vivado fifo ip学习笔记

1、同步fifo(特别注意srst低电平有效)

First Word Fall Through模式:输出数据提前放到线上,读出时可直接读到数据,没有延时

 

 

module vlg_design(
    input i_clk,    //50MHz, 20ns
    input i_rst_n,
    input[7:0] din,


    output[7:0] dout
    );
wire wr_en ;
wire rd_en ;
wire full  ;
wire empty ;
wire[4:0] data_count ;
assign wr_en = ~full ;
assign rd_en = (data_count >= 'd10 ) ;
fifo_generator_0 u (
  .clk(i_clk),                // input wire clk
  .srst(!i_rst_n),              // input wire srst
  .din(din),                // input wire [7 : 0] din
  .wr_en(wr_en),            // input wire wr_en
  .rd_en(rd_en),            // input wire rd_en
  .dout(dout),              // 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 testbench_top();
    
////////////////////////////////////////////////////////////
//参数定义

`define CLK_PERIORD        20        //时钟周期设置为20ns(50MHz)    

////////////////////////////////////////////////////////////
//接口申明
    
reg clk;
reg rst_n;
reg[7:0]  i_data ;
wire[7:0] o_data ;


////////////////////////////////////////////////////////////    
//对被测试的设计进行例化
    
vlg_design u(
    .i_clk     (clk),    //50MHz, 20ns
    .i_rst_n   (rst_n),
    .din       (i_data),

    .dout      (o_data)


    );
    
////////////////////////////////////////////////////////////
//复位和时钟产生

    //时钟和复位初始化、复位产生
initial begin
    clk <= 0;
    rst_n <= 0;
    #110;
    rst_n <= 1;
end

always #(`CLK_PERIORD/2) clk = ~clk ;

always@ (posedge clk or negedge rst_n)begin
    if(!rst_n) i_data <= 'd3 ;
    else if(i_data >= 'd15) i_data <= 'd3 ;
    else i_data <= i_data + 1 ;
end

endmodule

 

 wr_en上升沿时直接读出数据没有延时。

Standard FIFO:读出时有一个时钟的延时,如下图

 

 2、异步fifo(rst低电平有效)

如下图所示wr_en有效时写入14,rd_en有效时立刻读出14,没有延时

 

 3、异步fifo,输入宽度与输出宽度不同

输入为16位,输出为8位

 

 

 

输入为8位输出为十六位 

 

posted @ 2022-05-14 18:34  QQCCh  阅读(711)  评论(0)    收藏  举报