【问题标题】:Gray code fifo getting number of elements in buffer格雷码 fifo 获取缓冲区中的元素数
【发布时间】:2018-04-27 22:56:26
【问题描述】:

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

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

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

【问题讨论】:

    标签: verilog counter fifo


    【解决方案1】:

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

    【讨论】:

    • 我对用什么作为通讯时钟有点困惑。我只有一个读写时钟。此外,当您说转换为二进制和减法时,由于我的深度不是 2 的幂,您如何处理翻转情况而不需要太多额外的逻辑。
    • @Roarer:无论电路将使用什么差异,通常都会有时钟;将源格雷码计数器和目标格雷码计数器同步到该时钟将允许同步完成其他计算。舍入到下一个二次幂模数比使用非二次幂模数更容易。即使您不需要完整的深度。
    • 所以可以说读取时钟需要差异。所以我必须为写灰色指针插入一个寄存器来同步它们。因此,与读取指针相比,写入延迟了 1 个时钟周期。这就是将格雷码同步到另一个时钟域的意思吗? (只是一个在读时钟上运行的始终块,我将读时钟中的写指针分配给写时钟?)
    • @Roarer:是这样的想法,但是可靠的同步需要双寄存器,因此对写入数据进行操作的第一个机会是在读取域中的第三个时钟周期。如果写操作发生在读时钟边沿附近,第一个寄存器可能会锁存一个亚稳态;如果它的输出影响到多个寄存器的输入,那么有些人可能会认为写入已经发生,而其他人可能不会。让第一个寄存器馈送到同步器中的第二个寄存器意味着一切都将看到写入已经发生,或者......
    • ...看到它没有。使用单个同步器通常会起作用,但可能会导致偶尔出现奇怪的行为。
    【解决方案2】:

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

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

    第二:在异步 FIFO 中没有公共时钟。写操作都是从写时钟运行的。读操作都是从读时钟运行的。关键部分是在时钟域之间交换信息。这就是格雷码的用武之地。

    第三:异步 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 的幂时才有效。因此,异步 FIFO总是 的深度是 2 的幂。

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

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

    【讨论】:

    • 存在非二次方大小的单位变化码形式。例如,三位计数器序列 000-001-011-111-110-100。使用二次方的模数会使其他地方的事情变得更容易,但并不是绝对必要的。
    • 我知道,我想提它,但我最终没有。所以你是对的,我对此有点混淆了。问题有两个方面:1/ 从二进制计数器生成更短的序列要困难得多,尤其是对于 8 位或 9 位计数器。 2/ 它的用途有限,因为您不能将其用于任意深度。例如你不能做一个3序列的格雷码。
    • 不难生成任何偶数模的单位变化计数器,其长度与二的下一个幂相同。除以三可以通过对每个计数值进行除以六和解码两种模式来实现。另一方面,对 2 的幂模进行模减等操作比对非 2 的幂模进行模减要便宜得多。
    猜你喜欢
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 2013-01-05
    • 1970-01-01
    相关资源
    最近更新 更多