FPGA基础回顾:架构、开发流程与常用EDA工具
各位同学,今天我们聊聊FPGA的基础。说实话,很多做AI加速的朋友,一开始都盯着GPU,觉得FPGA门槛高。但真正上手后你会发现,FPGA的灵活性和低延迟,在VLA模型推理场景下,是GPU很难替代的。
我个人习惯,每次开始一个新项目前,都会先画一张FPGA内部的结构草图。为什么?因为只有把硬件摸透了,写出来的RTL代码才靠谱。下面这张图,就是我对FPGA核心架构的理解。
1. FPGA架构:四个核心要素
FPGA说白了就是一块「万能积木」。你通过编程,把里面的基本单元拼起来,就能实现任意数字电路。我把它拆成四个核心要素:LUT、FF、BRAM、DSP。
1.1 LUT(查找表)—— 逻辑的灵魂
LUT本质上是一个小型的RAM。比如一个6输入LUT,内部有2^6=64个存储位。你输入6位地址,它直接输出对应存储位的内容。我在项目中遇到过,有人用LUT实现复杂的组合逻辑,结果综合后面积爆炸。为什么?因为LUT的输入引脚是有限的,超过6个输入,就要级联多个LUT,延迟和面积都上去了。
关键点:LUT的输入引脚数决定了单级逻辑的复杂度。Vivado综合时,会尽量将逻辑映射到单个LUT内。如果不行,就拆成多级。
1.2 FF(触发器)—— 时序的基石
FF负责存储状态。每个FF都有一个时钟引脚、一个数据输入D、一个数据输出Q。时钟上升沿时,D的值被锁存到Q。嗯,这里要注意:FF的建立时间和保持时间,是时序分析的核心。我曾经因为忽略了保持时间,导致芯片在高温下频繁出错,排查了整整两天。
个人经验:写RTL时,我习惯在每个always块里只对一个时钟沿敏感。混合使用上升沿和下降沿,会让时序收敛变得非常痛苦。
1.3 BRAM(块RAM)—— 数据的仓库
BRAM是FPGA内部的专用存储单元。一个BRAM通常是36Kb大小,可以配置成单端口、双端口、甚至FIFO。你想想看,如果不用BRAM,而是用LUT搭一个大的RAM,那资源消耗会非常恐怖。在VLA模型中,权重参数和中间激活值,我一般都会优先考虑用BRAM来存。
| BRAM配置模式 | 位宽 | 深度 | 典型用途 |
|---|---|---|---|
| 单端口 | 1~72 bit | 512~32768 | 权重存储 |
| 真双端口 | 1~36 bit | 1024~32768 | 数据缓存 |
| 简单双端口 | 1~72 bit | 512~32768 | FIFO实现 |
1.4 DSP(数字信号处理单元)—— 计算的引擎
DSP48单元是Xilinx FPGA的杀手锏。它内部集成了一个乘法器和一个加法器,可以在一个时钟周期内完成乘加运算。对于VLA模型中的矩阵乘法、卷积运算,DSP单元是绝对的主力。我记得有一次做量化推理,直接用DSP48的预加器功能,把两个权重先加起来再乘,省了一个DSP资源。
避坑指南:我曾经以为DSP48可以无限使用,结果发现它的输入输出寄存器是有限的。如果流水线级数太多,需要额外的FF来打拍,反而会浪费资源。所以,用DSP之前,先看看它的寄存器配置。
2. 开发流程:从RTL到比特流
FPGA的开发流程,说白了就是「写代码 -> 编译 -> 下载」。但每一步都有坑。我按顺序讲一下。
2.1 RTL设计
用Verilog或VHDL描述硬件行为。我个人习惯用Verilog,因为语法更简洁。写RTL时,脑子里要时刻想着「这段代码会综合成什么电路」。比如:
// 一个简单的累加器
module accumulator (
input clk,
input rst_n,
input [7:0] data_in,
output reg [15:0] sum
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
sum <= 16'd0;
else
sum <= sum + data_in;
end
endmodule
这段代码综合后,会生成一个加法器和一个16位的寄存器。加法器用LUT实现,寄存器用FF实现。很简单,对吧?但如果你写成 sum = sum + data_in;(阻塞赋值),那综合出来的电路就完全不一样了。
2.2 综合
综合就是把RTL代码转换成门级网表。Vivado的综合工具会做逻辑优化、资源共享、状态机编码等。我建议综合时,打开「keep hierarchy」选项,这样调试时能看清每个模块的边界。
2.3 布局布线
这一步是把门级网表映射到FPGA的实际物理资源上。布局决定LUT、FF、BRAM放在哪个位置,布线决定它们之间的连线。布局布线是耗时最长的步骤,也是时序收敛的关键。我曾经有一个设计,综合后时序报告全是绿的,但布局布线后全是红的。为什么?因为布线资源不够,信号绕了远路。
核心原则:布局布线前,一定要加好时序约束。没有约束的布局布线,就像没有导航的开车——你永远不知道会跑到哪里去。
3. 常用EDA工具:Vivado与Quartus
目前主流的FPGA厂商,Xilinx用Vivado,Intel用Quartus。我两个都用过,说说感受。
3.1 Vivado(Xilinx)
Vivado的界面很现代,支持Tcl脚本自动化。它的综合引擎非常强大,特别是对高扇出信号的优化。我个人习惯用Vivado的「Report QOR Assessment」功能,可以提前预估设计能不能达到目标频率。
- 优点:IP核丰富,AXI总线支持好,调试工具(ILA/VIO)方便。
- 缺点:编译时间长,特别是大工程,跑一次布局布线可能要几个小时。
3.2 Quartus(Intel)
Quartus的编译速度比Vivado快,特别是增量编译。它的「Chip Planner」工具可以手动调整布局,适合高级用户。但它的IP核生成器不如Vivado直观。
- 优点:编译快,功耗分析准确。
- 缺点:对SystemVerilog的支持不如Vivado好。
我的建议:如果你是做AI加速,优先选Vivado。因为Xilinx的Vitis AI工具链和DPU IP核,对VLA模型的支持更成熟。但如果你做的是低功耗嵌入式应用,Quartus的功耗优化更胜一筹。
4. 小结
FPGA的基础,说白了就是理解LUT、FF、BRAM、DSP这四个基本单元,掌握RTL设计、综合、布局布线这三个步骤,以及熟悉Vivado和Quartus这两个工具。这些内容看起来简单,但每一个点都值得深挖。我在后续的课程中,会结合VLA模型的具体算子,带大家一步步把这些基础用起来。
公众号:蓝海资料掘金营,微信deep3321