本文转载自:<span id="profileBt"><a href="https://mp.weixin.qq.com/s/LXicgZrcXR2d2N-tOVzXiA"> 无界逻辑(微信号:wujieluoji)微信公众号</a></span>
异步FIFO通常用于跨时钟域处理,是逻辑设计常用基础模块。
<strong>一,异步FIFO结构及特点</strong>
异步FIFO也分为三个部分:FIFO写控制逻辑,FIFO读控制逻辑以及FIFO存储实体。这里作者习惯使用push(等同写)pop(等同读)来表述FIFO的概念。
需要特别注意异步FIFO的特点
<li>pop和push处于不同的时钟域</li>
<li>RAM的读写在不同的时钟域</li>
<center><img src="https://cdn.eetrend.com/files/2023-09/%E5%8D%9A%E5%AE%A2/100574307-3170…; alt=""></center>
<strong>二,空满产生方案(二进制对比)</strong>
FIFO空满状态产生判断只能使用方法二。
<li>empty是pop时钟域信号。当wr_ptr_pop等于rd_ptr时,表示FIFO为空。这里wr_ptr_pop是wr_ptr信号同步到pop时钟域的信号。</li>
<li>full是push时钟域信号。需要借助rd_ptr_push和wr_ptr进行判断,其中rd_ptr_push是rd_ptr信号同步到push时钟域的信号。</li>
1.wr_ptr跨时钟域到wr_ptr_pop的处理过程为:
<li>wr_ptr_b2g:在push时钟域上,wr_ptr由二进制转换为格雷码;</li>
<li>在pop时钟域采用两级打拍的方式,将wr_ptr_b2g采样为wr_ptr_b2g_pop的信号。</li>
<li>在pop时钟域,将wr_ptr_b2g_pop信号进行g2b的转换,产生wr_ptr_pop。</li>
<center><img src="https://cdn.eetrend.com/files/2023-09/%E5%8D%9A%E5%AE%A2/100574307-3170…; alt=""></center>
2.rd_ptr跨时钟域到rd_ptr_pop的处理过程为:
<li>rd_ptr_b2g:在 pop时钟域上,rd_ptr由二进制转换为格雷码;</li>
<li>在push时钟域采用两级打拍的方式,将rd_ptr_b2g采样为rd_ptr_b2g_push的信号。</li>
<li>在push时钟域,将rd_ptr_b2g_push信号进行g2b的转换,产生rd_ptr_push。</li>
<strong>三,优化方案:格雷码对比,产生空满</strong>
电路优化:我们可以使用格雷码进行对比,产生空满信号,时序和时延都会得到改善。
<center><img src="https://cdn.eetrend.com/files/2023-09/%E5%8D%9A%E5%AE%A2/100574307-3170…; alt=""></center>
1.空状态判断
二进制数值判断条件:rd_ptr == wr_ptr_pop
等价于<=>
格雷码数值判断条件:rd_ptr_grad == wr_ptr_pop_grad
可参考下图的格雷码变换
<center><img src="https://cdn.eetrend.com/files/2023-09/%E5%8D%9A%E5%AE%A2/100574307-3170…; alt=""></center>
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值不同。 即:高两位相反,低位相同;
可参考下图的格雷码变换:
<center><img src="https://cdn.eetrend.com/files/2023-09/%E5%8D%9A%E5%AE%A2/100574307-3170…; alt=""></center>
<strong>四,总结</strong>
<li>空满判断的读写指针必须是同一个时钟域上的信号。</li>
<li>读写指针需要经过二进制变换到格雷码。</li>
<li>读写指针格雷码在对端时钟域打两拍同步到对端时钟域上。</li>
<li>使用同一时钟域的格雷码信号进行对比得到空满信号。</li>