前言:如果使用二进制编码,FIFO的空满状态下的指针都是相同的,区别是前者发生在复位操作时,或当读地址读出FIFO中最后一个字,然后读地址追上了写地址; 后者当写指针转了一圈,折回来(wrapped around)又追上了读指针,已经读过的地址空间再次被写地址写入。
相关文章:
不是诗人:第三章 同步电路与跨时钟域电路设计_ FIFO空满信号生成机制与深度设计方法zhuanlan.zhihu.comgray码进行编码,如何判断FIFO空满?
1、二进制下区分满状态和空状态的方法:
在地址中添加一个额外的位(extra bit),当写指针增加并越过最后一个FIFO地址时,就将写指针这个未用的MSB加1,其他位回零。对读指针进行同样的操作。此时,对于深度为
满:如果两个指针的MSB不同,而其他位相同,说明写指针比读指针多折回了一次;如r_addr = 0000,而w_addr = 1000为满。
空:如果两个指针的MSB相同,则说明两个指针折回的次数相等。其余位相同,说明为空
2、若使用gray码进行同步,如何判断空满?
空:依据两者完全相等,包括MSB
满: 必须同时满足以下3条:
![05230252d9921e66b308d232e2ae53ab.png](https://i-blog.csdnimg.cn/blog_migrate/54686ce55904cddba1df2cbe4bdb34f6.jpeg)
- 写指针(wptr)和同步过来的读指针(rptr)的MSB不相等,因为wptr必须必rptr多折回一次。(同二进制编码)
- 写指针(wptr)和同步过来的读指针(rptr)的次高位(第三个bit位)不相等,如上图位置7和位置15,转化位二进制对应的时0111和1111。二进制下的111相等,代表同一位置。
- 剩下的其余位完全相同,即第二个bit位和第一个bit位,如图中的位置6和位置14,位置5和位置13
空满标志的判断方法是否有漏洞?
1、判断空满机制
- rptr同步两个“wclk”后,在wclk时钟域与wptr进行比较,生成full信号
- wptr同步两个“rclk”后,在rclk时钟域与rptr进行比较,生成empty信号
2、空满机制分析
假设读写时钟频率接近
![939f7420098bca942b46e11c8d3a3c86.png](https://i-blog.csdnimg.cn/blog_migrate/ce1cfe0ca4064ab92fb0ab8e07a9303d.jpeg)
- 上图rptr同步两个"wclk"后,在wclk时钟域与wptr进行比较,比较相同,符合条件,生成full信号。
- 但在rptr和wptr进行比较时, rptr已经更新为5.当FIFO认为自己满的时候,读地址又从里面读走了两个数据,即FIFO并没有真正的满
因此:
- 对于full信号的生成机制,同步后的读地址一定是小于或者等于当前的读地址,所以此时判断FIFO为满不一定是真满,这样更保守;
- Empty信号的机制同样成立,“空”时,不一定是真“空”
3、总结
异步FIFO通过比较读写地址进行满空判断,但是读写地址属于不同的时钟域,所以在比较之前需要先将读写地址进行同步处理,此机制保证了FIFO在空满极限情况下,依然留有余量,存在一定的冗余空间,以防写满溢出,读空多读的情况。