异步FIFO Verilog

本文介绍了异步FIFO的设计,包括写数据和读数据的代码实现,以及两级DFF用于同步异步信号的方法。重点讨论了空、将空、满、将满信号的判断和格雷码的应用。同时,提供了测试平台的详细步骤,展示了不同时钟速度下的仿真结果,探讨了吞吐量计算的重要性和应用。
摘要由CSDN通过智能技术生成

异步FIFO:

整体的电路及逻辑设计:
讲解链接:异步FIFO及其他跨时钟域信号传输方法讲解.
异步FIFO主要涉及的知识:
空、将空、满、将满信号的判断;
格雷码作为异步传输地址指针的使用;
两级D触发器同步异步信号;
FIFO深度、宽度、吞吐量的选择和计算。

具体地文字分析在CDC篇详细说吧,这里存代码。
在这里插入图片描述

写数据代码:

module write_data #(
	parameter FIFO_WIDTH = 4'd8,
	parameter FIFO_DEEP  = 8'd64,
	parameter GAP_DEEP   = 3'd5
	)(
	input	w_clk,	//写时钟
	input	w_rst_n,
	input	w_en,	//外部输入的写使能信号
	input	[FIFO_WIDTH:0]		rptr2_wclk,	//同步到写时钟下的读指针
	
	output	wfull,						//写满信号
	output	wclken,						//输出给RAM的允许写信号
	output	reg			wfull_almost,	//将满信号
	output	[FIFO_WIDTH:0]		wptr,	//输出的写指针
	output	[FIFO_WIDTH-1:0]	waddr	//输出的写地址
);

reg	[FIFO_WIDTH:0]	waddr_tmp;
reg	[FIFO_WIDTH:0]	w_gap; 

wire	[FIFO_WIDTH:0]	rptr_bin;
assign	wclken = w_en &(!wfull);//输出给RAM的允许写信号

//写地址、写指针产生
always @(posedge w_clk or negedge w_rst_n)begin
	if(!w_rst_n)
		waddr_tmp <= 9'd0;
	else if(wclken)
		waddr_tmp <= waddr_tmp + 1'd1;
	else
		waddr_tmp <= waddr_tmp;
end

assign 	waddr = waddr_tmp[7:0];	//写地址产生

assign	wptr = waddr_tmp^(waddr_tmp>>1'd1);//写指针转格雷码

//同步到写时钟下的读指针(格雷码) 转二进制
assign rptr_bin[8]=rptr2_wclk[8];
assign rptr_bin[7]=rptr_bin[8]^rptr2_wclk[7];
assign rptr_bin[6]=rptr_bin[7]^rptr2_wclk[6];
assign rptr_bin[5]=rptr_bin[6]^rptr2_wclk[5];
assign rptr_bin[4]=rptr_bin[5]^rptr2_wclk[4];
assign rptr_bin[3]=rptr_bin[4]^rptr2_wclk[3];
assign rptr_bin[2]=rptr_bin[3]^rptr2_wclk[2];
assign rptr_bin[1]=rptr_bin[2]^rptr2_wclk[1];
assign rptr_bin[0]=rptr_bin[1]^rptr2_wclk[0];

//写指针与读指针之间的间隔
always @(*)begin
	if(rptr_bin[8] == waddr_tmp[8])
		w_gap = FIFO_DEEP + rptr_bin[7:0] - waddr_tmp[7:0];
	else
		w_gap = rptr_bin[7:0] - waddr_tmp[7:0];
end

//将满信号
always @(posedge w_clk or negedge w_rst_n)begin
	if(!w_rst_n)
		wfull_almost = 1'd0;
	else if(w_gap < GAP_DEEP)
		wfull_almost = 1'd1;
	else
		wfull_almost = 1'd0;
end

//满信号
assign	wfull = (!w_gap)||
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
异步FIFO是一种在读写时钟不一致的情况下进行数据传输的存储器。与同步FIFO不同,异步FIFO需要使用同步打拍逻辑来进行读写地址的比较,这会导致一定的延时。因此,在异步FIFO中,空状态的指示信号可能存在一定的延迟。如果在延迟期间有新的数据写入FIFO,就会出现空状态指示信号有效,但实际上FIFO中仍存在数据的情况。 在Verilog中,可以使用一些方法来实现异步FIFO的设计。异步FIFO的设计需要考虑以下几个方面: 1. FIFO的大小:确定FIFO所能容纳的数据量,包括数据位宽和深度。 2. 读写指针:使用两个指针来追踪读写操作的位置。读指针指向最早写入的数据,写指针指向最新写入的数据。 3. 读写逻辑:通过判断读写指针的状态来实现读写操作。读操作会使读指针向前移动,写操作会使写指针向前移动,并将数据写入相应位置。 4. 空状态指示信号:通过判断读写指针的状态来确定是否存在数据。当读写指针相等时,说明FIFO为空。 综上所述,异步FIFOVerilog设计需要考虑读写指针和读写逻辑,并且要注意空状态指示信号的延迟问题。根据具体的需求和设计要求,可以选择适合的设计方法进行实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [异步FIFO的Verilg实现方法](https://blog.csdn.net/wuzhikaidetb/article/details/121152844)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [异步FIFO设计(Verilog)](https://blog.csdn.net/qq_21842097/article/details/118307227)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值