异步FIFO的异步复位顺序与复位释放顺序?

异步FIFO的异步复位顺序与复位释放顺序?

如下图所示,FIFO所用的存储结构为1R1W的双端口RAM,RAM存在读写冲突问题时,读出的数据会是不稳定状态,即当读操作和写操作同时发生且读写地址相同则RAM会发生读写冲突。

注意:在FIFO正常工作状态,内部存储RAM是不会发生读写冲突的,只有当不合理复位操作才会导致FIFO内部RAM发生读写冲突。

图中的两个复位:wrst_n和rrst_n均为异步复位


1、那么在FIFO初始化过程中,是先复位写端口(wrst_n=0)还是先复位读端口(rrst_n=0)呢?

先复位读端口,后复位写端口,能够有效避免FIFO内部RAM读写冲突。

这里有朋友困惑了,为什么先复位写端口会出现读写冲突呢?

请看下图:

假设FIFO深度为8,则写地址waddr为3位,则在写地址产生模块(FIFOwptr)中waddr[2:0]则对应3个寄存器,每个寄存器的复位信号的延时不完全一致,所以存在有些复位信号早到达,有些晚到达,造成在写时钟采样沿发生非理想跳变,如waddr从3’b110跳变到3’b010,从而RAM输入的写地址从3’b110跳变到3’b010。

 

如图所示,waddr[2]对应的复位信号早于其他地址位到达,且在时钟采样沿前跳变,本应写入RAM的地址应该为3'b110,应为复位信号的影响,现在跳变为了3'b010,若此时读端口的地地址为3'b010,此时发生RAM读写冲突,读出的数据不确定。此时的不确定数据会先后级传递,造成不确定的电路异常。

而在FIFO正常状态(FIFO中有数据的情况),写数据waddr一直大于读地址raddr,因而不会发生读写冲突。

先复位读端口则写地址大于读地址,则不会发生读写冲突。

2、在复位释放时,先释放读端口还是先释放写端口?

先释放读端口,后释放写端口,能够避免FIFO溢出但是没有上报的情况。

在芯片初始化完成后,芯片内部各模块是处于复位状态,因此需要依次复位释放,其中就包含了FIFO的复位释放。

 在IC设计中,我们是不允许FIFO溢出的,但是一旦有溢出必须有中断上报机制。

在一些FIFO设计中,读端口非空即读,且读时钟频率大于写时钟,此种情况下,在正常工作状态,FIFO不会溢出,因此此类FIFO没有反压流控和溢出中断上报机制。

若先复位释放写端口,则数据会不断写入到FIFO中,而此时读端口没有释放,这段时间内可能会发生FIFO溢出并且没有任何信息上报,因此不合理。

猜你喜欢

转载自blog.csdn.net/icxiaoge/article/details/80639443