1. 什么是 LUT?
LUT(look-up table)即查找表,是 FPGA 中实现组合逻辑功能的基本单元。可视为小型 SRAM,存储逻辑真值表,输入作为地址线,读取对应逻辑输出结果。
LUT 分为 LUT1 至 LUT6,数字代表输入口数量。例如 LUT4 有 4 个输入地址位,可读写 0~15 共 16 个地址的 bit 数据。
不同 LUT 之间可以级联,一般建议层级不超过 6,否则可能引发时序问题。若超过 6 层,需插入寄存器或降低频率改善时序。
通过设置 LUT 的初始值可实现特定逻辑。例如实现 2bit A、B 是否相等,将 I3=A[1]、I2=A[0]、I1=B[1]、I0=B[0] 映射到输入。当 A=B 时(0000 或 1111),在对应地址写入 1。
Verilog 例化代码:
LUT4 #(
.INIT(16'b1000000000000001) // Logic function
)
LUT4_inst (
.O(O), // 1-bit output: LUT
.I0(B[0]), // 1-bit input: LUT
.I1(B[1]), // 1-bit input: LUT
.I2(A[0]), // 1-bit input: LUT
.I3(A[1]) // 1-bit input: LUT
);
当输入为 0000/1111 时输出为 1,表示 A=B。
2. LUT 与传统逻辑门的对比
传统逻辑门基于与或非等门电路,EDA 工具先将 RTL 综合为门级电路,再综合为 LUT。FPGA 选择 LUT 而非直接门电路的原因如下:
- 性能角度:门电路存在不同时延,组合逻辑中门越多延时越长,易成系统瓶颈。LUT 内部已预置逻辑输出,给定输入即可直接读取结果,有效解决延时问题。
- 底层原理:FPGA 为现场可编程门阵列,属于半定制电路。其基本结构无法像 ASIC 那样固定,只能采用易于反复配置的结构。LUT 本质是 SRAM,初始值可包含各种门级逻辑,支持不改变电路的情况下重复修改逻辑。
3. LUT 可以怎么用?
LUT 主要有 SLICEL 和 SLICEM 两种类型。SLICEL 的 LUT 仅用于组合逻辑;SLICEM 的 LUT 有时钟输入口,可实现数据存储和组合逻辑,内部结构更复杂。
3.1 实现组合逻辑
通过改变初始值实现特定组合逻辑功能。
3.2 搭建 LUT_RAM(分布式 RAM)
FPGA 中 LUT 资源丰富,在小数据量存储需求下可直接使用 LUT 搭建分布式 RAM,节省 BRAM 资源。BRAM 最小容量通常为 18Kbit,少量存储需求占用一个 BRAM 较为浪费。此外,LUT 搭建的分布式 RAM 读写周期为 0,可节省时间。
LUT_RAM 通常提供 IP 核直接使用,具体参考板卡 IP 手册。
3.3 移位寄存器
除寄存器外,通过级联多个 LUT(SLICEM)可实现多位宽移位寄存器。SLICEM 里的 LUT 带 CLK 时钟输入口,一个 LUT6 可作为 32 位移位寄存器使用。

