零、前言
关于异步FIFO如何设计请参考之前的一篇文章:手写异步FIFO。
关于异步FIFO的空满现象可以参考:你真的理解异步FIFO读写中的空满现象吗?
一、格雷码的作用
格雷码的每两个相邻码字只有1bit的变化,将多bit的地址转换成对应的格雷码然后进行跨时钟域的传递,就可以直接使用两级flop进行同步。并且由于只有一个bit变化,那么即使采样错误也只有一种错误的可能,也即1变成了0或者0变成了1,不会出现其他各种不稳定的状态。降低了亚稳态发生的概率,以及发生逻辑冒险的概率及其带来的影响。
而且应用到异步FIFO的地址指针中,采样到的只有一个bit不同的错误值,其实也是正确的。例如在使用格雷码时,假设写指针从001->011,那么在读时钟域采样到的写指针的值只可能是001->001->011, 或者001->011->011,而不会出现除了这两个值以外的值。如果采样到011