第二章: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内部结构示意图 可编程逻辑块阵列 (CLB / LAB) LUT FF MUX LUT FF MUX LUT FF MUX LUT FF MUX LUT FF MUX IOB IOB IOB IOB IOB IOB IOB IOB BRAM 块RAM BRAM 块RAM BRAM 块RAM DSP48 DSP48 DSP48 DSP48 配置 逻辑 (SRAM) 时钟 管理 (PLL/MMCM) 图例 CLB IOB BRAM DSP 配置

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