第二章:FPGA的诞生与演进
说实话,每次有新人问我FPGA是怎么来的,我都会先讲一个故事。那是上世纪80年代,做数字电路设计的人,手里只有两种选择:要么用一堆74系列小芯片搭电路,要么去流片做ASIC。前者太慢太笨重,后者太贵太冒险。
我当时刚入行,跟着师傅做一块通信板卡。板子上密密麻麻全是DIP封装的逻辑门,光是布线就折腾了两周。师傅叹了口气说:“要是能有一种芯片,既能像ASIC一样灵活,又能像通用芯片一样买来就用,该多好。” 嗯,这个想法,就是FPGA的起点。
2.1 从PAL/GAL到CPLD:可编程逻辑的萌芽
最早的可编程逻辑器件,叫PAL(可编程阵列逻辑)。它内部是一个固定的“或”阵列,加上一个可编程的“与”阵列。说白了,就是你可以通过烧断熔丝,来决定哪些输入信号参与逻辑运算。
我印象很深,当年调试一块PAL电路,烧错了熔丝,整片芯片就废了。后来有了GAL(通用阵列逻辑),它改用EEPROM单元,可以擦除重写。这算是一个巨大的进步——至少你烧错了还能再来一次。
再往后,出现了CPLD(复杂可编程逻辑器件)。它把多个PAL/GAL模块集成在一起,中间用可编程互连矩阵连接。CPLD的特点是:
- 非易失性:掉电不丢配置
- 时序可预测:延迟基本固定
- 适合做胶合逻辑和状态机
我在一个老项目中用过CPLD做PCI接口的地址译码。说实话,那玩意儿用起来挺顺手,但一旦逻辑规模超过几百个宏单元,就开始捉襟见肘了。
关键区别: CPLD是基于乘积项架构的,适合组合逻辑多的设计;而FPGA是基于查找表(LUT)架构的,适合时序逻辑多的设计。这个区别,决定了它们各自的应用场景。
2.2 Xilinx与Altera的江湖往事
说到FPGA,绕不开两家公司:Xilinx和Altera(现在叫Intel PSG)。
1985年,Xilinx推出了世界上第一款FPGA——XC2064。它只有64个逻辑模块,每个模块只有3个查找表输入。放在今天,这点资源连个计数器都嫌少。但在当时,这已经是革命性的了。
我记得有个老工程师跟我说过,当年他们拿到XC2064的样片时,整个实验室都沸腾了——终于有一种芯片,可以在实验室里“现场”改变硬件逻辑了。
Altera则是在1984年就成立了,但它的第一款FPGA(FLEX系列)直到1990年代才推出。两家公司从此开始了长达三十年的竞争:
| 年代 | Xilinx | Altera |
|---|---|---|
| 1985 | XC2064(首款FPGA) | EP300(PLD) |
| 1990s | Spartan/Virtex系列 | FLEX/APEX系列 |
| 2000s | Virtex-II Pro(内嵌PowerPC) | Stratix系列(内嵌DSP) |
| 2010s | Zynq(ARM+FPGA) | Cyclone V SoC(ARM+FPGA) |
| 2020s | Versal(AI引擎) | Agilex(Intel 7工艺) |
2015年,Altera被Intel收购,变成了Intel PSG。很多人觉得这是FPGA行业的转折点。我个人倒觉得,竞争格局变了,但技术演进的方向没变——都是往更密、更快、更智能的方向走。
一个小建议: 初学者选开发板,我建议优先考虑Xilinx的Artix-7系列或者Intel的Cyclone IV系列。这两款芯片资料多、社区活跃,踩坑了也有人帮你。我当年就是拿一块Spartan-3E板子入的门,虽然现在看那板子性能很弱,但用来学基础完全够了。
2.3 FPGA芯片内部到底长什么样?
好,现在我们来拆开一个FPGA,看看里面到底有什么。你想象一下,FPGA的内部结构,就像一个巨大的乐高底板:
FPGA内部主要由这几部分组成:
1. 可编程逻辑块(CLB/LAB)
这是FPGA的核心。每个逻辑块里包含若干个查找表(LUT)和触发器(FF)。LUT本质上是一个小型的RAM,你可以把它理解成一个“真值表生成器”——输入4个或6个信号,输出你想要的结果。
我在项目中遇到过一个问题:同样的逻辑,用LUT实现和用门电路实现,面积和延迟差别很大。后来我养成了一个习惯——写代码之前,先想想这个逻辑会被综合成几个LUT。这个习惯帮我避免了很多次“综合后资源不够”的尴尬。
2. 可编程互连资源
逻辑块之间靠什么连起来?靠的是纵横交错的金属线和可编程开关。你可以把这些开关想象成高速公路的匝道——通过配置它们,就能把任意两个逻辑块连接起来。
注意: 互连延迟是FPGA时序分析中最难搞的部分。我曾经调试过一个设计,逻辑功能完全正确,但就是跑不到目标频率。最后发现是某条互连路径绕了太多弯,导致延迟超标。解决办法是调整布局约束,让相关逻辑靠得更近。
3. 输入输出块(IOB)
IOB负责芯片内部信号和外部引脚之间的接口。它支持各种电平标准:LVCMOS、LVDS、SSTL等等。选错IO标准,轻则信号质量差,重则烧芯片。
4. 块RAM(BRAM)
FPGA内部有专用的存储资源,叫块RAM。每个块RAM通常是36Kbit大小,可以配置成单端口、双端口、FIFO等模式。我一般用它来做数据缓存和跨时钟域处理。
5. DSP单元
现代FPGA都集成了硬核的DSP乘法器。以Xilinx的DSP48E2为例,它可以在一个时钟周期内完成一个25x18位的乘法,还能级联起来做FIR滤波器。如果你做数字信号处理,这东西是神器。
6. 时钟管理单元
PLL和MMCM用来产生不同频率、不同相位的时钟。我建议初学者一定要理解“时钟是FPGA的脉搏”这句话——时钟没处理好,整个设计都会出问题。
2.4 现代FPGA的演进趋势
现在的FPGA,已经不是当年那个单纯的“可编程逻辑”了。你看看这几年的新品:
- 异构集成: 把ARM处理器、AI引擎、高速收发器全部塞进一颗芯片里。比如Xilinx的Zynq UltraScale+,一颗芯片就是一个完整的嵌入式系统。
- 先进工艺: Intel的Agilex用上了Intel 7工艺,Xilinx的Versal用上了7nm。工艺越先进,逻辑密度越高,功耗越低。
- 硬化IP: 越来越多的功能被做成硬核——PCIe Gen5、DDR5控制器、100G以太网MAC。这些硬核比用逻辑搭出来的省电、省面积、跑得快。
我个人觉得,FPGA的未来是“软件定义硬件”。你想想看,以前改硬件要换芯片、改PCB,现在只需要下载一个新的比特流文件。这种灵活性,是ASIC永远比不了的。
给新人的一句话: 别被FPGA的复杂性吓到。你不需要一开始就搞懂所有模块。先学会怎么用LUT和触发器搭一个计数器,然后慢慢扩展。我当年就是从“点亮一个LED”开始的——那个LED闪烁的瞬间,我觉得自己打开了新世界的大门。
公众号:蓝海资料掘金营,微信deep3321