什么是异步FIFO?
FIFO是一种先进先出的数据缓冲器,与普通的存储器相比,没有外部地址线,其内部地址线自加1,因此FIFO只能顺序写入顺序读出。
异步FIFO的意思就是FIFO的读写时钟是异步的,因此可用于两个不同时钟系统之间的数据传输。
异步FIFO的组成及原理
异步FIFO主要有四个部分,读写时钟、读写指针、读写数据、空满标志。
复位的时候,读写指针都为0,读指针总是指向要读的位置,读完自加1,写指针总是指向要写的下一个位置,写完自加1。当写指针越过FIFO的最后一个地址,折回来赶上读指针时,说明此时FIFO写满了,当读指针越过FIFO的最后一个地址,折回来赶上写指针时,说明此时FIFO读空了。
由于空满的判断条件都是写指针等于读指针,因此为了区分是写满状态还是读空状态,还需要在读写指针前加一位最高位。使读写指针在越过最后一个地址时,这个最高位加1。这样,初始时,读写指针的最高位都是0。当写指针越过FIFO最后一个地址时,写指针的最高位为1,而读指针的最高位还是0,此时,除了最高位不一样,读写指针其它位都一样,这种情况代表写满。当读指针也越过最后一个地址时,读指针的最高位为1,此时读写指针的所有位,包括最高位都相等,这种情况代表读空。
由于读写指针的比较要在同一个时钟下进行,因此还存在指针跨时钟域的问题,如果指针用的自然码编码,则在跨时钟域时不同位的变化可能不是同时发生,导致出现了一些中间状态,对指针比较产生影响。如果用格雷码编码,一次只有一个位变化,这样即使采错了,也只是出现当前编码或前一个编码,不会出现其他状态(?为什么就没关系了)。因此指针采用格雷码编码。
回到刚才的自然码判断空满,读写指针全等时表示空,除最高位相反,其它相等表示满,即
0111--0111 空
0111--1111 满
若是转成格雷码,上面两个例子对应的就是
0100--0100 空
0100--1000 满
所以格雷码下判断空满的条件是全等表示空,最高位和次高位相反,其它位相等表示满。
参考文章:
https://blog.csdn.net/alangaixiaoxiao/article/details/81432144
http://bbs.eetop.cn/thread-857651-1-1.html?_dsign=1ad959fa
https://blog.csdn.net/dongdongnihao_/article/details/79859520