本文转载自: 无界逻辑(微信号:wujieluoji)微信公众号
异步FIFO通常用于跨时钟域处理,是逻辑设计常用基础模块。
一,异步FIFO结构及特点
异步FIFO也分为三个部分:FIFO写控制逻辑,FIFO读控制逻辑以及FIFO存储实体。这里作者习惯使用push(等同写)pop(等同读)来表述FIFO的概念。
需要特别注意异步FIFO的特点
![](https://cdn.eetrend.com/files/2023-09/%E5%8D%9A%E5%AE%A2/100574307-317088-fifo-1.png)
二,空满产生方案(二进制对比)
FIFO空满状态产生判断只能使用方法二。
1.wr_ptr跨时钟域到wr_ptr_pop的处理过程为:
![](https://cdn.eetrend.com/files/2023-09/%E5%8D%9A%E5%AE%A2/100574307-317089-fifo-2.png)
2.rd_ptr跨时钟域到rd_ptr_pop的处理过程为:
三,优化方案:格雷码对比,产生空满
电路优化:我们可以使用格雷码进行对比,产生空满信号,时序和时延都会得到改善。
![](https://cdn.eetrend.com/files/2023-09/%E5%8D%9A%E5%AE%A2/100574307-317090-fifo-3.png)
1.空状态判断
二进制数值判断条件:rd_ptr == wr_ptr_pop
等价于<=>
格雷码数值判断条件:rd_ptr_grad == wr_ptr_pop_grad
可参考下图的格雷码变换
![](https://cdn.eetrend.com/files/2023-09/%E5%8D%9A%E5%AE%A2/100574307-317091-fifo-4.png)
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值不同。 即:高两位相反,低位相同;
可参考下图的格雷码变换:
![](https://cdn.eetrend.com/files/2023-09/%E5%8D%9A%E5%AE%A2/100574307-317092-fifo-5.png)
四,总结