try ai
科普
编辑
分享
反馈
  • 递减器电路

递减器电路

SciencePedia玻尔百科
核心要点
  • 可以通过行波借位减法器直观地实现数字减法,该减法器使用一连串逻辑门来模拟手动借位的过程。
  • 一种更高效、更常见的方法是通过二进制补码算术统一减法和加法,从而允许标准加法器电路执行减法。
  • 递减器和减法器电路是通用的构建模块,用于创建计数器、求反电路和组合式加/减法器单元。
  • 这些电路是现代处理器中的关键组件,尤其是在浮点单元(FPU)中,用于在计算过程中对齐指数。
  • 求差的基本概念延伸到了模拟电子学领域,在模拟电子学中,差分放大器通过减去连续电压来进行测量和信号分析。

引言

机器如何执行减法这样看似人类独有的行为?“减去”和“借位”的过程对我们来说感觉很直观,但在计算机内部,它每秒被执行数十亿次,而使用的不过是简单的电子开关。这个明显的悖论引出了一个根本性问题:抽象的数学运算如何能转化为物理硬件?答案在于为算术运算而构建的电路的精妙设计,特别是递减器——一种设计用于减一的电路。本文将揭开递减器电路的神秘面纱,弥合减法概念与其硅基实现之间的鸿沟。

我们将踏上一段深入数字逻辑核心的旅程。在“原理与机制”一章中,我们将解构递减器,从模拟笔算减法的直观行波借位法开始,逐步深入到半减器和全减器的模块化设计。接着,我们将揭示通过二进制补码算术实现的减法与加法的深刻统一,这是现代计算的基石。之后,“应用与跨学科联系”一章将拓宽我们的视野,揭示这一基本电路如何成为创建复杂系统的多功能工具——从可编程计数器到每颗CPU中至关重要的浮点单元,甚至在模拟信号处理世界中也能找到其对应物。

原理与机制

机器是如何进行减法运算的?这感觉像是一种根本上属于人类的行为,涉及到从邻位“借位”的心算过程。然而,在你的计算机深处,每秒钟都有数万亿次减法运算发生,执行者不过是些简单的开关。这怎么可能呢?让我们踏上揭秘这段旅程,从一个简单的黑匣子开始,慢慢撬开它,揭示其中精妙的逻辑。

想象一下,我们有一个设备,它有3位输入和3位输出。我们对它进行详尽的测试,发现它的行为可以由一个简单的表格完美描述。当我们输入011(数字3),我们得到输出010(数字2)。当我们输入001(1),我们得到000(0)。最奇怪的是,当我们输入000(0),我们得到111(7)。这个设备是一个​​3位递减器​​;它计算输入 - 1,并带有一种称为模运算的“回绕”行为。但它是如何工作的?里面没有齿轮或杠杆,只有逻辑。

熟悉的借位行为,电气化实现

让我们思考一下我们如何在纸上从一个数中减去1,比如400 - 1。你不能从0中减去1,所以你尝试从十位借位。十位也是0,所以你向百位借。你从4中借1,剩下3。那个1在十位上变成了10。你再从那个10中借1,剩下9,这又在个位上变成了10。最后,10减1等于9。答案是399。

