异步fifo的设计(三)

时间:2021-11-30 05:26:50

这篇文章主要讲述一下另一种异步fifo的设计方法,这种设计方法与上篇文章设计方法的区别在于不需要将读指针rd_ptr和写指针wr_ptr同步化。该论文中采取对读、写指针的异步比较并且异步判断出emptyfull状态位的值。

这里的读写指针还是采用格雷码计数器。由前面博客中讲到的格雷码计数器可知,有两种设计方法:一种设计只用到一组触发器,但是Grey-to-binary转换器,二进制增量器,Binary-to-grey转换器;另外一种设计用到两组触发器,一组触发器用来储存二进制数,另外一组用来出来二进制转换的格雷码值,这种设计方法能够减少组合逻辑,增加计数器的上限频率。其结构如下图所示:

异步fifo的设计(三)

 

下面讲一下空满状态的检测:空和满状态两种情况下,rd_ptrwr_ptr的值是相等,因此要区别这两种状态的话需要添加额外的bit位进行判断。当rd_ptrwr_ptrMSB不相等而其余位相等的时候是满状态;当rd_ptrwr_ptr的所有位都相等的时候是空状态。本篇文章中是将地址空间按照MSB和次MSB位划分为四块,通过对MMSB和次MSB的译码来确定当fifo的读指针和写指针相等的时候是趋向满状态还是空状态。

下图是wr_ptr滞后于rd_ptr1/4区域,为什么要在1/4区域的时候判断,这是因为这个时候wr_ptr即将和rd_ptr相等,所要先要确定一个大的方向,即趋向full状态还是empty状态,有了这个趋向之后,当wr_ptrrd_ptr相等的时候就可以对empty或者full进行相应的置位。

异步fifo的设计(三)


同理可以给出rd_ptr滞后wr_ptr的情况,这种情况下的译码条件还多了一个写复位wr_rst信号如图所示:

异步fifo的设计(三)


综合上两种情况,当direction=1的时候趋向full状态;当direction0的时候趋向empty状态。如下所示:

异步fifo的设计(三)


最终给出该种设计方法的框架图,如下所示:

异步fifo的设计(三)


这里详细说明一下空满状态的产生逻辑,如下图所示:比较模块会产生一个aempty_n,afull_n信号(产生的具体方法前面已经介绍了),然后这两个信号需要通过一个同步器。拿empty信号来分析:empty信号是在rclk下生效的,但是一旦wptr信号发生变化,empty信号值将不再有效,因此这种失效庆幸是在wclk下发生的,rclkwclk是异步时钟,如果不使用同步器的话可能会产生亚稳态,因此需要用同步器来稳定结果。对于full状态也是一样的道理。

异步fifo的设计(三)