门电路在 FPGA 中的映射机制
在传统数字电路课上,我们被灌输'与门就是两个晶体管搭出来的物理结构'。但在 FPGA 的世界里,根本没有固定的与门、或门。所有这些'门',都是'虚拟'的——它们是通过一种叫查找表(LUT)的神奇机制动态生成的。
门电路的本质:不是'元件',而是'函数'
先来打破一个迷思:
'我在代码里用了
and原语,FPGA 里就一定有个'与门'。'
错。FPGA 里没有预设的与门,也没有专门的异或门单元。所谓的'门电路',本质上只是一个布尔函数——输入几个比特,输出一个结果。
比如一个 2 输入与门:
- 它的行为由真值表决定;
- 输出只取决于当前输入,无状态;
- 是最典型的组合逻辑。
而在数学上,任何组合逻辑都可以表示为一个 n 变量的布尔函数 $ f(x_1, x_2, …, x_n) $。而 FPGA 要做的,就是用硬件去实现这个函数。
关键来了:实现方式决定了效率和性能。
在 ASIC 中,你可以为每个常用门定制晶体管级电路,做到极致优化;但在 FPGA 中,必须用统一的可编程结构来模拟一切逻辑。于是,就有了 LUT。
FPGA 的'通用积木':LUT 是怎么工作的?
如果说 FPGA 是一块乐高积木板,那查找表(Look-Up Table, LUT)就是最小的功能积木块。
现代主流 FPGA(如 Xilinx 7 系列及以上)普遍采用 6 输入 LUT(LUT6),意味着它可以实现任意一个最多 6 个输入变量的布尔函数。
LUT 的工作原理:把逻辑变成'查字典'
想象一下你要判断三个人是否都同意开会:
| A | B | C | 开会? |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 |
| … | … | … | … |
| 1 | 1 | 1 | 1 |
如果把这个表格存进一个 1-bit × 8 的小内存里,然后让 A、B、C 作为地址线去读取对应位置的数据——那你其实就已经实现了一个 3 输入与门!
这就是 LUT 的核心思想:
把逻辑函数的真值表预先烧录进一个小 SRAM 里,运行时根据输入选择输出。
举个具体例子:实现 y = a & b
- 输入 a 和 b 构成 2 位地址(00, 01, 10, 11)
- 对应输出分别是 0, 0, 0, 1
- 所以 LUT 的内容设置为
4'b0001 - 当输入变化时,自动查表返回结果
不需要专门设计'与门电路',只要改一下配置数据,同一个 LUT 下一秒就能变成异或门、或非门甚至更复杂的逻辑。
这种灵活性正是 FPGA 的灵魂所在。
实际映射过程:你的代码是如何被打包进 Slice 的?
我们来看一个经典案例:半加器。
// 半加器行为级描述
module half_adder (
input a,
input b,
output sum,
output carry
);
assign sum = a ^ b;
assign carry = a & b;
endmodule
这段代码看起来只有两个简单运算。但综合工具看到的是什么?
它会分析这两个表达式:
sum = a ^ b→ 需要一个 2 输入异或门

