只有一个元素的异步FIFO

59 篇文章 4 订阅
54 篇文章 4 订阅
module one_entry_fifo #(parameter dw=16 )(

        input	rd_clk, wr_clk, rd_rst_n,wr_rst_n,we,re,

        input	[dw-1:0]	d ,reset_value,

        output	reg [dw-1:0]	q ,

        output	 reg  empty , full 

    );

    //synopsys sync_set_reset "rd_rst_n,wr_rst_n"

wire legal_wr  =  we  &(~full);

wire legal_rd  =  re & (~empty) ;

reg wr_ptr ,rd_ptr ;// only one bit !

reg wr_ptr_r,wr_ptr_rr; 

reg rd_ptr_r,rd_ptr_rr; 







always @(posedge rd_clk)wr_ptr_r <=wr_ptr;

always @(posedge rd_clk)wr_ptr_rr <=wr_ptr_r; 




always @(posedge wr_clk)rd_ptr_r <= rd_ptr;

always @(posedge wr_clk)rd_ptr_rr <= rd_ptr_r; 




always @(posedge rd_clk)if( wr_ptr_rr == rd_ptr ) empty<=1;else empty <= legal_rd ; 

always @(posedge wr_clk)if( rd_ptr_rr != wr_ptr ) full<=1 ;else full <= legal_wr ; 




always @(posedge rd_clk)if (~rd_rst_n)  rd_ptr <= 0;else  if ( legal_rd ) rd_ptr <= ~ rd_ptr ;

always @(posedge wr_clk)if (~wr_rst_n)  wr_ptr <= 0;else  if ( legal_wr ) wr_ptr <= ~ wr_ptr ;




reg [dw-1:0] buff ;  always @(posedge wr_clk)if ( legal_wr ) buff <= d ;

always @(posedge rd_clk)if ( ~rd_rst_n ) q <= reset_value ;else if ( legal_rd ) q <= buff; 







endmodule

 

因为只有一个元素,所以避免了使用格雷码来传递计数器。
应用场合:
1 ,跨时钟区域的信号,数据传递。
2,结合单时钟FIFO组成更大的容量的异步FIFO(和同步FIFO连接时候注意空和满标志的处理)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值