FWFT_FIFO和Standard_FIFO对比仿真

  在FPGA中使用FIFO时,如果使用FPGA厂商提供的FIFO IP,一般都会有First Word Fall Through FIFO和Standard FIFO类型选项,那么这两种FIFO有什么差异么。两种FIFO的端口是一样的,看不出区别,只有通过仿真,才能看到实际运行时的差别。仿真工程可以从以下地址下载。https://download.csdn.net/download/cjie221/90684941

1.仿真平台

  下载仿真工程解压后,在sim文件夹下,可以直接双击tb_top.bat脚本运行,或者打开Modelsim,Change Directory到sim文件夹,执行脚本do tb_top.do来运行。
  测试平台tb_top.v框图如下图所示,测试源是计数器数值,在计数值为100 ~ 170之间,产生FIFO写使能,FIFO的写数据就是计数值。在计数值为400 ~ 470之间,产生FIFO读使能,FIFO输出数据。
在这里插入图片描述

  被测试单元分别是两种FIFO。fwft_fifo就是First Word Fall Through FIFO,另一个standard_fifo就是Standard FIFO。FIFO利用网上的开源代码来实现,便于有兴趣的同学进一步查看模块内部信号。FIFO的数据位宽用参数DW来表示,这里取32,另一个参数L表示的是FIFO内地址计数器的位宽,所以实际FIFO深度为2L,这里L取6。不过fwft_fifo代码有点特殊,实际深度为2L+2=66,而standard_fifo实际深度就是2L=64。

2.仿真波形

  仿真波形如下图所示,同时驱动fwft_fifo和standard_fifo。先进行写操作,执行71次写操作,实际最多只能写入最大深度个数。然后再进行读操作,执行71次读操作。
在这里插入图片描述

(1)fwft_fifo
  上半部分是fwft_fifo仿真波形,先看写数据波形,当wren为1时,写入数据,可以看到写入6个数据后,empty信号才拉低。相比Standard FIFO,empty信号拉低的时间要更长。在empty信号拉低后,fwft_fifo输出端口data_out1就保持为第1个写入的数据。这个与Standard FIFO也是不同的。
在这里插入图片描述

  接下来我们再看读数据波形,First Word Fall Through FIFO最大的特点就在于此,当rden为1时,输出端口data_out1立刻就是FIFO输出值。而不像Standard FIFO输出端口有输出至少要延后1个时钟周期。
在这里插入图片描述

(2)standard_fifo
  下半部分是standard_fifo仿真波形,先看写数据波形,当wren为1时,写入数据,可以看到只写入1个数据后,empty信号就拉低了,同时输出端口data_out2并没有任何变化。
在这里插入图片描述

  然后再看读数据波形,当rden为1时,输出端口data_out2不是立刻就有输出值,而是延时1个时钟周期才有输出。当然有些FIFO IP也会提供pipeline out选项允许延时多个时钟周期输出。
在这里插入图片描述

3. First Word Fall Through FIFO应用

  在哪些场合会用到First Word Fall Through FIFO呢,一般是要求读使能rden信号既作为FIFO的读使能信号,又是其他的模块的控制信号,同时要求数据必须与这个控制信号同步,不能有延时。例如以下这种情况。
  有数据需要写入DDR3控制器,但数据必须要先经FIFO缓存,然后在写入时直接从FIFO搬运。我们看一个DDR3控制器的写操作时序图,写使能信号wr_data_en和写数据wr_data必须是同步的,而如果用wr_data_en作为FIFO的读使能,那么这时采用First Word Fall Through FIFO的话,FIFO的输出数据就可以直接对接写数据端口了。
在这里插入图片描述

  不过实际应用中大多使用Standard FIFO就可以,First Word Fall Through FIFO使用场合相对较少,并且使用的资源也多一些。

### FWFT FIFO IP 实现及问题解决方案 #### 什么是FWFT FIFO? First Word Fall Through (FWFT) 是一种特殊的FIFO行为,在这种模式下,一旦有新的数据被写入并且当前FIFO为空,则该新数据立即可以被读取。这意味着即使在单个时钟周期内发生写随后的读操作,读端口也能获取最新的写入数据[^1]。 #### FWFT FIFO 的工作原理 为了支持FWFT功能,通常会在内部逻辑中加入额外的状态机来跟踪FIFO状态以及管理读写指针之间的关系。具体来说: - 当检测到一次有效的写请求且此时FIFO为空时,系统会立即将此最新写入的数据标记为可读。 - 这种机制依赖于精确控制读写使能信号,并通过握手协议确保不会丢失任何有效数据[^2]。 #### VIVADO 中配置FWFT FIFO IP核的方法 在Xilinx Vivado工具链里创建带有FWFT特性的FIFO组件非常简单: 1. 打开IP Catalog并搜索`FIFO Generator`; 2. 配置参数页面中的选项以满足项目需求; 3. 特别注意设置`Output Register Options -> First Word Fall Through`属性为启用状态;这一步骤至关重要因为它决定了所生成的核心是否具备即时传递第一个字的能力。 ```tcl # 创建一个新的FIFO Generator实例并开启FWFT特性 create_ip -name fifo_generator -vendor xilinx.com -library ip -module_name my_fifo_gen set_property CONFIG.Fifo_Implementation {Independent_Clocks_Block_RAM} [get_ips my_fifo_gen] set_property CONFIG.Performance_Options {First_Word_Fall_Through} [get_ips my_fifo_gen] ``` #### 常见问题及其解决办法 ##### 数据同步问题 由于FWFT允许几乎同时发生的写读动作,因此可能会遇到跨时钟域传输带来的亚稳态风险。为了避免这种情况的发生,建议采用双级触发器或其他形式的同步电路对接收到的信息进行处理后再送入目标时钟区域。 ##### 占用资源过多 如果发现使用了FWFT之后消耗了大量的硬件资源,可能是因为增加了用于快速响应的第一级寄存器。对于某些应用场景而言,或许可以通过调整设计减少不必要的性能优化从而节省空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cjie221

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值