【问题标题】:Arrays as buffer VHDL数组作为缓冲区 VHDL
【发布时间】:2015-04-25 19:22:36
【问题描述】:

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

如果我创建一个“大”数组来存储例如 1000 个条目。每个新的数据时钟我都会存储一个插槽。并且每个输出数据时钟我输出一个数据。如果这两个时钟同时出现会怎样?

例如:

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;

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

考虑到我不会丢失任何数据。

【问题讨论】:

  • 看看我在那里发布的答案:stackoverflow.com/questions/29505213/…
  • 这没问题,只要您几乎不会同时在同一个位置读写。您的 fpga 供应商应该有冲突的时间信息,但您的逻辑应该真正防止这种情况发生。我认为 Xilinx 在这种情况下保证写入,但是读取不是。
  • 它是您发布的代码,您可以转移您的收银机。但我想使用指针而不是移动寄存器。这可能吗?
  • @Drolet 我试过了,但它没有合成。如果我使用 elsif rise_edge(OUTPUT_DATA) 它只运行写入而不运行输出。
  • 移位单个数组好还是创建多个数组好?

标签: vhdl fpga


【解决方案1】:

您在这里询问的是跨时钟域 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

【讨论】:

  • 该问题假定具有独立读写指针Counter_INCounter_OUT 的双端口内存。唯一会导致潜在亚稳态问题的时钟跨域问题发生在同时读取和写入同一位置时。因为 FIFO 握手信号(例如 FULL、EMPTY 等)需要不可能发生的时钟域交叉。在受影响的握手信号允许写入不再是 FULL FIFO 或从不再是 EMPTY FIFO 读取之前,有一个以时钟为单位的延迟。你的叙述远未完成。有参考吗?
  • 它不完整,因为要完全解释 CDC FIFO 设计的所有方面需要一篇冗长的文章。我已添加参考以供进一步阅读。
  • 关于该主题的另一篇论文是“欺骗同步器的十四种方法”,webee.technion.ac.il/~ran/papers/Sync_Errors_Feb03.pdf
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-14
  • 2013-08-11
  • 2013-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多