fifo的rdata_同步Fifo和异步fifo

本文介绍了两种FIFO的设计方法,一种是基于触发器的同步FIFO,另一种是基于RAM的异步FIFO。同步FIFO采用触发器实现,易于扩展,代码已验证;异步FIFO基于RAM,设计更复杂,涉及到跨时钟域同步和空/满状态的判断。文章还提供了两种不同的空/满状态判断算法,并给出了相应的Verilog代码实现。
摘要由CSDN通过智能技术生成

这一种设计的FIFO,是基于触发器的。宽度,深度的扩展更加方便,结构化跟强。以下代码在modelsim中验证过。

modulefifo_cell(sys_clk,sys_rst_n,read_fifo,write_fifo,fifo_input_data,

next_cell_data,next_cell_full,last_cell_full,cell_data_out,cell_full);

parameterWIDTH=8;

parameterD=2;

inputsys_clk;

inputsys_rst_n;

inputread_fifo,write_fifo;

input[WIDTH-1:0]fifo_input_data;

input[WIDTH-1:0]next_cell_data;

inputnext_cell_full,last_cell_full;

output[WIDTH-1:0]cell_data_out;

outputcell_full;

reg[WIDTH-1:0]cell_data_reg_array;

reg[WIDTH-1:0]cell_data_ld;

regcell_data_ld_en;

regcell_full;

regcell_full_next;

assigncell_data_out=cell_data_reg_array;

always@(posedgesys_clkornegedgesys_rst_n)

if(!sys_rst_n)

cell_full<=#D0;

elseif(read_fifo||write_fifo)

cell_full<=#Dcell_full_next;

always@(write_fifoorread_fifoornext_cell_fullorlast_cell_fullorcell_full)

casex({read_fifo,write_fifo})

2'b00:cell_full_next=cell_full;

2'b01:cell_full_next=next_cell_full;

2'b10:cell_full_next=last_cell_full;

2'b11:cell_full_next=cell_full;

endcase

always@(posedgesys_clkornegedgesys_rst_n)

if(!sys_rst_n)

cell_data_reg_array[WIDTH-1:0]<=#D0;

elseif(cell_data_ld_en)

cell_data_reg_array[WIDTH-1:0]<=#Dcell_data_ld[WIDTH-1:0];

always@(write_fifoorread_fifoorcell_fullorlast_cell_full)

casex({write_fifo,read_fifo,cell_full,last_cell_full})

4'bx1_xx:cell_data_ld_en=1'b1;

4'b10_01:cell_data_ld_en=1'b1;

default:cell_data_ld_en=1'b0;

endcase

always@(write_fifoorread_fifoornext_cell_fullorcell_fullorlast_cell_fullorfifo_input_dataornext_cell_data)

casex({write_fifo,read_fifo,next_cell_full,cell_full,last_cell_full})

5'b10_x01:cell_data_ld[WIDTH-1:0]=fifo_input_data[WIDTH-1:0];

5'b11_01x:cell_data_ld[WIDTH-1:0]=fifo_input_data[WIDTH-1:0];

default:cell_data_ld[WIDTH-1:0]=next_cell_data[WIDTH-1:0];

endcase

endmodule

modulefifo_4cell(sys_clk,sys_rst_n,fifo_input_data,write_fifo,fifo_out_data,

read_fifo,full_cell0,full_cell1,full_cell2,full_cell3);

parameterWIDTH=8;

parameterD=2;

inputsys_clk;

inputsys_rst_n;

input[WIDTH-1:0]fifo_input_data;

output[WIDTH-1:0]fifo_out_data;

inputread_fifo,write_fifo;

outputfull_cell0,full_cell1,full_cell2,full_cell3;

wire[WIDTH-1:0]dara_out_cell0,data_out_cell1,data_out_cell2,

data_out_cell3,data_out_cell4;

wirefull_cell4;

fifo_cell#(WIDTH,D)cell0

(.sys_clk(sys_clk),</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值