异步FIFO 是指读写时钟不一致,读写时钟是互相独立的,多用于跨时钟域的数据传输,也可用于位宽变换。
同步FIFO:读写时钟一样,输入输出的位宽可以不同。
同步/异步FIFO的配置
一般的异步FIFO的配置步骤参考:vivado ip核 FIFO的配置与调用_vivado的fifoip核实现不同位宽-
CSDN博客
注意:下图对应位置不勾选,IP出现wr_rst和rd_rst信号;勾选,整个IP只有一个rst信号
手撕异步FIFO的代码
module async_fifo //------------------------------------------------// //写指针转换成格雷玛 //读指针转换成格雷玛 //------------------------------------------------// //write pointer(binary to gray) //gray write pointer syncrous 打2拍 //----------------------// //read pointer(binary to gray) 打2拍 //gray read pointer syncrous //----------------------// //full //----------------------// //read //输出赋值 endmodule |
异步fifo的测试文件
`timescale 1ns/1ps module test_tb(); reg rst; reg wr_clk; reg rd_clk; reg [4 : 0] din; wire wr_en; wire rd_en; wire [4 : 0] dout; wire full; wire wr_ack; wire empty; wire valid; wire [3 : 0] rd_data_count; wire [3 : 0] wr_data_count; wire almost_full; wire overflow; wire almost_empty; wire underflow; //读时钟 initial rd_clk = 1; always#5 rd_clk = ~rd_clk; //写时钟 initial wr_clk = 1; always#25 wr_clk = ~wr_clk; //读使能、写使能 assign wr_en = ((~rd_en) && (~full)); assign rd_en = ((~wr_en) && (~empty)); //写数据 always @ ( posedge wr_clk ) begin if ( rst ) din <= 5'd1; else if ( wr_en ) din <= din + 1'b1; end initial begin rst = 1; #11; rst = 0; end //例化 t1 t1_inst( .rst ( rst ), .wr_clk ( wr_clk ), .rd_clk ( rd_clk ), .din ( din ), .wr_en ( wr_en ), .rd_en ( rd_en ), .dout ( dout ), .full ( full ), .wr_ack ( wr_ack ), .empty ( empty ), .valid ( valid ), .rd_data_count ( rd_data_count ), .wr_data_count ( wr_data_count ), .almost_full (almost_full ), .overflow (overflow ), .almost_empty (almost_empty ), .underflow (underflow ) ); endmodule |
手撕同步FIFO
`timescale 1ns / 1ps
integer i; //===========write pointer address===========// //===========read pointer address===========// //===========counter===========// /* //===========full===========// //===========empty===========// //===========almost_full===========// //===========almost_empty===========// //===========read data===========// //===========write data===========// endmodule |
同步FIFO的仿真文件
`timescale 1ns / 1ps
parameter DATA_WIDTH = 8; reg clk,rst_n; parameter clk_period = 10; initial repeat(50) begin always #(clk_period/2) clk = ~clk; sync_fifo endmodule |