FPGA 比特流深度解析
什么是比特流?
通俗来说,比特流就是 FPGA 的'配置数据'。如果把 FPGA 看作一块空白的可编程电路板,比特流就是告诉它如何装配内部零件的指令清单。
类比一下:你的 Verilog 代码是设计图纸,综合与布局布线是施工过程,而比特流则是最终下达给硬件的具体施工指令。
比特流的本质
1. FPGA 内部结构
FPGA 由数百万个可配置单元组成。核心组件包括查找表(LUT)、触发器(FF)以及可编程互连矩阵(Switch)。这些单元通过特定的连接方式构成了逻辑功能。
┌─────────────────────────────────┐
│ ┌───┐ ┌───┐ ┌───┐ ┌───┐ │
│ │LUT│──│FF │──│LUT│──│FF │ │
│ 查找表 (LUT) 触发器 (FF) │
│ └───┘ └───┘ └───┘ └───┘ │
│ 可编程互连矩阵 (Switch) │
│ ┌───────────────────────────┐ │
│ │ │ │
│ └───────────────────────────┘ │
└─────────────────────────────────┘
2. 比特流就是配置这些单元的'开关指令'
每个比特控制着具体的连接状态:
- 比特 [0] = 1 → LUT0 配置为输入 A&B 输出 1
- 比特 [1] = 0 → 开关 S1 断开
- 比特 [2] = 1 → 触发器 F3 连接到 LUT5 的输出
- ...
这个过程重复几百万次,直到整个芯片被配置完成。
实际例子:
// 你的代码
assign out = a & b;
// 综合后变成 LUT2
#(.INIT(4'b1000)) // 这 4 位就会编码到比特流中
lut_inst (.I0(a), .I1(b), .O(out));
为什么要'烧录'?
FPGA vs 单片机对比
| 特性 | FPGA | 单片机 (MCU) |
|---|---|---|
| 硬件 | 空白的可重构逻辑单元 | 固定的 CPU+ 外设 |
| 程序 | 比特流=重新配置硬件 | bin 文件=CPU 执行的指令 |
| 本质 | 改变电路结构 | 改变程序流程 |
形象类比
单片机(执行 bin 文件): 你雇了一个厨师 (CPU),给他一份菜谱 (bin 文件)。厨师按菜谱步骤做菜:切菜、炒菜、装盘。这是顺序执行指令。
FPGA(加载 bitstream): 你有一个魔法厨房 (FPGA),可以变形。给它施魔法 (bitstream) 后:灶台变成 3 个 (并行处理)、刀具自动切菜 (硬件加速)、整个厨房变成专门做这道菜的流水线。这是物理重构电路。
为什么不烧录 bin 文件?
本质区别
BIN 文件(单片机) 内容主要是 CPU 指令序列。CPU 按顺序读取并执行这些指令。
; bin 文件内容:CPU 指令序列
0x00: MOV R0, #0x01 ; 把 1 存到寄存器
0x04: ADD R0, R0, #1 ; 寄存器 +1
0x08: STR R0,

