3.2 格雷码(Gray code)计数器
设计异步FIFO的原则是安全可靠地把数据从一个时钟域传输到另一个时钟域。如果用一个相对于计数器时钟是异步的时钟来取样计数器的值,就要考虑计数器的每一位在哪个范围内变化,每一位都有机会同时发生变化,比如从FFFF变化到0000,这时每个单独的位都处于亚稳态。这种变化意味着读数有可能是0000~FFFF之间的任意一个值。这种情况下FIFO将无法正常工作,于是设计一个格雷码来表示的计数器,
因为格雷码是最小距离码,相邻的码元只有1位不同,它可以避免因延迟不一致而引起的毛刺现象。
计数器由触发器组和累加器组成,处理格雷码计数器的办法为:将格雷码转换为二进制码元,然后加1,再将它转换回格雷码并存储,这是解决产生N位格雷码算法棘手问题的一个办法。异步FIFO的写地址和读地址由格雷码计数器来实现计数,读/写指针均用格雷码来表示,格雷码计数器指针原理如图4所示,当FIFO非空或者非满时,读指针或者写指针实现加1操作。
3.3 一种新颖的设计方法产生空满标志
空满标志位是通过比较读/写指针来判断的,空满标志的判断方法:对于二进制地址来说,如果RAM大小为M,那么它需要的地址位宽度为N=log2 M。假设双口RAM大小是8 B,所需寻址地址位宽度是3 b。如果读/写指针均用3位来表示的话,那么当读/写指针相等时,无法判别是读时针追上了写时针造成读空还是写时针追上了读时针造成写满,这样就无法正确判断空、满标志。为了方便的区分空、满,读/写指针各增加1位,取地址指针宽度为log2M+1,寻址中没有使用的最高位地址标记为MSB,即读/写指针为N+1位,寻址范围为2n。表1为格雷码表示的4位地址指针。