格雷码fifo获取缓冲区中的元素数量

时间:2018-04-27 22:56:26

标签: verilog counter fifo

我有2个不同的时钟,一个用于阅读,一个用于写入。我使用格雷码将指针与另外两个触发器同步,以便在输入信号的不同时钟上进行同步。

我读过的文章指出了如何使用格雷码来确定完整和空信号,方法是将2MSB与完全状态进行比较,并将空状态相等。

但是,我需要获取缓冲区中的元素数量,而不仅仅是完整信号或空信号。灰色代码可以吗?

2 个答案:

答案 0 :(得分:0)

计算两个灰度代码值之间差异的最容易理解的方法是将它们与公共时钟同步,将它们转换为二进制,然后对它们进行普通的二进制减法。虽然有可能设计一个完全组合的电路,它可以计算两个格雷码值之间的差异,使得如果一个特定值的所有位都是稳定的,而另一个值中的一位变化,则只有一位在输出中会改变,所有其他的都会保持稳定,这样的设计会比简单地同步两个计数器,转换为二进制和减去的设计复杂得多。

答案 1 :(得分:0)

在评论中,您询问共同的时钟,并提到您的深度不是2的幂。

首先:编辑原始帖子并添加该问题和信息。

第二:在a-同步FIFO中没有公共时钟。写操作都是从写时钟运行的。读操作都是从读时钟开始运行的。关键部分是在时钟域之间交换信息。这就是灰色代码的用武之地。

第三:a同步FIFO使用格雷码,因为一次只有一个位改变。重要的是,该过程是循环的。因此,您的姓氏和第一个值之间的差异也只有一位:

Counter   Gray-code
  000       000
  001       001
  010       011
  011       010
  100       110
  101       111
  110       101
  111       100 <-- Last 
  000       000 <-- First again

当且仅当深度(以及计数器)是2的幂时,这是有效的。因此,a-同步FIFO 始终的深度为2的幂。

如果必须具有不同的深度,则可以在开头或结尾添加同步FIFO。但是如果你考虑一下:FIFO只是一个弹性缓冲区。如果它是例如的行为16个条目深或12个条目没有不同,除此之外,您有可能存储更多值。

最后:正如supercat所说:你从二进制转换为格雷码,交叉到另一个时钟域,然后再将格雷码转换为二进制。 在结束时钟域中,您可以安全地比较读取和写入计数器,以确定FIFO的填充级别 如果读取和写入两侧都需要该级别,则必须在每个时钟域中执行此过程两次。