第三章 FPGA架构与资源:你手里的“万能积木”到底长什么样?

做FPGA设计这么多年,我经常被刚入行的朋友问到一个问题:“FPGA到底是个什么东西?它凭什么能实现那么多功能?”

其实,FPGA没那么神秘。说白了,它就是一盒高级的“数字积木”。你想想看,乐高积木能拼出房子、汽车、飞船,FPGA里的基本单元就能拼出加法器、计数器、甚至一个完整的CPU。今天,我就带你拆开这盒积木,看看里面到底有哪些宝贝。

3.1 FPGA内部结构:四大金刚

一个典型的FPGA芯片,内部主要由四种核心资源构成。我习惯叫它们“四大金刚”:LUT、FF、BRAM、DSP。你只要搞懂了这四个东西,FPGA的大门就算迈进一半了。

3.1.1 LUT(查找表)—— 逻辑功能的“翻译官”

LUT的全称是Look-Up Table,查找表。它怎么工作的?

想象一下,你有一张真值表。输入A、B、C、D,输出Y。LUT就是把这张表“烧录”到芯片里。输入什么组合,就直接查表得到输出。这比用一堆与门、或门搭电路快多了。

常见的LUT是4输入或6输入的。比如Xilinx的7系列,用的是6输入LUT。一个6输入LUT可以实现任意一个6输入布尔函数。

核心要点: LUT是实现组合逻辑的基本单元。你写的任何组合逻辑,最终都会被综合工具映射成LUT里的真值表。

我在项目中遇到过一个问题:一个复杂的译码器,用LUT实现后,时序总是跑不过。后来发现是LUT的输入太多,级联了好几级。解决办法很简单——把译码器拆成两级流水,中间插一级寄存器。嗯,这里要注意,LUT不是万能的,输入太多会引入延迟。

3.1.2 FF(触发器)—— 时序逻辑的“记忆细胞”

FF就是Flip-Flop,触发器。它是FPGA里用来存储状态的元件。每个FF可以保存1比特数据。

FPGA里的FF通常是D触发器,带有时钟使能(CE)和异步复位(RST)。你写的 always @(posedge clk) 或者 always_ff @(posedge clk),最终都会映射到这些FF上。

我个人习惯,在设计时先估算一下要用多少FF。比如一个32位的计数器,至少需要32个FF。如果资源不够,就得考虑复用或者换更大的芯片。

小技巧: 很多初学者以为FF越多越好。其实不然。FF太多意味着流水线级数深,虽然频率能跑高,但latency(延迟)会变大。这是一个trade-off(权衡)。

3.1.3 BRAM(块RAM)—— 片上的“大仓库”

BRAM是Block RAM的缩写。它是FPGA内部集成的专用存储单元。跟用LUT+FF搭出来的分布式RAM相比,BRAM容量大、速度快、功耗低。

一个典型的BRAM块是36Kb(Xilinx)或20Kb(Altera)。你可以把它配置成单口RAM、双口RAM、FIFO、ROM等等。

我曾经在一个视频处理项目里,需要缓存一帧图像。如果用LUT搭,芯片面积直接爆炸。换成BRAM,轻轻松松搞定。说白了,大块数据存储,一定要用BRAM,别自己用LUT去拼,那是给自己找麻烦。

特性 分布式RAM(LUT实现) BRAM
容量 小(几十到几百比特) 大(几十Kb到几Mb)
速度 快(靠近逻辑) 较快(有专用布线)
功耗 较高 较低
适用场景 小容量、高频率寄存器堆 大容量数据缓存、FIFO

3.1.4 DSP(数字信号处理单元)—— 算力的“发动机”

DSP切片是专门用来做乘法、加法、乘累加运算的硬核模块。它比用LUT搭出来的乘法器快得多,也省资源得多。

Xilinx的DSP48E1(7系列)可以支持25x18的乘法,还能级联做FIR滤波器。Altera的DSP块也类似,支持9x9、18x18、27x27等多种模式。

