FPGA 与 CPLD 的区别:乘积项、查找表与上电即行的架构分野
在数据手册和招聘要求里,CPLD 与 FPGA 经常被并称为「可编程逻辑器件」,很多教程也把它们放在同一章。但拆开芯片盖看,两者的内部结构几乎是两条技术路线:一个继承自 PAL/GAL 的与或阵列,靠 Flash 单元记住自己的功能,上电的一瞬间就开始工作;一个以查找表为基本积木,配置存在易失的 SRAM 里,每次上电都要经历一段「先加载、后开工」的窗口。
如果你刚读完 LUT 与触发器:FPGA 逻辑单元深度剖析 和 FPGA 配置方式有哪几种,这篇正好回答一个自然冒出来的问题:既然 FPGA 的 SRAM 配置掉电就丢,那有没有掉电不丢、上电直接干活的可编程芯片?有,就是 CPLD。本篇按「历史谱系 → 两边的内部结构 → 配置与上电 → 时序与工程后果 → 容量功耗成本 → 现代边界与选型」六步,把 FPGA 与 CPLD 的区别一次讲透。
这张概念卡是全篇的地图。读它抓住三条竖线:左中两组讲「硅片里是什么、上电后发生什么」,是 FPGA 与 CPLD 的区别的物理根源;最右一组讲这些物理差异怎样翻译成工程上的取舍。下面逐节展开。
本文要回答的问题
- CPLD 内部的「乘积项、宏单元」和 FPGA 的「LUT、CLB」实现同一个与门时,路径有什么不同?
- 为什么 CPLD 掉电不丢配置、上电即行,而 FPGA 每次上电都要从外部 Flash 重新加载?
- 「引脚到引脚延迟确定」是什么意思,它给地址译码、电源时序这类设计带来什么好处?
- 板子上已经有 FPGA 了,为什么还经常要配一颗 CPLD?现代非易失 FPGA 会不会把 CPLD 淘汰?
一、先看历史:PAL/GAL 到 CPLD/FPGA 的谱系
可编程逻辑的故事从二十世纪七十年代的 PLA(可编程逻辑阵列)开始:任何组合逻辑都能化成积之和(与或表达式),于是硅片上摆「与门阵列 + 或门阵列」,用熔丝烧断多余连接就实现了你要的方程。之后的 PAL 固定或阵列、只让与阵列可编程,便宜且普及;GAL 把一次性熔丝换成电可擦除 EEPROM,一颗芯片可反复擦写,这是 CPLD 的直接祖先。
CPLD(复杂可编程逻辑器件)就是「把多个 PAL/GAL 块连同可编程互连做进一颗芯片」:若干逻辑块围着一个集中式布线资源,配置位仍是 Flash/EEPROM。它的基因里写着两件事:与或阵列结构和非易失配置。
FPGA(现场可编程门阵列)走了另一条路。基本单元不是与或阵列,而是靠小存储器查表实现任意函数的 LUT,配置存在 SRAM 单元里。单元粒度细、可以铺得极密,容量能做大;但 SRAM 易失,每次上电都得从外部搬配置。后面三节的所有差异几乎都能追溯到这道分野。
二、CPLD 内部:乘积项、宏单元与集中式布线
要看懂 CPLD,先看一个宏单元(macrocell)里有什么。
每个宏单元的核心是一组乘积项(product term):若干输入先做「与」,产生若干个乘积项,再送进一个或门相加,得到积之和表达式;后面挂一个可配置的触发器(D 触发器可旁路,旁路后就是纯组合输出),再配一些极性选择、输出使能和反馈开关。几十个宏单元组成一个逻辑块,逻辑块之间通过一块集中式布线资源(常叫 PIA 或 UIM,可以理解为一块全交叉开关矩阵)互连——任何输入到任何宏单元、任何宏单元反馈到任何宏单元,走的都是同一类、级数相同的布线路径。
这种结构有三个直接后果。
第一,资源模型是「方程」而不是「门」。你写的地址译码 assign cs = (addr[15:12] == 4'hA) && en; 会被化成几个乘积项,编译器报告的是「用了 3 个宏单元、5 个乘积项」,而不是 LUT 数。若一个表达式乘积项不够,还能借相邻宏单元的乘积项(product term sharing),代价是多一级延迟。
第二,布线是集中的、可枚举的。因为路径类型统一,信号从这只脚进、那只脚出经过几级电路是固定的,数据手册敢直接给出引脚到引脚(pin-to-pin)的确定延迟,例如 t_PD 一个明确的纳秒数,与你的设计占用率基本无关。
第三,配置位就是 Flash 本身。宏单元之间谁连谁、触发器用不用,由片内非易失存储单元决定,上电时这些位本来就在,没有「加载」这个动作。
这张架构对照图按两个灰色容器左右排开,蓝色是两边的运算主体,紫色是布线资源,绿色表示「非易失、上电即在」,红色表示「易失、必须被填充」,橙色是外挂的非易失仓库。读这张图对比三个位置即可:运算单元一个是与或阵列一个是查表;布线一个集中一个分段;配置存储一个在片内非易失,一个在易失 SRAM 里、外挂 Flash 只负责当仓库。FPGA 一侧还多出 BRAM、DSP、SerDes 这类专用硬块——这是容量堆上去之后的红利,下一节细说。
三、FPGA 内部:LUT、触发器与分段布线
FPGA 的基本积木在 LUT 与触发器:FPGA 逻辑单元深度剖析 里已经完整拆过,这里只对比着复述要点。一个 LUT 本质上是一小块 SRAM:N 输入的 LUT 有 2 的 N 次方个存储位,输入当地址、输出就是查表结果,于是同一个四输入与门、四选一多路器、异或网络,在硅片上都是同一张表,只是写入的内容不同。LUT 配对触发器,加上进位链和本地互连,组成一个可配置逻辑块(CLB,Intel 侧常叫 LE/ALM)。
成千上万个 CLB 之间不是全交叉开关,而是分段布线:短连线覆盖相邻块,长连线跨越数行数列,靠开关矩阵(switch matrix)里的配置 SRAM 单元把需要的段接通。信号从 A 到 B 具体走几段短连线、过几个开关,是布局布线工具根据当前设计的占用情况现算的——换一个设计,即使同样两个寄存器之间,路径都可能不同。
细粒度 + 分段布线的回报是容量和弹性:现代 FPGA 从几万到数百万个 LUT 不等,逻辑阵列之外还嵌入 BRAM(参见 BRAM 与分布式 RAM 怎么选)、DSP 乘加单元(参见 DSP48 是什么)、高速收发器、处理器软核甚至硬核。代价是延迟要靠工具分析才知道(这正是 XDC 管脚与时序约束 存在的原因),且几十万到上亿个配置位必须在上电时一次性写入。
CPLD 的容量天花板则很明显:经典产品通常只有几百到几千个宏单元,再往上做,与或阵列和集中布线的硅片面积都不划算——大逻辑量应用自然被推向 FPGA。
四、配置工艺与上电行为差异
结构差异最直观的爆发点是上电。
CPLD 的配置位是非易失的 Flash/EEPROM(早期还有紫外线擦除的 EPROM 工艺)。芯片一上电,电源电压进入有效区间,宏单元和布线开关就已经按烧入的内容连通,组合输出几乎随电源建立而有效,时序逻辑等时钟沿到来即可动作。没有外部存储、没有加载过程、没有 DONE 信号,这就是常说的上电即行(instant-on / instant-up)。
FPGA 的 SRAM 工艺则完全不同。上电后芯片先做上电复位(POR),清空配置存储器、采样模式引脚决定从哪里取镜像,然后从 SPI/BPI Flash 或外部主控把比特流逐帧搬入配置 SRAM,做完 CRC 校验,DONE 拉高、STARTUP 阶段释放 I/O,用户逻辑这才开始运行。完整过程的每个步骤在 FPGA 上电配置时序详解 里有逐拍图解,FPGA 配置方式有哪几种 则讲清了主模式、从模式与 JTAG 三个入口的分工。
这张上电时序对照图里,上方 CPLD 只有三级,蓝色后立刻进入两个绿色「已工作」状态;下方 FPGA 要穿过红色 POR、橙色搬运、红色校验,最后才到绿色的 DONE。这中间的时间窗口通常在毫秒到几十毫秒量级(具体数值随器件容量、配置位宽、时钟频率变化很大,以厂商数据手册为准),窗口内 FPGA 的 I/O 通常处于高阻或指定的预加载状态。正是这个窗口,决定了「谁来管整板上电」这件事不能交给 FPGA 自己。
配置接口也不同。CPLD 通过 JTAG 直接烧片内 Flash,可擦写次数受 Flash 工艺限制(上万次量级,以厂商资料为准),不需要外部存储配合。FPGA 的 JTAG 直写配置 SRAM、掉电即失,要永久保存得把比特流写进外挂 Flash(参见 比特流烧录到外部 Flash 的完整流程);多一颗芯片和一条启动链路,但镜像管理灵活、可多镜像切换、可加密(参见 FPGA 比特流加密与密钥管理),SRAM 本身也没有擦写寿命问题。
五、时序确定性与工程后果
「引脚到引脚延迟确定」是 CPLD 最硬核的差异化卖点,值得单独拆一拆。
在 CPLD 里,输入进 PIA、过乘积项、进或门、到输出,路径级数由结构固定。数据手册直接标注 t_PD(组合传播延迟)、t_CO(时钟到输出)、f_max 等参数,写完方程就知道最坏延迟,不用跑时序分析,也不用复杂约束。
在 FPGA 里,LUT 延迟固定,但布线延迟取决于走了几段互连线、过几个开关,由布局结果决定;触发器之间要做完整的静态时序分析,靠约束告诉工具周期和输入输出延迟,再反复布局布线收敛(见 同步设计原则)。功能正确但时序不过,在 FPGA 上是日常,在 CPLD 上几乎不存在。
这种确定性在三类场景里是刚需:
- 地址译码与片选。处理器一上电就开始取指,如果译码逻辑在 FPGA 加载完成前不生效,第一笔总线访问就会落空。放在 CPLD 里,电源有效、片选即有效。
- 电源时序与复位分发。板上多路电源要求「A 轨稳定后开 B 轨、全部就绪后释放复位」,监控逻辑必须在所有器件就绪之前就工作,包括监控 FPGA 自己的核心电源——这活天然轮不到 FPGA 干。单板上电与电源设计的整体背景可参考 FPGA 电源供电与散热设计入门。
- 电平接口与状态胶合。上电期间各总线的上下拉、上电复位期间外部接口的方向和默认电平,需要一颗不受配置窗口影响的器件兜底,避免总线打架或对外误动作。
这也就回答了「有 FPGA 为什么还要 CPLD」:CPLD 常常不是拿来实现主功能的,而是当 FPGA 的陪跑管家——管 FPGA 的配置模式脚、PROGRAM_B、初始化外部存储器、维持上电期间的关键片选。一颗小 CPLD 的成本,换来整板启动行为的确定性。
六、容量、功耗、成本:十维大对比
架构差异最终都会折算成选型表上的数字。下表把 FPGA 与 CPLD 的区别按十个维度摊开,表中量级是两类器件的总体形态(具体型号随代际和厂商变化很大,选型时以厂商数据手册为准)。
| 对比维度 | CPLD | FPGA |
|---|---|---|
| 基本架构单元 | 乘积项(与或阵列)+ 宏单元 | LUT 查找表 + 触发器(CLB/LE) |
| 布线结构 | 集中式全交叉布线(PIA/UIM),路径类型统一 | 分段布线 + 开关矩阵,路径由布局布线决定 |
| 配置工艺 | 片内 Flash/EEPROM,非易失 | 配置 SRAM,易失;外挂 Flash 存镜像 |
| 掉电行为 | 配置保留,再上电直接工作 | 配置丢失,必须重新加载比特流 |
| 启动时间 | 电源有效即工作(微秒级,随电源斜率) | POR + 加载 + 校验,通常毫秒到几十毫秒 |
| 典型容量 | 数十到数千宏单元,约几百到几万门 | 数千到数百万 LUT,等效门可达数百万以上 |
| 延迟确定性 | 引脚到引脚 t_PD 固定,数据手册直给 | 依赖布局布线与时序收敛,需约束和时序分析 |
| 嵌入式资源 | 基本没有;偶有少量用户 Flash 位 | BRAM、DSP、PLL/MMCM、SerDes、硬核处理器 |
| 功耗特征 | 静态电流低、无启动浪涌,适合常开监控 | 静态电流较高,配置瞬间有涌流;高端器件散热设计不可省 |
| 单价区间(相对) | 低,小逻辑几元到几十元量级 | 从入门个位数到高端数百上千元,随资源和封装拉开 |
| 典型用途 | 地址译码、电源时序、复位胶合、电平接口、FPGA 配置管家 | 数据通路、信号处理、协议桥接、软核系统、高速串行 |
读这张表的方法是按「不可让步的约束」从左到右筛,而不是按「谁更先进」选。如果第一行硬性需求就是「上电第一毫秒内片选必须正确」,表格走到启动时间那一行就已经分出胜负,后面的容量和单价再诱人也不能反推;反过来,如果设计里要跑滤波运算、要缓存一帧图像、要出 PCIe,CPLD 在容量和嵌入式资源两行上直接出局,时序确定性的好处无处兑现。FPGA 资源利用率报告怎么看 里讲的 LUT/BRAM/DSP 估算,正是在 FPGA 一侧确定选型档位的工具。
成本要算总账:CPLD 方案省下外挂配置 Flash、配置电路和启动管理软件,单板 BOM 更省;FPGA 方案的外挂存储、多电源轨、时钟和散热要一起估。功耗同理:监控功能 7×24 小时常开,CPLD 的低静态电流优势会被时间放大;FPGA 峰值功耗虽高,完成的却是 CPLD 做不到的吞吐。
七、现代器件的边界模糊与选型清单
严格二分在今天已经不够用,边界正在模糊。一类产品是非易失 FPGA:在 LUT 架构内部嵌入 Flash 配置位,上电瞬间把配置影子加载到 SRAM 或直接以 Flash 控制开关,既有细粒度 LUT 资源,又把启动窗口压到极短甚至声称即时启动,还省掉外挂配置 Flash(Lattice MachXO 系列、Intel/Altera MAX 10 是这类思路的代表,架构与参数以厂商资料为准)。另一类是容量越做越大、混入少量用户 Flash/RAM 的现代「系统级 CPLD」。谱系从两极变成了一条连续带。
但工程判据没有变模糊。按下面这棵决策树从上往下问,绝大多数板级设计两三个分叉就能落位。

读这棵树顺序不能乱:先问「不工作的那几十毫秒会不会出事」,再问资源规模,最后才比价格功耗。启动确定性放在树顶,因为它无法靠工程技巧补偿——时序违例可以加约束重跑,资源不够可以换大一号,唯独配置窗口内逻辑不存在这件事,除了换器件类别或选非易失架构没有别的补救。
可操作的选型清单:
- 主数据通路、算法、协议处理:选 FPGA,按 LUT/BRAM/DSP/SerDes 估资源定档位。
- FPGA 自己的上电管家(模式脚、PROGRAM_B、首笔总线片选、电源时序):经典设计用小 CPLD;想精简 BOM 可评估非易失 FPGA,但要核对启动时间与 I/O 预加载行为。
- 纯电平转换、简单粘合、几十门以下且常开:CPLD 的低功耗和单价更合适;再简单的用普通逻辑芯片即可。
- 定型号时:CPLD 查宏单元数、乘积项数、t_PD、I/O 电平与封装;FPGA 查资源口径、配置时间公式、配置方式与镜像方案。数字一律以厂商数据手册为准。
这一篇在知识体系里的位置
本篇是 FPGA 入门体系中「器件是什么」的横向辨析篇,向上承接器件谱系,向下连通配置与启动两条主线:
- 想把 FPGA 一侧的基本单元看细,读 LUT 与触发器:FPGA 逻辑单元深度剖析;想看两家厂商的产品线怎么对应,读 FPGA 厂商与产品家族概览,其中对 MAX 这类非易失系列有定位。
- 想理解 FPGA 为什么每次上电要加载、从哪加载,读 FPGA 配置方式有哪几种;想逐拍看懂 POR 到 DONE 的过程,读 FPGA 上电配置时序详解。
- 镜像如何固化进外挂 Flash,见 比特流烧录到外部 Flash 的完整流程;担心比特流被抄走,见 FPGA 比特流加密与密钥管理。
- 启动窗口里的电源与复位设计,与 FPGA 电源供电与散热设计入门 配合阅读。
后续同系列还会安排一篇从制造工艺角度展开的对比(反熔丝、Flash、SRAM 三种配置工艺与抗辐照、保密、成本的关系),届时再与本篇互链。
总结
FPGA 与 CPLD 的区别,根子在硅片架构:CPLD 是乘积项宏单元加集中式布线、片内 Flash 非易失配置,换来了引脚到引脚的确定延迟、掉电不丢与上电即行,代价是容量只有几百到几千宏单元、没有大块专用资源;FPGA 是 LUT 加触发器、分段布线、SRAM 易失配置,换来了海量逻辑与 BRAM/DSP/SerDes 弹性,代价是每次上电要经历 POR、搬比特流、校验的加载窗口,时序还要靠约束收敛。选型不看谁先进,先问「上电第一毫秒逻辑在不在」:地址译码、电源时序、复位与 FPGA 配置管家交给 CPLD,数据通路与高速串行交给 FPGA,而内嵌 Flash 的非易失 FPGA 正站在两者之间,把这条分界线变成一条按启动时间和资源粒度连续过渡的光谱带。