经典的单时钟FIFO

59 篇文章 4 订阅
54 篇文章 4 订阅


经典的,可配置的单时钟FIFO实现
 


 


已经经历过流片验证。




module sc_fifo#(

        parameter AW = 5 ,

        parameter DW = 64

    )(

        input clk,rst_n,

        input [ DW-1:0] din,

        input wr,rd,

        output full,empty,

        output reg valid, // data is now valid in dout bus , rd act as ack.

        output  reg  [ DW-1:0] dout

    );




    reg [ AW:0] fifo_cntr  ;

    localparam MAX_FIFO_LEN = (1<<AW ) ;

    reg [ DW-1:0] buff[0:  MAX_FIFO_LEN -1] ;




    reg [ AW-1:0] wr_ptr  ;

    reg [AW-1:0]	rd_ptr  ;

    assign full  = fifo_cntr >= (  MAX_FIFO_LEN   - 2) ;

    assign empty = fifo_cntr == 0 ;

    always @ (posedge clk) valid<=~empty ;

    wire valid_rd =  ( ~empty ) & rd ;

    wire valid_wr =   ( ~full ) & wr ;




    always@(posedge clk) if (~rst_n) wr_ptr <= 0;else if(valid_wr)wr_ptr<=wr_ptr+1;

    always@(posedge clk) if (~rst_n)rd_ptr <= 0 ;else if (valid_rd)rd_ptr <= rd_ptr+1;




    always@(posedge clk)

    casex ({rst_n,valid_wr,valid_rd})

        3'b0xx : fifo_cntr<=0;

        3'b110 : fifo_cntr<=fifo_cntr+1;

        3'b101 : fifo_cntr<=fifo_cntr-1;

        3'b111 ,3'b100 :fifo_cntr<=fifo_cntr ;

    endcase




    always@(posedge clk) if (valid_wr) buff[wr_ptr] <=din ;

    always@(posedge clk)  dout <= buff[rd_ptr] ;




endmodule






  

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值