FIFO IP核
FIFO主要分为同步FIFO和异步FIFO,顾名思义,通过读写时钟是否一致进行划分。同步 FIFO常用于同步时钟的数据缓存, 异步 FIFO常用于跨时钟域的数据信号传递,如当程序产生数据较快,来不及处理,就按照一个较快的时钟存储在FIFO中,然后再通过正常的时钟进行处理。本质上FIFO和RAM一样都是进行存储数据,只是RAM通过地址进行存储和处理,而FIFO是先进先出的方式。
个人理解的FIFO使用方法,就是在IP核的基础在,写好外部写和读模块,只需要控制好根据full和empty信号,进行读写使能,写模块中收到的数据会自动存储在FIFO中,读模块中的输出数据也会从FIFO中自动读出。
RTL代码
本来是准备设计一个异步FIFO,通过不同时钟进行控制FIFO读写速率不同,通过PLL生成两个不同频率的时钟作为读写的时钟,RTL代码如下:
module top(input clk,
input rst
);
wire wr_en;
wire rd_en;
wire [7:0] din;
wire [7:0] dout;
wire full;
wire empty;
wire clk_out1;
wire clk_out2;
wire locked;
wire [7:0] rd_data_count;
wire [7:0] wr_data_count;
fifo_generator_0 u0 (
.wr_clk(clk), // input wire wr_clk
.rd_clk(clk), // input wire rd_clk
.din(din), // input wire [7 : 0] din
.wr_en(wr_en), // input wire wr_en
.rd_en