FIFO学习笔记--访问同步/异步 & 读写同步/异步
一、先明确:两个“同步/异步”的本质区别(关键!)
在FPGA的FIFO语境中,“同步/异步”有两个完全不同的定义,必须分开理解:
| 维度 | 定义(核心判断标准) | 目的/影响 |
|---|---|---|
| 1. 访问方式的同步/异步 | 数据读写是否需要时钟沿触发(组合逻辑vs时序逻辑) | 决定数据读写的延迟(无延迟vs有延迟) |
| 2. FIFO类型的同步/异步 | 写时钟(wr_clk)和读时钟(rd_clk)是否相同 | 决定是否能跨时钟域(同一时钟vs不同时钟) |
举个通俗例子:
- 访问方式异步:像“拿货架上的零食”——伸手就拿,不用等(无时钟,组合逻辑);
- 访问方式同步:像“按电梯按钮”——按了要等电梯到达(时钟沿)才能进(时序逻辑);
- FIFO类型同步:像“两个人用同一个闹钟做事”——你存数据、我读数据,都按同一个节奏(同一时钟);
- FIFO类型异步:像“你按北京时间存数据,我按纽约时间读数据”——节奏不同(不同时钟),需要协调。
二、分布式FIFO的“矛盾点”解释:访问方式异步,但FIFO类型仅支持同步
回到你的疑问:“分布式FIFO支持异步访问,又只支持同步FIFO”——这句话的正确解读是:
- 分布式FIFO的访问方式是异步(数据读写不依赖时钟沿,组合逻辑);
- 分布式FIFO的类型仅支持同步(读写必须用同一个时钟,不能跨时钟域)。
原因和分布式FIFO的硬件实现(基于LUT)强相关:
1. 为什么访问方式是“异步”?(基于LUT的组合逻辑特性)
分布式FIFO是用LUT拼接成的分布式RAM实现的——而LUT的本质是“可编程SRAM阵列”,支持“组合逻辑访问”(异步):
- 写操作:只要写使能(wr_en=1)且FIFO未满(full=0),数据会立即存入LUT的SRAM,不需要等时钟沿;
- 读操作:只要读使能(rd_en=1)且FIFO非空(empty=0),数据会立即从LUT的SRAM读出,不需要等时钟沿;
- 核心结果:数据读写“无时钟延迟”(组合逻辑特性),这就是“访问方式异步”的由来。
2. 为什么FIFO类型仅支持“同步”?(无跨时钟域处理能力)
FIFO类型的“异步”(读写时钟不同)需要解决一个关键问题:跨时钟域的指针同步(写指针在wr_clk域,读指针在rd_clk域,直接对比会产生亚稳态)。
而分布式FIFO的限制在于:
- 它是“软核FIFO”(完全由LUT+组合逻辑搭建),没有硬件级的“指针同步模块”(比如格雷码编码、跨时钟域打拍);
- 如果强行让分布式FIFO支持不同时钟(异步类型),写指针和读指针的跨时钟域对比会产生亚稳态,导致满/空标志判断错误(比如误判“满”导致数据丢失,或误判“空”导致读无效数据);
- 工程上为了稳定,分布式FIFO仅支持“读写时钟相同”(同步类型)——此时指针在同一个时钟域,对比无亚稳态,满/空判断可靠。
简单说:分布式FIFO“没能力处理跨时钟域”,所以只能做同步类型,但它本身的读写操作不需要时钟(访问方式异步)。
三、对比:块FIFO的“同步/异步”特性(更常用,避免混淆)
块FIFO基于BRAM实现,和分布式FIFO形成鲜明对比,能帮你更清晰区分两个维度:
- 访问方式:同步(依赖时钟沿)——BRAM是同步存储,数据读写必须在时钟上升沿触发(和你之前学的BRAM ROM/RAM一致);
- FIFO类型:支持同步+异步(主流用异步)——块FIFO有硬件级的指针同步模块(格雷码编码),能安全处理“读写时钟不同”的场景(跨时钟域),这也是FPGA中最常用的FIFO类型。
块FIFO的时序流程(同步访问方式):
- 写操作:wr_clk上升沿 → 采样wr_en和din → 数据存入BRAM;
- 读操作:rd_clk上升沿 → 采样rd_en → 数据从BRAM读出到dout;
- 若为异步类型(wr_clk≠rd_clk):写指针/读指针通过格雷码编码后跨时钟域同步,满/空标志稳定无亚稳态。
四、总结:两个维度的“同步/异步”对应关系(表格清晰梳理)
| FIFO类型 | 访问方式(依赖时钟?) | FIFO类型(读写时钟?) | 核心特性 | 适用场景 |
|---|---|---|---|---|
| 分布式FIFO | 异步(无时钟,组合逻辑) | 仅同步(时钟相同) | 无读写延迟,小容量,不支持跨时钟域 | 小容量缓冲(<1KB)、同一时钟下速率匹配 |
| 块FIFO(同步) | 同步(时钟沿,时序逻辑) | 同步(时钟相同) | 有1~2拍延迟,大容量,时序稳定 | 大容量缓冲(>1KB)、同一时钟下数据缓存 |
| 块FIFO(异步) | 同步(时钟沿,时序逻辑) | 异步(时钟不同) | 有1~2拍延迟,大容量,支持跨时钟域 | 跨时钟域数据交互(如ADC→DSP)、不同速率模块对接 |
五、一句话快速判断(避免混淆)
- 说“访问方式同步/异步”:看数据是不是“等时钟沿”才读写(等=同步,不等=异步);
- 说“FIFO类型同步/异步”:看读写是不是“同一个时钟”(是=同步,不是=异步);
- 分布式FIFO:不等时钟(访问异步),但必须同一个时钟(类型同步);
- 块FIFO(异步):等时钟(访问同步),但可以不同时钟(类型异步)——这是FPGA中最常用的“跨时钟域FIFO”。

浙公网安备 33010602011771号