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

本文转载自: 无界逻辑(微信号:wujieluoji)微信公众号

FIFO:First in, first out,先进先出;其主要作用是:数据缓存,位宽转换,时钟域处理,通常作为模块之间的桥梁,存在与逻辑设计中。

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

1.FIFO控制器;

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

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

FIFO写控制逻辑主要功能:

  • 产生FIFO写地址
  • 写有效信号
  • 同时产生FIFO满
  • 写溢出等状态信号
  • FIFO读控制逻辑主要功能:

  • 产生FIFO读地址
  • 读有效信号
  • 同时产生FIFO空
  • 读溢出等状态信号
  • 如下图所示,FIFO读写过程的地址控制:

    1.当FIFO初始化(复位)时wr_addr与rd_addr同指到0x0,此时FIFO处于空状态;

    2.当FIFO进行写操作时,wr_addr递增,与rd_addr错开,此时FIFO处于非空状态;

    wr_addr增加到FIFO DEPTH时,发生卷绕,追上了rd_addr,此时FIFO满;

    3.当FIFO进行读操作时,fifo_read_addr递增;

    可以看出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]时,表示空;

    当wr_ptr[4]!=rd_ptr[4] 且wr_ptr[3:0]==rd_ptr[3:0]时,表示满;写指针已经转了一圈追上了读指针;

    FIFO溢出状态产生:

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

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

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

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

    最新文章

    最新文章