
在数字电子学的世界里,创建定制逻辑电路曾经是一个僵化且劳动密集的过程,需要将单个元件焊接在一起。可编程逻辑器件 (PLD) 的出现彻底改变了这一领域。它引入了单一的可配置芯片,通过编程可以执行各种各样的逻辑功能。这种从硬连线硬件到可配置逻辑的转变标志着电子设计的一个关键时刻,为原型设计和生产提供了前所未有的灵活性和速度。然而,PLD 的世界并非铁板一块;它包含了一系列具有根本不同架构和设计理念的器件家族。
本文旨在填补设计人员和工程师在知识上的一个关键空白:理解不同 PLD 架构背后的“为什么”。本文将超越表层比较,揭示区分 CPLD 与 FPGA、PAL 与 PLA 的深层原理。在我们的讨论过程中,您将了解到这些架构上的差异如何导致关键的权衡,从而直接影响系统性能、安全性和成本。第一章将深入探讨这些器件的演变,从其基础的乘积和逻辑到定义它们的现代结构。随后的章节则探讨这些内部差异如何转化为广泛的应用和跨学科联系,揭示了为什么选择正确的器件是一项精湛的工程艺术。我们首先从探索使这项卓越技术成为可能的核心原理和机制开始。
想象一下,您想构建一台定制机器,一台遵循特定逻辑规则的机器。老方法是拿起烙铁,在电路板上将数十个独立的逻辑门——与门、或门、非门——焊接在一起。这就像一砖一瓦地盖房子。虽然可行,但速度慢、不灵活,而且一旦出错,修改起来就是一场噩梦。那么,如果有一种神奇的芯片,您只需告诉它执行什么逻辑呢?一种可以随意配置和重新配置的通用逻辑结构。这就是可编程逻辑器件 (PLD) 背后的革命性思想。
但如何创建这样的结构呢?秘密在于数字逻辑中一个极其简单而强大的原理:任何逻辑函数,无论多么复杂,都可以用一种称为乘积和 (SOP) 的标准形式来表示。把它想象成一个通用配方。首先,您创建一组基本“成分”——即乘积项,由不同输入(或其反相)进行“与”运算形成。然后,只需将您需要的特定“成分”相加(进行“或”运算),即可创建最终的函数。这个“先与后或”的两步过程为构建逻辑提供了通用蓝图。
最早的 PLD 是这种乘积和思想的优雅物理体现。它们由两个主要部分组成:一个用于创建乘积项的可编程与平面,以及一个用于将它们组合成最终输出的或平面。这个家族最早的成员是可编程逻辑阵列 (PLA) 和可编程阵列逻辑 (PAL)。
为了理解其中的区别,让我们打个比方。想象一下,您是 20 世纪初的一名电话总机接线员。您面前有一个输入线路面板(输入)和一个输出线路面板(输出)。您的工作是建立连接。
PLA 就像一个您可以完全自由操作的交换台。您有一个可编程开关网格,可以将任何输入连接到任何中间的“乘积项”线路(与平面)。然后,您有第二个可编程开关网格,可以将任何中间线路连接到任何最终输出线路(或平面)。这为您提供了巨大的灵活性;您可以在不同输出之间共享乘积项,并构建非常复杂的逻辑。
而PAL则简化了事情。您仍然拥有完全可编程的与平面,因此可以创建任何您想要的乘积项。但是或平面中的连接是固定的。每个输出都永久连接到一小组特定的乘积项线路上。这就像一个接线员,可以将来电者连接到一组共享电话线上,但从这些共享线路到最终目的地的连接已经是硬连线的。
这看起来像是一个限制,事实也的确如此——PAL 的灵活性不如 PLA。但这个限制也是它的优势。通过固定或平面,PAL 变得更简单、制造成本更低,而且通常速度也快得多。如果我们考虑实现一对简单函数,这种权衡就得到了很好的说明。对于一个特定的设计,一个 PLA 可能需要(比如说)24 个可编程连接来实现具有最大共享度和灵活性的逻辑。而等效的 PAL,由于其固定的或平面,可能只需要 18 个可编程连接就能完成同样的工作。这展示了工程学中的一个基本原则:您常常需要用通用性来换取效率。
早期的 PAL 有一种相当戏剧性的编程方式。所谓的“可编程连接”实际上是微小的物理熔丝。要对器件进行编程,您需要发送一股电流来烧断不需要的熔丝,从而将您的逻辑永久地“刻”在硅片上。这被称为一次性可编程 (OTP)。这种方法很有效,但也毫无容错性。如果您的设计有错误,您无法修复芯片,只能把它扔掉重来。这就像把作业刻在石板上一样。
接着出现了一项杰出的创新:通用阵列逻辑 (GAL)。GAL 沿用了 PAL 的高效架构(可编程的与平面,固定的或平面),但彻底改变了编程方法。它没有使用物理熔丝,而是采用了一种借鉴自 EEPROM(电可擦除可编程只读存储器)的技术。
其物理机制非常奇妙。在每个连接点,没有熔丝,而是一种称为浮栅晶体管的特殊晶体管。这种晶体管有一个微小的、电绝缘的材料岛(浮栅),可以存储电荷。通过施加精确的电压,您可以将电子注入这个栅极,电子会被困在其中。这些被困的电荷会改变晶体管的行为,从而有效地建立或断开一个逻辑连接。这种方法的美妙之处在于,这个过程是可逆的!您可以施加不同的电压来移除电荷,从而“擦除”连接。
这改变了整个设计流程。GAL 不是石板,而是一块白板。您可以对它进行编程、测试、发现错误、擦除,然后用修正后的设计重新编程——所有这些都可以在几秒钟内完成,甚至无需将其从电路板上取下。对于正在为新系统制作原型的工程师来说,这是一项颠覆性的技术,它实现了以前不可能实现的快速迭代和调试。
随着数字系统变得越来越宏大,单个 PAL 或 GAL 通常已不足以满足需求。合乎逻辑的下一步是将几个这样的模块集成到一个更大的单一芯片上。这就是复杂可编程逻辑器件 (CPLD) 的精髓。
CPLD 的架构非常直观。它由少数几个逻辑阵列块 (LABs) 组成,每个 LAB 本质上都是一个强大的、类似 GAL 的结构。CPLD 的真正核心,也是使其变得“复杂”的原因,是可编程互连矩阵 (PIM)。这是一个复杂的、集中式的交换结构,将所有 LAB 相互连接,并连接到芯片的输入/输出 (I/O) 引脚。如果您设计中 LAB 1 的一部分需要向 LAB 2 的另一部分发送信号,该信号会通过这个 PIM 超级高速公路快速传输。
如果我们放大一个 LAB,会发现其基本构建块是宏单元。宏单元不仅仅是原始的乘积和逻辑。它是一项巧妙的工程设计,包括:
这种在瞬时(组合)输出和时钟同步(寄存)输出之间进行选择的能力,使得宏单元的功能异常丰富,能够构建从简单的胶合逻辑到与系统时钟同步、按顺序执行操作的复杂状态机等各种电路。
在 CPLD 通过组合越来越大的类 PAL 模块不断发展的同时,一种完全不同的架构哲学出现了:现场可编程门阵列 (FPGA)。
FPGA 不是由少数几个大型、功能强大的“粗粒度”逻辑块构成,而是由成千上万甚至数百万个微小、相同的“细粒度”逻辑单元组成的巨大网格——一片“海洋”。至关重要的是,这些单元不使用乘积和结构。相反,FPGA 逻辑单元的核心是查找表 (LUT)。
LUT 是一个非常简单的概念:它是一个小型的、可配置的存储块。例如,一个 4 输入 LUT 只是一个 16 位的 SRAM()。要实现任何 4 变量的逻辑函数,您只需将所需真值表预先加载到 LUT 的 16 位中。当输入信号到达时,它们充当这个微型存储器的地址,存储在该地址的位就成为输出。这就是“以存储器实现逻辑”。
这种架构上的区别——CPLD 采用粗粒度、基于 SOP 的宏单元,而 FPGA 采用细粒度、基于 LUT 的单元——是这两个器件家族之间最根本的差异。这就像用一套大型、专用的得宝积木(CPLD)和用一大盒小型、相同的乐高积木(FPGA)来搭建东西的区别。用乐高积木,您可以进行更精细的控制,搭建出更复杂、更庞大的结构,但将它们全部拼凑在一起是一项更复杂的任务。
这些深层的架构差异导致了深刻而实际的权衡,每个数字设计师都必须加以衡量。
首先是时序可预测性。CPLD 凭借其单片结构和集中式互连矩阵,提供了高度可预测和一致的时序。信号从输入引脚,经过单个宏单元,再到输出引脚的延迟很短、固定且有详细文档记录。这是因为信号路径简单且受限。而 FPGA 则不同,它拥有庞大、分段的布线网络。信号的延迟在很大程度上取决于设计软件如何放置逻辑单元以及如何在它们之间布线。这种布线可能很曲折,导致延迟可变且远不如 CPLD 可预测。因此,CPLD 在“胶合逻辑”方面表现出色——在对严格、可预测的时序要求至关重要的不同芯片之间进行接口连接。
其次,也许是最关键的一点,是上电行为。大多数 CPLD 是非易失性的。就像它们演变而来的 GAL 一样,它们的配置存储在片上闪存或 EEPROM 存储器中。这意味着在加电的瞬间,CPLD 就立即配置完成并完全运行。它是“瞬时启动”的。
相比之下,大多数 FPGA 是易失性的。它们的配置(所有 LUT 的值和布线设置)存储在 SRAM 中,断电后内容会丢失。因此,每次启动基于 FPGA 的系统时,FPGA 都是一块“白板”。它的配置数据必须从外部非易失性存储芯片加载,这个过程可能需要几毫秒。
在许多应用中,几毫秒的启动时间无关紧要。但在某些情况下,这却是生死攸关的问题。考虑一个用于大型工业压力机的安全互锁控制器。该控制器必须在机器通电的瞬间就激活并执行安全规则。15 毫秒的启动延迟是可能发生灾难性故障的“永恒”瞬间。在这种情况下,CPLD 的瞬时启动特性使其成为唯一可行的选择。这个简单而优雅的特性,直接源于其非易失性架构,使得看似不起眼的 CPLD 在数字设计世界中扮演着至关重要的角色,一个更大、更强大的 FPGA 无法始终替代的角色。
现在我们已经探讨了可编程逻辑器件的基本原理,您可能会问自己:“这一切都很巧妙,但这些东西到底有什么用?”这是一个很合理的问题。一个科学概念的真正魅力不仅在于其内在的优雅,还在于它如何触及并改变周围的世界。可编程逻辑就是这方面一个绝佳的例子。它是工程师们塑造现代世界的数字粘土,其影响范围从平凡到真正深刻的领域。
让我们从一个常见的工程难题开始。想象一下,您正在构建一块复杂的电路板,比如一个科学仪器的控制系统。您有一个功能强大的微处理器、一些存储芯片以及各种用于输入和输出的外设。您如何让它们相互通信呢?您需要一个翻译,或者说,一个翻译委员会。这就是工程师所说的“胶合逻辑”。在过去,这意味着要抓取一把简单的分立逻辑芯片——这里一个与门,那里一个或门,再加几个反相器——然后将它们全部连接起来。结果往往是在电路板上造成一片拥挤、混乱的景象,名副其实地由微小的黑色元件和铜线构成的丛林。这种方法不仅对制造和库存管理来说是一场噩梦,而且还非常僵化。如果您发现了一个错误或想添加一个功能,就必须拿出烙铁,在电路板上进行“外科手术”。一定有更好的方法。
的确有。可编程逻辑的第一个,也许是最具革命性的应用,就是为了驯服这种混乱。一个单一的复杂可编程逻辑器件 (CPLD) 就可以吞下几十个那样的分立芯片。所有那些杂乱的胶合逻辑都可以被整合到一个整洁的封装中。这极大地减少了电路板上所需的物理空间,简化了需要购买和管理的零件清单,而且——最神奇的是——使设计变得灵活。如果需要更改逻辑,您不需要重新布线硬件,只需重新编程该器件即可。一个简单的任务,比如根据传感器读数控制水泵和警报器,以前可能需要几个独立的 74 系列芯片,而现在可以由一个单一的、可重编程的通用阵列逻辑 (GAL) 器件来处理。这种从物理布线到逻辑编程的转变是一次范式转移。
但这些器件不仅仅是清理混乱电路的数字“清洁工”。它们是真正的变色龙。一个简单 PLD 的内部结构——一个可编程的与门阵列馈入一个固定的或门阵列——是数字逻辑的通用画布。您可以对其进行编程,使其成为您能想象到的几乎任何标准数字构建模块。例如,考虑一个 4-1 多路复用器,这是一个基本组件,其作用类似于数字开关,根据两个控制信号从四个数据输入中选择一个。要构建它,您不需要购买专用的多路复用器芯片。相反,您可以配置 GAL 的与平面来生成四个精确的乘积项——每个乘积项对应选择线的一种特定状态——然后或门自然地将它们相加,产生最终的多路复用器输出。通过这种方式,可编程逻辑变成了一种数字粘土,随时可以被塑造成设计师想要的任何功能。
随着设计变得越来越宏大,道路上出现了一个岔路口,通向两个截然不同的器件家族:CPLD 及其更强大的“表亲”——现场可编程门阵列 (FPGA)。在它们之间做出选择是一项经典的工程权衡,是一个关于平衡不同类型完美方案的迷人故事。
一方面,CPLD 将可预测性艺术发挥到了极致。它的架构非常简洁优美,逻辑功能在宏单元中实现,所有宏单元通过一个单一、统一的互连矩阵相连。信号从任何输入引脚,通过逻辑,到达任何输出引脚所需的时间非常一致且可预测。这为什么重要?想象一下,您正在为一个老式微处理器设计一个解码器,其内存访问的时序窗口非常紧凑。您需要以一致、有保证的速度生成片选信号。CPLD 是完成这项工作的完美工具,因为其确定性架构确保了不会出现时序意外,无论逻辑在器件内部如何排列。
另一方面,FPGA 则是为纯粹的容量和灵活性而生。FPGA 不是几个大的逻辑块,而是一个由微小的、细粒度的逻辑元件组成的巨大、庞杂的城市,所有元件都通过一个复杂的、分层的布线通道网络互连。这种细粒度结构使得 FPGA 能够容纳极其复杂的设计,比如一个多核处理器。然而,这种复杂性是有代价的。将设计转化为 FPGA 配置的过程远比 CPLD 复杂。设计工具必须解决一个极其困难的难题:首先,将抽象逻辑映射到器件特定的逻辑元件上;然后,将这些元件放置在芯片上的最佳位置;最后,在它们之间布线成千上万的连接。这个“布局布线”阶段是一个计算上极其残酷的优化问题,在更简单的 CPLD 世界中基本上不存在。
这种架构上的分歧导致了产品开发中的关键战略决策。如果您正在构建一个功能固定、成本敏感的简单产品,CPLD 的低成本和简单的设计流程很有吸引力。但如果您是一家初创公司,正在向一个不确定的市场推出一种新型科学仪器呢?如果您预计在产品发布后需要添加重要的新功能以保持竞争力呢?FPGA 的初始开发时间和较高的单位成本可能看起来令人望而生畏,但其可重配置性是一条生命线。通过软件更新来部署重要的功能升级,而不是进行昂贵且耗时的硬件重新设计,这可能是成功与失败的分水岭。FPGA 的灵活性是它的超能力。
这确实是一种超能力。FPGA 不仅提供更多的逻辑,它们还提供更智能的逻辑。在其结构中编织了专门的硬件模块,用于加速常见的、计算密集型任务。一个绝佳的例子是算术运算。如果您在 CPLD 上构建一个 32 位加法器,每一位的进位信号都必须缓慢地通过通用互连传播到下一位。但 FPGA 有一个秘密武器:一条专用的、高速的进位链,直接在相邻的逻辑元件之间运行。这条特殊通路让进位信号可以从一位快速传递到下一位,完全绕过了速度较慢的通用布线结构。性能差异是惊人的。对于一个 32 位加法器,这一个架构特性就能使 FPGA 实现比其 CPLD 对应方案快 30 倍以上。
这种根据问题定制硬件的能力超出了简单算术的范畴。FPGA 的架构融合了通用逻辑(查找表,即 LUT)和专用存储块 (BRAM),使其能够解决 CPLD 根本无法处理的问题。考虑实现一个大型复杂的有限状态机,也许用于数字信号处理应用,其中状态转换的逻辑是稀疏的——意味着大多数状态和输入的组合都会导致默认的错误条件。在以“乘积和”方式“思考”的 CPLD 中,每个有效的转换规则都需要自己专用的乘积项。对于一个大型状态机,这可能导致组合爆炸,需要数量惊人的资源。然而,FPGA 可以用另一种巧妙的方式来解决这个问题。它可以使用其 BRAM 将整个状态转换表实现为一个巨大的内存查找。当前状态成为输入到内存的地址,而输出的数据则包含了下一状态和输出的所有信息。对于这类问题,这种基于内存的方法效率要高得多,这展示了用门实现逻辑与用内存实现逻辑之间深刻的架构权衡。
故事并未就此结束。这些架构选择的后果可能会波及到看似不相关的领域,例如信息安全。数字电路中每当一个晶体管翻转时,都会消耗一小股能量。一种被称为差分功耗分析 (DPA) 的狡猾攻击方式就利用了这一点,通过精确测量设备在执行加密计算时的功耗。通过对这些微小的功耗波动进行统计分析,攻击者实际上可以推断出隐藏在其中的密钥。
在这里,CPLD 和 FPGA 呈现出有趣的对比。CPLD 凭借其简单、确定性的布线和大型逻辑块,以一种非常干净、同步的方式执行操作。这会产生一个高信噪比的功耗特征,其中与数据相关的信号在背景噪声中清晰可见。对于攻击者来说,这简直是天赐良机。而 FPGA 具有庞大、分布式的架构和复杂的布线,其本身就更具噪声。单个逻辑操作被分散在许多微小的逻辑元件和复杂的互连网络上,所有这些元件的开关时间都略有不同。这产生了一个远为混乱的功耗特征,其中泄露秘密的信号被淹没在背景噪声的海洋中。矛盾的是,FPGA 的架构复杂性和“混乱性”使其天然成为这类旁道攻击更难攻击的目标。一块硅片上如何排列逻辑门的决定,竟能对我们私人信息的安全产生直接影响,这难道不奇妙吗?
从清理混乱的电路板到实现高性能计算,甚至影响信息的物理安全,可编程逻辑器件证明了灵活思想的力量。它们不仅仅是元器件;它们是想象力的画布,是连接抽象逻辑世界与塑造我们生活的设备具体现实之间的强大纽带。