FIFO时序理解——almost_empty、almost_full

为什么要设计almost_empty?

有Full、Empty,为什么还要加上Almost Full和Almost Empty?——不丢失数据和多读数据。

在写FIFO时,我们一般在时序逻辑中判断Full Signal:如果Full Signal为低,说明FIFO没满,于是拉高wr_en。但是这有时会出问题,如下图。

full:

所以,在FIFO使用时,使用Almost_full信号来控制FIFO的读满预警,尽量让FIFO有足够满预警裕量。例如,在usedw为32才是真的满了,你可以设为28的时候就给出满预警,可以保证设计的可靠和安全。

设置:

在这里插入图片描述

  • full:FIFO满的标记信号,为高电平时表示FIFO已满,不能再进行写操作。
  • empty:FIFO空的标记信号,为高电平时表示FIFO已空,不能在进行读操作。
  • usedw[](number of words in theFIFO):显示存储在FIFO中数据个数的信号,Note:(可以使用最高位作为FIFO的半满指示信号。)
  • almost full:接近满信号,当usedw信号的值大于或等于我们设置的almost full的值时,该信号置为高电平,是full信号的提前提示信号。
  • almost empty:接近空信号,当usedw信号的值小于我们设置的almost empty的值时,该信号置为高电平,是empty信号的提前提示信号。
  • Asynchronous clear:异步复位信号,用于复位所有输出状态端口。
  • Synchronous clear(flush the FIFO):同步复位信号,用于复位所有输出状态端口。
增加almost_full:

在这里插入图片描述

empty:

在读FIFO时,我们一般在时序逻辑中判断Empty Signal:如果Empty Signal为低,说明FIFO有数据可以读,于是拉高rd_en。但是这有时会出问题,如下图。

在这里插入图片描述

假设此时已经是FIFO的最后一个数据,由第6个clock的rd_en,在第7个clock中Empty Signal才会拉高,而在第7个clock中,时序逻辑输入的Empty Signal是上一个时钟的低电平信号,于是认为还有有效的FIFO数据,re_en继续为高。

有两种方法解决这个问题:

  • 下一个时钟再去判断Empty Signal;
  • 配合使用Almost Empty Signal来处理;

第一种方法每两个clock才能处理一个FIFO数据,想要快速地读出数据,这种方法显然不合适。
方法二的思路是:将FIFO的Empty和Almost_empty以及读使能配合起来使用,来保证能够连续读,并准确的判断FIFO空满状态,提前决定是否能启动读使能。

具体的实施办法是:

  • 当Empty为1,不能读;

  • 当Empty为0,Almost_empty为0时,可以连续读;

  • 当Empty为0,Almost_empty为1时,读一拍停一拍。如果上一拍读使能ed_en=1,那么不能读;如果上一拍读使能rd_en=0,可以读。

这样,在数据连续读写时,既能不间断的读出数据而又不导致FIFO为空后还错误的读出数据。

增加almost_empty:

在这里插入图片描述

一种错误示范:
  • almost_empty=0时,可以连读;
  • 当almost_empty=1同时wr_en=1,可以连读;
  • almost_empty=1,wr_en=0,读一拍停一拍。

在这里插入图片描述
在这里插入图片描述

实际上,这种是没有必要的。读只需要通过almost_empty来判断是否连读,不需要看wr_en。当alempty =1时,就慢慢读,读一拍停一拍。

读只需要通过almost_empty来判断是否连读,不需要看wr_en。当alempty =1时,就慢慢读,读一拍停一拍。

绘图工具:https://wavedrom.com/editor.html

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