FPGA笔记5.1——FIFO IP核的配置
目录
- 一、FIFO简介
- 二、Vivado FIFO IP核的配置
- 三、Standard FIFO(标准模式)和 First Word Fall Through(FWFT,首字预显模式)的区别
一、FIFO简介
FIFO(First In, First Out,先进先出)是数字电路设计和计算机体系结构中一种极其基础且重要的数据缓冲模块。可以把它想象成一条单行道的输水管或者超市的结账排队通道:数据像水流或顾客一样,从一端进入,按照严格的顺序从另一端离开。最先进入的数据,必然最先被读出。
1. 核心原理
从硬件实现的角度来看,FIFO 本质上是一个双端口存储器(RAM)加上一套读写指针控制逻辑。
- 存储介质:内部是一块 RAM(在 FPGA 中通常是 Block RAM 或 Distributed RAM/LUTs),用来暂存数据。
- 环形缓冲(Circular Buffer):
- 写指针(Write Pointer):指向下一个要写入数据的位置。每写入一个数据,指针加 1。
- 读指针(Read Pointer):指向下一个要读取数据的位置。每读出一个数据,指针加 1。
- 当指针达到最大深度时,会自动回绕到 0,形成一个环。
- 空/满标志(Flags):
- Empty(空):当读指针追上了写指针(Read == Write),说明没数据了,FIFO 变空。此时禁止读操作。
- Full(满):当写指针绕了一圈追上了读指针(Write == Read + Depth),说明存满了,FIFO 变满。此时禁止写操作,否则会发生“溢出(Overflow)”。
2. 存在的必要性:为什么要用 FIFO?
在简单的电路中,数据直接从模块 A 传到模块 B 即可。但在复杂的数字系统中,模块 A 和模块 B 往往处于不同的“节奏”或“环境”中。FIFO 的核心价值在于 “解耦” (Decoupling)。它解决了以下三大核心矛盾:
A. 跨时钟域传输(Clock Domain Crossing, CDC)—— 最重要的功能
这是 FIFO 在 FPGA 设计中存在的最大理由。
- 问题:模块 A 跑在 100MHz,模块 B 跑在 50MHz。如果 A 直接发数据给 B,数据会丢失或产生亚稳态(Metastability),导致系统崩溃。
- 解决:使用异步 FIFO(Asynchronous FIFO)。A 用 100MHz 的时钟把数据写入 FIFO,B 用 50MHz 的时钟从 FIFO 读出。FIFO 内部通过格雷码(Gray Code)和同步器处理了跨时钟域的风险,保证数据安全过河。
B. 吞吐率匹配(带宽平滑)
- 问题:模块 A 产生数据的速度是“突发”的(一阵快一阵慢),而模块 B 处理数据的速度是“匀速”的。例如:ADC 采集数据非常快,但 CPU 处理数据比较慢。
- 解决:FIFO 充当蓄水池。当 A 爆发性写入数据时,FIFO 先把数据暂存起来;然后 B 再以自己的慢速从容地读走。只要长时间平均带宽匹配,数据就不会丢失。
C. 数据位宽转换(Gearbox / 变速箱)
- 问题:模块 A 输出是 32-bit 位宽,但模块 B 输入只能接受 8-bit 位宽。
- 解决:使用支持非对称读写的 FIFO。写入端设为 32-bit,读出端设为 8-bit。FIFO 会自动把一个 32-bit 的字拆成四个 8-bit 的字吐出来,反之亦然。
3. 常见分类
根据读写时钟的关系,FIFO 分为两类:
- 同步 FIFO (Synchronous FIFO / Common Clock):
- 读写使用同一个时钟。
- 用途:仅用于同一时钟域内的数据缓冲,比如暂存一段数据等待后续处理。
- 特点:延迟极低,逻辑简单。
- 异步 FIFO (Asynchronous FIFO / Independent Clocks):
- 读写使用两个独立、频率不同甚至相位不固定的时钟。
- 用途:跨时钟域处理(CDC)。
- 特点:设计复杂(涉及格雷码指针转换),有一定的固有延迟(同步级数),但能隔离时钟域。
4. 两种读模式:Standard vs. FWFT
在实际使用 IP 核时,会经常遇到这两个概念:
- Standard FIFO (标准模式):你给一个读使能(Read Enable),数据在下一个时钟周期才出来。这符合 RAM 的物理特性。
- FWFT FIFO (First-Word Fall-Through,首字预现):数据还没给读使能,就已经“掉”到输出口了。你给读使能,实际上是把当前数据“拿走”,让下一个数据掉下来。这种模式不需要等待一拍,对时序逻辑设计更友好。
二、Vivado FIFO IP核的配置
Basic

1. Interface Type (接口类型)
决定 FIFO 对外呈现的信号协议。
- Native (原生接口) :这是最基础的 FIFO 接口,包含标准的
wr_en(写使能)、din(写数据)、full(满)、rd_en(读使能)、dout(读数据)、empty(空) 等信号。它适用于一般的数据缓冲和跨时钟域处理 。 - AXI Memory Mapped :实现 AXI4、AXI3 或 AXI4-Lite 协议接口的 FIFO。一般用于与ZYNQ系列FPGA的PS 端进行数据交互。
- AXI Stream :实现 AXI4-Stream 协议接口的 FIFO,常用于视频或高速流数据处理。
2. Fifo Implementation (FIFO 实现方式)
决定了 FIFO 内部使用的存储资源类型以及时钟架构。
- 当前选择:
Independent Clocks Block RAM(独立时钟 Block RAM) 。- Independent Clocks (独立时钟):读写操作使用两个不同的时钟 (
wr_clk和rd_clk)。IP 核内部会自动处理跨时钟域的同步问题 。这通常用于解决跨时钟域 (CDC) 问题。 - Block RAM (块 RAM):使用 FPGA 内部专用的 BRAM 资源来存储数据。这种方式适合中等或较大深度的 FIFO,且支持非对称位宽(读写位宽不同)和 ECC 功能 。
- Independent Clocks (独立时钟):读写操作使用两个不同的时钟 (
- 其他选项对比:
- Common Clock:读写使用同一个时钟 (
clk),延迟更低,但不具备跨时钟域功能 。 - Distributed RAM:使用 FPGA 的逻辑资源 (LUTs) 搭建 RAM。适合深度很小(如 16-64 深)的 FIFO,节省 BRAM 资源 。
- Shift Register:使用移位寄存器,适合深度较小且不需要随机访问的场景 。
- Built-in FIFO:使用 FPGA 芯片内硬核 FIFO 控制器(如 7 Series 或 UltraScale 中的 FIFO 硬核),性能最高且节省逻辑资源,但功能定制性(如标志位)可能受限 。
- Common Clock:读写使用同一个时钟 (
3. Synchronization Stages (同步级数)
- 含义:定义了跨时钟域逻辑中同步器的级数 。
- 当前设置:
2。这是默认值。 - 作用:用于降低亚稳态 (Metastability) 的风险。如果时钟频率非常高,可能需要增加到 3 或 4 级来提高可靠性 。
4. FIFO Implementation Options (FIFO 实现选项表)
这是一个信息展示区。根据上方选择的 “Fifo Imple