同步缓冲器设计(Synchronous FIFO)

  • 缓冲器又称为队列,是一种数据暂存的机制。缓冲器存在的必要是因为当数据传出端传出数据时,接收端不一定能实时地接收,如果接收端不能实时地接收,又无缓冲器的存在,数据将不可避免会遗失。如果输出输入端的时钟频率一致,称之为同步缓冲器,如果输出输入端的时钟频率不一致,称之为异步缓冲器。缓冲器能存储的数据个数,称之为其深度,每一个数据有多少位数,称之为其宽度。
  • 在使用缓冲器时必须了解,如果输入端不断地将数据写入,而输出端却不去将数据取走的话,就会造成Overflow。反之,若输出端不断地将数据取走,输入端却不将数据写入的话,就会造成Underflow。为了避免这种情况,读取与写入就必须经过控制。Overflow和Underflow的指标是满(Full)或空(Empty),如果写数据指针wptr和读数据指针rptr这两个指针指到相同的地址时,就有可能是Full或Empty。如果指到相同的地址之前的动作是write,就是Full;如果指针指到相同的地址之前的动作是read,就是empty。通常设计的要求都是可以发生Full或者Empty,但不能发生Overflow或Underflow。
  • 为了避免Overflow和Underflow,就需要读写地址多一比特的标志位。
  • 通过读写地址和读写标志位来判断当前的Full或者Empty状态:
    • 写动作肯定是在读动作前的.
    • 判断Full,(wr_loop==rd_loop) && (wptr==rptr)
    • 判断Empty, (wr_loop!=rd_loop) && (wprt==rptr)
  • wr_loop,wptr增加的原理需要外部的写信号push_req_i和非满信号!full
  • rd_loop,rptr增加的原理需要外部的读信号pop_req_i和非空信号!empty
    • 读端口最好加一个读有效信号pop_vld_o,当读成功时产生
  • elements信号标志了当前fifo存储了多少位数据
    • 加一的逻辑(One push, None pop) { (push_req_i&&!full) && !(pop_req_i&&!empty) }
    • 减一的逻辑(None push, One pop) { !(push_req_i&&!full) && (pop_req_i&&!empty) }
  • 外部需要给FIFO深度(DEPTH)和位宽(WDITH)两个参数。
    • 深度最好是2的次幂,对应的FIFO内部的wptr和rptr的位宽可给也可不给。
  • 24
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值