前言
在日常的软件开发中,我们很少需要真正关心计算机的底层是如何工作的。编译器、操作系统以及各种高级抽象层为我们开发者提供了一个相对稳定而统一的接口,使得人们能够专注于算法与应用逻辑。然而,在这些抽象层之下,计算机本质上只是由大量简单电子元件构成的系统:电信号在导线中传播、逻辑门对信号进行运算、寄存器保存状态,而处理器按照既定规则执行指令。我们能否尝试回答一个看似简单但实际上非常深刻的问题:如果从最基础的逻辑电路开始,我们能否一步一步构建出一个完整的
CPU? 为了回答这个问题,我们将暂时抛开操作系统、编译器以及复杂的体系结构,从最基本的数学与逻辑出发,逐步搭建计算机的核心组件。
首先,我们需要理解数字电路的数学基础。计算机内部所有的数据最终都以二进制形式表示,因此逻辑运算可以通过布尔代数或伽罗瓦域 的运算进行描述。通过这些数学工具,可以形式化地分析逻辑函数以及电路行为。在此基础上,我们将构建最基本的逻辑门,例如与门、或门、非门以及异或门。这些逻辑门是数字电路的基本构件,通过组合这些简单的运算单元,可以实现任意布尔函数。
随后,我们将逐步构建更复杂的算术电路。例如,从半加器与全加器开始,构建多位加法器,并进一步实现算术逻辑单元(ALU)。ALU
是处理器中最核心的计算模块,它负责执行加法、减法以及各种逻辑运算。
在完成算术电路之后,我们将引入“状态”这一概念:通过锁存器和触发器,可以构建寄存器与计数器,从而使电路能够在不同的时钟周期之间保存数据。这一步是从纯组合电路迈向完整计算系统的关键。
最终,通过将寄存器、ALU、控制逻辑以及指令译码电路组合在一起,我们将得到一个能够执行指令序列的处理器。虽然这个处理器在功能上可能非常简单,但它已经包含了现代
CPU 的基本结构:数据通路、控制单元以及指令执行机制。
我开这个系列的目标并不是构建一个高性能处理器,而是通过从零开始构建
CPU
的过程,理解计算机体系结构最核心的思想。通过这种自底向上的方式,可以清晰地看到从数学、逻辑电路到处理器结构之间的联系。当我们真正理解这些基础之后,再回过头来看现代处理器中的复杂机制,例如流水线、乱序执行或缓存系统,就会发现这些复杂结构其实都是建立在同样简单的逻辑基础之上。
希望本系列文章能够帮助您以一种更加本质的视角理解计算机:
计算机并不是一个神秘的黑盒,而是由大量简单规则逐步构建而成的系统。
第一部分 算术逻辑单元
在现代计算机系统中,大部分数据处理操作都依赖于算术与逻辑运算。处理器在执行程序时,需要对二进制数据进行加法、减法等以及各种逻辑运算,这些运算均由算术逻辑单元 (A rithmetic
L ogic U nit,简称
ALU )完成。因此,ALU
构成了处理器数据通路中的核心计算模块,其结构与实现方式直接决定了系统的运算能力。
从抽象层次上看,ALU
可以被视为一个将输入数据映射为输出结果的函数。设两个 位二进制操作数为 ,并具有如下的向量表示: 在控制信号的作用下,ALU 对输入数据执行某种运算,并产生输出向量
以及若干状态标志信号,例如进位标志、零标志和溢出标志等。不同的控制信号对应不同的运算功能,例如加法、减法或按位逻辑运算。
尽管 ALU
的功能看起来较为复杂,但从电路实现的角度来看,这些运算都可以通过基本逻辑门电路构造。逻辑门构成最基本的电路单元,而复杂的算术运算则是通过对这些基本单元进行组合而实现的。因此,理解
ALU 的实现过程,需要从最基本的逻辑运算开始。
在数学上,二进制逻辑运算可以通过布尔代数进行描述。布尔代数提供了一套形式化的代数结构,用于刻画逻辑变量之间的运算关系。在二值逻辑系统中,每一个变量只能取两个可能的值,即
与 。这些运算在结构上与伽罗瓦域
具有密切联系,因此可以利用代数方法对逻辑函数进行分析与化简。
在掌握布尔代数的基础上,可以进一步研究逻辑门电路的实现方式。逻辑门是数字电路中最基本的硬件单元,例如与门、或门、非门和异或门等。通过组合这些基本逻辑门,可以实现任意布尔函数,从而构造复杂的组合逻辑电路。
众所周知,现代计算机的
ALU整体是建立在逻辑电路理论的基础上的,因此,要搞清楚计算机的运算原理,就必须搞清楚逻辑电路原理。我们将从基本逻辑运算与抽象代数结构的角度出发,论证
ALU 的运算原理,并在必要位置给出严谨的数学证明。
第一章 基本逻辑门
在数字电路中,逻辑门是实现布尔运算的基本电路单元。每一个逻辑门都接收若干输入信号,并根据特定的逻辑规则产生输出信号。从抽象角度来看,逻辑门可以被视为一个函数,其输入与输出均取值于二值集合
其中 通常表示逻辑假或低电平,而 表示逻辑真或高电平。
设一个逻辑门具有 个输入信号,则可以将其输入表示为一个向量
其中每个 。逻辑门根据内部实现的逻辑函数,将这些输入映射为输出信号 ,因此可以将逻辑门表示为函数 该函数称为布尔函数 。换言之,一个具有 个输入的逻辑门本质上实现了一个映射 称 为逻辑门的扇入 。不同类型的逻辑门对应不同的布尔函数,例如,与门实现逻辑与运算,或门实现逻辑或运算,而非门则实现逻辑取反运算。从电路结构上看,逻辑门的输入端通常连接到其他电路单元的输出端,而其输出端则作为后续电路的输入信号。因此,逻辑门可以通过导线相互连接,从而构成更复杂的逻辑电路。
在组合逻辑电路中,输出仅由当前输入决定;而在更复杂的时序电路中,输出还可能依赖于电路的历史状态。为了描述逻辑门在不同输入情况下的行为,通常使用真值表 。真值表列出了所有可能输入组合及其对应的输出结果。例如,对于一个具有两个输入的逻辑门,其输入共有 种可能的组合,因此真值表中需要列出四种情况。通过真值表,可以完整地描述逻辑门实现的布尔函数。
在本章中,我们将首先介绍几种最常见的基本逻辑门,包括与门、或门、非门以及异或门,并分析它们的逻辑性质。随后将讨论逻辑门之间的代数关系,以及如何通过组合这些基本门电路实现更复杂的逻辑函数。
1.1 非门(NOT Gate)
1.1.1 定义
非门又称反相器、,是最简单的逻辑门,仅具有一个输入端口和一个输出端口,其核心功能是实现逻辑非运算,即对输入信号进行取反 :
输入为 (0) 时输出为 (1)
输入为 (1) 时输出为 (0)
在逻辑上,这等价于对命题取否定。
1.1.2 真值表
其中
1.1.3 运算表达式
也可表示为
1.1.4 实现
非门可通过晶体管(二极管、MOS管)实现,核心原理是利用晶体管的导通与截止状态对应逻辑
和 :当输入为高电平( )时,晶体管导通,输出低电平( );当输入为低电平( )时,晶体管截止,输出高电平( )。实际应用中,常用CMOS反相器,具有功耗低、抗干扰能力强的特点。下图是一种使用MOS管的非门:
1.2 与门(AND Gate)
1.2.1 定义
与门具有两个及以上输入端口和一个输出端口,核心功能是实现“逻辑与”运算,仅当所有输入信号均为
(真)时,输出才为 (真);只要有一个输入为 (假),输出即为 (假),遵循“同时为真才为真”的逻辑。
1.2.2 真值表
(A)
(B)
(Y)
0
0
0
0
1
0
1
0
0
1
1
1
对应表达式:
1.2.3 运算表达式
也可写为
1.2.4 实现
与门可通过二极管串联实现:两个二极管的阳极连接在一起作为输出端,阴极分别作为输入端口,电源通过电阻连接到输出端。当所有输入均为高电平( )时,二极管均截止,输出高电平( );只要有一个输入为低电平( ),对应二极管导通,输出被拉低为低电平( )。如下图:
实际应用中,常用CMOS与门,然而它不是由单级电路构成的。它实际上是将一个与非门和一个非门级联而成的。如下图:
1.3 或门(OR Gate)
1.3.1 定义
或门具有两个及以上输入端口和一个输出端口,核心功能是实现“逻辑或”运算,只要有一个输入信号为
(真),输出即为 (真);仅当所有输入均为 (假)时,输出才为 (假),遵循“有一个为真即为真”的逻辑。
1.3.2 真值表
(A)
(B)
(Y)
0
0
0
0
1
1
1
0
1
1
1
1
1.3.3 运算表达式
1.3.4 实现
或门可通过二极管并联实现:两个二极管的阴极连接在一起作为输出端,阳极分别作为输入端口,电源通过电阻连接到输出端。当有一个输入为高电平( )时,对应二极管导通,输出高电平( );当所有输入均为低电平( )时,二极管均截止,输出低电平( )。如下图:
实际应用中,常用CMOS或门,由一个或非门加一个非门组成,与CMOS与门结构对称。如下图:
1.4 异或门(XOR Gate)
1.4.1 定义
异或门(Exclusive
OR)具有两个及以上输入端口和一个输出端口,核心功能是实现“逻辑异或”运算,当输入信号“不同”时(一个为
,一个为 ),输出为 (真);当输入信号“相同”时(均为 或均为 ),输出为 (假)。异或运算在数电中应用极广。
1.4.2 真值表
(A)
(B)
(Y)
0
0
0
0
1
1
1
0
1
1
1
0
1.4.3 运算表达式
异或运算可以由基本逻辑门组合实现:
1.5 同或门(XNOR Gate)
1.5.1 定义
同或门(Exclusive
NOR)是异或门的反相,具有两个及以上输入端口和一个输出端口,核心功能是实现“逻辑同或”运算,当输入信号“相同”时(均为
或均为 ),输出为 (真);当输入信号“不同”时(一个为 ,一个为 ),输出为 (假),与异或运算互为非运算。
1.5.2 真值表
(A)
(B)
(Y)
0
0
1
0
1
0
1
0
0
1
1
1
1.5.3 运算表达式
其与异或关系为
第二章 逻辑运算的代数结构
逻辑变量取值集合为 ,该系统可用布尔代数 描述。逻辑运算还可嵌入到伽罗瓦域 的多项式结构中。在 中只有两种基本运算:
逻辑运算可通过如下映射关系,与伽罗瓦域 中的运算对应,实现逻辑运算的代数化表示:
由此可见,逻辑非运算对应伽罗瓦域中“
加变量”的运算,逻辑异或运算对应伽罗瓦域中的加法运算,逻辑与运算对应伽罗瓦域中的乘法运算。而逻辑或运算无法直接对应伽罗瓦域的基本运算,需通过上述映射关系推导得出,其多项式表示为
该表达式属于布尔环多项式表示 ,是逻辑或运算在伽罗瓦域
中的代数等价形式。
2.1 非运算性质
由逻辑非运算与伽罗瓦域 运算的映射关系,非运算可表示为
双重否定律
对逻辑变量
进行两次非运算,结果仍为
本身,即:
证 :根据非运算的代数表达式 ,对 再次进行非运算,可将 整体代入公式 ,得到: 在伽罗瓦域 中,加法运算满足特殊性质:两个 相加的结果为 ,即
利用加法结合律,将上式中的 优先计算,可得:
又因为在伽罗瓦域 中, 为加法单位元,满足 ,因此:
即
,得证 。
互补律
一个逻辑变量与其非变量的或运算结果恒为 ,与运算结果恒为 ,即:
证 :结合非运算的代数表达式
和逻辑运算的伽罗瓦域映射关系,分别证明两个等式:
证明 :
由逻辑或的布尔环多项式表示 ,令
,代入得:
展开右边多项式: 在伽罗瓦域 中, (异或运算自反性),且 (幂等性),代入化简:
故
证明 :
由逻辑与的映射关系 ,代入 ,得:
综上,互补律的两个等式均成立,得证 。
2.2 与运算性质
逻辑与运算对应伽罗瓦域 中的乘法运算
,因此其性质可由伽罗瓦域乘法的性质推导得出。
交换律
两个逻辑变量进行与运算时,交换变量顺序,结果不变,即:
证 :由与运算与伽罗瓦域乘法的映射关系, , 。
在伽罗瓦域 中,乘法运算满足交换律,即 ,因此
,得证 。
结合律
三个及以上逻辑变量进行与运算时,改变运算顺序(添加括号),结果不变,即:
证 :根据映射关系, , 。
在伽罗瓦域 中,乘法运算满足结合律,即 ,因此
,得证 。
幂等律
一个逻辑变量与自身进行与运算,结果仍为该变量本身,即:
证 :由映射关系, 。
在伽罗瓦域
中,对于任意逻辑变量 (取值为 或 ),均满足 (当 时, ;当 时, ),因此
,得证 。
单位元
一个逻辑变量与
进行与运算,结果仍为该变量本身,即:
证 :由映射关系, 。
在伽罗瓦域
中, 是乘法单位元,满足 ,因此
,得证 。
零元
一个逻辑变量与
进行与运算,结果恒为 ,即:
证 :由映射关系, 。
在伽罗瓦域
中, 是乘法零元,满足 ,因此
,得证 。
吸收律
一个逻辑变量与该变量和另一个变量的或运算结果进行与运算,结果仍为该变量本身,即:
证 :结合逻辑或的布尔环多项式表示 ,将其代入左边表达式:
展开多项式,利用伽罗瓦域乘法分配律:
由幂等性
,代入化简:
在伽罗瓦域 中, ,因此:
即:
得证 。
2.3 或运算性质
逻辑或运算并没有直接对应的伽罗瓦域基本运算,需借助其布尔环多项式表示
,结合伽罗瓦域的运算性质,推导其各类性质。
交换律
两个逻辑变量进行或运算时,交换变量顺序,结果不变,即:
证 :根据或运算的多项式表示, , 。
在伽罗瓦域 中,加法满足交换律( ),乘法满足交换律( ),因此:
,即
,得证 。
分配律
一个逻辑变量与另外两个变量的或运算结果进行与运算,等价于该变量分别与两个变量进行与运算后,再进行或运算,即:
证 :分别对等式左右两边进行代数化简,验证其等价性。
化简左边
:
代入或运算多项式表示,结合与运算映射关系,得:
化简右边 :
先计算 ,
,再代入或运算多项式表示:
由幂等性 ,化简得:
左 边 右 边 ,得证 。
2.4 德摩根定律
德摩根定律揭示了非运算和与、或运算之间的反向关系,可将与运算的非运算转化为非运算的或运算,或将或运算的非运算转化为非运算的与运算:
证 :此处以第一个等式
为例,结合伽罗瓦域运算和逻辑映射关系证明,第二个等式可同理推导。
化简左边 :
由与运算映射关系
,结合非运算表达式 ,令
,得:
化简右边
:
先由非运算表达式得出
,
,再代入或运算多项式表示:
展开右边多项式,利用伽罗瓦域运算性质化简:
代入原式并合并同类项:
在伽罗瓦域 中, 、 、 ,因此:
左边
与右边化简结果一致,故 ,得证 。
同理,可证明 ,此处不再赘述。
2.5 异或运算性质
由前文映射关系可知,逻辑异或运算直接对应伽罗瓦域
中的加法运算,即
由于伽罗瓦域
中的加法运算满足阿贝尔群的所有条件(交换律、结合律、单位元存在、逆元存在),因此集合
构成阿贝尔群(交换群),其各项性质均可由伽罗瓦域加法性质推导得出。
交换律
两个逻辑变量进行异或运算时,交换变量顺序,结果不变,即:
证 :由异或与伽罗瓦域加法的映射关系, , 。
在伽罗瓦域 中,加法运算满足交换律,即 ,因此有:
得证 。
结合律
三个及以上逻辑变量进行异或运算时,改变运算顺序(添加括号),结果不变,即:
证 :由映射关系, , 。
在伽罗瓦域 中,加法运算满足结合律,即 ,因此有:
得证 。
单位元
一个逻辑变量与
进行异或运算,结果仍为该变量本身,即:
证 :由映射关系, 。
在伽罗瓦域 中,0是加法单位元,满足 ,因此有:
得证 。
逆元
一个逻辑变量与自身进行异或运算,结果为单位元 ,即:
证 :由映射关系, 。
在伽罗瓦域
中,任意元素与自身相加的结果为
,即 ,因此有:
得证 。
反转性质
一个逻辑变量与1进行异或运算,结果等价于该变量的非运算,即:
证 :由映射关系, 。
由非运算的代数表达式 可知,
,而伽罗瓦域加法满足交换律,因此有:
得证 。
奇偶校验性质
多个逻辑变量的异或运算结果,等价于所有变量取值之和对 取模,即:
若参与运算的变量中,取值为 的个数为奇数,则异或结果为 ;若为偶数,则结果为 。
证 :采用数学归纳法证明,结合异或运算与伽罗瓦域加法的等价性(
)。
当 时, ,
,等式成立;
假设当 ( )时,等式成立,即: 当 时,有: 由归纳假设和映射关系: 因此,当 时,等式仍成立。
综上,对任意正整数 ,等式均成立,得证 。
2.6 同或运算性质
同或运算定义为异或运算的非运算,即
结合异或运算与伽罗瓦域加法的映射关系( )和非运算的代数表达式(
),同或运算可进一步表示为
交换律
两个逻辑变量进行同或运算时,交换变量顺序,结果不变,即:
证 :根据同或运算的代数表达式 , 。
在伽罗瓦域 中,加法满足交换律( ),因此:
,即
,得证 。
结合律
三个及以上逻辑变量进行同或运算时,改变运算顺序(添加括号),结果不变,即:
证 :
左边:
将括号内的 展开:
利用异或与取反的性质:
因此:
于是得到:
右边:
将括号内的 展开:
利用异或与取反的性质:
于是:
因此:
得证 。
自反性质
一个逻辑变量与自身进行同或运算,结果恒为 ,即:
证 :将 代入同或运算的代数表达式,得: 在伽罗瓦域 中, ,因此 ,即 ,得证 。
第三章 加法器
在现代计算机体系结构中,加法运算是最基本的算术运算之一。几乎所有复杂算术操作,例如减法、乘法、除法以及地址计算等,都可以归结为若干次加法运算的组合。例如,减法可以通过补码表示转化为加法;乘法通常通过移位与加法的组合实现;除法可以通过迭代减法或恢复算法实现;而在处理器执行内存访问时,地址的计算通常表现为基址与偏移量之间的加法运算。因此,在计算机硬件层面,实现高效可靠的加法运算是算术逻辑单元设计的核心问题之一。
在数字电路中,所有数据均以二进制形式表示。第二章已经讲过,二进制数的每一位仅可能取
或 ,因此其运算规则可以完全用布尔代数来描述,且布尔代数与伽罗瓦域
之间存在严格的代数对应关系,其中逻辑与运算对应于伽罗瓦域中的乘法运算,而逻辑异或运算则对应于伽罗瓦域中的加法运算。利用这一映射关系,可以将二进制加法转化为布尔多项式运算,从而为数字电路设计提供严格的数学基础。本章首先分析实现一位加法的最基本逻辑单元——半加器 ,然后进一步引入来自低位的进位输入,研究全加器的结构,并推导多位加法器的进位传播规律。
3.1 半加器
半加器 是实现两个一位二进制数相加的最基本逻辑电路。设两个输入变量
在执行加法运算时,结果可能包含两个部分,其中一部分是当前位的结果,称为本位和(S um),另一部分是当运算结果超过
1 时产生的高位进位,称为进位(C arry)。
因此,一位加法可以表示为一个映射: 其中
表示当前位的计算结果,而
表示向高位产生的进位。
下面我们来推导 与 的代数表达式。
3.1.1 本位和
根据二进制加法规则可以得到本位和 的取值规律:当两个输入变量均为 时,结果为 ;当其中恰有一个为 时,结果为 ;而当两个输入同时为 时,由于产生进位,本位结果重新变为
。这一规律说明,本位和为
的情况恰好出现在两个输入取值不同的情形,而当两个输入相同时结果为 。这一性质与逻辑异或运算的定义完全一致。通过上述穷举,我们可以将本位和
看作两个输入变量作异或运算的结果。
从代数的角度看,第二章已经证明,异或运算可以映射到伽罗瓦域 中的加法运算,即: 因此,一位二进制加法的本位和可以表示为: 这一公式表明,本位和的计算仅需要一个异或门即可完成。
3.1.2 进位
根据二进制加法规则,仅当两个输入变量同时为 时才会产生进位。例如: 在这一运算中,最低位结果为 ,而高位产生进位 。若任一输入变量为 ,则运算结果不会产生进位。这一条件又和逻辑与运算的定义完全一致。在第二章中,我们已经给出逻辑与运算与伽罗瓦域乘法之间的对应关系:
其中右侧表示伽罗瓦域中的乘法运算。因此进位可以表示为:
从代数角度看,这说明进位实际上由乘法项决定。当两个输入变量均为
时,其乘积为 ,从而产生进位;只要其中任意一个变量为
,乘积便为 ,因此不会产生进位。
综合以上分析可以得到,半加器的逻辑结构完全由两个基本逻辑运算决定,因此半加器电路只需要两个基本逻辑门:一个异或门用于计算本位和,一个与门用于计算进位。因此,我们可以得到半加器的逻辑电路图:
简记为:
需要注意的是,半加器只能处理两个输入变量的加法运算,而在实际的多位加法中,每一位运算还可能接收到来自低位的进位信号。因此在实际处理器中,需要使用更一般的加法单元——全加器。
3.2 全加器
在多位二进制加法运算中,每一位的计算不仅依赖当前位的两个输入,还依赖来自低位的进位信号。因此,在第
位执行加法运算时,需要考虑三个输入变量: 其中
表示第一个加数在第 位的值, 表示第二个加数在第 位的值,而 表示来自第 位的进位。
该运算单元产生两个输出,其中
表示当前位的结果,而
表示向更高位传播的进位。能够同时处理两个输入位和一个进位输入的加法单元称为全加器 。
3.2.1 全加器的进位
我们现在先不关心全加器和半加器的具体联系,暂且将其看作是半加器的多输入推广。要将半加器推广到三个输入,其核心问题是推导进位信号在各个位之间传播的数学表达式。在现代处理器设计中,全加器不仅用于构建最简单的串行进位加法器,还为更高速的结构,例如超前进位加法器,提供理论基础。因此,对全加器进位关系的严格数学推导具有重要意义。
易知,产生进位存在两种情况。第一种情况是当前位的两个输入变量直接产生进位,此时有:
该信号称为生成信号(Generate)。第二种情况是当前位允许低位的进位向高位传播,此时定义传播信号:
若此时存在输入进位 ,则该进位会被传播到更高位。
因此进位的逻辑表达式为: 由式 ,令 得: 对第三项进行分配律展开: 由式 及式 ,得: 由于交叉项恒为 0,进位多项式坍缩为纯加法形式: 此即全加器的基本进位关系 。
我们从式 的形式中观察到,多项式的第一项 与半加器的进位数 的表达式在形式上完全一致,而在第二项中,令
代入,得到: 此处的 在形式上与半加器的本位和同样完全一致。由此可见,我们可以将全加器看作两个半加器以及一个与门的组合,建立下图所示的等效电路:
下面我们从数学归纳法出发,给出式 的另一种证明方式。
证:
设两个 位二进制数 的进位序列为 我们要证明第
位的进位公式为
该表达式描述了进位在多位加法中的传播路径,其中每一项对应一种可能的进位传播链。例如第一项表示第
位直接产生进位;第二项表示第
位产生进位并被第
位传播;而更长的乘积项表示更长距离的进位传播过程。
当 时,有: 由穷举法,易证该公式成立。
假设当 时公式成立,即:
当
时,根据全加器递归关系 代入归纳假设式 ,得:
利用式 展开: 可以看出,式 与式 在形式上完全一致,因此命题对所有
成立。得证 。
3.2.2 串行进位加法器(Ripple
Carry Adder)
我们已经得到了全加器的基本进位关系: 该公式表明,第
位的进位由两部分决定:一部分来自当前位输入
直接产生的进位,另一部分来自低位进位
的传播。利用这一递归关系,可以将多个全加器按照位序依次连接,从而实现多位二进制加法运算。这种结构称为串行进位加法器 (R ipple
C arry
A dder,简称RCA )。
设两个 位二进制数 最低位的进位输入记为 ,在普通加法运算中通常取 对于第
位,全加器的输出关系为: 由于进位
依赖于前一位的进位 ,因此在电路结构上必须从最低位开始逐级传播进位信号。换言之,第
位的计算只有在第 位的进位已经确定之后才能完成。
因此,在最坏情况下,最低位产生的进位需要依次经过所有中间位,最终才能到达最高位。这种逐级传播的过程正是“串行进位 ”名称的来源。
在电路实现中,一个
位串行进位加法器可以通过将
个全加器按位连接实现,其中每一级的进位输出连接到下一位的进位输入。该结构实现简单,硬件成本较低,因此在早期计算机以及一些低功耗电路中仍然具有实际应用价值。
然而,这种结构的主要缺点在于进位传播延迟较大。设单个全加器的进位延迟为
,则在最坏情况下,进位需要从最低位传播至最高位,因此总延迟近似为
可以看到,延迟时间随位数
线性增长。当操作数位数较大时,这种结构会显著限制加法运算的速度。
3.3 超前进位加法器
在上一节中已经讨论了串行进位加法器的结构。该结构通过逐级传播进位来完成多位加法运算,其实现方式简单,但由于进位必须从最低位依次传播到最高位,因此电路延迟会随着位数的增加而线性增长。当操作数的位宽较大时,这种进位传播延迟会成为限制运算速度的重要因素。
为了减少这种由逐级传播带来的延迟,可以利用全加器进位公式的代数结构,对进位关系进行展开,使得高位进位能够直接由输入变量计算得到,而不必等待低位进位逐级传递。这种通过并行计算进位信号来提高运算速度的思想,构成了超前进位加法器 (C arry
L ookahead A dder,简称
CLA )的基本原理。
根据全加器的进位关系式 可以看到,第
位的进位由两个因素决定。一方面,如果当前位输入 与 同时为
1,则该位必然产生新的进位;另一方面,如果当前位允许进位传播,则来自低位的进位
将继续向高位传递。
为了便于分析这种关系,引入两个辅助信号。首先定义生成信号 当
时,表示当前位能够直接产生进位。即使低位没有输入进位,也会在该位产生新的进位信号。
其次定义传播信号 当
时,表示当前位允许低位进位向更高位传播。如果存在输入进位 ,则该进位将继续传递到下一位。
利用上述两个定义,可以将全加器的进位关系写为:
该表达式具有非常重要的意义。它说明进位的产生只依赖于生成信号与传播信号,而这两个信号均仅由输入变量
决定,因此可以在加法运算开始时同时计算得到。
通过不断展开式 ,可以得到更高位进位的显式表达式。例如,对最低几位展开可以得到:
将式 代入式 ,得到: 继续展开可得:
从上述推导可以看出,每一位的进位都可以表示为若干个生成信号与传播信号的组合项。这些组合项分别对应不同长度的进位传播路径。例如项
表示第 1 位产生进位并被第 2
位传播,而项 则表示第 0
位产生的进位经过两级传播后到达第 3 位。
由此可以得到一般形式。对于第
位进位,有:
该表达式说明,高位进位可以完全表示为输入变量的布尔多项式。因此,在硬件电路中可以通过组合逻辑一次性计算出多个进位信号,而不必等待低位进位逐级传播。
在得到所有进位信号之后,各位的加法结果仍然可以通过全加器公式计算:
由于进位信号能够通过组合逻辑并行计算,因此加法运算的总延迟主要取决于逻辑门的层数,而不再随位数线性增长。与串行进位加法器相比,这种结构可以显著减少进位传播时间,从而提高整体运算速度。
需要指出的是,当位数
较大时,式 中的传播项数量会迅速增加,使得实现该公式所需的逻辑门数量显著增加,从而导致电路规模和布线复杂度迅速上升。因此,在实际处理器设计中,通常不会直接构造完全展开的超前进位网络,而是采用分组或层次化的实现方法,通过将加法器划分为若干较小的模块来实现高效的进位计算。这种层次化结构能够在运算速度与电路复杂度之间取得较好的平衡,因此被广泛应用于现代处理器的算术逻辑单元设计中。
3.4 分组超前进位加法器
在上一节中已经讨论了 CLA 的基本原理。通过引入生成信号与传播信号:
可以将全加器的进位关系化简为迭代的代数形式:
通过不断代入,可以得到高位进位关于低位信号的展开式。例如,对于第 位的进位 ,有: 从纯代数的角度来看,式 可以在一个步骤内(即两级逻辑门:与门阵列+或门阵列)计算完成。然而,在实际的
CMOS 物理电路中,是受限的。随着
的增加,该表达式中的逻辑项数量和最高次项的变量个数(如 需要
输入的与门)迅速增长,导致电容负载过大,电路延迟反而会急剧上升。
因此,在实际电路设计中,通常采用分组超前进位 结构来降低单级电路的复杂度。设一个加法器被划分为若干个 位的加法模块(通常 )。对于每个模块,我们可以定义该模块的组生成信号 与组传播信号 。
组生成信号定义为:
该信号表示:在没有任何外部输入进位(即 )的情况下,该
位模块内部是否能够依靠自身操作数产生新的进位,并传播到模块的最高位。
组传播信号定义为:
该信号表示:若外部输入进位为 (即 ),该进位是否能够贯穿整个模块,从最低位一路传播到最高位输出。
由此,我们可以得到模块级的进位输出关系: 不难发现,式 的代数形式与单个位加法器的进位关系式 完全同构 。这意味着,每一个
位加法模块在更高层次上被抽象化为了一个新的“宏代数单元”。通过这种同构映射,我们可以构建多级进位计算网络,在规避物理扇入限制的同时,保证高速的进位计算。
3.5 加法器的层次化结构
当加法器位宽 进一步增大(如 32
位或 64
位)时,单层的分组超前进位依然会面临规模庞大的问题。因此,现代处理器设计中普遍采用层次化结构(Hierarchical
Structure) 来构建大规模加法器。
设一个 位加法器被划分为 个加法模块,每个模块包含 位,则有 。 对于第
个模块( ),我们定义其组生成信号为 ,组传播信号为 。模块之间的宏观进位关系可以写为:
由于该表达式与单个位全加器的进位关系完全相同,我们可以再次应用超前进位展开方法,得到宏观模块级的进位计算表达式。例如,对于第
个模块的输入进位,可以展开为:
通过这种树状的层次划分,我们可以在不同的代数抽象层上分别进行计算,从而将极长的进位传播路径切分为短路径的并行计算。
3.6
加法器延迟分析与代数结合律证明
在数字电路中,加法器的性能通常通过其传播延迟来衡量。不同结构的加法器在进位传播方式上的代数差异,直接决定了其算法复杂度。
串行进位加法器(RCA):线性时延 在 RCA
中,每一位的进位都严格依赖于前一位的计算结果,代数计算必须串行执行。若单个全加器产生进位的延迟为
,则对于一个
位加法器,进位信号在最坏情况下需要纵贯整个数据通路,其总延迟为: 超前进位加法器(CLA):对数时延
采用分组与层次化结构后,进位计算网络的深度大幅下降。在理想的树状层次结构下,其延迟近似表示为:
层次化计算能够生效的根本数学原因,在于进位传播逻辑满足代数结合律。
我们定义一个二元进位状态对 。并定义一种状态合并算子 ,用于表示两个相邻模块的进位逻辑合并:
在伽罗瓦域 下,该算子映射为多项式: 结合律证明 : 设有三个相邻的位块状态 、 和 。 左结合计算: 右结合计算: 因为左结合结果严格等于右结合结果,所以进位状态合并算子 满足结合律。
正是由于结合律的保障,我们计算
位进位前缀 时,不需要按顺序从右向左依次计算(这对应 RCA 的 延迟),而是可以任意加括号进行二叉树式的并行规约计算。一棵包含
个叶子节点的平衡二叉树的高度为
,这也就是超前进位加法器能够突破线性延迟物理极限,最终达到
延迟的严密数学依据。
第四章 基本算术运算
在上一章中,我们已经研究了加法器的原理,并将其推广到了
位二进制数的加法,但仅有加法对于我们要实现的 ALU
来说是远远不够的。一个完整的 ALU
不仅需要能够执行加法运算,还需要支持完整的四则运算以及若干辅助运算,例如移位、比较与取模等。这些运算共同构成了处理器执行算术指令时所依赖的基本功能。
4.1 位运算
在第一章和第二章中,我们重点研究了伽罗瓦域
的代数性质,并定义和分析了若干基本逻辑运算。这些运算包括与运算、或运算、异或运算、非运算以及同或运算等。然而需要注意的是,这些运算本质上是定义在有限 域
上的,其运算对象仅限于集合
中的元素。然而,在大多数实际情况下,我们通常处理的是自然数集 甚至实数域
中的数,因此,如果希望在计算机中对整数直接应用这些运算,就必须将定义在 上的各种逻辑运算推广到自然数集
上。
设两个任意的自然数 可以用
个一位二进制数 写成下面的形式: 其中 与 分别表示整数 与 的第 位二进制数。显然有 如果我们在 中定义了一类逻辑运算 ,要将这一类运算推广到自然数集 ,一种可行的方法是通过对每一个对应的
逐位进行 运算,从而在自然数集合上定义新的
运算。这类推广后的新运算称为位运算 。
4.1.1 定义
由于在位运算的范畴中,每一位的运算结果均不会干扰其他位的运算结果,因此,我们可以认为位运算在每一位上是相互独立的,这与向量的线性运算性质类似。为了便于研究,我们可以将任意一个自然数
写成 维二进制向量的形式: 称上式为自然数
的二进制向量表示 ,其中 为 的第 位二进制数。如果一个数 在二进制表示下的位数 实际上不满 位,我们就将 全部看作为 ,并称这所有
组成的整体为前导零 。我们以后研究一个数的某一位的性质问题时,都将把自然数写成二进制向量的形式,并把
称作 的第 个分量。
我们将五种基本位运算定义为:
很容易看出,这几类位运算均关于自然数集
闭合。然而在这里,我们很想知道,在第二章中我们反复研究了
上定义的各种逻辑运算的性质,这些性质能不能直接推广到自然数集合 的位运算呢?
4.1.2 逻辑运算性质的推广
一般地,如果二元运算 在集合
上满足某一代数性质 成立,设自然数
的二进制向量表示为: 其中 我们定义关于自然数集 闭合的位运算 为: 那么位运算 在自然数集
上必满足性质 成立,其中
均为任意自然数。
证 :设 为任意自然数,其中任意 的第 个分量记为 , 。
根据按位运算
的定义,对于由该运算构成的 ,其第
个分量 的值完全由各输入向量在第
位的分量决定。由于各分量之间的运算是相互独立的,我们可以将 的任意一个分量写成: 同理,对于性质
等号右侧的 ,其第 个分量
满足: 由式 可知,下列等式在每一个分量上均成立:
这意味着向量 与向量 在所有的
个对应分量上均完全相等。换句话说,对于自然数 ,其每一位二进制数均完全相等,因此这两个自然数必然相等。即:
得证 。同理,可以证明定义在
上的任意一个 元运算的形如上述性质
的某个代数性质在位运算中也是成立的。
根据上述结论,我们可以将任何一个定义在
上的二元运算中的任意一个形如式 的代数性质推广至相应的位运算,如按位或同样遵循交换律和结合律。但需要注意的是,如果一个运算性质不能写成形如式 的形式,它不一定可以 推广到自然数集的形如式 的运算性质。如对于逻辑与运算存在性质
对于任意的
均成立,将逻辑与运算推广至自然数集的按位与运算之后,可以观察到,若取
,虽然满足了
,但 ,因此不能将性质 也推广至自然数集下的按位与运算。
4.2 减法
在上一章中,我们重点研究了加法器的性质及其进位传播规律,从而建立了加法运算。由于对于任意的自然数
,我们总是可以将 写成
的形式,因此,我们可以认为,加法和减法实际上是同一种运算。然而,在这里,我们注意到,在纯粹的
运算体系中,我们无法直接表达整数的正负性。因此,我们必须引入一种表示负数的方式。
4.2.1 算术运算的扩张
在前面研究算术运算(包括位运算)的时候,我们均默认了一个前提条件:参与运算的两个数
均为一般的自然数。那么,我们能否得到负数的定义,从而将算术运算推广到全体整数呢?
一般地,对于一个整数 ,我们知道,其符号可能取两种情况:当
时取正号,当 时取负号,当 时,由于
的足够特殊的性质,我们可以任意地取它的符号。但是这里有一个问题,在二进制的存储机制中,并不存在一个天然独立于数值结构之外的符号标记,因此,我们需要定义一个二进制位用于表征一个任意整数的符号。我们规定一个自然数
的第 位
为一个任意整数的符号位 ,当取
时,该数为正数;反之则为负数。并规定一个 位有符号整数的绝对值为去掉第
位后部分的自然数。一般地,对于任意的整数 来说,其可以表示为: 该整数的符号取决于
的取值。因此我们可以发现,虽然一个同样的
位二进制有序序列可以表示的数字数量是一样的,但其绝对值大小并不一样。若将
看作一个自然数,它的取值为 ,而若看作一个一般的整数,其取值为
。因此,在后续的讨论中,我们有必要将是否带有符号这种情况区分开,并称前者为无符号整数 ,后者为有符号整数 。但需要注意,简单的“符号-绝对值”表示法(原码)会导致加减法逻辑复杂化。为了利用加法器直接实现减法,我们需要引入“补码”这一模运算工具。
4.2.2 补码
在前面我们不难发现,要计算 ,关键问题在于如何表示 。一般地,我们设任意自然数 的二进制向量表示分别为: 由于我们只关心
的大小,并且 和 的最大位数 是一个有限整数,所以我们可以将 位二进制数减法看作是模 前提下的减法。因此,我们有: 而对于任意一个自然数 ,总是有 ,因此,我们便将模 减法转换为了加法,并找到了 在模 前提下的等效表示: 为了搞清楚 与
在各个位上有什么关系,我们可以对上式进行变形: 注意到 也是一个
位二进制数,且如果我们将其直接减去 ,由于这个数的每一位都是二进制中最大的
,因此在这个减法过程中不存在借位现象,直接按位相减即可。同时我们观察到,如果
的一个分量 ,那么 的第 个分量必然为 ,反之则为 ,这与对 直接取反的结果是完全一致的。即:
我们也将 称作是
的反码 。将上式代入式 ,得: 将上式称为 位二进制数
的补码 。将上式代入减法的表达式,得: 此即自然数减法在二进制形式下的表达式 。
4.2.3 位宽
然而这里有一个小却关键的问题:我们注意到,对于 位二进制数 和 ,无论是 还是
实际上都很有可能是一个
位二进制数,虽然我们通过取模
消去了第
位,我们也不得不回答一个问题:第 位的那个数到底有什么意义?
为了研究第
位分量的具体意义,我们暂时不对最终结果取模 。设 ,其中 为取模之前的第
位分量。我们注意到,由于最终运算结果实际上是和
的大小无关的,或者换句话说,我们并没有规定 和
到底谁大谁小,因此这里作减法之后的结果可能不是一个自然数,而是一个负数。
现在我们讨论当
时的情况。在这种情况之下,
必然为一负数。因此,必然有: 由于 是严格小于
的,而 是最小的那个 位二进制数,所以在取模之前的 的实际位数必然不足 位,即 。同理,我们也可以证明,当 时,必然有 。因此,在底层的减法运算中, 实际上充当了一种借位标志: 意味着发生了借位,即 ;而 意味着没有发生借位,即 。
在刚刚讨论减法的过程中,我们不难发现,要得到一个自然数的补码,我们首先需要确定这个数在二进制表示下的位数
,然后在模
条件下建立其补码的表达式,在这个过程中,其补码的形式是与 强相关的,而
的具体取值仍然取决于运算时的实际情况。为了便于我们的计算与讨论,我们在我们的
ALU 中将这个
锁死为我们指定的一个足够特殊、完美的常数,并规定参与除纯粹位运算之外的一切运算的自然数的位数均为
。我们称这里的 为 ALU
代数结构的位宽 。我们又知道,一般来说,对于两个 位二进制数 的相加,其所得结果 可能是一个 位的二进制数。但是,在位宽 的条件下, 的第 个分量 会被直接抛弃。我们称 为位宽
下的溢出位 。这样的结果与在模
意义下得到的结果是一致的。因此,在位宽
的条件下,我们可以将所有整数运算理解为在模 意义下进行。换句话说,若 为两个任意自然数,则 ALU
中实际执行的运算并不是普通整数意义下的 而是 同理,对于减法运算,也有
由此可见,无论是针对运算来说还是针对单一整数的表示来说,这些过程都是在模
意义下进行的。我们定义: 其中 表示整数 在模 意义下的剩余类。
在这个集合上定义加法与乘法:
可以看出,这个集合在上述运算下自然地构成一个剩余类环 。由于位宽 下的二进制数恰好可以表示从 到 的所有整数: 因此,每一个
位二进制数都可以唯一对应于一个剩余类: 综上所述,在位宽
的约束下,所有
位二进制数并不再被视为通常意义下的整数,而是被统一解释为模
意义下的剩余类。此时,加法与减法运算也不再是 上的运算,而是
上的运算。在这一结构下,溢出对应于模运算中的“取代表元”,补码对应于加法逆元的构造。而符号的正负性则来源于对剩余类代表元区间的不同选取。因此,从本质上看,一个固定
位宽的
ALU,并不是在处理“整数”,而是在实现一个有限环
上的运算系统。