
在数字设计的追求中,目标几乎总是一致的:创造更小、更快、更便宜、更节能的电路。工程师们使用庞大的工具箱,将复杂的行为转化为优雅的硬件,但其中最强大而微妙的工具之一是“策略性无关”这一概念。这就是无关项的原理,它利用未指定或不可能出现的情景,在优化中获得显著优势。它解决的核心问题是如何处理系统永远不会遇到的输入或那些无关紧要的输出。这种模糊性非但不是一种约束,反而成为一种深刻的设计自由的源泉。
本文探讨了利用无关项创造卓越数字电路的艺术与科学。我们首先将在“原理与机制”部分解析其基本思想,探索无关项的来源,以及它们如何作为使用卡诺图进行简化和在触发器等时序组件逻辑中的主要工具。之后,“应用与跨学科联系”部分将展示这一基本原理如何应用于解决现实世界的工程问题,从设计译码器和计数器,到优化现代可编程硬件(如 FPGA 和 PLA)中的复杂逻辑。让我们从深入探究使这项强大技术成为可能的核心机制开始。
想象一下,你正在为一个非常简单的机器编写说明书,比如一盏只有一个开关的灯。规则很简单:如果开关是向上,灯就亮;如果开关是向下,灯就灭。说明书写完了。但如果一个淘气的朋友问:“如果开关在中间位置会怎么样?”你可能会停顿一下,然后意识到……这不重要。这个开关被设计成要么向上要么向下。“中间位置”在物理上是不可能出现的。你可以忽略它。你完全“不关心”在这种情况下说明书上写了什么,因为它永远不会发生。
这个简单的想法就是数字设计者工具库中最强大的工具之一的核心:无关项。
在数字逻辑这个清晰的黑白世界里,电路的每一个输入组合都应该产生一个明确定义的输出,要么是逻辑1(高电平),要么是逻辑0(低电平)。我们可以将所有可能的输入看作一个全集。对于我们想要构建的任何函数,我们将这个全集划分为两个集合:输出必须为1的输入集合(on-set,或称“1集合”)和输出必须为0的输入集合(off-set,或称“0集合”)。
但如果存在第三类输入呢?就像我们那个侧向的开关一样,这些输入组合由于某种原因,在系统的正常运行中永远不会出现。或者,对于某些输入,其输出对系统的其余部分根本没有影响。这就产生了第三个集合,即无关项集合。对于这个集合中的任何最小项,我们被赋予了一种深刻的自由:我们可以选择将其输出指定为1或0,以方便为准。因此,输入的宇宙被完全划分为三个不同的区域:必需的ON(1)、必需的OFF(0)和可选的“无关项”。
在实际系统中,这些条件从何而来?它们主要通过两种方式产生。
首先,就像我们的灯的例子一样,某些输入组合可能是物理上不可能或相互排斥的。想象一个被设计为有限状态机 (FSM) 的自动售货机控制器。假设设计需要5个不同的内部状态来记录用户的操作(例如,“空闲”、“已投币”、“已选择商品”等)。为了用二进制表示这5个状态,我们至少需要3个比特,因为太少,而足够。我们为这5个状态中的每一个分配一个唯一的3比特编码(如000、001……)。但是等等——3个比特给了我们8种可能的组合,从000到111。那剩下3个未分配给任何有效状态的二进制编码怎么办?这些是未使用的状态。如果我们的机器工作正常,它永远不应该进入这些状态之一。因此,当我们设计计算下一个状态的逻辑时,如果当前状态是这些无效编码之一,它应该做什么?我们不关心!这些未使用的状态编码成为我们设计的无关项条件的礼物。
其次,系统对于某些输入的输出可能是不相关的。如果一个传感器的读数仅在安全联锁启动时才被使用,那么当联锁未启动时,我们就不关心传感器的值。系统的规范使我们不必定义那种情况下的行为。
这种自由不仅仅是懒惰的借口;它是巧妙设计的许可证。为无关项选择输出的能力是创造更简单、更小、更高效逻辑电路的秘密武器。
为了理解这一点,我们可以使用卡诺图 (K-map) 来可视化一个布尔函数。卡诺图是一种网格,其中相邻的单元格代表仅相差一个比特的输入组合。我们简化函数的目标是圈出尽可能大的由1组成的矩形方块,这些方块的大小必须是2的幂(1, 2, 4, 8, ...)。每个方块对应我们最终表达式中的一个简化乘积项。
现在,让我们引入无关项,我们用 或 来标记它。 就像一副牌中的通配符或王牌。如果它能帮助你形成一个更大的方块,你可以把它当作1;如果它没有帮助,你可以把它当作0并直接忽略它。
考虑一个函数 。最小项 和 可以组合成一项 。最小项 则独自存在。简化后的表达式将是 。
但是,如果系统规范告诉我们输入 永远不会发生,使其成为一个无关项呢?让我们在 的位置上放一个 。现在,奇妙的事情发生了。位于 的孤立的 1 与位于 的 相邻。通过选择将这个 视为 1,我们可以形成一个新的、更大的由两个元素组成的组,合并 和 。这个组简化为项 。我们整个函数现在简化为 。我们消去了一个变量!电路变得更简单了,这完全归功于我们策略性地利用了一个被允许忽略的条件。
这个过程可能更加戏剧化。一个具有两个独立项(如 和 )的函数,在加入一个有用的无关项后,可能突然简化为更大的项 和 ,从而完全改变了质蕴含项(我们最小表达式的候选项)的格局。
关键在于我们并不被强制使用无关项。这个选择是策略性的。只有当使用无关项扩大一个分组能带来更简单的整体表达式时,这样做才是有益的。
想象一个更复杂的场景,一个需要优化的旧控制系统的4变量函数。卡诺图上散布着几个1和几个d。我们的任务是使用最少、最大的可能方块来覆盖所有的1。我们可能会发现,包含其中三个无关项可以让我们用两个巨大的方块就覆盖所有的1,从而得到一个优雅简洁的两项表达式。但第四个无关项怎么办?我们可能会看到,如果我们包含它(将其视为1),它将是孤立的,不与任何其他1或有用的d相邻。覆盖它将需要在我们的表达式中增加一个全新的第三项,使电路更加复杂。明智的设计师会说:“谢谢,但不用了。”对于那个特定的无关项,我们将选择其值为0,并将其排除在我们的分组之外。这门艺术在于知道哪些王牌该打,哪些该留在手里。
同样重要的是要认识到,无关项并非万能药。有时,增加一个无关项条件根本带不来任何好处。现有的1可能排列得让无关项无法帮助形成更大的分组。在这种情况下,无论我们是否使用无关项,最小表达式都保持完全相同。这提醒我们,逻辑优化是一门务实的学科,而非教条;我们使用有效的工具。
到目前为止,我们的讨论主要集中在组合逻辑上,其中输出是输入的瞬时函数。但是,无关项的概念在时序逻辑——即存储、状态和时间的领域——中同样至关重要,甚至可能更为美妙。
数字存储器的基本构建模块是触发器。激励表是触发器的规则手册;它告诉我们需要提供什么输入,才能使其从当前状态 转换到期望的下一个状态 。
让我们看看JK 触发器。它的行为由特征方程 决定。假设触发器当前处于状态 ,我们希望它保持在状态 。将 和 代入方程,得到 ,简化为 。注意到 发生了什么吗?它被乘以 (即0),所以从方程中消失了!这意味着要将状态保持在0, 必须为0,但 的值完全不相关。它可以是0或1,转换仍然会正确发生。因此,激励表中的条目是 (),其中 就是我们的无关项。
这是一个深刻的结果。无关项条件不是来自人为的外部规范;它是有机地源于设备本身的数学物理原理!
现在,将其与更简单的D 触发器进行对比,其特征方程是直接性的典范:。如果我们希望下一个状态是1,我们必须设置 。如果我们希望它是0,我们必须设置 。这里没有模糊性,没有变量会方便地从方程中消失。对于任何期望的转换,所需的输入 都是唯一确定的。因此,D触发器的激励表根本不包含无关项。通过比较 JK 和 D 触发器,我们发现,组件控制逻辑中是否存在无关项,直接反映了其底层数学定义中的自由度。
当我们使用这些组件构建更大的电路时,比如一个应实现特定行为(如 )的状态机,我们可以利用这些激励表中的无关项来获得优势。J 和 K 的“无关”项给了我们选择。我们可以为每个 选择 或 ,以使计算 J 和 K 的逻辑尽可能简单。有趣的是,即使我们做出一个懒惰或非最优的选择——例如,将所有无关项都设置为0——最终的电路可能仍然能完美正常工作。它只是可能不是最有效的实现方式。无关项定义了一个完整的有效解空间,我们作为工程师的工作就是在这个空间中航行,找到一个不仅正确,而且优雅高效的设计。
从不可能的输入到未使用的状态,从简化门电路网络到引导触发器随时间变化,无关项的原理是一条统一的线索。它体现了一种工程哲学:不要解决你没有的问题。相反,利用这种自由去创造更好的东西。正是在这种对模糊性的策略性使用中,在这种不知晓的自由中,蕴含着数字设计的大部分艺术与美。
现在我们已经掌握了“无关项”的原理,你可能会认为它们仅仅是学术上的好奇心——一种解决教科书问题的聪明技巧。但事实远非如此。在工程和计算机科学的世界里,我们不必指定的东西所赋予的自由,不仅仅是一种便利;它是效率、优雅和创新的深刻而强大的引擎。它就像雕塑家的凿子,去除不必要的部分,以揭示内在的形态。让我们踏上征程,看看这个简单的想法如何发展成为现代数字设计的基石。
从本质上讲,数字设计是一种翻译行为——将期望的行为转化为逻辑门的物理排列。我们使用的门和连接越少,我们的电路就会越便宜、越快、越节能。这是无关项大放异彩的第一个也是最直接的舞台。
想象一下,你有一组输入,电路必须为其产生'1',另一组输入必须为其产生'0'。任务是找到满足这些要求的最简布尔表达式。现在,假设由于物理或逻辑原因,某些输入组合永远不会发生。对于这些不可能的输入,输出应该是什么?答案是我们根本不关心!我们可以将这些虚幻输入的输出任意指定为'0'或'1'——只要这个选择能帮助我们最大程度地简化逻辑即可。
在卡诺图的可视化语言中,这就像一个棋盘,一些方格标记为'1',一些标记为'0',还有一些标记为 代表无关项。在画圈以寻找简化项时,你需要覆盖所有的'1',同时不能触及任何'0'。 是通配符;如果包含它们能让你画出更大的圈,你就可以这么做,但如果它们没有帮助,你也可以自由地忽略它们。更大的圈对应着变量更少的更简乘积项,这又意味着更简单的门电路。无论你是寻求“积之和”(SOP)形式还是“和之积”(POS)形式,这都适用,在后一种情况下,你将简化针对'0'输出的逻辑。
这不仅仅是一个抽象的游戏。考虑一下你闹钟或微波炉上无处不在的七段数码管。它需要一个4位二进制编码的十进制(BCD)输入来显示0到9的数字。但一个4位数可以表示0到15的值。10到15的六种组合在BCD码中是无效的;它们永远不应该被送到译码器。这六个“禁用”输入对设计者来说是一份礼物。在为中间的'g'段创建逻辑时,我们可以将这六个输入视为无关项。这种自由使得最终电路可以得到极大的简化。同样的原理也适用于任何自定义逻辑,例如构建一个电路来检测BCD数字是否为素数(2、3、5或7)。这六个无效代码再次提供了无关项的沃土,让我们能够构建一个更简单、更优雅的素数检测器。
无关项的力量远远超出了静态的组合电路,延伸到了动态的时序电路世界——这些带有存储器的机器会随着时间通过一系列状态演化。
想一个数字计数器。也许你需要一个非常特定的计数序列,例如,循环遍历状态 然后重复。如果你使用3位触发器来存储状态,你就有 种可能的状态(0到7)。但你的设计只使用了其中的四个!状态0、4、5和7是未使用状态。一个正常工作的计数器永远不会进入这些状态。因此,在设计从当前状态计算下一个状态的组合逻辑时,我们可以将这些未使用状态视为无关项。如果机器意外进入状态5会发生什么?我们不关心,因为它本不应该发生。这给了我们极大的自由来简化驱动触发器的逻辑。此外,某些触发器(如JK触发器)的本质在其激励表中提供了其自身的内部无关项条件,进一步增加了简化的可能性。有趣的是,虽然具体逻辑随状态分配而变化,但由未使用状态和触发器行为产生的无关项机会的总数是设计问题本身的固有属性。
这个思想在有限状态机(FSM)——无数控制系统背后的大脑——的正式设计中达到了顶峰。有时,一个机器的规范是不完整的。对于给定的状态和输入,所需的输出或下一个状态可能无关紧要。例如,一个控制器可能处于等待传感器触发的状态,而在此等待期间其输出是无关的。这些明确未指定的输出和转换是另一种形式的无关项。
在状态最小化过程中,我们试图用最少的状态来构建机器,这些无关项至关重要。通常,只有当两个状态“等价”时——即对于所有输入,它们具有相同的输出并转换到等价的状态——它们才能被合并。但有了无关项,条件就放宽了:状态只需要“相容”即可。如果两个状态的输出不冲突(即,一个为'0',另一个为'1';如果一个或两个都是 ,则可以接受),并且它们的下一状态也相容,那么这两个状态就是相容的。这使我们能够合并那些不完全相同的状态,从而显著降低最终机器的复杂性,无论是Mealy机(输出取决于状态和输入)还是Moore机(输出仅取决于状态)。
在现代数字电子技术中,许多设计不是由单个门电路构建的,而是在现场可编程门阵列(FPGA)或可编程逻辑阵列(PLA)等可编程设备上实现的。在这里,优化的目标从最小化门数量转变为尽可能高效地使用芯片的固定内部资源。
FPGA由大量的查找表(LUT)构成。例如,一个4输入LUT只是一个拥有16个1比特位置的小型存储块。它可以通过简单地存储函数的16项真值表来实现任何4输入布尔函数。在设计BCD码到余3码的转换器时,对应十进制10-15的输入是无关项。在编程LUT时,我们可以用任何值(0或1)填充与这些无关项输入相对应的存储位置,只要能使整体存储模式尽可能简单。在一个显著的例子中,转换器最低有效位的逻辑起初看起来很复杂,但通过恰当选择无关项的值,可以使其符合 的模式(其中 是最低有效输入位),即一个输入的简单反相。这意味着LUT被编程为一个极简函数,这可能对FPGA的布线和时序产生下游效益。
在具有专用“与”平面和“或”平面的可编程逻辑阵列(PLA)中,主要成本是“与”平面中独立乘积项的数量。这里的诀窍是共享。如果我们能创建一个对多个不同输出函数都有用的乘积项,我们就能节省资源。无关项是实现这一目标的关键。通过策略性地使用无关项来形成更大、更通用的蕴含项(乘积项),我们增加了像 这样的项既可以作为输出 表达式的一部分,又可以作为输出 表达式的一部分的机会,从而有效地实现一次,使用两次。这种由无关项的自由度所实现的多输出优化,对于在单个芯片上创建密集高效的逻辑至关重要。
从塑造少数几个门电路到在硅芯片上编程数百万个门,原理保持不变。“无关项”是数字设计中沉默的伙伴。它是知道该忽略什么的艺术,是利用未指定之处的智慧,也是连接问题抽象需求与其最精简、最快速、最优雅物理形式的桥梁。