【7】同步FIFO

同步FIFO

  • 结构

在这里插入图片描述

  • RAM:双端口RAM;
  • 空满信号产生:通过比较读写地址指针来产生空满信号;
  • verilog代码
module sync_fifo #( parameter WIDTH = 8,
					parameter DEPTH = 16)(			
		input clk, 
		input rst_n,
		input winc,
		input rinc,
		input wdata,
		output rdata,
		output wfull,
		output rempty
);
localparam ADDR = $clog2(DEPTH);
reg[ADDR:0] wptr;
reg[ADDR:0] rptr;

always@(posedge clk, negedge rst_n)begin
	if(!rst_n)begin
		wptr <= 'b0;
	end
	else if(winc & ~wfull)begin
		wptr <= wptr +1'b1;
	end
end

always@(posedge clk, negedge rst_n)begin
	if(!rst_n)begin
		rptr <= 'b0;
	end
	else if(rinc & ~rempty)begin
		rptr <= rptr + 1'b1;
	end
end

assign wfull = {~wptr[ADDR], wptr[ADDR-1:0]}==rptr;
assign rempty = wptr==rptr;

dual_ram #(.WIDTH(WIDTH),
		   .DEPTH(DEPTH))
	ram(.wclk(clk),
		.rclk(clk),
		.waddr(wptr[ADDR-1:0]),
		.raddr(rptr[ADDR-1:0]),
		.wen(winc & ~wfull),
		.ren(rinc & ~rempty),
		.wdata(wdata),
		.rdata(rdata)
		);
endmodule

module dual_ram #(parameter WIDTH = 8,
				  parameter DEPTH = 16)(
	input wclk,
	input rclk,
	input [$clog2(DEPTH)-1:0]waddr,
	input [$clog2(DEPTH)-1:0]raddr,
	input wen,
	input ren,
	input [WIDTH-1:0]wdata,
	output reg [WIDTH-1:0]rdata
);

reg[WIDTH-1:0] ram[0:DEPTH-1];

always@(posedge wclk)begin
	if(wen)
		ram[waddr] <= wdata;
end

always@(posedge rclk)begin
	if(ren)
		rdata <= ram[raddr];
end

endmodule
  • 仿真结果

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值