【发布时间】:2018-08-29 16:29:06
【问题描述】:
我了解 FIFO 的操作,但我认为我遗漏了一些关于它的实用性的信息。
在 FPGA 中实现 FIFO 时,假设要跨时钟域,您似乎经常会遇到 FIFO 已满的情况,但仍有数据应在每个周期进行计时。如果写入机制输入数据的速度快于读取机制读取数据的速度,则可能会发生这种情况。显然,一旦 FIFO 已满,它将开始忽略数据,直到有空间继续存储数据。
我的问题是,这不是什么大问题吗?我们基本上只是在丢失数据? FIFO 确实在发挥作用,但整个系统只是在丢弃数据
我得出了两个可能的结论
1) 在这种情况下(输入数据速率大于输出数据速率),如果我们真的关心不丢失任何数据,那么 FIFO 可能不是跨越这些域的最佳方式(尤其是如果写入机制的时钟比读取域快得多)。如果这是真的,那么传统上是否有比使用 FIFO 更好的跨时钟域的方法?也许答案是您需要在 FIFO 之前使用另一个元素,例如抽取器?
2) 在 FIFO 需要时间来清除其数据之前,我们对系统设置了一个约束,即“您只能写入 X 数量的数据(或周期或时间等)”。这对我来说似乎不满意,我们必须关闭数据流一会儿,等待 FIFO 腾出一些空间,直到我们继续写入。但话又说回来,我是数字系统的新手,也许这只是我不习惯的严酷现实:)
这样看来,跨时钟域时 FIFO 的最佳用途只是让进入 FIFO 的数据速率和从 FIFO 流出的数据速率相同,因为这样它就可以跟上自己的速度。
【问题讨论】:
-
FIFO 的两条规则:永远不要写入满的 FIFO,永远不要从空的 FIFO 中读取。永远不要违反规则。
标签: vhdl verilog fpga fifo hdl