同步FIFO硬件代码

同步FIFO
数据宽度、FIFO深度 可配置

module synfifo #(parameter DEPTH=16, ADDR_WIDTH=4, DATA_WIDTH=8)(
    input clk, rst_n, rd, wr,
    input [DATA_WIDTH-1:0] datain,
    output reg [DATA_WIDTH-1:0] dataout,
    output reg empty, full
    );
reg [DATA_WIDTH-1:0] mem [DEPTH-1:0];
reg [ADDR_WIDTH-1:0] rp,wp;

//mem and wp
always@(posedge clk)
    if(!rst_n)
        wp<=0;
    else if(wr && !full)
    begin wp<=wp+1; mem[wp]<=datain; end
    
//rp and dataout
always@(posedge clk)
    if(!rst_n)
        begin rp<=0; dataout<=0; end
    else if(rd && !empty)
    begin rp<=rp+1; dataout<=mem[rp]; end
    
//full
//判断条件:是否既读又写, 是否读, 正在写&指针关系
always@(posedge clk)
    if(!rst_n)
        full<=0;
    else if(wr && rd) ;
    else if(rd) full<=0;
    else if(wr && (wp+1==rp || wp=={ADDR_WIDTH{1'b1}}&& rp==0)) full<=1;
    
//empty
always@(posedge clk)
    if(!rst_n)
        empty<=1;
    else if(wr&&rd) ;
    else if(wr) empty<=0;
    else if(rd && ((rp+1==wp)|| rp=={ADDR_WIDTH{1'b1}} && wp==0)) empty<=1;

endmodule
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值