FIFO读数据异常分析

FIFO是FPGA设计中最常用的IP,读写时序相对简单,可能正是因为这个原因,通常不会去细读FIFO手册,具体怎么操作大概清楚,上手就写,一般不会出什么问题。最近却遇到读FIFO异常的情况,特意记录一下,顺便细读了一下PG057。

FIFO读操作异常

数据写入FIFO后,读取数据,没有输出。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vliWRQkZ-1652091842675)(./pic/2.png)]

FIFO 读时序

下图是pg057读时序图,在文档中读到这样一句话:

shows a standard read access. When you write at least one word into the FIFO,
empty is deasserted — indicating that the data is available to be read。

当FIFO中的empyt信号为0时,才可以读FIFO。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0xBFL3do-1652091842677)(./pic/1.png)]

为什么原来不出这种错误呢

仔细观察抓到的时序图发现,从写使能有效到empty由高变低经历了几个时钟周期,之前使用FIFO时,empty应该是在写使能下一个周期就置低了。差异就在于以前FIFO读写都是8bit数据,这次是64bit数据。应该是输入位宽导致empty的变化。

读写位宽不同时

FIFO输入为64bit,输出为32bit。

当向FIFO写入64‘h090a0b0c0d0e0f10时,从输出端先读出32’h090a0b0c,后读出32‘h0d0e0f10。

使用valid信号

valid不是必须使用信号,但该信号指示读出数据有效状态,非常有用。

First-Word Fall-Through与Show-ahead

在读使能信号有效之前,FIFO输出数据,这个功能在Xilinx叫First-Word Fall-Through,Intel叫Show-ahead。功能类似,在使用First-Word Fall-Through时,valid信号不再能准确只是输出有效。在有效情况下使用First-Word Fall-Through会更方便,但我有时更愿意麻烦点,使用标准FIFO,因为遇到做器件移植的情况,要移植的器件不支持这种模式,需要修改时序。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Msf3uGge-1652091842679)(./pic/3.png)]

Underflow 与Overflow

Underflow

Underflow用来指示读操作不成功,当FIFO为空时,进行读操作,该信号触发。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5BM5TdF7-1652091842680)(./pic/5.png)]

Overflow

Overflow用来指示写操作不成功,当FIFO为满时,进行写操作,该信号触发。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hizT4lNp-1652091842681)(./pic/4.png)]

FIFO实现

Intel FPGA的FIFO通常由两种资源实现,Block RAM和 Distributed RAM。Xilinx有如下四种资源实现。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0X4qPGH0-1652091842681)(./pic/6.png)]

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您可以使用FPGAFIFO(First-In-First-Out)模块来读取数据FIFO是一种用于缓存数据的硬件模块,可以实现数据的暂存和传输。以下是一般的步骤: 1. 配置FIFO模块:首先,您需要在FPGA中配置FIFO模块。具体的配置方法取决于您所使用的FPGAFIFO模块的类型。通常,您需要设置FIFO的深度、数据宽度和读写接口。 2. 连接FIFO模块:将FPGA中的FIFO模块与其他组件(如外部设备或其他逻辑模块)连接起来。这可能涉及到引脚映射、时钟和复位信号等。 3. 读取数据:一旦FIFO模块配置和连接完成,您可以通过读取FIFO的输出接口来获取数据。读取接口通常包括数据输出端口、读使能信号和读指针。 - 首先,使用读使能信号来启用读取操作。这可以是一个控制信号或一个时钟触发信号,具体取决于您的设计。 - 然后,通过读指针来读取数据。读指针是FIFO模块中的一个计数器,用于指示下一个要读取的数据位置。您可以使用该指针从FIFO的存储区域中读取数据。 - 最后,通过数据输出端口获取读取的数据数据的格式和宽度取决于您在配置FIFO时定义的参数。 需要注意的是,读取FIFO数据的速度应该与写入FIFO数据的速度相匹配,以避免数据丢失或溢出。此外,还需要考虑FIFO的状态(如空、满)以及其他相关控制信号(如复位)来确保正确数据读取操作。 请注意,具体的实现细节和步骤可能因使用的FPGAFIFO模块而有所不同。建议您参考所使用FPGAFIFO模块的文档和手册,以获取详细的配置和操作指南。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

硬码农二毛哥

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

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

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

打赏作者

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

抵扣说明:

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

余额充值