2、FPGA基础入门:FPGA vs CPU vs GPU、FPGA内部结构(LUT、FF、BRAM、DSP)、主流厂商与选型
好,我们正式开始FPGA的学习。这一章是地基,我会尽量讲得接地气一点。很多初学者一上来就被各种术语吓住了,什么LUT、FF、BRAM,听着像天书。其实没那么玄乎,你把它拆开看,每个部件都有它存在的道理。
2.1 FPGA vs CPU vs GPU:它们到底有啥区别?
先聊个我经常被问到的问题:FPGA和CPU、GPU到底有啥不一样?
CPU,说白了就是个“万能工”。它能处理各种任务,但一次只能处理一个指令流。你让它算1+1,它得先把指令取出来,解码,再执行。效率高吗?对于通用计算来说,很高。但对于某些特定任务,比如大量重复的数学运算,它就有点力不从心了。
GPU呢,是个“包工头”。它擅长同时干很多类似的活,比如渲染图形、训练神经网络。它有很多小核心,每个核心都能做简单运算。但它的灵活性不如CPU,而且控制逻辑相对简单。
FPGA就不一样了。它是个“乐高积木”。你可以用硬件描述语言(比如Verilog)把电路“搭”出来。想做个加法器?搭一个。想做个滤波器?再搭一个。所有电路都是并行工作的,没有“取指令-解码-执行”这个过程。所以,FPGA的延迟极低,吞吐量极高。
核心区别一句话总结:
- CPU:软件执行,串行,灵活,延迟高。
- GPU:并行计算,适合大规模数据并行,延迟中等。
- FPGA:硬件实现,并行,低延迟,可重构。
我在项目中遇到过这样一个场景:客户需要一个高速数据采集系统,要求从传感器读取数据后,在1微秒内完成滤波并输出结果。CPU做不到,因为中断响应和指令执行时间太长。GPU也悬,因为数据从CPU搬运到GPU再搬回来,光这个开销就超了。最后我们用FPGA,直接在硬件里搭了一个流水线,数据进来,处理完,出去,一气呵成。嗯,这就是FPGA的用武之地。
2.2 FPGA内部结构:拆开看看里面都有啥
FPGA内部到底长什么样?我习惯把它想象成一个“电子积木盒”。盒子里主要有四种积木:LUT、FF、BRAM、DSP。我们一个一个看。
2.2.1 LUT(查找表)
LUT是FPGA最基础的逻辑单元。它的作用很简单:实现任意组合逻辑。比如你想实现一个与门(AND),或者一个异或门(XOR),甚至一个复杂的逻辑表达式,LUT都能搞定。
怎么做到的?其实LUT内部是一个小型的RAM。它把输入信号当作地址,去查这个地址里存的是什么值,然后输出。举个例子,一个4输入LUT,有16种输入组合。你提前把这16种组合对应的输出值写进去,它就相当于一个“万能逻辑门”。
避坑指南: 我曾经在设计一个复杂的状态机时,没注意LUT的输入数量限制,结果综合工具报错说“LUT输入不够”。后来我把逻辑拆成两级,用两个LUT级联才解决。所以,设计时心里要有数:一个LUT通常有4-6个输入,别超了。
2.2.2 FF(触发器)
FF是FPGA里的“记忆单元”。它负责存储一个比特的数据,并在时钟沿到来时更新。没有FF,FPGA就只能做组合逻辑,没法做时序逻辑——说白了,就是没法做“有记忆”的电路。
每个LUT后面通常都跟着一个FF。这样,你既可以做组合逻辑,也可以做时序逻辑。我刚开始学的时候,总觉得FF就是用来寄存数据的。后来发现,它还能用来做延迟、同步、分频……用处太多了。
2.2.3 BRAM(块RAM)
BRAM是FPGA内部的存储资源。它是一块一块的RAM,每块大小通常是18Kb或36Kb。你可以把它配置成单端口RAM、双端口RAM、FIFO、ROM等等。
为什么需要BRAM?因为LUT虽然也能当RAM用(叫分布式RAM),但容量太小,而且会消耗宝贵的逻辑资源。BRAM是专用的存储块,容量大,速度快,还不占逻辑资源。
注意: BRAM的读写时序需要仔细处理。尤其是双端口RAM,两个端口同时读写同一个地址时,可能会发生冲突。我见过一个同事,因为没处理好BRAM的读写冲突,导致数据偶尔出错,查了三天才找到原因。嗯,这种坑踩过一次就记住了。
2.2.4 DSP(数字信号处理单元)
DSP是FPGA里的“数学加速器”。它专门用来做乘法、加法、乘累加等运算。一个DSP slice通常包含一个乘法器和一个累加器,可以高效地实现FIR滤波器、FFT、矩阵乘法等。
为什么需要DSP?因为用LUT搭乘法器太浪费了。一个18x18的乘法器,如果用LUT实现,可能要消耗几百个LUT,而且速度还慢。用DSP的话,一个slice就够了,又快又省资源。
我记得有一次做无线通信的基带处理,需要大量的复数乘法。如果全用LUT实现,芯片资源肯定不够。后来我把所有乘法都映射到DSP上,资源占用直接降了70%。所以,设计时一定要优先考虑DSP资源。
2.3 主流厂商与选型
FPGA市场现在主要是两家独大:Xilinx(现在叫AMD)和Intel(原Altera)。另外还有Lattice、Microchip(原Microsemi)等小众厂商。
| 厂商 | 代表系列 | 特点 | 适用场景 |
|---|---|---|---|
| AMD (Xilinx) | Artix, Kintex, Virtex, Zynq | 生态成熟,文档丰富,高端性能强 | 通信、数据中心、AI加速 |
| Intel (Altera) | Cyclone, Arria, Stratix | 功耗控制好,与Intel处理器集成方便 | 工业、汽车、嵌入式 |
| Lattice | iCE40, ECP5, CrossLink | 超低功耗,小封装,价格低 | IoT、消费电子、接口桥接 |
| Microchip | IGLOO2, PolarFire | 高可靠性,抗辐射,安全特性强 | 航空航天、军工、医疗 |
选型时,我一般会考虑这几个因素:
- 资源需求:先估算你需要多少LUT、FF、BRAM、DSP。别买小了,也别买大了浪费钱。
- 速度等级:你的设计需要跑多快?100MHz还是500MHz?不同速度等级价格差很多。
- 封装与功耗:如果是手持设备,选Lattice的低功耗系列。如果是基站设备,选Xilinx的高性能系列。
- 开发工具:Xilinx用Vivado,Intel用Quartus。我个人觉得Vivado的IP核生态更丰富,但Quartus的编译速度更快。看个人习惯。
- 供货与成本:批量生产时,芯片价格和供货周期很重要。Lattice的芯片便宜,但性能有限。Xilinx的高端芯片贵,但性能强。
我的建议: 如果你是初学者,先别纠结选型。买一块Xilinx Artix-7或者Intel Cyclone IV的开发板,几百块钱,足够你入门了。等你有项目经验了,自然知道该选什么。
好了,这一章的内容就到这里。FPGA的基础结构其实不复杂,关键是理解每个部件的作用,以及它们如何协同工作。下一章我们会开始写第一行Verilog代码,到时候你就知道这些LUT、FF、BRAM、DSP是怎么被“用”起来的了。