异步FIFO设计思路,阅读并理解这篇文章,你可称为异步FIFO大拿

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

异步FIFO通常用于跨时钟域处理,是逻辑设计常用基础模块。

一,异步FIFO结构及特点
异步FIFO也分为三个部分:FIFO写控制逻辑,FIFO读控制逻辑以及FIFO存储实体。这里作者习惯使用push(等同写)pop(等同读)来表述FIFO的概念。

需要特别注意异步FIFO的特点

  • pop和push处于不同的时钟域
  • RAM的读写在不同的时钟域
  • 二,空满产生方案(二进制对比)

    FIFO空满状态产生判断只能使用方法二。

  • empty是pop时钟域信号。当wr_ptr_pop等于rd_ptr时,表示FIFO为空。这里wr_ptr_pop是wr_ptr信号同步到pop时钟域的信号。
  • full是push时钟域信号。需要借助rd_ptr_push和wr_ptr进行判断,其中rd_ptr_push是rd_ptr信号同步到push时钟域的信号。
  • 1.wr_ptr跨时钟域到wr_ptr_pop的处理过程为:

  • wr_ptr_b2g:在push时钟域上,wr_ptr由二进制转换为格雷码;
  • 在pop时钟域采用两级打拍的方式,将wr_ptr_b2g采样为wr_ptr_b2g_pop的信号。
  • 在pop时钟域,将wr_ptr_b2g_pop信号进行g2b的转换,产生wr_ptr_pop。
  • 2.rd_ptr跨时钟域到rd_ptr_pop的处理过程为:

  • rd_ptr_b2g:在 pop时钟域上,rd_ptr由二进制转换为格雷码;
  • 在push时钟域采用两级打拍的方式,将rd_ptr_b2g采样为rd_ptr_b2g_push的信号。
  • 在push时钟域,将rd_ptr_b2g_push信号进行g2b的转换,产生rd_ptr_push。
  • 三,优化方案:格雷码对比,产生空满

    电路优化:我们可以使用格雷码进行对比,产生空满信号,时序和时延都会得到改善。

    1.空状态判断

    二进制数值判断条件:rd_ptr == wr_ptr_pop

    等价于<=>

    格雷码数值判断条件:rd_ptr_grad == wr_ptr_pop_grad

    可参考下图的格雷码变换

    2.满状态判断

    二进制数值判断条件:wr_ptr[4] == !rd_ptr_push[4] &&

    wr_ptr[3:0] == rd_ptr_push[3:0]

    等价于格雷码数值判断:

    wr_ptr_grad[4] == !rd_ptr_push_grad[4] &&

    wr_ptr_grad[3] == !rd_ptr_push_grad[3] &&

    wr_ptr_grad[2:0] == rd_ptr_push_grad[2:0]

    如二进制最高bit不同,会使转换后的格雷码最高和次高bit值不同。 即:高两位相反,低位相同;

    可参考下图的格雷码变换:

    四,总结

  • 空满判断的读写指针必须是同一个时钟域上的信号。
  • 读写指针需要经过二进制变换到格雷码。
  • 读写指针格雷码在对端时钟域打两拍同步到对端时钟域上。
  • 使用同一时钟域的格雷码信号进行对比得到空满信号。
  • 最新文章

    最新文章