数组作为缓冲VHDL

时间:2015-04-24 15:21:17

标签: vhdl fpga

我需要在VHDL中创建一个FIFO缓冲区。我需要使用二维数组来存储数据,如(数据的数量)(n位数据)。

如果我创建一个单独的“大”数组,例如存储1000就存储了。每个新数据时钟我存储一个插槽。每个输出数据时钟I输出一个数据。如果这两个时钟同时出现,会发生什么?

例如:

if rising_edge(INPUT_DATA) then
                    Register_Array(Counter_IN) <= DataIN;
                    Counter_IN <= Counter_IN + 1;
end if;
if rising_edge(OUTPUT_DATA) then
                    DataOUT <= Register_Array(Counter_OUT);
                    Counter_OUT <= Counter_OUT + 1;
end if;

如果可以创建这样的过程,如果两个时钟同时接近会发生什么?

考虑一下我不能丢失任何数据。

1 个答案:

答案 0 :(得分:2)

您在这里询问的是时钟域跨越FIFO或CDC FIFO。 时域跨越FIFO非常难以设计。存在许多陷阱,其中大部分都无法通过模拟进行检查。

至于你的数组,你应该使用std_logic_vector数组,就像@Nicolas Roudel链接的答案一样。

但这仍然远离功能正常的CDC FIFO。您还需要灰色格式的读取和写入指针,灰色到bin指针转换,两个灰色指针的时钟域交叉,空和完整指示,读取和写入信号,防止合成器打破时钟域交叉的适当属性,以及时间限制。 所有这一切都需要正确地防止你提出的问题:“当两个时钟几乎同时出现时会发生什么?”

当两个时钟几乎同时出现时发生的事情被称为“亚稳态”,它会在你的设计中引起各种不良和不可预测的事情。

如果您在CDC FIFO的设计中只有一件事是错误的,那么您的设计在仿真中甚至可以在硬件中运行良好。大部分时间........: - )

所有FPGA供应商都有现成的CDC FIFO,您可以使用它们。我强烈建议初学者考虑将现成的FIFO用于生产设计。 但与此同时,设计CDC FIFOa是了解时钟域交叉和可转移性的一个很好的挑战。

这是您可以找到有关如何处理时钟域交叉的信息的众多页面之一:https://filebox.ece.vt.edu/~athanas/4514/ledadoc/html/pol_cdc.html 这里还有一个相关的stackexchange答案:https://electronics.stackexchange.com/questions/97280/trying-to-understand-fifo-in-hardware-context