FIFO简介:
FIFO的英文全称是First In First Out,即先进先出。FPGA使用的FIFO一般指的是对数据的存储具有先进先出特性的一个缓存器,常被用于数据的缓存,或者高速异步数据的交互也即所谓的跨时钟域信号传递。它与FPGA内部的RAM和ROM的区别是没有外部读写地址线,采取顺序写入数据,顺序读出数据的方式,使用起来简单方便,由此带来的缺点就是不能像RAM和ROM那样可以由地址线决定读取或写入某个指定的地址。本章我们将对Vivado软件生成的FIFOIP核进行读写测试,来向大家介绍XilinxFIFO IP核的使用方法。
同步FIFO常用于同步时钟的数据缓存,异步FIFO常用于跨时钟域的数据信号的传递,例如时钟域A下的数据data1传递给异步时钟域B,当data1为连续变化信号时,如果直接传递给时钟域B则可能会导致收非所送的情况,即在采集过程中会出现包括亚稳态问题在内的一系列问题,使用异步FIFO能够将不同时钟域中的数据同步到所需的时钟域中。
实验任务
本节的实验任务是使用Vivado生成FIFOIP核,并实现以下功能:当FIFO为空时,向FIFO中写入数据,写入的数据量和FIFO深度一致,即FIFO被写满;然后从FIFO中读出数据,直到FIFO被读空为止。
模块示意图:
顶层模块代码实现:
moduleip_fifo(
input sys_clk,//时钟信号
input sys_rst_n//复位信号
);
//wire define
wire fifo_wr_en;// FIFO写使能信号
wire fifo_rd_en;// FIFO读使能信号
wire [7:0] fifo_din;//写入到FIFO的数据
wire [7:0] fifo_dout;//从FIFO读出的数据
wirea lmost_full;// FIFO将满信号
wirea lmost_empty;// FIFO将空信号
wire fifo_full;// FIFO满信号
wire fifo_empty;// FIFO空信号
wire [7:0] fifo_wr_data_count;// FIFO写时钟域的数据计数
wire [7:0] fifo_rd_data_count;// FIFO读时钟域的数据计数
//例化FIFO IP核
fifo_generator_0 fifo_generator_0(
.wr_clk(sys_clk),// input wire wr_clk
.rd_clk(sys_clk),// input wire rd_clk26
.wr_en(fifo_wr_en),// input wire wr_en
.rd_en(fifo_rd_en),// input wire rd_en29
.din(fifo_din),// input wire [7 : 0] din
.dout(fifo_dout),// output wire [7 : 0] dout32
.almost_full(almost_full),// output wire al