所谓FIFO就是先进先出的意思,通俗的说,就像数据从一个管道的一端进去而从管道的另一端输出。FIFO是一个没有地址端口的存储器,它依靠内部写指针(指定写数据的位置)和读指针(指定读数据的位置)来进行数据的存储或读取。
FIFO有同步FIFO和异步FIFO之分。它们的区别是同步FIFO数据的读写受同一时钟源的控制,而异步FIFO的读写则可以受不同时钟源控制。在这里,我将要介绍的是基于同步的FIFO设计。下面分别介绍基于移位寄存器模式和基于双端口RAM模式的同步FIFO设计。
1、基于移位寄存器的同步FIFO设计
基于移位寄存器的同步FIFO只需一个读指针,指示FIFO中第一个有效数据,如图1所示。
图1 基于移位寄存器的FIFO读写数据过程
这里设计一个数据位宽和FIFO深度都可设置的简单FIFO,其实现电路如下所示:
FIFO写仿真波形如图2所示。
图2 FIFO写数据
FIFO读仿真波形如图3所示。
图3 FIFO读数据
此外,该设计还支持同时读写FIFO,但有两个限制。第一个限制是,当FIFO为空时,只支持写操作,不支持同时读写操作;第二个限制是,当为FIFO为满时,只支持读操作,不支持同时读写操作。
2、基于双端口RAM的同步FIFO设计
基于双端口RAM的同步FIFO需要读指针和写指针两个指针,分别指示读取数据和写数据的位置,如图4所示。
图4 基于双端口RAM的FIFO读写数据过程
这里设计一个数据位宽和FIFO深度都可设置的简单FIFO,其实现电路如下所示:
FIFO写仿真波形如图5所示。
图5 FIFO写数据
FIFO读仿真波形如图6所示。
图6 FIFO读数据
该设计也是有一个限制的,就是当为FIFO为满时,只支持读操作,不支持同时读写操作。
3、总结
由于在设计中我们规定了FIFO满后就不能再写数据,所以导致了基于移位寄存器的FIFO的第二个限制和基于双端口RAM的FIFO的限制。如果想去掉这个限制,节将写FIFO的条件由if((push & ~full) == 1'b1)改为if(push == 1'b1)即可。