FPGA试题练习--------异步FIFO设计

本文详细介绍了如何设计一个异步FIFO,以实现读写速率匹配。讨论了判断FIFO满空状态的难点,提出通过格雷码指针同步来解决读写指针在不同时钟域的问题,并提供了设计代码及仿真结果验证。
摘要由CSDN通过智能技术生成

一、目标
设计一个异步fifo实现匹配读写速率匹配。
二、分析
设计难点:如何判断空满标志?快时钟域格雷码指针同步到慢时钟域进行判断,格雷码的效果是否还在?数据最大猝发长度如何得到fifo深度?下面进行分析。
异步fifo主要用于读写时钟频率不同时,缓存数据,防止数据丢失。fifo的深度与读写数据时钟频率、最大猝发传输数据有关。即:
在这里插入图片描述
对于写端来说,存在fifo写满的状况,此时fifo需给出full标志;对于读端来说,存在fifo读完的情况,此时fifo应给出empty标志。
下面分析这两种情况。
①对写端fifo写满
当写端写数据进fifo,但读端未及时读出数据,导致fifo中的存储空间用完,此时fifo需给出full标志。判断fifo是否满了,可通过读写指针的指向地址进行判断,但由于读写指针相等时可能是满也可能是空,所以采用读写指针多定义一个bit用来区分满/空。
由于在判断满时,需要在写时钟下将读写指针进行判断,但读指针是在读时钟下更新值时,在写时钟下采集读指针很容易遇到读指针在更新值得状况,导致采集到的读指针值无法预知,所以这种状况下需要对读指针进行跨时钟域进行同步。
常用跨时钟域同步电路图如下
在这里插入图片描述
当第一级寄存器产生亚稳态后,第二级寄存器稳定输出概率为90%,第三极寄存器稳定输出的概率为99%。
为了尽可能使采集到的读指针不出错,采用将读指针转换为格雷码。因为格雷码每次只有一个bit跳变,在第一级触发器采集时更容易采集到稳定值。
②对读端fifo读空
当fifo中的数据被读端读完时,fifo需给出empty信号。判断依据是和写指针进行比较,所以需要将写指针同步到读时钟下进行比较。

在设计中需要用到存储器,因此可直接调用vivado中的ip如下图:
在这里插入图片描述
在这里插入图片描述
配置为a口写入数据,b口读出数据。
三、设计代码

module fifo(
clk_w,
clk_r,
rst,
wr_en,
rd_en,
full,
empty,
data_in,
data_out
);
input clk_w;
input clk_r;
input rst;
input wr_en;
input rd_en;
input [31:0]data_in;
output[31:0]data_out;
output full;
output empty;


wire [31:0]data_out;
reg full;
reg empty;

parameter width = 5;
(* keep = "true"  *)reg  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值