FPGA 比特流 (Bitstream) 深度解析
🔍 什么是比特流 (Bitstream)?
简单理解:比特流是 FPGA 的"配置数据",就像给一块空白的可编程电路板"装配零件"的指令清单。
形象比喻:
你的 Verilog 代码 → 综合/布局布线 → 比特流 (建筑图纸) (施工过程) (具体施工指令)
🧩 比特流的本质
1. FPGA 内部结构
FPGA 由数百万个可配置单元组成:
┌─────────────────────────────────┐
│ ┌───┐ ┌───┐ ┌───┐ ┌───┐ │
│ │LUT│──│FF │──│LUT│──│FF │ │
│ 查找表 (LUT) │ └───┘ └───┘ └───┘ └───┘ │
│ 触发器 (FF) │
│ │ │ │
│ 可编程互连 │
│ ┌───────────────────────────┐ │
│ │ 可编程互连矩阵 (Switch) │ │
│ └───────────────────────────┘ │
│ ┌───┐ ┌───┐ ┌───┐ ┌───┐ │
│ │LUT│──│MUX│──│LUT│──│RAM│ │
│ └───┘ └───┘ └───┘ └───┘ │
└─────────────────────────────────┘
2. 比特流就是配置这些单元的"开关指令"
每个比特控制:
比特 [0] = 1 → LUT0 配置为:输入 A&B 输出 1
比特 [1] = 0 → 开关 S1 断开
比特 [2] = 1 → 触发器 F3 连接到 LUT5 的输出
比特 [3] = 0 → MUX 选择通道 0 ...
(重复几百万次)
实际例子:
// 示例代码
assign out = a & b;
// 综合后变成 LUT2 #(.INIT(4'b1000))
// 这 4 位就会编码到比特流中
lut_inst (.I0(a), .I1(b), .O(out));
🔧 为什么要"烧录"?
FPGA vs 单片机对比
| 特性 | FPGA | 单片机 (MCU) |
|---|---|---|
| 硬件 | 空白的可重构逻辑单元 | 固定的 CPU+ 外设 |
| 程序 | 比特流=重新配置硬件 | bin 文件=CPU 执行的指令 |
| 本质 | 改变电路结构 | 改变程序流程 |

