参考文章:
FIFO即First in first out,也叫先入先出电路,可以实现数据先进先出的存储器件。
FIFO一般普遍用作数据缓冲器,也可以用于顺序数据的缓冲,比如音频信号或视频信号。另一个广泛的应用是在处理器之间的通讯中。
FIFO的基本单元是寄存器。作为存储器件,FIFO的存储能力是由其内部定义的存储寄存器的数量决定。FIFO存储器一般以数据量的(深度,即寄存单元的个数)
deepth*width(宽度,即一寄存单元的bits)的形式来说明所采用的基本结构。
第一代FIFO存储器是基于“导向”理论的,数据从输入端被移到输出端,所需要的时间称为导向时间。每一个数据字需要一个状态触发器,因此对数据锁存的控制只能实现很短的
FIFO的操作以长度为8的FIFO为例说明其工作原理,如下图:
________________________
D, C, B, A ——> | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8|———>
两边的箭头表示数据移动的方向。A,B,C,D表示被处理的数据。1,2,3,4,……8表示FIFO的8个存储单元。
表明这个FIFO中共有8个寄存器单元。每个寄存器单元可以存储一个数据。所以寄存器的单元越多,FIFO的存储能力就越强。
每个寄存器单元的位宽与FIFO的输入和输出端的位宽是一致的。如果要处理的数据A,B,C,D是16位的数据,那么输入输出端及每个寄存器单元的位宽就都是16位。
这个FIFO可以命名为8X16 FIFO。它在每一个时钟上升沿到来时,数据向右移动一个存储单元。这样在时钟的控制下,数据从左到右通过存储单元
FIFO通常是双端口的存储器,其中一个端口用于写入数据,而另一个端口用于读出数据。可以同时对存储器字存储单元进行写入和读出操作。它的数据吞吐率是普通RAM的两倍。
FIFO型的存储器不需要由地址来存取数据。需要由另外的信号线(或标志)来指明存储器的内容状态。
现在的FIFO存储器采用SRAM单元来实现。它是基于带两个指针的环行FIFO结构的。要写入的数据的存储地址放在写指针中,
而FIFO结构中要读出的第一个数据的地址放在读指针中。在复位后,两个指针都指向存储器的同一个字单元,每次写操作后,写指针指向下一个存储单元。
对数据字的读取操作,会把读指针指向下一个要读取的数据字,读指针就不断地跟随写指针,当读指针跟上写指针后,FIFO的结构里面为空。
如果写指针追上读指针,FIFO结构里面的数据是满载的。
如果从硬件上来实现循环存储器,可以用双端口的SRAM来存取数据。指针用二进制计数器的特征,它用于产生SRAM的存储器地址,
同步FIFO存储器的基本结构包括存储器阵列,标志逻辑和扩展逻辑(图太难画了,就不贴了)。存储器阵列由双端口存储单元构成。
允许同时对存储单元的两个端口(读端口和写端口)进行存取。标志逻辑用于比较两个地址指针的值,如果两个值的比较结果为零,FIFO存储器为全空,同时全空标志为真。
如果两个值的比较结果等于存储器的容量深度,说明存储器全满,同时全满标志为真。还可以设置其他一些标志,比如半满,可编程接近满,可编程接近空等。
它们也通过对偏移量寄存器中的编程值和存储器阵列中的字的数量进行比较来生成,扩展逻辑通过对多个模块按容量深度扩展结构进行的级联来形成更深的FIFO存储器,
采用令牌传递方法来实现逻辑上容量更深的FIFO。
在普通模式下(没有进行容量,深度级联的模式),每一个地址在到达最大值后,会跳会到零。
在容量深度扩展模式下,当地址指针到达最大值后,一个脉冲信号会送到扩展端口,该端口把令牌传到另一个FIFO存储器中(直到令牌重新传回来,这个地址指针才会增加),
(这个地方还有点模糊,有待解决。)
字宽扩展,可以使FIFO存储器有更宽的数据通路。在字宽扩展模式中,读操作,写操作和重传输都一样。要在字宽上扩展多个FIFO存储器,必须同时通过对每个存储器的状态
标志进行与操作生成“混合标志”。混合标志也包括全空标志和全满标志。这样才能保证FIFO存储器保持同步。