本文主要是介绍同步缓冲器设计(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的位宽可给也可不给。
这篇关于同步缓冲器设计(Synchronous FIFO)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!