异步FIFO中读写指针为什么要用格雷码

本文探讨了异步FIFO中采用格雷码的原因及如何避免2进制指针在空满状态判断时的问题。通过对比2进制指针与格雷码的特点,解释了格雷码如何确保在亚稳态条件下正确地判断FIFO的空满状态。
首先要了解的是异步FIFO使用格雷码的唯一目的就是“即使在亚稳态进行读写指针抽样也能进行正确的空满状态判断”。


那么典型的判断方法是怎样进行的呢?以满状态判断为例,先要对读指针(属于读时钟域)在写时钟域进行抽样,然后才能与写指针进行比较,如果写指针赶上了读指针,说明已经写满,写操作必须暂停。


接下来说说为什么2进制指针不适合做空满判断。事实上2进制读指针在增减时,经常发生多位突变,比如6位地址111111会在下一时刻变成000000,在实际电路中,这个变化过程要持续很长一段时间,会由111111经历6个状态转移到达000000。比如111111-> 101111 -> 100111 ->100110 -> 100100 -> 000100-> 000000。由于写时钟与读时钟不同步,异步的写时钟很可能会在状态不稳定的中间某个状态抽样,这样就会得到错误的读指针,进而做出错误的状态判断,导致系统异常。而且由于多位同时突变,凭借概率论常识可知发生错误的可能性很大。


那么怎样才能避免这个问题的发生呢?显然,在中间状态抽样,这个是不可避免的,这是异步系统天生的缺陷。我们的目标是:即使在中间状态抽样,也要不影响空满状态的判断。符合这个要求的编码方法是每次只能有1个比特发生改变。为什么这么说呢?因为当只有一个比特发生改变时,即使在中间状态抽样,其结果也不外乎两种:递增前原指针和递增后新指针。显然递增后新指针是最新情况的反映,如果抽样到这个指针,那么和我们的设计预期是一致的,如果抽样到递增前的原指针,会有什么结果呢?假设现在抽样读指针,那么最坏的情况就是把“不满”判断成了“满”,使得本来被允许的写操作被禁止了,但是这并不会对逻辑产生影响,只是带来了写操作的延迟。同样的,如果现在抽样写指针,那么最坏的情况就是把“不空”判断成了“空”,使得本来被允许的读操作被禁止了,但是这也不会对逻辑产生影响,只是带来了读操作的延迟。

显然每次只变化1比特的编码方案可以有效解决中间状态下空满状态的判断问题,格雷码就是这样的一种编码。
异步FIFO中,使用格雷码作为读写指针的主要原因是减少跨时钟同步过程中可能出现的亚稳态问题,并确保指针在不同时钟之间同步时的稳定性。格雷码的设计特性决定了其相邻两个数值之间仅有一位发生变化,这使得在跨时钟采样时,即使发生亚稳态,也只会导致某一位的错误,从而避免多位同时翻转可能引起的错误状态[^3]。 ### 格雷码读写指针的约束方法 1. **单比特翻转特性** 格雷码的相邻值之间仅有一位发生变化,这使得在将读写指针从一个时钟同步到另一个时钟时,采样到的指针值最多只会有一位是错误的。这种特性确保了即使在同步过程中出现亚稳态,也不会导致指针值出现跳跃式的错误,从而避免了误判满/空标志[^3]。 2. **同步器设计** 为了进一步减少亚稳态的影响,通常采用两级寄存器(双触发器)对读写指针进行同步处理。第一级寄存器用于捕获跨时钟的信号,第二级寄存器用于稳定该信号。这种方式可以显著降低亚稳态传播的概率,确保同步后的指针值更接近实际值[^2]。 3. **保守的满/空判断机制** 由于同步过程会引入延迟,导致同步后的指针值可能滞后于实际值,因此满/空标志的判断需要采取保守策略。例如,在写时钟判断满标志时,如果同步后的读指针滞后于实际读指针,则可能导致“虚满”现象;而在读时钟判断空标志时,同步后的写指针也可能滞后,导致“虚空”现象。尽管如此,这种保守判断不会影响FIFO的功能正确性,只是可能略微降低性能[^5]。 4. **地址总线同步偏差控制** 为了确保格雷码的优势不被削弱,地址总线的同步偏差必须控制在一个时钟周期以内。如果地址总线的同步偏差超过一个周期,可能会导致多位同时发生变化,从而失去格雷码的优势,增加误判风险[^4]。 5. **格雷码与满/空标志的生成** 满标志通常在写时钟生成,通过比较同步后的读指针与写指针来判断是否已满;空标志则在读时钟生成,通过比较同步后的写指针与读指针来判断是否已空。由于写指针同步到读时钟时可能存在滞后,因此空标志可能会提前触发,但这不会影响FIFO的功能正确性[^2]。 ### 示例代码:格雷码与二进制码转换 ```python def binary_to_gray(n): return n ^ (n >> 1) def gray_to_binary(n): b = n while (n >> 1): b ^= n >> 1 n >>= 1 return b ``` ### 总结 通过使用格雷码作为读写指针编码,并结合同步器设计与保守判断机制,异步FIFO能够在跨时钟同步过程中有效避免亚稳态问题。这种设计不仅提高了系统的稳定性,还确保了FIFO在各种时钟频率差异下的功能正确性。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值