文章目录
一、FIFO的简介二、Native FIFO 特点三、同步FIFO的不同配置以及仿真测试3.1 打开 FIFO Generrator3.2 端口设置3.3 标志信号设置3.3 数据数量信号设置3.4 标准读模式,读写位宽一致的FIFO仿真测试以及信号分析3.4.1 控制代码编写3.4.2 FIFO写数据端仿真结果分析3.4.3 FIFO读数据端仿真结果分析
3.5 标准读模式,打开output Register的FIFO仿真测试3.6 FWFT模式下,FIFO仿真测试以及信号解析3.7 标准读模式,读写位宽不一致的FIFO仿真测试以及信号分析3.7.1 写读宽度1:4的FIFO测试3.7.2 写读宽度4:1的FIFO测试
四、异步FIFO的不同配置以及仿真测试4.1 打开 FIFO Generrator4.2 端口设置4.3 标志信号设置4.4 读写数据数量信号设置4.5 关于FIFO异步复位需要注意的问题4.5.1 FIFO复位时,读或者写时钟丢失的情况仿真4.5.2 FIFO复位时,RST复位周期小于3个慢时钟周期的情况仿真
4.6 标准读模式,读写位宽一致的FIFO仿真测试以及读写域信号分析4.6.1 programmable flag仿真测试
五、使用FIFO的注意事项总结参考
一、FIFO的简介
FIFO( First Input First Output)指的是一种数据结构,数据以先进先出的顺序进行处理。FIFO分为同步FIFO和异步FIFO,应用场景非常广泛,例如:跨时钟域传输、数据缓存、数据位宽转换等等。
Xilinx FIFO支持自定义宽度、深度、状态标志、内存类型和写入 (读取)端口宽高比。FIFO 还可以进行定制,以利用某些 FPGA 系列中提供的块 RAM、分布式 RAM 或内置 FIFO 资源来创建高性能、面积优化等 FPGA 设计。Xilinx支持 Native、AXI4-Stream、AXI4、AXI3 和 AXI4-Lite 接口 本文主要讲解Native接口的FIFO,AXI接口的后续再讲解。其中Native接口异步FIFO结构如下: ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b19bcfdaac454f64aa31057404e9acd1.png#pic_center)
二、Native FIFO 特点
FIFO 数据宽度为 1 至 1024 位对称或非对称宽高比(读写端口比范围为 1:8 至 8:1)同步或异步复位选项可选存储器类型(块 RAM、分布式 RAM) 、移位寄存器或内置 FIFO选择在标准或第一个字下降模式 (FWFT) 下运行满和空状态标志,以及用于指示左字的几乎满和几乎空标志可编程满和空状态标志,由用户定义的常量或专用输入端口设置可配置的握手信号支持 Block RAM 和内置 FIFO 配置的汉明错误注入和纠正检查 (ECC)
三、同步FIFO的不同配置以及仿真测试
3.1 打开 FIFO Generrator
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/edfbe15f13dc469aa4030a97d0757878.png#pic_center)
用户给FIFO的命名,这里测试同步FIFO,因此命名为scfifo_test接口种类:正如上文所述,Xilinx支持Native和AXI接口,本文主要讲解Native接口组成FIFO的方式,同步还是异步,由块 RAM、分布式 RAM 还是内置 FIFO 资源构成各种FIFO支持的特性列表每种特性的是什么意思: (1) Non-symmetric aspect ratios:非对称纵横比(读写的数据端口位宽可以不一致,范围从 1:8 到 8:1) (2) First-Word Fall-Through:第一个字读出功能,当 FIFO 中存在数据时,第一个字将通过 FIFO自动出现在输出总线 dout上 (3) Uses Built-in FlFO primitives:使用内置的FIFO单元,从而可以通过在宽度和深度上级联内置 FIFO 来创建大型 FIFO (4) ECC support:纠正检查支持 (5) Dynamic Error Injection:汉明错误注入
我们就选择Native接口,由块Block RAM组成的同步FIFO
3.2 端口设置
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/5b4431f942c2499c8807f3b233ec06c6.png#pic_center)
读FIFO模式,标准的FIFO是读使能来临后,延迟一个时钟周期输出数据。这里选择标准,后面会测试FWFT。读写数据位宽以及深度,默认都是同位宽,后面会测试不同读写位宽。输出寄存器,如果打开,输出的数据会延迟一拍出来复位管脚复位模式,分为同步复位和异步复位复位时,dout数据显示什么数值读数据延迟的时钟周期
3.3 标志信号设置
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/2d3df3014d334cd28a09677a7a173b48.png#pic_center)
可以操作的标准信号,几乎满标志和几乎空标志写确认确认信号和读有效信号,和读写溢出信号。可以打开看是否数据正确的读写进FIFO
3.3 数据数量信号设置
可以显示FIFO内还剩多少数量,因为这里选择的是同步FIFO,因此只有一个data_count。如果是异步FIFO,将会有读写数量。
3.4 标准读模式,读写位宽一致的FIFO仿真测试以及信号分析
3.4.1 控制代码编写
`timescale 1ns / 1ps
module my_scfifo_test(
input sys_clk , //输入时钟
input rst_n //系统复位
);
wire [17:0] dout ; //FIFO读数据
wire full ; //FIFO满信号
wire empty ; //FIFO空信号
wire almost_full ; //FIFO几乎满信号
wire almost_empty ; //FIFO几乎空信号
wire [9:0] data_count ; //FIFO数据数量
reg srst ; //FIFO复位
reg [17:0] din ; //FIFO写数据
reg wr_en ; //FIFO 写使能
reg rd_en ; //FIFO读使能
reg [6:0] wait_cnt ; //等待复位完成计数器
reg [2:0] state ;
always @(posedge sys_clk or negedge rst_n) begin
if(rst_n == 1'b0)begin
wait_cnt |