这种借位的链式反应是思考减法最直观的方式,我们可以构建一个数字电路来精确地完成这个任务。这被称为​​行波借位减法器​​。让我们逐位查看其逻辑,对于一个输入 A=A2A1A0A = A_2A_1A_0A=A2​A1​A0​ 产生一个输出 S=S2S1S0S = S_2S_1S_0S=S2​S1​S0​。

  1. ​​最低有效位 (S0S_0S0​):​​ 要从最右边的位 A0A_0A0​ 中减去1,你只需将其翻转。如果 A0A_0A0​ 是1,S0S_0S0​ 变为0。如果 A0A_0A0​ 是0,S0S_0S0​ 变为1,我们必须向下一位“借位”。所以,输出总是输入的反相:S0=NOT(A0)S_0 = \text{NOT}(A_0)S0​=NOT(A0​)。借位的需求,我们称之为借位信号 b1b_1b1​,仅在 A0A_0A0​ 为0时才有效。所以,b1=NOT(A0)b_1 = \text{NOT}(A_0)b1​=NOT(A0​)。

  2. ​​中间位 (S1S_1S1​):​​ 输出 S1S_1S1​ 取决于输入 A1A_1A1​ 以及我们是否从第一级接收到一个借位 b1b_1b1​。如果没有借位 (b1=0b_1=0b1​=0),S1S_1S1​ 就是 A1A_1A1​。如果有借位 (b1=1b_1=1b1​=1),我们必须从 A1A_1A1​ 中减去1,这意味着我们将其翻转。这个操作——“如果一个控制信号为1,就翻转该位”——正是​​异或门 (XOR)​​ 的完美应用。逻辑变为 S1=A1⊕b1S_1 = A_1 \oplus b_1S1​=A1​⊕b1​,或者代入我们对 b1b_1b1​ 的表达式,得到 S1=A1⊕(NOT(A0))S_1 = A_1 \oplus (\text{NOT}(A_0))S1​=A1​⊕(NOT(A0​))。一个新的借位 b2b_2b2​ 仅在我们需要从0中减去1时产生,即 A1=0A_1=0A1​=0 且我们有一个输入借位 b1=1b_1=1b1​=1。

  3. ​​最高有效位 (S2S_2S2​):​​ 这个模式继续。最终位 S2S_2S2​ 仅当一个借位 b2b_2b2​ 从最右边一路行波传递过来时才被翻转。这仅在 A0A_0A0​ 和 A1A_1A1​ 都为0时发生。所以,逻辑是 S2=A2⊕b2S_2 = A_2 \oplus b_2S2​=A2​⊕b2​,其中 b2=(NOT(A1)∧NOT(A0))b_2 = (\text{NOT}(A_1) \land \text{NOT}(A_0))b2​=(NOT(A1​)∧NOT(A0​))。

这种逻辑链,其中一个阶段的结果影响下一个阶段,完美地模仿了我们的笔算方法。我们可以仅使用基本逻辑门从头开始构建整个递减器。

用模块搭建:减法器层次结构

虽然可以从单个门电路构建电路,但工程师更喜欢模块化的方法,就像使用预制砖块而不是从头制作每一块砖。在数字逻辑中,这些“砖块”是执行常见任务的标准电路。

最基本的减法砖块是​​半减器​​。它回答一个非常简单的问题:从一个位 AAA 中减去另一个位 BBB 的结果是什么?它有两个输出:​​差​​ DDD 和​​借位输出​​ BoutB_{out}Bout​。

  • 差在两个位相同时为0(0−00-00−0 或 1−11-11−1),在不同时为1(1−01-01−0 或 0−10-10−1)。这正是异或门的行为:D=A⊕BD = A \oplus BD=A⊕B。
  • 仅在一种特定情况下需要借位:当你计算 0−10-10−1 时。因此借位输出为 Bout=(NOT(A))∧BB_{out} = (\text{NOT}(A)) \land BBout​=(NOT(A))∧B。

半减器是一个好的开始,但它缺少一个关键部分。它没有用于接收前一级的借位的输入。为了构建一个多位减法器,我们需要一个可以处理三个输入的模块:被减数 AAA、减数 BBB 和一个​​借位输入​​ BinB_{in}Bin​。这就是​​全减器​​。

模块化设计的妙处在于,我们可以用我们已经理解的更简单的半减器来构建一个全减器。想象一下我们想计算 A−B−BinA - B - B_{in}A−B−Bin​。我们可以分两步进行:首先计算 A−BA-BA−B,然后从该结果中减去 BinB_{in}Bin​。这表明一个设计,其中两个半减器链接在一起:

  1. 第一个半减器计算 D1=A⊕BD_1 = A \oplus BD1​=A⊕B 和一个借位 B1=(NOT(A))∧BB_1 = (\text{NOT}(A)) \land BB1​=(NOT(A))∧B。
  2. 第二个半减器以 D1D_1D1​ 作为其输入并减去 BinB_{in}Bin​,产生最终的差 Dfull=D1⊕Bin=A⊕B⊕BinD_{full} = D_1 \oplus B_{in} = A \oplus B \oplus B_{in}Dfull​=D1​⊕Bin​=A⊕B⊕Bin​。它也产生自己的借位 B2B_2B2​。

