跳转到主要内容

异步FIFO设计前传:同步FIFO的设计思路

judy 提交于

本文转载自:<span id="profileBt"><a href="https://mp.weixin.qq.com/s/K4VlYX1RUahg1WvGzLvP3Q"&gt; 无界逻辑(微信号:wujieluoji)微信公众号</a></span>

FIFO:First in, first out,先进先出;其主要作用是:数据缓存,位宽转换,时钟域处理,通常作为模块之间的桥梁,存在与逻辑设计中。
<center><img src="https://cdn.eetrend.com/files/2023-09/%E5%8D%9A%E5%AE%A2/100574250-3168…; alt=""></center>

典型同步FIFO由两部分组成:

1.FIFO控制器;

2.FIFO存储实体(Memory、Reg);

其中FIFO控制器包括FIFO写控制逻辑和FIFO读控制逻辑;

FIFO写控制逻辑主要功能:

<li>产生FIFO写地址</li>

<li>写有效信号</li>

<li>同时产生FIFO满</li>

<li>写溢出等状态信号</li>

FIFO读控制逻辑主要功能:

<li>产生FIFO读地址</li>

<li>读有效信号</li>

<li>同时产生FIFO空</li>

<li>读溢出等状态信号</li>

<center><img src="https://cdn.eetrend.com/files/2023-09/%E5%8D%9A%E5%AE%A2/100574250-3168…; alt=""></center>

如下图所示,FIFO读写过程的地址控制:

1.当FIFO初始化(复位)时wr_addr与rd_addr同指到0x0,此时FIFO处于空状态;
<center><img src="https://cdn.eetrend.com/files/2023-09/%E5%8D%9A%E5%AE%A2/100574250-3168…; alt=""></center>

2.当FIFO进行写操作时,wr_addr递增,与rd_addr错开,此时FIFO处于非空状态;
<center><img src="https://cdn.eetrend.com/files/2023-09/%E5%8D%9A%E5%AE%A2/100574250-3168…; alt=""></center>

wr_addr增加到FIFO DEPTH时,发生卷绕,追上了rd_addr,此时FIFO满;
<center><img src="https://cdn.eetrend.com/files/2023-09/%E5%8D%9A%E5%AE%A2/100574250-3168…; alt=""></center>

3.当FIFO进行读操作时,fifo_read_addr递增;
<center><img src="https://cdn.eetrend.com/files/2023-09/%E5%8D%9A%E5%AE%A2/100574250-3168…; alt=""></center>

可以看出wr_addr==rd_addr是无法区分FIFO是空还是满。
那么,如何判断FIFO空满状态呢?

FIFO空满状态的产生有两种方法:
方法一:为产生FIFO空满标志,引入FIFO Count计数器,FIFO Count寄数器用于指示FIFO内部存储数据个数;
 (1)当只有写操作时,FIFO Count加1;只有读操作时,FIFO Count减1;其他情况下,FIFO Count保持;
 (2)当FIFO Count为0时,说明FIFO为空,fifo_empty置位;
 (3)当FIFO Count等于FIFO_DEPTH时,说明FIFO已满,fifo_full置位;
方法二:使用wr_addr和rd_addr判断,如下图所示,wr_addr和rd_addr位宽是4bit就够了,我们扩展一位,设置wr_ptr和rd_ptr为5bit。

当wr_ptr[4:0]==rd_ptr[4:0]时,表示空;
<center><img src="https://cdn.eetrend.com/files/2023-09/%E5%8D%9A%E5%AE%A2/100574250-3168…; alt=""></center>

当wr_ptr[4]!=rd_ptr[4] 且wr_ptr[3:0]==rd_ptr[3:0]时,表示满;写指针已经转了一圈追上了读指针;
<center><img src="https://cdn.eetrend.com/files/2023-09/%E5%8D%9A%E5%AE%A2/100574250-3168…; alt=""></center>

FIFO溢出状态产生:

(1)当fifo空时,继续发起pop操作,则fifo下溢。

 (2)当fifo满时,继续发起push操作,则fifo上溢。

同步FIFO设计是不是很简单?

特别需要你掌握的是FIFO空满判断的第二种方法;