目录
一、FIFO的定义和应用场景
二、FIFO的结构
三、FIFO的应用场景
3.1 单时钟(同步)FIFO
3.2 双时钟(异步)FIFO
四、FIFO的结构
五、FIFO常见参数
六、实现 FIFO 的方法
6.1 IP核的使用——FIFO
6.1.1 单时钟 FIFO 实现与测试
6.1.2 混合宽度异步(双时钟) FIFO 实现与测试
6.2 纯编程实现同步FIFO
6.2.1 顶层模块
6.2.2 FIFO控制模块
6.2.3 双端口RAM模块
6.2.4 RTL视图
6.2.5 TestBench代码
6.2.6 仿真结果
6.3 纯编程实现异步混合宽度FIFO
参考资料:
《FPGA自学笔记——设计与验证》;《硬件架构的艺术》;《Verilog HDL数字集成电路高级程序设计》等
链接:https://pan.baidu.com/s/1dKOXQMg3M3vHmVIx9KdMxg 提取码:kqy9 --来自百度网盘超级会员V6的分享
一、FIFO的定义和应用场景
FIFO(First in First Out)是一种先进先出的数据缓冲器,通常用于接口电路的数据缓存。与普通存储器的区别是没有外部读写地址线,可以使用两个时钟分别进行读和写操作。
FIFO只能顺序写入数据和顺序读出数据,其数据地址由内部读、写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。
二、FIFO的结构
FIFO从读/写端口和同步时钟关系来分,有两类结构:单时钟FIFO(Single Clock FIFO,SCFIFO)和双时钟(Dual Clock FIFO,DCFIFO),其中DCFIFO又可以分为普通双时钟(DCFIFO)和混合宽度双时钟FIFO(DCFIFO_MIXED_WIDTHS)。分别如下图所示:
从图中可以看到,单时钟 FIFO 具有一个独立的时钟端口 Clock ,因此所有输入信号的读取都是在 Clock 的上升沿进行的,所有输出信号的变化也是在Clock 信号的上升沿的控制下进行的,即单时钟 FIFO 的所有输入输出信号都是同步于 Clock 信号的 。
而在双时钟 FIFO 结构中,写端口和读端口分别有独立的时钟 ,所有与写相关的信号都是同步于写时钟 wrclk 的,所有与读相关的信号都是同步于读 时钟 rdclk 的。在双时钟 FIFO 的符号图中,位于上部分 的为与写 相关的所有信号,位于中间部分 的为与读 相关的所有信号,位于下部 的为异步清零 信号。
三、FIFO的应用场景
3.1 单时钟(同步)FIFO
单时钟 FIFO 常用于片内数据交互。
例如,在 FPGA 的控制下从外部传感器读取到的一连串传感器数据,首先被写入 FIFO 中,然后再以
UART
串口波特率将数据依次发送出去。由于传感器的单次读取数据可能很快,但并不是时刻都需要采集数据,例如某传感器使用SPI 接口的协议,
FPGA
以
2M
的
SPI
数据速率从该传感器中读取
20
个数据,然后以
9600的波特率通过串口发送出去。因为 2M
的数据速率远高于串口
9600
的波特率,因此需要将从传感器中采集到的数据首先用 FIFO
缓存起来,然后再以串口的数据速率缓慢发送出去。这里,由于传感器数据的读取和串口数据的发送都是可以同步于同一个时钟的,因此可以使用单时钟结构的 FIFO
来实现此功能 。
3.2 双时钟(异步)FIFO
双时钟 FIFO
的一个典型应用就是异步数据的收发,所谓异步数据是指数据的发送端和接收端分别使用不同的时钟域 。使用双时钟 FIFO 能够将不同时钟域中的数据同步到所需的时钟域系统中。
例如,在一个高速数据采集系统中,实现将高速 ADC
采集的数据通过千兆以太网发送到 PC
机。
ADC
的采样时钟
(CLK1)
由外部专用锁相环芯片产生,则高速
ADC
采样得到的数据就是同步于该 CLK1
时钟信号,在
FPGA
内部,如果
FPGA
工作时钟
(CLK2)是由独立的时钟芯片加片上锁相环产生的,则 CLK1
和
CLK2
就是两个不同域的时钟,他们的频率和相位没有必然的联系,假如 CLK1
为
65M
,
CLK2
为
125M
,那么就不能使用
125M的数据来直接采集 65M
速率的数据,因为两者数据速率不匹配,在采集过程中会出现包括亚稳态 问题在内的一系列问题,所以这里就可以使用一个具备双时钟结构的 FIFO
来进行异步数据的收发。下图
为使用
FIFO
进行异步数