忽略 FPGA 中 FIFO 输入的数据的总体影响是啥?
Posted
技术标签:
【中文标题】忽略 FPGA 中 FIFO 输入的数据的总体影响是啥?【英文标题】:What is the overall impact of ignoring data at FIFO input in an FPGA?忽略 FPGA 中 FIFO 输入的数据的总体影响是什么? 【发布时间】:2018-08-29 16:29:06 【问题描述】:我了解 FIFO 的操作,但我认为我遗漏了一些关于它的实用性的信息。
在 FPGA 中实现 FIFO 时,假设要跨时钟域,您似乎经常会遇到 FIFO 已满的情况,但仍有数据应在每个周期进行计时。如果写入机制输入数据的速度快于读取机制读取数据的速度,则可能会发生这种情况。显然,一旦 FIFO 已满,它将开始忽略数据,直到有空间继续存储数据。
我的问题是,这不是什么大问题吗?我们基本上只是在丢失数据? FIFO 确实在发挥作用,但整个系统只是在丢弃数据
我得出了两个可能的结论
1) 在这种情况下(输入数据速率大于输出数据速率),如果我们真的关心不丢失任何数据,那么 FIFO 可能不是跨越这些域的最佳方式(尤其是如果写入机制的时钟比读取域快得多)。如果这是真的,那么传统上是否有比使用 FIFO 更好的跨时钟域的方法?也许答案是您需要在 FIFO 之前使用另一个元素,例如抽取器?
2) 在 FIFO 需要时间来清除其数据之前,我们对系统设置了一个约束,即“您只能写入 X 数量的数据(或周期或时间等)”。这对我来说似乎不满意,我们必须关闭数据流一会儿,等待 FIFO 腾出一些空间,直到我们继续写入。但话又说回来,我是数字系统的新手,也许这只是我不习惯的严酷现实:)
这样看来,跨时钟域时 FIFO 的最佳用途只是让进入 FIFO 的数据速率和从 FIFO 流出的数据速率相同,因为这样它就可以跟上自己的速度。
【问题讨论】:
这里的问题似乎是off-topic。电气工程堆栈交换网站上的特定电子设计问题可能是 on-topic。 FIFO 的两条规则:永远不要写入满的 FIFO,永远不要从空的 FIFO 中读取。永远不要违反规则。 【参考方案1】:您似乎将两个问题合二为一。
有时钟域交叉和输入数据缓冲。恰好 FIFO 将这两个任务的实现组合在一个实体中。
如果接收器跟不上发送器,并且没有流量控制,那么数据就会丢失,无论数据是否跨越时钟域都没有关系。如果不添加某种握手或流控制线,您将无法解决数据丢失问题。
如果没有流量控制,您必须确保输入缓冲区大小足以在您的特定情况下处理负载峰值。
至于影响 - 如果您的设计可以解决数据丢失问题,则影响是不存在的,或者如果设计不能容忍数据丢失,您将拥有一个无法正常工作的设备。
【讨论】:
流量控制是指“full”/“empty”和“almost full”/“almost empty”控制信号以外的控制?例如,控制信号会告诉发送器停止传输数据,直到接收器准备好接受更多数据? @jakedaly 我就是这个意思。查看各种接口。CTS/RTS
在 UART 中,waitrequest
在 Avalon-MM 中或 ready
在 Avalon-ST 中。这是保证数据不会丢失的最低要求。 “几乎满/空”是特定的,在大多数情况下不需要。
@jakedaly 需要注意的是,如果生产者创建输出的速度比消费者输入的速度快,您通常有两种选择:丢失任何消费者无法接收的数据,或者让消费者申请向生产者施加压力以停止数据的生产。哪个最适合您的系统取决于数据是什么,但是如果您需要所有数据,则流控制是实现背压的机制。有时,生产者只能在短时间内更快地创建数据,这就是 FIFO 等缓冲技术变得重要的地方。【参考方案2】:
FIFO 还具有不同输入和输出宽度的功能。这意味着例如您有一个 100 Mhz 32 位输入和一个 50Mhz 64 位输出。进出fifo的数据速率是一半,但数据宽度是两倍。
【讨论】:
以上是关于忽略 FPGA 中 FIFO 输入的数据的总体影响是啥?的主要内容,如果未能解决你的问题,请参考以下文章
FPGA基础学习(11) -- FIFO设计(style#1)
ZYNQ从入门到秃头08 FPGA片内异步FIFO读写测试实验