我了解FIFO的操作,但我认为我缺少有关它的实用程序的信息。
在FPGA中实现FIFO时,可以说跨时钟域,看来您经常会遇到FIFO已满的情况,但是仍然有每个周期都要计时的数据。如果写入机制的时钟输入速度快于读取机制的数据读取速度,则可能会发生这种情况。显然,一旦FIFO已满,它将开始忽略数据,直到它有空间继续存储数据为止。
我的问题是,这没什么大不了的吗?我们基本上只是丢失数据?确保FIFO可以完成工作,但是整个系统只是丢弃数据
我得出了两个可能的结论
1)在这种情况下(输入数据速率大于输出数据速率),如果我们真的关心不丢失任何数据,则FIFO并不是穿越这些域的最佳方法(尤其是如果写入机制比读取域的时钟快得多)。如果是这样,那么传统上是否有比使用FIFO更好的跨时钟域的方法?也许答案是您需要在FIFO之前使用另一个元素,例如抽取器?
2)我们对系统施加了一个约束条件,即“在FIFO需要时间清除其数据之前,您只能写入X数量的数据(或周期,时间等)”。对于我来说,这似乎不令人满意,我们必须关闭数据流一会儿,然后等待FIFO清除一些空间,直到我们继续写入。但是再说一次,我是数字系统的新手,也许这只是我不习惯的残酷现实:)
那么,在跨时钟域时,FIFO的最佳用途似乎仅仅是进入FIFO的数据速率与流出FIFO的数据速率相同的一种,因为它可以跟上自己的步伐。
答案 0 :(得分:0)
似乎您正在将两个问题混为一谈。
存在时钟域交叉和输入数据缓冲。 FIFO恰好在一个实体中结合了这两个任务的实现。
如果接收器跟不上发送器,并且没有流控制,那么数据将丢失,并且数据是否跨时钟域也无关紧要。如果不添加某种握手或流控制线,就无法解决数据丢失问题。
在没有流控制的情况下,您必须确保输入缓冲区的大小足以应付特定情况下的负载峰值。
关于影响-如果您的设计可以解决数据丢失的情况,则不存在;或者,如果设计不容许数据丢失,则设备将不起作用。
答案 1 :(得分:0)
FIFO还具有不同输入和输出宽度的功能。例如,这意味着您有一个100 Mhz的32位输入和一个50Mhz的64位输出。进入/离开前一半的数据速率,但数据宽度为两倍。