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

Verilog 格雷码fifo获取缓冲区中的元素数,verilog,counter,fifo,Verilog,Counter,Fifo,我有两个不同的钟,一个用来读书,一个用来写字。我使用格雷码与另外两个触发器同步指针,以便在输入信号的不同时钟上进行同步 我读过的文章说明了如何通过比较2MSB的满状态和相等的空状态来使用格雷码确定满信号和空信号 但是,我需要得到缓冲区中元素的数量,而不仅仅是满信号或空信号。这可能与格雷码有关吗?计算两个格雷码值之差的最容易理解的方法是将它们与一个公共时钟同步,将它们转换为二进制,然后对它们执行普通的二进制减法。虽然可以设计一个完全组合的电路来计算两个格雷码值之间的差,如果一个特定值的所有位都是稳

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

我读过的文章说明了如何通过比较2MSB的满状态和相等的空状态来使用格雷码确定满信号和空信号


但是,我需要得到缓冲区中元素的数量,而不仅仅是满信号或空信号。这可能与格雷码有关吗?

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

在一篇评论中,您询问了公共时钟,并提到深度不是二的幂

第一:编辑你的原始帖子,添加问题和信息

第二:在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
计数器格雷码
000       000
001       001
010       011
011       010
100       110
101       111
110       101

111 100我有点搞不清楚该用什么作为普通时钟。我只有一个读写时钟。另外,当你说“转换为二进制”和“减法”时,由于我的深度不是2的幂,你如何在没有太多额外逻辑的情况下处理翻滚的情况。@Roarer:无论什么电路将要使用差分,通常都会被计时;将源和目标格雷码计数器同步到该时钟将允许同步进行其他计算。将四舍五入到下一个二模幂将使事情比使用非二模幂容易得多,即使你不需要完整的深度。所以让我们假设差分是读取时钟所需要的。因此,我必须为写灰色指针插入一个寄存器来同步它们。因此,与读取指针相比,写入延迟1个时钟周期。这就是你所说的将格雷码同步到另一个时钟域的意思吗?(只是一个始终在读时钟上运行的块,我将写指针从读时钟分配到写时钟?@Roarer:这是一个想法,但是可靠的同步需要双寄存器,所以第一次使用写数据的机会是在读域的第三个时钟周期。如果写入发生在非常接近读取时钟边缘的位置,则第一个寄存器可能会锁定亚稳态条件;如果该寄存器的输出影响到多个寄存器的输入,则一些寄存器可能会认为写入已发生,而其他寄存器可能不会。将第一个寄存器馈送到同步器中的第二个寄存器意味着所有内容都将要么看到写入已发生,要么……看到写入未发生。使用一个同步器通常可以工作,但可能会导致偶尔出现奇怪的行为。有几种形式的单位更改代码,其大小为两个非幂次。例如,三位计数器序列000-001-011-111-110-100。使用双模的幂将使其他地方的事情变得更容易,但这不是绝对必要的。我知道,我曾想过要提到它,但最后我没有提到。所以你是对的,我对此有点困惑。问题有两个方面:1/Its从二进制计数器生成较短的序列要困难得多,特别是对于8或9位计数器。2/它的用途有限,因为不能用于任意深度。e、 g.你不能生成一个3序列的格雷码。生成一个任意偶数模的、长度等于下一个二次方的位变化计数器并不困难。可以通过执行“除以六”并对每个计数值解码两种模式来适应“除以三”。另一方面,对两个模的幂进行模减法比对非两个模的幂进行模减法要便宜得多。