将多个 FiFos 连接到一个 FiFo

Connecting many FiFos to one FiFo

我的verilog固件图是这样的:

valid signal from fifo

在我的图表中,我有 6 个 16 位数据和 6 个 valid_data 是由 generate 函数生成的 6 个相同模块的输出。 valid_data的作用是当16位数据写入Xilinx提供的FiFo(Native and IP core)时通知。因为我的固件中有两个时钟域,所以我使用同步FiFo作为两个时钟域之间的握手,以确保在时钟域120 MHz中正确获取6个16位数据。

然后我把6个同步FiFo的6个16位输出数据放到1个96位变量中。我想使用来自6个同步Fifo的6个有效信号生成新的有效信号来通知异步FiFo 96位数据已准备好写入异步FiFo。但是我有一个问题:

我认为6个16位数据同时进入FIFO所以Synchronize of Fifo的输出需要同时出现。 但是当我用chipscope检查有效信号时,我不明白为什么FIFO出来的有效信号在图中不是同一时间,这让我很难产生新的有效信号.有人可以告诉我发生这种情况的原因。

6 valid signal from 6 Fifos and new valid signal checked by Chipscope

_有效检查[85:81]是来自6个FiFos的6个有效信号

_ check_ir_valid 是 累积 6 个有效信号的变量

_ valid_to_fifo 是新的有效信号

因为6个有效信号不会同时出现所以我也想到了另外一种方法所以也是用一个6位变量累加6个有效信号。当这个变量从 FiFo 收集到足够多的 6 个有效信号时,这意味着 6 位变量等于 6'h3F,我将有异步 FiFo 的新有效信号。 这种方法有没有潜在的风险?

我想我知道你想做什么,但图表和文字有些不完整,有些地方令人困惑。

第一个:
在您的图表中,您显示了具有 150MHz 输入时钟和 120MHz 输出时钟的同步 FIFO。 不可能!同步FIFO读写端口的时钟频率和相位必须相同。

但我认为你正在做的是等待每个 FIFO 都有一个字,然后同时读取所有内容。这里的症结在于:所有六个 FIFO 运行 都是同一个 150MHz 时钟吗?如果是这样,您可以制作您刚才描述的逻辑,它应该是来自 150MHz 时钟的 运行。从那里您可以产生一个读取脉冲,该脉冲从同步 FIFO 中获取数据并将它们写入异步 FIFO。

我已经把你的图改成了我认为你需要实现的:

请注意,这仅在以下情况下有效:
- 150 MHz 时钟都是一样的。
- 输入端的数据速率不太高。 (有效时间最多 120/150)


Post 编辑:
如果 150MHz 时钟相同,您还没有回答。如果不是,您应该使用 6 个异步 FIFO。在那种情况下,末端 FIFO 可以与 120 MHz 时钟同步 运行。
如果是同一个时钟,上面的方案逻辑会少一些。

"wait for six valids"逻辑
无论您使用什么,"wait for six valids" 逻辑都必须能够接受任何或所有同时到达。我对那部分逻辑还有另一个问题。您的波形显示一个时钟周期 'valid' (可能,我不知道时钟在哪里)。我从未见过来自 FIFO 的数据。

如果您的 FIFO 有一个 'empty' 信号,那会好得多,因为只要至少有一个值要读取,它就会保持低电平。当你可以阅读时,逻辑就变成了一个 6 输入 'NOR' 门。


使用空信号
您的 'valid' 信号似乎只高一个周期。这很难处理。大多数 FIFO 都有状态信号,如 'full' 和 'empty'。在您的情况下,您检查是否所有 FIFO 都有数据(所有空信号均为 0)。比你读他们。在 Verilog 中它看起来像:

wire [5:0] empty;
wire       can_read;
....
   asyncfifo fifo1 (
   ....
      .empty( empty[0] ),

   asyncfifo fifo2 (
   ....
      .empty( empty[1] ),

   // The above for each FIFO

   assign can_read = (empty==6'b000000);