忽略 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 输入的数据的总体影响是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Linux fifo 缓冲采坑

fpga中TB怎么写

FPGA基础学习(11) -- FIFO设计(style#1)

ZYNQ从入门到秃头08 FPGA片内异步FIFO读写测试实验

ZYNQ从入门到秃头08 FPGA片内异步FIFO读写测试实验

v3学院 FPGA专家 带你学习FPGA实现格雷码跨时钟域异步fifo