这篇文章主要讲述一下另一种异步fifo的设计方法,这种设计方法与上篇文章设计方法的区别在于不需要将读指针rd_ptr和写指针wr_ptr同步化。该论文中采取对读、写指针的异步比较并且异步判断出empty和full状态位的值。
这里的读写指针还是采用格雷码计数器。由前面博客中讲到的格雷码计数器可知,有两种设计方法:一种设计只用到一组触发器,但是Grey-to-binary转换器,二进制增量器,Binary-to-grey转换器;另外一种设计用到两组触发器,一组触发器用来储存二进制数,另外一组用来出来二进制转换的格雷码值,这种设计方法能够减少组合逻辑,增加计数器的上限频率。其结构如下图所示:
下面讲一下空满状态的检测:空和满状态两种情况下,rd_ptr和wr_ptr的值是相等,因此要区别这两种状态的话需要添加额外的bit位进行判断。当rd_ptr和wr_ptr的MSB不相等而其余位相等的时候是满状态;当rd_ptr和wr_ptr的所有位都相等的时候是空状态。本篇文章中是将地址空间按照MSB和次MSB位划分为四块,通过对MMSB和次MSB的译码来确定当fifo的读指针和写指针相等的时候是趋向满状态还是空状态。
下图是wr_ptr滞后于rd_ptr1/4区域,为什么要在1/4区域的时候判断,这是因为这个时候wr_ptr即将和rd_ptr相等,所要先要确定一个大的方向,即趋向full状态还是empty状态,有了这个趋向之后,当wr_ptr和rd_ptr相等的时候就可以对empty或者full进行相应的置位。
同理可以给出rd_ptr滞后wr_ptr的情况,这种情况下的译码条件还多了一个写复位wr_rst信号如图所示:
综合上两种情况,当direction=1的时候趋向full状态;当direction为0的时候趋向empty状态。如下所示:
最终给出该种设计方法的框架图,如下所示:
这里详细说明一下空满状态的产生逻辑,如下图所示:比较模块会产生一个aempty_n,和afull_n信号(产生的具体方法前面已经介绍了),然后这两个信号需要通过一个同步器。拿empty信号来分析:empty信号是在rclk下生效的,但是一旦wptr信号发生变化,empty信号值将不再有效,因此这种失效庆幸是在wclk下发生的,rclk和wclk是异步时钟,如果不使用同步器的话可能会产生亚稳态,因此需要用同步器来稳定结果。对于full状态也是一样的道理。