【发布时间】:2018-04-27 22:56:26
【问题描述】:
我有 2 个不同的时钟,一个用于阅读,一个用于书写。我正在使用格雷码将指针与另外 2 个触发器同步,以便在输入信号的不同时钟上同步。
我读过的文章指出了如何使用格雷码通过比较满状态的 2MSB 和空状态的相等性来确定满和空信号。
但是,我需要获取缓冲区中元素的数量,而不仅仅是完整或空信号。这可能与格雷码有关吗?
【问题讨论】:
我有 2 个不同的时钟,一个用于阅读,一个用于书写。我正在使用格雷码将指针与另外 2 个触发器同步,以便在输入信号的不同时钟上同步。
我读过的文章指出了如何使用格雷码通过比较满状态的 2MSB 和空状态的相等性来确定满和空信号。
但是,我需要获取缓冲区中元素的数量,而不仅仅是完整或空信号。这可能与格雷码有关吗?
【问题讨论】:
计算两个格雷码值之间的差异最容易理解的方法是将它们与一个公共时钟同步,将它们转换为二进制,然后对它们进行普通的二进制减法。虽然可以设计一个完全组合的电路来计算两个格雷码值之间的差异,如果一个特定值的所有位都是稳定的,并且另一个值中的一位发生变化,那么只有一位输出会发生变化,而所有其他的都会保持稳定,这样的设计会比简单地同步两个计数器、转换为二进制和减法的设计复杂得多。
【讨论】:
您在评论中询问了通用时钟,并提到您的深度不是 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 的填充级别。
如果读写端都需要该级别,则必须执行此过程两次,在每个时钟域中执行一次。
【讨论】: