fpga项目: pll fifo ram ip测试 - minichao9901/TangNano-20k-Zynq-7020 GitHub Wiki

1) pll ip测试

  • 非常简单,没有任何逻辑。
  • 需要注意的是:不要带转接板,长线会导致时钟的毛刺非常大,占空比也失真了。
  • 如果直接在zynq GPIO扩展口这里测,效果好很多。

2) fifo ip测试

  • fifo ip采用单个时钟,位宽8bits,深度32
  • 采用key1启动fifo写,key2启动fifo读
  • 设计了一个通用的gen_tx_data.v,它可以定时产生读/写pulse,并伴随着读写data。后续这个还可以再扩充一下功能。

fifo仿真

module test_fifo_ip(
   input clk,
    input rst_n,
    input key1,
    input key2
    );

key_filter
#(.CNT_MAX(50)) 
u_key_filter_wr(
    .sys_clk(clk),
    .sys_rst_n(rst_n),
    .key_in(key1),
    .key_flag(write_pulse)
);

key_filter 
#(.CNT_MAX(50)) 
u_key_filter_rd(
    .sys_clk(clk),
    .sys_rst_n(rst_n),
    .key_in(key2),
    .key_flag(read_pulse)
);

wire [7:0] po_wr_data;
wire [7:0] po_rd_data;
wire [4:0] data_count;

gen_tx_data 
#(.FCLK(50_000),
.EVENT_MAX(35)
)
u_gen_wr_data(
    .clk(clk),
    .rst_n(rst_n), 
    .pi_start_pulse(write_pulse),   
    
    .po_start_pulse(po_wr_start_pulse),
    .po_data(po_wr_data)   
    );
 
gen_tx_data 
#(.FCLK(50_000),
.EVENT_MAX(35)
)
u_gen_rd_data(
    .clk(clk),
    .rst_n(rst_n), 
    .pi_start_pulse(read_pulse),   
    
    .po_start_pulse(po_rd_start_pulse),
    .po_data()   
    );       

  fifo_generator_0 u_fifo_generator_0 (
  .clk(clk),                // input wire clk
  .rst(~rst_n),                // input wire rst
  .din(po_wr_data),                // input wire [7 : 0] din
  .wr_en(po_wr_start_pulse),            // input wire wr_en
  .rd_en(po_rd_start_pulse),            // input wire rd_en
  .dout(po_rd_data),              // output wire [7 : 0] dout
  .full(full),              // output wire full
  .empty(empty),            // output wire empty
  .data_count(data_count)  // output wire [4 : 0] data_count
);
        
endmodule
module gen_tx_data(
    input clk,
    input rst_n, 
    input pi_start_pulse,   
    
    output reg po_start_pulse,
    output reg [7:0] po_data   
    );
    
parameter FCLK=50_000_000;
parameter DLY_MS=FCLK/100;
parameter EVENT_MAX=10;     

reg [19:0] timer;
reg [5:0] event_t;
wire timer_flag;
reg work_en;
wire [5:0] event_o;

always @(posedge clk or negedge rst_n)
if(rst_n==0)
    work_en<=0;
else if(pi_start_pulse==1)
    work_en<=1;    
else if(event_t==EVENT_MAX)
    work_en<=0;    
    
always @(posedge clk or negedge rst_n)
if(rst_n==0)
    timer<=0;
else if(timer==DLY_MS-1)
    timer<=0;    
else
    timer<=timer+1;

assign timer_flag=(timer==DLY_MS-1)&&(work_en==1);
    
always @(posedge clk or negedge rst_n)
if(rst_n==0)
    event_t<=0;
else if(event_t==EVENT_MAX)
    event_t<=0;
else if(timer_flag)
    event_t<=event_t+1;

assign event_o=timer_flag? event_t: 0;  //generate counter-value pulse    
 
always @(posedge clk or negedge rst_n)
if(rst_n==0) begin
    po_start_pulse<=0;
    po_data<=0;
end
else if(event_o)
    task_send_data(event_o);
else
    po_start_pulse<=0; 
 
task task_send_data;
    input [7:0] data_in;
    begin
       po_start_pulse<=1;
       po_data<=data_in;
    end
endtask    

endmodule

fifo仿真结果

  • 由于fifo深度只有32,而读/写了34个数据,因此写最多只写入了32个,读出最多只读出了32个。

fifo测试

  • key+fifo+seg7_disp
  • 这里说明一下,key+seg7_disp以后所有的工程都可以考虑使用,非常便捷。
`timescale 1ns / 1ps
module test_fifo_ip(
   input clk,
    input rst_n,
    input key1,
    input key2,

    output  wire    [5:0]   sel,
    output  wire    [7:0]   seg,
    output empty,
    output full,
    output po_wr_start_pulse,
    output po_rd_start_pulse
       
    );

key_filter
//#(.CNT_MAX(50)) 
u_key_filter_wr(
    .sys_clk(clk),
    .sys_rst_n(rst_n),
    .key_in(key1),
    .key_flag(write_pulse)
);

key_filter 
//#(.CNT_MAX(50)) 
u_key_filter_rd(
    .sys_clk(clk),
    .sys_rst_n(rst_n),
    .key_in(key2),
    .key_flag(read_pulse)
);

wire [7:0] po_wr_data;
wire [7:0] po_rd_data;
wire [4:0] data_count;

gen_tx_data 
#(
//.FCLK(50_000),
.EVENT_MAX(50)
)
u_gen_wr_data(
    .clk(clk),
    .rst_n(rst_n), 
    .pi_start_pulse(write_pulse),   
    
    .po_start_pulse(po_wr_start_pulse),
    .po_data(po_wr_data)   
    );
 
gen_tx_data 
#(
//.FCLK(50_000),
.EVENT_MAX(50)
)
u_gen_rd_data(
    .clk(clk),
    .rst_n(rst_n), 
    .pi_start_pulse(read_pulse),   
    
    .po_start_pulse(po_rd_start_pulse),
    .po_data()   
    );       

  fifo_generator_0 u_fifo_generator_0 (
  .clk(clk),                // input wire clk
  .rst(~rst_n),                // input wire rst
  .din(po_wr_data),                // input wire [7 : 0] din
  .wr_en(po_wr_start_pulse),            // input wire wr_en
  .rd_en(po_rd_start_pulse),            // input wire rd_en
  .dout(po_rd_data),              // output wire [7 : 0] dout
  .full(full),              // output wire full
  .empty(empty),            // output wire empty
  .data_count(data_count)  // output wire [4 : 0] data_count
);


//------------- seg_dynamic_inst -------------
seg_dynamic 
//#(.CNT_MAX(500)) 
seg_dynamic_inst
(
    .sys_clk     (clk   ), //绯荤粺鏃堕挓锛岄鐜?50MHz
    .sys_rst_n   (rst_n ), //澶嶄綅淇″彿锛屼綆鏈夋晥
    .data        (po_rd_data   ), //鏁扮爜绠¤鏄剧ず鐨勫??
    .point       (          ), //灏忔暟鐐规樉绀?,楂樼數骞虫湁鏁?
    .seg_en      (1'b1      ), //鏁扮爜绠′娇鑳戒俊鍙凤紝楂樼數骞虫湁鏁?
    .sign        (          ), //绗﹀彿浣嶏紝楂樼數骞虫樉绀鸿礋鍙?

    .sel         (sel       ), //鏁扮爜绠′綅閫変俊鍙?
    .seg         (seg       )  //鏁扮爜绠℃閫変俊鍙?
);

        
endmodule
  • 最大读写数据量是50,而fifo深度是32,所以可以看到读写到31个就停止了。empty和full信号的行为符合预期。