那么,我们什么时候需要向下一级传递一个借位呢?如果第一级需要借位(B1=1B_1=1B1​=1)​​或​​第二级需要借位(B2=1B_2=1B2​=1),就应该产生一个最终的借位输出。因此,我们可以用一个简单的​​或门​​将两个半减器的借位信号组合起来,得到最终的借位输出信号。这个精巧的结构展示了复杂性是如何由简单的、可重用的部件构建起来的。有了这个功能强大的全减器模块,我们可以创建多功能的算术组件,例如一个可以根据单个控制信号将数字原样通过或将其递减的电路。

伟大的统一:作为加法的减法

行波借位法很直观,但它有一个实际的缺点:借位信号的“行波”传播需要时间。对于一个64位的数字,借位可能需要穿过所有63个前级阶段,才能知道最后一位的最终答案。事实证明,自然界有一个更优雅、更令人惊讶的技巧,一个统一了加法和减法的深刻原理:​​二进制补码算术​​。

想想一个12小时制的时钟。如果你想后退1小时(减1),你可以通过前进11小时达到同样的结果。在时钟盘这个有限的世界里,-1和+11是等效的。处理固定位数(比如 N=4N=4N=4)的数字电路,也具有类似的“回绕”属性。

要从一个数 AAA 中减去1,我们可以转而给 AAA 加上一个特殊的数。这个代表-1的魔法数字是什么?在一个 NNN 位系统中,-1的二进制补码表示是一个由 NNN 个1组成的字符串。对于一个4位系统,-1表示为 111121111_211112​。

为什么这能行?数字 111121111_211112​ 在十进制中是15,也就是 24−12^4 - 124−1。当我们计算 A+(24−1)A + (2^4 - 1)A+(24−1) 时,根据算术法则,这等于 (A−1)+24(A-1) + 2^4(A−1)+24。由于我们的系统只有4位,它无法表示像 24=162^4 = 1624=16 这样大的数字。和中的 242^424 部分表现为从最高位产生的进位,这个进位被直接丢弃。剩下的正是 A−1A-1A−1。

这是一个深刻的见解。这意味着我们不需要为减法构建单独的电路!我们可以使用一个标准的​​并行加法器​​电路来构建一个递减器。为了计算 A−1A-1A−1,我们将加法器配置为执行 S=A+B+CinS = A + B + C_{in}S=A+B+Cin​,并简单地设置如下输入:

  • 第一个输入是我们的数字 AAA。
  • 第二个输入 BBB 设置为全1(对于4位系统是 111121111_211112​)。
  • 初始进位输入 CinC_{in}Cin​ 设置为0。

让我们用一个例子来测试一下。假设 A=10112A = 1011_2A=10112​(数字11)。我们想计算 11−1=1011-1=1011−1=10。使用我们基于加法器的递减器:

\begin{array}{@{}c@{\,}c@{}c@{}c@{}c@{}c} & 1 & 0 & 1 & 1 & \quad (A = 11) \\ + & 1 & 1 & 1 & 1 & \quad (B = 15, \text{or } -1) \\ \hline 1 & 1 & 0 & 1 & 0 & \end{array}

结果是 11010211010_2110102​。但由于我们处在一个4位的世界里,我们只保留最后四位,即 101021010_210102​。这是10的二进制表示。完美运行!这个单一而优美的原理是现代计算机执行减法的基础。这个想法也是可扩展的。如果你需要构建一个5位递减器,但只有4位加法器芯片,你可以将它们串联起来,利用第一个芯片的进位输出来正确调整第二个芯片的计算,这展示了这种模块化方法的稳健性。

