异步FIFO(Asyn FIFO)学习笔记

本文介绍了一种在不同步时钟域间进行有效数据交换的设计方法。通过使用双口RAM和格雷码转换来减少亚稳态的影响,并采用两级同步技术确保数据一致性。详细解析了读写控制模块的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计思路

w_clk与r_clk不同步,跨时钟域

需要模块:

1、读控制

2、写控制

3、双口RAM

4、Bin2Gray(跨时钟域---亚稳态---需要使用格雷码---减少亚稳态的概率)

5、SYN同步(将w_addr送到读控制模块----比较地址差判断空满,需要r_clk对w_addr同步)

(将r_addr送到写控制模块----比较地址差判断空满,需要w_clk对r_addr同步)

简单来说两级同步就是打两拍、用于跨时钟域设计

 

 

采样情况

只有1bit发生变化,采样时钟要么采到原地址,要么采到新地址

1、读时钟,最坏情况下,A--B,采样到A,若A为满,B为不满,则将“不满判断成了满”,禁止写操作,不会对逻辑产生影响,只是写操作被延迟

2、写时钟,最坏情况下,A--B,采样到A,若A为空,B为不空,则将“不空判断成了空”,禁止读操作,不会对逻辑产生影响,只是读操作被延迟

 

端口

1、w_rst、r_rst

2、r_clk、r_req、r_data

3、w_clk、w_req、w_data

4、w_full、r_empty

 

模块

1、写控制模块

输入:w_clk,rst_n,w_req,r_gaddr

输出:w_addr,w_gaddr,full,

写地址加:w_req&&(full==0)

产生full:读地址格雷码与写地址格雷码——高2 bit相反,其余相等

assign  full={~w_gaddr[addr_width-1],~w_gaddr[addr_width-2],w_gaddr[addr_width-3:0]}==r_gaddr?1:0

bin2gray:从低往高,逐位异或,最高位不变

 

2、读控制模块

输入:r_clk,rst_n,r_req,w_gaddr

输出:r_addr,r_gaddr,empty

读地址加:r_req&&(empty==0)

产生empty:读地址格雷码与写地址格雷码相等

assign empty=(r_gaddr==w_gaddr)?1:0;

 

3、top模块

输入:w_clk,r_clk,rst_n,w_data,w_req,r_req

输出:r_data,full,empty

同步:

写地址同步到读控制:将w_gaddr先利用w_clk打一拍(不能组合逻辑输出),再利用r_clk打两拍

读地址同步到写控制:将r_gaddr先利用r_clk打一拍(不能组合逻辑输出),再利用w_clk打两拍

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值