FPGA 的 LUT 是什么 —— 对比 CPLD 的“与或阵列”
在 FPGA 中,LUT 是 查找表(Lookup Table) 的缩写。它是 FPGA 实现组合逻辑(如加法、选择、条件判断等)的最核心基础单元。
LUT 在硬件上就是一个“固化”在芯片里的真值表。在传统的数字电路设计中,我们是先画出真值表,然后用各种门电路(与门、或门、非门)去拼凑、实现这个真值表。
而在 FPGA 里,这个过程被完全“颠倒”过来了:输入信号 = 存储器的地址(Address)。真值表的输出结果 = 提前写入存储器的数据(Data)。
1 FPGA
1.1 FPGA 工作原理:用“存储”代替“逻辑门”
LUT 的核心思想是用存储器来实现布尔逻辑。它本质上是一个小型的、高速的 SRAM(静态随机存取存储器)。
当你用 Verilog 写了一段组合逻辑(例如 assign Y = (A & B) | C;),编译工具并不会在 FPGA 里去寻找实际的与门和或门,而是会做两件事:
- 算出真值表:把输入
A, B, C所有可能的组合(共 8 种)对应的输出Y全部算出来。 - 写入 LUT:把这个真值表的结果直接烧录到 LUT 的存储单元中。
逻辑的输入信号(A, B, C)直接充当该存储器的地址线,而输出(Y)就是对应地址上存储的数据。

1.2 硬件结构
一个 $N$ 输入的 LUT 主要由两部分组成:
- $2^N$ 个 SRAM 单元:用来存放真值表的输出结果(0 或 1)。
- 多路选择器(MUX)网络:输入信号作为 MUX 的控制端,用来选择哪一个 SRAM 的值被输出。
以一个 4 输入 LUT(4-LUT) 为例:
- 它有 4 个输入端,可以组合出 $2^4 = 16$ 种状态。
- 内部包含 16 个 SRAM 位。
- 无论你写的多输入逻辑函数多么复杂(只要输入不超过 4 个),它在硬件上的延迟都是完全相同的——就是信号通过那一级 MUX 网络到达输出端的固定的物理延迟。
1.3 现代 FPGA 中的 LUT 演进
- 4-LUT:早期的 FPGA 普遍采用 4 输入的 LUT。
- 6-LUT:现代高性能 FPGA基本都全面转向了 6-LUT 架构。
为什么要用 6-LUT? 虽然 6-LUT(需要 64 个 SRAM 位)比 4-LUT(16 个 SRAM 位)消耗更多的硅片面积,但对于现代复杂的数字系统,6-LUT 可以显著减少逻辑层数(Logic Depth)。层数变少了,信号在片内走线的延迟就大大降低,从而能够显著提升 FPGA 的最高工作频率($F_{max}$)。
在很多现代架构中,逻辑单元里的 6-LUT 甚至可以被拆分成两个独立的 5-LUT 或共享输入的双 LUT 使用,以防止逻辑资源浪费。
2 CPLD
与 FPGA “用存储器查表” 的逻辑不同,传统 CPLD 是基于“与或阵列(AND-OR Array)”的乘积项(Product-Term)架构来实现逻辑的。
2.1 CPLD 的核心实现原理:与或阵列
在数字电路中,任何一个复杂的组合逻辑函数都可以化简为“积之和(Sum of Products, SOP)”的形式。例如:
\[Y = (A \cdot B \cdot \bar{C}) + (B \cdot D)\]CPLD 就是直接在硬件上堆砌了大量的“与门”和“或门”来实现这种数学表达式的:
- 与阵列(AND Array):通常是可编程的。输入信号及其反相信号会进入这个阵列,通过编程决定哪些信号连接到同一个与门上,从而形成一个个“乘积项”(如 $A \cdot B \cdot \bar{C}$)。
- 或阵列(OR Array):通常是固定连接(或部分可编程)的。它负责把多个与门的输出(乘积项)加起来,形成最终的逻辑输出 $Y$。
2.2 核心架构:宏单元(Macrocell)
CPLD 的基本结构单元不叫逻辑单元(LE/Slice),而叫宏单元(Macrocell)。一个典型的宏单元通常包含以下几个部分:
- 乘积项选择矩阵:负责分配与门的输出。
- 可编程或门:把选中的乘积项组合在一起。
- 可配置触发器(Flip-Flop):用于实现时序逻辑。如果不需要时序逻辑,可以把触发器旁路(Bypass)掉,直接输出组合逻辑。
- 异或门(XOR):用于方便地实现取反、控制极性或者加法器中的异或操作。
由于物理上就是真实的导线和逻辑门连在一起,CPLD 的输入信号到输出信号只需要经过固定的几级门延迟。
2.3 CPLD 与 FPGA 实现方式的对比
这两者的实现哲学完全不同,导致了它们在特性上的巨大差异:
| 特性 | CPLD(传统) | FPGA |
|---|---|---|
| 底层核心 | 与或阵列(乘积项结构) | LUT 查找表(SRAM 结构) |
| 实现逻辑 | 物理上的逻辑门真实连接 | 用存储器模拟真值表 |
| 时延特性 | 确定性极高(Predictable)。走线和门延迟固定,几乎没有抖动。 | 不确定。延迟取决于编译器的布线结果。 |
| 适合的逻辑 | 适合输入极多、逻辑较浅的组合逻辑(如复杂的地址译码器、总线接口控制)。 | 适合逻辑很深、时序复杂、规模极大的系统(如 CPU、数字信号处理)。 |
| 工艺/断电 | 多数基于 Flash / EEPROM 工艺,断电不丢失代码,上电即运行。 | 多数基于 SRAM 工艺,断电即丢失,上电需要从外部 Flash 加载代码。 |
2.4 现代 CPLD 的“模糊地带”
需要注意的是,随着半导体工艺的发展,现在的“CPLD”和“FPGA”界限已经有些模糊了。
例如 Intel(原 Altera)非常经典的 MAX II / MAX V / MAX 10 系列,虽然市场上依然称它们为 CPLD,但如果去查阅它们的 Datasheet,你会发现它们的内部其实已经放弃了传统的与或阵列,而是采用了和 FPGA 一样的 LUT(查找表)结构。
之所以还叫 CPLD,是因为它们把配置用的 Flash 芯片直接集成到了芯片内部,实现了“单芯片、非易失、上电即运行”的 CPLD 传统外在特性,但在底层实现上,它已经流着 FPGA 的“血”了。而像 Xilinx 的 CoolRunner-II 等经典系列,则是最纯正的传统 CPLD 与或阵列架构。
留下评论