当然,在任何实际系统中,我们都必须注意边界情况。当我们的递减器接收到输入 000020000_200002​ 时会发生什么?我们的电路会尽职地计算 0−10-10−1 并输出 111121111_211112​(-1的二进制补码)。这被称为​​下溢​​。在许多应用中,比如跟踪可用资源的数量,我们需要在再次尝试递减之前知道计数是否已达到零。一个简单的逻辑电路可以监视输入线,如果所有输入线都为零,它就升起一个标志,表示即将发生下溢。这可以通过一个或非门(NOR gate)来实现,其输出仅在所有输入都为'0'时才为'1'。

从简单的借位行为到减法与加法的伟大统一,递减器电路的设计揭示了数字逻辑核心的优雅与精巧。这是一段从人类直觉到更深刻、更强大的数学真理的旅程,一切都体现在电子那无声、闪电般的舞蹈之中。

应用与跨学科联系

现在我们已经把玩了递减器及其近亲——减法器的齿轮和杠杆,我们可能会满足于对它们工作原理的理解,然后将它们放回盒子里。但这就像学会了字母表却从不读书一样!这些基本电路的真正魅力,正如物理学或工程学中的任何基本原理一样,不在于它们孤立的功能,而在于当它们与世界其他部分连接时所开启的无限可能性。那么,让我们踏上征程,看看“减去”这个简单的想法会将我们引向何方。

算术瑞士军刀

乍一看,一个加法电路和另一个减法电路似乎是两个截然不同的工具。但是自然界和聪明的工程师都厌恶冗余。当一个设备可以被巧妙地设计成同时完成两项任务时,为什么还要建造两个呢?这就是常见的加/减法器电路的精妙之处。通过使用二进制补码的数学技巧,我们可以将减法转化为一种特殊的加法。电路不需要学习新技能;它只需要被告知以一种稍微不同的方式处理数字。一根控制线充当开关,将电路的“个性”从加法器翻转为减法器。这是一个效率的绝佳范例,也是优秀设计的基石。

但巧妙之处不止于此。一旦你有了这个多功能的加/减法器模块,你就可以通过布线对其进行“编程”,以执行一整套其他操作。想求一个数 AAA 的负数吗?只需让电路计算 0−A0 - A0−A 即可。通过将零送入一个输入端,AAA 送入另一个输入端,并将模式设置为减法,该电路就变成了一个专用的求反器。

那么我们今天的主角——递减器呢?或者它的反面,递增器?这些操作,A−1A-1A−1和A+1A+1A+1,是计数的基础。同样,我们的通用模块也能胜任。要得到 A+1A+1A+1,我们将电路设置为“加法”模式,并输入数字1。要得到 A−1A-1A−1,我们可以将其设置为“减法”模式并输入数字1,或者更巧妙地,使用几种其他能达到相同结果的配置之一。这种灵活性表明,逻辑门不仅仅是在执行单一、僵化的计算;它们正在实现一个更普适的数学关系,我们可以利用它来达到各种目的。我们甚至可以推动它执行非标准计算,比如 A−(B+1)A - (B+1)A−(B+1),只需在输入进入减法器之前就对其进行预处理。这个电路就像一位才华横溢的音乐家,不仅能演奏乐谱,还能在主题上即兴创作出精彩的变奏。

构建更智能、更稳健的系统

从单个操作提升一步,我们可以开始将这些模块组合成更复杂的系统。想象一下,你需要一个可以根据指令进行向上或向下计数的电路。你可以构建一个专用的递增器和一个专用的递减器。然后,使用一组称为多路复用器的简单数字开关,你可以创建一个单一、统一的模块。一个控制信号告诉多路复用器是传递来自递增器的结果还是递减器的结果,从而用预制部件为你提供一个可选的加/减计数器。这种模块化方法——从更简单、已充分理解的组件构建复杂系统——是所有现代数字设计的基础,从简单的计算器到超级计算机。