你想想看,如果做一个32x32的乘法器,用LUT搭可能需要几百个LUT,延迟还大。用DSP块,一个周期搞定。所以,只要涉及乘法、乘累加,优先用DSP。

避坑指南: 我曾经在一个项目中,为了省DSP资源,用LUT搭了一个乘法器。结果时序收敛不了,最后不得不重新改代码。从那以后,我再也不在乘法上省DSP了。DSP就是用来干这个的,别省。

3.2 Xilinx与Altera主流器件对比

市面上主流的FPGA厂商就两家:Xilinx(现在叫AMD Xilinx)和Altera(现在叫Intel Altera)。两家各有千秋,我简单说说我的感受。

对比项 Xilinx(AMD) Altera(Intel)
代表系列 Artix-7, Kintex-7, Virtex-7, Zynq, UltraScale+ Cyclone V, Arria 10, Stratix 10, Agilex
开发工具 Vivado / ISE Quartus Prime
LUT结构 6输入LUT(7系列起) 8输入LUT(部分器件可拆分为两个4输入)
DSP能力 DSP48E1/E2,支持25x18 可变精度DSP,支持9x9到27x27
BRAM 36Kb块,可拆成两个18Kb 20Kb块(M20K)
特色 AXI总线生态好,Zynq带ARM硬核 功耗控制优秀,Cyclone系列性价比高

我个人习惯,做通信或图像处理项目,优先选Xilinx,因为它的DSP和BRAM配合得很好,Vivado的IP核生态也成熟。做低功耗或成本敏感的项目,Altera的Cyclone系列很香。

但说实话,两家工具链都挺难用的。Vivado编译慢,Quartus有时候报错看不懂。嗯,这个只能忍。

3.3 开发板选型建议

选开发板,我建议你从这三个维度考虑:项目需求、预算、学习曲线。

  • 入门学习: Xilinx的Artix-7系列(比如Nexys A7、Basys 3)或者Altera的Cyclone V系列(比如DE10-Lite)。价格几百到一千多,资源够用,文档丰富。
  • 进阶项目: 如果要做图像处理、神经网络加速,建议上Zynq系列(比如ZedBoard、PYNQ-Z2)。带ARM硬核,软硬件协同设计,玩法多。
  • 高性能计算: Kintex-7或Arria 10以上的板子,价格上万,适合做通信基站、雷达信号处理。

我的建议: 如果你是学生或者刚入门,别一上来就买最贵的。一块几百块的Artix-7板子,足够你跑通大部分基础实验了。等你真的需要做高速接口(比如DDR3、PCIe、SFP+)时,再考虑升级。

我曾经见过一个朋友,入门就买了Virtex-7的板子,结果大部分资源都没用到,还因为编译太慢而头疼。选板子,够用就好。

3.4 本章知识体系总览

下面这张图,是我为你整理的本章知识结构。你可以把它当作一张“地图”,随时回来查阅。

FPGA架构与资源知识体系 FPGA芯片 LUT 查找表 FF 触发器 BRAM 块RAM DSP 运算单元 实现组合逻辑 6输入/4输入 真值表映射 存储1比特状态 D触发器 带CE/RST 大容量存储 36Kb/20Kb块 可配RAM/ROM/FIFO 乘法/乘累加 25x18/27x27 硬核加速 Xilinx vs Altera 开发板选型建议 入门:Artix-7 / Cyclone V 进阶:Zynq / Arria 10 Xilinx:Vivado、AXI生态 Altera:Quartus、低功耗

这张图把FPGA的核心资源、厂商对比和选型建议串在了一起。你以后看芯片手册时,可以对照这张图,快速定位到关键信息。

好了,这一章的内容就到这里。FPGA的架构和资源,是后续所有设计的基础。你只有把LUT、FF、BRAM、DSP这四个东西搞明白了,后面讲流水线设计、时序约束、资源优化时,你才能听得懂、用得上。

可可精品资料库