数组作为缓冲区 VHDL

Arrays as buffer VHDL

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

如果我创建一个 "big" 数组来存储例如 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;

如果可以创建这样的进程,如果两个时钟同时接近会怎样?

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

你在这里问的是时钟域交叉FIFO,或者CDC FIFO。 跨时钟域的 FIFO 设计起来非常困难。陷阱很多,大部分都无法通过仿真检查出来。

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

但这离正常运行的 CDC FIFO 还很远。您还需要灰度格式的读写指针、灰度到 bin 指针的转换、两个灰度指针的时钟域交叉、空和满指示、读写信号、防止合成器破坏时钟域交叉的适当属性,以及时序约束。 所有这些都是正确保护您所询问的事情所需要的:"What happens when two clocks occur at almost the same time?"

当两个时钟几乎同时发生时发生的事情称为"metastability",它会导致您的设计中出现各种糟糕且不可预测的事情。

如果您在 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