从全加器到并行进位加法器的核心改进思想,是通过增加复杂的“预判”逻辑来解除对进位信号的线性、串行依赖,从而实现各位并行计算,以空间换时间,大幅提升运算效率。
一、 要掌握什么
-
全加器与串行加法器:理解一位全加器的逻辑结构,并掌握由多位全加器构成串行进位加法器(又称行波进位加法器)的原理及其延迟分析。
-
并行进位加法器:理解并行进位加法器的设计思想,重点在于理解其如何通过进位生成(Generate)和进位传递(Propagate)的概念来加速进位链的产生,从而实现快速加法。
-
带符号数的加减法运算:掌握补码加减法运算规则,深刻理解“减法变加法”的硬件实现。
-
溢出判断:掌握补码加法运算中溢出的概念、原因和硬件检测方法(双符号位法和单符号位法),这是绝对的重点与难点。
二、 演进过程详解
我们来一步步看这个家族是如何“内卷”和“进化”的。
1. 卑微的基石:全加器 (Full Adder)
一切始于最基础的“工人”——一位全加器。你可以把它想象成一个只负责处理个位数加法的初级会计。
-
输入:他需要三个数字:当前位的两个加数(Ai 和 Bi),以及来自更低一位的进位(Ci)。
-
输出:他只做两件事:算出当前位的和(Si),以及要不要向更高一位进位(Ci+1)。
这个小工人本身效率很高,但他的致命弱点是:他必须等拿到低位传来的进位信号后,才能开始工作。
2. 效率低下的流水线:串行进位加法器 (Ripple-Carry Adder)
如果我们想算一个多位数(比如8位数)的加法,最直观的方法就是找8个“一位全加器”工人,让他们排成一队。这就是串行进位加法器,也因为其进位信号像波浪一样一波波向高位传递,而被称为行波进位加法器。
-
工作模式:
-
第0位工人(处理最低位)最先开工,因为它没有“更低一位”,我们可以认为它的进位输入 C0 为0。
-
它算出结果 S0 和给第1位的进位 C1。
-
第1位工人一直在等 C1,拿到后立刻开工,算出 S1 和给第2位的进位 C2。
-
……
-
这个过程一直持续到最高位(第7位)工人拿到第6位传来的进位 C7,完成计算后,整个8位加法才算结束。
-
-
核心矛盾:依赖
这里的效率瓶颈非常明显:严重的串行依赖。第 i 位的计算结果,完全依赖于第 i−1 位的进位输出。就像一条生产线,后一道工序必须等前一道工序完成后才能启动。如果加法器有 n 位,而每个全加器的延迟是 T,那么总延迟大约就是 n×T。位数越多,等待时间越长,CPU完全无法忍受这种“龟速”。
3. 天才的诞生:并行进位加法器 (Parallel-Carry Adder)
为了打破这种“我等你,你等他”的僵局,天才的工程师想出了一个办法:我们能不能不傻等,而是提前预测出每一位的进位?这就是并行进位加法器(也称先行进位加法器,Carry-Lookahead Adder)的核心思想。
-
解除依赖的武器:
它引入了一个独立、且更聪明的“领导”部门——进位生成逻辑 (Carry-Lookahead Logic)。这个部门不直接算加法,而是专门用来光速计算出所有位的进位信号。它是怎么做到的呢?它发现,对于任何一位 i 来说,它未来是否会产生进位,只取决于两种情况:
-
“本地自产” (Generate):不管低位给不给进位,我自己就能产生一个进位。这种情况只发生在 Ai=1 且 Bi=1 时。我们把这个叫做进位生成信号 gi。
-
“上游传递” (Propagate):我自己不一定能产生进位,但如果低位给了我一个进位,我保证能把它原封不动地传给下一位。这种情况发生在 Ai 和 Bi 中有一个是1时(Ai⊕Bi=1 或 Ai+Bi=1)。我们把这个叫做进位传递信号 pi。
-
-
工作模式革命:
-
加法开始时,所有位的 Ai 和 Bi 都是已知的。于是,我们可以在一瞬间,并行地计算出所有位的 gi 和 pi 信号。
-
那个聪明的“领导部门”拿到所有的 gi 和 pi 后,通过一个(虽然复杂但极快)的纯组合逻辑电路,同时推导出所有位的最终进位 C1,C2,…,Cn。
-
比如 C1 产生,要么是第0位“本地自产”(g0),要么是第0位能“传递”(p0)且最初就有个进位(C0)。
-
C2 产生,要么是第1位“本地自产”(g1),要么是第1位能“传递”(p1)且它收到了来自第0位的进位(C1)。把 C1 的逻辑代入,就可以发现 C2 完全可以由 g1,p1,g0,p0,C0 直接算出,无需等待。
-
-
一旦所有进位 Ci 都被“预知”并送达,那8个“工人”(全加器)就不再需要排队了,他们可以同时开工,用各自的 Ai,Bi 和被光速送达的 Ci 来计算最终的和 Si。
-
-
核心改进:空间换时间
并行加法器通过增加一套复杂的、专门用于“预判”进位的逻辑电路,打破了进位信号的逐级传递依赖,实现了所有进位的同时计算。这是一种典型的**以硬件的复杂度(空间)换取运算速度(时间)**的优化策略。
4. 灵魂升华:带符号加法器与溢出判断
前面的加法器本质上只处理无符号数。要让它能处理带符号数(通常用补码表示),硬件本身不需要做任何改变。一个n位的加法器,既可以计算无符号数加法,也可以计算补码表示的带符号数加法。
真正的区别在于对结果的解读和对“错误”的判断。这个“错误”就是溢出 (Overflow)。
-
什么是溢出? 对于一个n位的补码数,它能表示的范围是有限的。当两个正数相加,结果超出了能表示的最大正数(正溢出);或两个负数相加,结果小于了能表示的最小负数(负溢出),就发生了溢出。注意:一个正数和一个负数相加,永远不会溢出。
-
如何判断溢出?(考研核心)
硬件必须提供一个信号来告诉CPU“算错了!”。主要有两种判断方法:
-
双符号位法(变形补码):用两位来表示符号位,如
00
表示正,11
表示负。运算后,如果新的双符号位变成01
(正溢出)或10
(负溢出),则表示发生了溢出。这种方法直观,但会多占用一位。 -
单符号位法(最常用):这是考研最常考的方法。它通过比较**最高数值位(符号位前一位)向符号位的进位(Cn−1)和符号位产生的进位(Cn)**来判断。
-
判断公式:V=Cn−1⊕Cn (⊕ 代表异或)。
-
解读:如果这两个进位不相同(一个为0,一个为1),则表示溢出;如果相同(都为0或都为1),则表示未溢出。
-
-