但是当我们的计数出错时会发生什么?如果我们让递减器从0中减去1会怎样?在无符号数的世界里,这会导致“下溢”,回绕到可能的最大数,就像里程表从00000回滚到99999。在许多应用中,这是一个错误。一个设计良好的递减器不仅仅是计算;它还会通信。它提供一个额外的信号,一个“借位输出”标志,在发生下溢时精确地变为高电平。这个信号是来自硬件的消息,我们可以用它来构建更智能的系统。我们可以将这个标志连接到一个多路复用器,当检测到下溢时,它会忽略无意义的结果,转而输出一个预定义的错误代码或触发警报。这是从纯数学到稳健工程的关键一步:预见失败并优雅地处理它。

现代计算机的核心

那么这个小电路在宏大的蓝图中出现在哪里呢?它最关键的角色之一隐藏在每个现代处理器的核心深处:浮点单元,即FPU。这是芯片中处理带小数点数字的部分——这些数字对于科学计算、图形学以及几乎所有非整数运算都至关重要。

一个浮点数以科学记数法的形式存储,包含一个尾数(有效数字)和一个指数。要将两个这样的数相加,比如 1.23×1051.23 \times 10^{5}1.23×105 和 4.56×1034.56 \times 10^{3}4.56×103,你不能只将 1.231.231.23 和 4.564.564.56 相加。你必须首先通过使它们的指数相等来对齐它们的“小数点”。你会将 4.56×1034.56 \times 10^{3}4.56×103 重写为 0.0456×1050.0456 \times 10^{5}0.0456×105。关键问题是:你需要将小数点移动多少位?答案是指数之间的差值:5−3=25 - 3 = 25−3=2。

那么FPU是如何计算这个差值的呢?用一个简单的二进制减法器。一个在根本上与我们讨论过的电路相同的电路,将两个指数作为输入,其输出决定了尾数必须如何移位。这是一个令人惊叹的想法:现代计算中最复杂、最关键的操作之一,依赖于卑微的减法器来执行其第一个、至关重要的步骤。

超越数字:模拟世界中的减法

“求差”的概念是如此基础,以至于它完全超越了由1和0组成的数字世界。自然界本身就在连续的模拟域中执行减法,我们已经构建了模仿这一过程的电路。数字减法器的模拟等效物是一种称为差分放大器的电路。

想象一下,你想测量一个交流电压信号的全幅值,即其峰峰值。你可以构建一个“正峰值检测器”电路来记住它看到的最高电压(VmaxV_{max}Vmax​),以及一个“负峰值检测器”来记住最低电压(VminV_{min}Vmin​)。为了找到总幅值,你只需计算差值:Vpeak−to−peak=Vmax−VminV_{peak-to-peak} = V_{max} - V_{min}Vpeak−to−peak​=Vmax​−Vmin​。这正是差分放大器所做的事情。它将两个峰值电压作为输入,其输出与它们的差值成正比,从而直接、实时地测量信号的振幅。

一个更深远的应用在于信号分析。假设你有一个来自音频放大器的信号,它本应是纯正弦波,但听起来失真了。这种失真包含称为谐波的不需要的额外频率。你如何测量混入“好”信号(基频)中的“坏”信号(谐波)的量?你可以使用减法作为一种隔离工具。首先,你使用一种特殊的滤波器,即陷波滤波器,来移除基频,只留下谐波。现在你有了总信号和谐波信号。如果你将两者都输入差分放大器,它会计算(总信号) - ([谐波](/sciencepedia/feynman/keyword/harmonic_waves)),输出的就是你开始时的纯净基频信号。通过减去一部分,你可以分离出另一部分。这项技术在测试和测量中至关重要,它使工程师能够诊断和量化从音频系统到无线电通信等各种系统中的噪声和失真。

从逻辑门中的一个简单开关,到浮点运算的仲裁者,再到净化模拟信号的工具,减法原理是一条贯穿无数科技领域的金线。它提醒我们,最强大的思想往往是最简单的,而它们的真正价值,体现在它们编织的丰富多彩的联系网络之中。