我的verilog固件图如下:
在我的图中,我有6个16位数据,6个valid_data是由生成函数生成的6个相同模块的输出。 valid_data的功能是在将16位数据写入Xilinx提供的FiFo(Native和IP内核)时通知。因为我的固件中有两个时钟域,所以我使用同步FiFo作为两个时钟域之间的握手,以确保在时钟域120 MHz中正确获得6个16位数据。
之后,我将6个同步FiFo中的6个16位输出数据放入一个96位变量。我想使用来自6个同步Fifos的6个有效信号来生成新的有效信号,以通知异步FiFo 96位数据已准备好写入异步FiFo。但我有一个问题:
我认为6个16位数据同时进入FIFO,因此Synchrono of Fifo的输出需要同时出现。 但是当我使用chipcope检查有效信号时,我不明白为什么有效信号输出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的新有效信号。 此方法是否存在潜在风险?
答案 0 :(得分:1)
我想我知道你要做的是什么,但图表和文字是一些不完整的地方,并且令人困惑。
第一:
在您的图表中,您显示了具有150MHz输入时钟和120MHz输出时钟的同步FIFO。 这是不可能的!同步FIFO读写端口上的时钟频率和相位必须相同。
但我认为你正在做的是等待每个FIFO有一个单词然后读出然后全部同时出现。这里的关键是:所有六个FIFO都运行相同的150MHz时钟吗?如果是这样,你可以制作你刚才描述的逻辑,它应该从150MHz时钟运行。由此产生一个读脉冲,从同步FIFO中获取数据并将其写入异步FIFO。
我已经将您的图表更改为我认为您需要实现的内容:
请注意,这只适用于:
- 150 MHz时钟都是一样的
- 输入的数据速率不是太高。 (有效时间最长为120/150)
发布编辑:
如果150MHz时钟相同,你还没有回答。如果不是,您应该使用6个异步FIFO。在这种情况下,结束FIFO可以从120 MHz时钟同步运行
如果它是相同的时钟,上面的方案将是更少的逻辑。
“等待六个人”逻辑
无论你使用什么,“等待六个valid”逻辑必须能够接受任何或所有同时到达。我对这部分逻辑有另一个问题。波形在一个时钟周期内显示“有效”(可能,我不知道时钟在哪里)。我从未见过来自FIFO的那个。
如果您的FIFO有一个“空”信号会更好,因为只要至少有一个值可读,它就会保持低电平。您可以读取的逻辑变为6输入“NOR”门。
使用空信号
您的“有效”信号似乎仅在一个周期内很高。这很难处理。大多数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);