fifo读写写测试

记录学习日常:本实验参考正点原子的实验教程。按照自己的理解来完成实验。四个模块,第一个模块是调用fifo IP核并设计类型,二,写如数据模块,三,读数据模块,四,顶层模块。ip核设置如图:

 二,

写数据模块的输入有时钟、复位、写满、写空,输出有写请求、写出数据,把数据写入fifo核。

读数据模块输入有时钟、复位、读空、读满、从fifo核来的数据,输出有读请求。

写请求与读请求都与fifo核发输入端相连,感觉fifo核像是个存储器,写入数据再读出。

当写空状态与写请求寄存器为1是写请求触发,当读满状态与读请求寄存器为1时读请求触发。

 顶层模块就是把前三个模块整合到一个模块里。上代码“

module fifo_wr(
	input clk,
	input rst_n,
	input wrempty,
	input wrfull,
	output reg[7:0]data,
	output wrreq
);

	reg [1:0]state_cnt;
	reg wrreq_t;

	assign wrreq = ~wrfull & wrreq_t;
	
	always@(posedge clk or negedge rst_n)
		if(!rst_n)begin
			wrreq_t <= 1'b0;
			data <= 8'd0;
			state_cnt <= 2'd0;
		end
		else begin
			case (state_cnt)
				2'd0 : begin
					if(wrempty)begin
						wrreq_t <= 1'b1;
						state_cnt <= state_cnt + 1'b1;
					end
					else
						state_cnt <= state_cnt;
				end
				2'd1 : begin
					if(wrfull)begin
						wrreq_t <= 1'b0;
						data <= 8'd0;
						state_cnt <= 2'd0;
					end
						else begin
							wrreq_t <= 1'b1;
							data <= data +1'b1;
						end
				end
				default :state_cnt <= 2'd0;
				endcase
		end
			
endmodule

module fifo_rd(
	input clk,
	input rst_n,
	input [7:0]data,
	input rdfull,
	input rdempty,
	output  rdreq
);

reg rdreqt;
reg [1:0]state_cnt;
reg [7:0]data_fifo;

assign rdreq = ~rdempty & rdreqt;

	always@(posedge clk or negedge rst_n)
	if(!rst_n)begin
		rdreqt <= 1'b0;
		data_fifo <= 8'd0;
	end
	else begin
			case (state_cnt)
				2'd0 : begin
					if(rdfull)begin
						rdreqt <= 1'b1;
						state_cnt <= state_cnt + 1'b1;
					end
				else
					state_cnt <= state_cnt;
				end
				2'd1 : begin
					if(rdempty)begin
						rdreqt <= 1'b0;
						data_fifo <= 8'd0;
						state_cnt <= 2'd0;
					end
					else begin
						rdreqt <= 1'b1;
						data_fifo <= data;
					end
				end
				default : state_cnt <= 2'd0;
				endcase
		end

endmodule
module fifo(
	input sys_clk,
	input sys_rst_n
);
wire [7:0]  data;

	wire   rdreq;
	
	wire   wrreq;
	wire 	[7:0]  q;
	wire 	  rdempty;
	wire 	  rdfull;
	wire 	[7:0]  rdusedw;
	wire 	  wrempty;
	wire 	  wrfull;
	wire 	[7:0]  wrusedw;

fifo_ip u_fifo_ip (
	.data(data),
	.rdclk(sys_clk),
	.rdreq(rdreq),
	.wrclk(sys_clk),
	.wrreq(wrreq),
	.q(q),
	.rdempty(rdempty),
	.rdfull(rdfull),
	.rdusedw(rdusedw),
	.wrempty(wrempty),
	.wrfull(wrfull),
	.wrusedw(wrusedw)
	);

	

fifo_wr fifo_wr_u(
	.clk(sys_clk),
	.rst_n(sys_rst_n),
	.wrempty(wrempty),
	.wrfull(wrfull),
	.data(data),
	.wrreq(wrreq)
);

fifo_rd fifo_rd_u(
	.clk(sys_clk),
	.rst_n(sys_rst_n),
	.data(q),
	.rdfull(rdfull),
	.rdempty(rdempty),
	.rdreq(rdreq)
);


endmodule

仿真

 这个仿真总觉得有点问题,又说不上来。一起讨论下。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值