FIFO读写控制

该博客讨论了在两个处理速率不同的模块间进行数据传输时可能出现的问题,如数据遗漏或错误。为了解决这个问题,引入了FIFO(First In First Out)缓存器。发送模块在FIFO空时写入数据,接收模块在FIFO满时读取数据,确保数据的完整传输。博客还提供了FIFO缓存器的Verilog实现,包括写入和读取模块。
摘要由CSDN通过智能技术生成

/*
如果在两个模块之间传输数据,两个模块之间的处理速率不同,会导致采集数据的遗漏或错误
在他们之间加一个数据缓存器,所有数据先经过缓存器缓存,再输入数据接送模块
*/

/*创建两个模块,一个 作为发送模块,一个作为接受模块,发送模块检测到 fifo为空开始向fifo写数据
直到fifo写满为止,数据接受模块检测到fifo满,则从fifo中读出数据,直到fifo读空为止
*/

 

 

module fifo(
	input				clk,
	input				rst_n,
	output[7:0] q	
);
wire wrreq;
wire rdreq;
wire [7:0]data;
	wire			wrfull;
	wire			wrempty;
	wire			rdempty;
	wire			rdfull;
wr_fifo wr_fifo(
	.clk			(clk        ),
	.rst_n			(rst_n		),
	.wrfull			(wrfull		 ),
	.wrempty		(wrempty	 ),
	.data				(data	  ),
	.wrreq			(wrreq		 )
);

rd_fifo rd_fifo(
	.clk					(clk	 ),
	.rst_n			(rst_n			  ),
	.rdfull			(rdfull		),
	.rdempty		(rdempty	 ),
	.rdreq			(rdreq		  )
);

my_fifo  my_fifo(
	.data			(data      ),
	.rdclk		( clk         ),
	.rdreq		(rdreq          ),
	.wrclk		(  clk            ),
	.wrreq		(  wrreq        ),
	.q					(   q   ),
	.rdempty	(    rdempty    ),
	.rdfull		(rdfull         ),
	.wrempty	(   wrempty     ),
	.wrfull		(   wrfull       )
	);

endmodule
module wr_fifo(
	input					clk,
	input					rst_n,
	input					wrfull,
	input					wrempty,
	output reg[7:0]data,
	output		reg		wrreq
);
reg state;
always@(posedge clk or negedge rst_n)
	if(!rst_n)
		begin
			data<=0;
			wrreq<=0;
			state<=0;
		end
	else begin
		case(state)
			0:begin
					if(wrempty)
						begin
							state<=1;
							wrreq<=1;
							data<=0;
						end
				else
					state<=0;
				end
			1:begin
					if(wrfull)
						begin
							state<=0;
							wrreq<=0;
							data<=0;
						end
				else begin
					data<=data+1;//没有写满时,写入数据
					wrreq<=1;
				end
					end
			default:state<=0;
		endcase
	end

endmodule
module rd_fifo(
	input					clk,
	input					rst_n,
	input					rdfull,
	input					rdempty,
	output		reg		rdreq
);

reg state;

always@(posedge clk or negedge rst_n)
	if(!rst_n)
		begin
			rdreq<=0;
			state<=0;
		end
	else begin
		case(state)
			0:begin
					if(rdfull)
						begin
							rdreq<=1;
							state<=1;
						end
					else
						begin
							rdreq<=0;
							state<=0;
						end
				end
			1:begin
					if(rdempty)
						begin
							rdreq<=0;
							state<=0;
						end
					else begin
						rdreq<=1;
						state<=1;
					end
				end
			default:state<=1;
		endcase
	
	end
	
	endmodule

`timescale 1ns/1ns
module fifo_tb();

	reg				clk;
	reg				rst_n;
	wire[7:0] q	;
initial begin
	clk=0;
	rst_n=0;
	#100.2;
	rst_n=1;
end

always #10 clk=~clk;



 fifo fifo(
	.clk(clk),
	.rst_n(rst_n),
	.q	(q)
);


endmodule

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值