前言
在日常的软件开发中,我们很少需要真正关心计算机的底层是如何工作的。编译器、操作系统以及各种高级抽象层为我们开发者提供了一个相对稳定而统一的接口,使得人们能够专注于算法与应用逻辑。然而,在这些抽象层之下,计算机本质上只是由大量简单电子元件构成的系统:电信号在导线中传播、逻辑门对信号进行运算、寄存器保存状态,而处理器按照既定规则执行指令。我们能否尝试回答一个看似简单但实际上非常深刻的问题:如果从最基础的逻辑电路开始,我们能否一步一步构建出一个完整的 CPU?为了回答这个问题,我们将暂时抛开操作系统、编译器以及复杂的体系结构,从最基本的数学与逻辑出发,逐步搭建计算机的核心组件。
首先,我们需要理解数字电路的数学基础。计算机内部所有的数据最终都以二进制形式表示,因此逻辑运算可以通过布尔代数或有限域
随后,我们将逐步构建更复杂的算术电路。例如,从半加器与全加器开始,构建多位加法器,并进一步实现算术逻辑单元(ALU)。ALU 是处理器中最核心的计算模块,它负责执行加法、减法以及各种逻辑运算。
在完成算术电路之后,我们将引入“状态”这一概念:通过锁存器和触发器,可以构建寄存器与计数器,从而使电路能够在不同的时钟周期之间保存数据。这一步是从纯组合电路迈向完整计算系统的关键。
最终,通过将寄存器、ALU、控制逻辑以及指令译码电路组合在一起,我们将得到一个能够执行指令序列的处理器。虽然这个处理器在功能上可能非常简单,但它已经包含了现代 CPU 的基本结构:数据通路、控制单元以及指令执行机制。
本系列文章的目标并不是构建一个高性能处理器,而是通过从零开始构建CPU的过程,理解计算机体系结构最核心的思想。通过这种自底向上的方式,可以清晰地看到从数学、逻辑电路到处理器结构之间的联系。当我们真正理解这些基础之后,再回过头来看现代处理器中的复杂机制,例如流水线、乱序执行或缓存系统,就会发现这些复杂结构其实都是建立在同样简单的逻辑基础之上。
希望本系列文章能够帮助读者以一种更加本质的视角理解计算机: 计算机并不是一个神秘的黑盒,而是由大量简单规则逐步构建而成的系统。
第一部分 算术逻辑单元
在现代计算机系统中,大部分数据处理操作都依赖于算术与逻辑运算。处理器在执行程序时,需要对二进制数据进行加法、减法等以及各种逻辑运算,这些运算均由算术逻辑单元(Arithmetic Logic Unit,简称 ALU)完成。因此,ALU 构成了处理器数据通路中的核心计算模块,其结构与实现方式直接决定了系统的运算能力。
从抽象层次上看,ALU
可以被视为一个将输入数据映射为输出结果的函数。设两个
尽管 ALU 的功能看起来较为复杂,但从电路实现的角度来看,这些运算都可以通过基本逻辑门电路构造。逻辑门构成最基本的电路单元,而复杂的算术运算则是通过对这些基本单元进行组合而实现的。因此,理解 ALU 的实现过程,需要从最基本的逻辑运算开始.
在数学上,二进制逻辑运算可以通过布尔代数进行描述。布尔代数提供了一套形式化的代数结构,用于刻画逻辑变量之间的运算关系。在二值逻辑系统中,每一个变量只能取两个可能的值,即
在掌握布尔代数的基础上,可以进一步研究逻辑门电路的实现方式。逻辑门是数字电路中最基本的硬件单元,例如与门、或门、非门和异或门等。通过组合这些基本逻辑门,可以实现任意布尔函数,从而构造复杂的组合逻辑电路.
众所周知,现代计算机的 ALU整体是建立在逻辑电路理论的基础上的,因此,要搞清楚计算机的运算原理,就必须搞清楚逻辑电路原理。我们将从基本逻辑运算与抽象代数结构的角度出发,论证 ALU 的运算原理,并在必要位置给出严谨的数学证明。
第一章 基本逻辑门
在数字电路中,逻辑门是实现布尔运算的基本电路单元。每一个逻辑门都接收若干输入信号,并根据特定的逻辑规则产生输出信号。从抽象角度来看,逻辑门可以被视为一个函数,其输入与输出均取值于二值集合
设一个逻辑门具有
在组合逻辑电路中,输出仅由当前输入决定;而在更复杂的时序电路中,输出还可能依赖于电路的历史状态。为了描述逻辑门在不同输入情况下的行为,通常使用真值表。真值表列出了所有可能输入组合及其对应的输出结果。例如,对于一个具有两个输入的逻辑门,其输入共有
在本章中,我们将首先介绍几种最常见的基本逻辑门,包括与门、或门、非门以及异或门,并分析它们的逻辑性质。随后将讨论逻辑门之间的代数关系,以及如何通过组合这些基本门电路实现更复杂的逻辑函数。
1.1 非门(NOT Gate)
1.1.1 定义
非门又称反相器,是最简单的逻辑门,仅具有一个输入端口和一个输出端口,其核心功能是实现逻辑非运算,即对输入信号进行反相:
- 输入为 (0) 时输出为 (1)
- 输入为 (1) 时输出为 (0)
在逻辑上,这等价于对命题取否定。
1.1.2 真值表
| 输入 (A) | 输出 (Y) |
|---|---|
| 0 | 1 |
| 1 | 0 |
其中
1.1.3 运算表达式
也可表示为
1.1.4 实现
非门可通过晶体管(二极管、MOS管)实现,核心原理是利用晶体管的导通与截止状态对应逻辑0和1:当输入为高电平(1)时,晶体管导通,输出低电平(0);当输入为低电平(0)时,晶体管截止,输出高电平(1)。实际应用中,常用CMOS反相器,具有功耗低、抗干扰能力强的特点。下图是一种使用MOS管的非门:
1.2 与门(AND Gate)
1.2.1 定义
与门具有两个及以上输入端口和一个输出端口,核心功能是实现“逻辑与”运算,仅当所有输入信号均为1(真)时,输出才为1(真);只要有一个输入为0(假),输出即为0(假),遵循“同时为真才为真”的逻辑。
1.2.2 真值表
| (A) | (B) | (Y) |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
对应表达式:
1.2.3 运算表达式
也可写为
1.2.4 实现
与门可通过二极管串联实现:两个二极管的阳极连接在一起作为输出端,阴极分别作为输入端口,电源通过电阻连接到输出端。当所有输入均为高电平(1)时,二极管均截止,输出高电平(1);只要有一个输入为低电平(0),对应二极管导通,输出被拉低为低电平(0)。如下图:
实际应用中,常用CMOS与门,然而它不是由单级电路构成的。它实际上是将一个与非门和一个非门级联而成的。如下图:
1.3 或门(OR Gate)
1.3.1 定义
或门具有两个及以上输入端口和一个输出端口,核心功能是实现“逻辑或”运算,只要有一个输入信号为1(真),输出即为1(真);仅当所有输入均为0(假)时,输出才为0(假),遵循“有一个为真即为真”的逻辑。
1.3.2 真值表
| (A) | (B) | (Y) |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
1.3.3 运算表达式
1.3.4 实现
或门可通过二极管并联实现:两个二极管的阴极连接在一起作为输出端,阳极分别作为输入端口,电源通过电阻连接到输出端。当有一个输入为高电平(1)时,对应二极管导通,输出高电平(1);当所有输入均为低电平(0)时,二极管均截止,输出低电平(0)。如下图:
实际应用中,常用CMOS或门,由一个或非门加一个非门组成,与CMOS与门结构对称。如下图:
1.4 异或门(XOR Gate)
1.4.1 定义
异或门(Exclusive OR)具有两个及以上输入端口和一个输出端口,核心功能是实现“逻辑异或”运算,当输入信号“不同”时(一个为0,一个为1),输出为1(真);当输入信号“相同”时(均为0或均为1),输出为0(假)。异或运算在数电中应用极广。
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)是异或门的反相,具有两个及以上输入端口和一个输出端口,核心功能是实现“逻辑同或”运算,当输入信号“相同”时(均为0或均为1),输出为1(真);当输入信号“不同”时(一个为0,一个为1),输出为0(假),与异或运算互为非运算。
1.5.2 真值表
| (A) | (B) | (Y) |
|---|---|---|
| 0 | 0 | 1 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
1.5.3 运算表达式
其与异或关系为
第二章 逻辑运算的代数结构
逻辑变量取值集合为
加法
乘法
逻辑运算可通过如下映射关系,与有限域
由此可见,逻辑非运算对应有限域中“1加变量”的运算,逻辑异或运算对应有限域中的加法运算,逻辑与运算对应有限域中的乘法运算。而逻辑或运算无法直接对应有限域的基本运算,需通过上述映射关系推导得出,其多项式表示为
2.1 非运算性质
由逻辑非运算与有限域
双重否定律
双重否定律表明,对逻辑变量A进行两次非运算,结果仍为A本身,其表达式为
互补律
互补律反映了逻辑变量与其非运算结果之间的核心关系,即一个逻辑变量与其非变量的“或运算”结果恒为1(逻辑真),“与运算”结果恒为0(逻辑假),表达式为
证:结合非运算的代数表达式
- 证明
:
由逻辑或的布尔环多项式表示
- 证明
:
由逻辑与的映射关系
2.2 与运算性质
逻辑与运算对应有限域
交换律
与运算的交换律表明,两个逻辑变量进行与运算时,交换变量顺序,结果不变,表达式为
在有限域
结合律
与运算的结合律表明,三个及以上逻辑变量进行与运算时,改变运算顺序(添加括号),结果不变,表达式为
证:根据映射关系,
在有限域
幂等律
与运算的幂等律表明,一个逻辑变量与自身进行与运算,结果仍为该变量本身,表达式为
在有限域
单位元
与运算的单位元为1,即一个逻辑变量与1进行与运算,结果仍为该变量本身,表达式为
在有限域
零元
与运算的零元为0,即一个逻辑变量与0进行与运算,结果恒为0,表达式为
在有限域
吸收律
与运算的吸收律表明,一个逻辑变量与该变量和另一个变量的或运算结果进行与运算,结果仍为该变量本身,表达式为
得证。
2.3 或运算性质
逻辑或运算无直接对应的有限域基本运算,需借助其布尔环多项式表示
交换律
或运算的交换律表明,两个逻辑变量进行或运算时,交换变量顺序,结果不变,表达式为
在有限域
分配律
与运算对或运算的分配律表明,一个逻辑变量与另外两个变量的或运算结果进行与运算,等价于该变量分别与两个变量进行与运算后,再进行或运算,表达式为
- 化简左边
:
代入或运算多项式表示,结合与运算映射关系,得:
- 化简右边
:
先计算
2.4 德摩根定律
德摩根定律揭示了非运算与与、或运算之间的反向关系,可将与运算的非运算转化为非运算的或运算,或将或运算的非运算转化为非运算的与运算,表达式为
证:此处以第一个等式
- 化简左边
:
由与运算映射关系
- 化简右边
:
先由非运算表达式得出
同理,可证明
2.5 异或运算性质
由前文映射关系可知,逻辑异或运算直接对应有限域
交换律
异或运算的交换律表明,两个逻辑变量进行异或运算时,交换变量顺序,结果不变,表达式为
在有限域
结合律
异或运算的结合律表明,三个及以上逻辑变量进行异或运算时,改变运算顺序(添加括号),结果不变,表达式为
在有限域
单位元
异或运算的单位元为0,即一个逻辑变量与0进行异或运算,结果仍为该变量本身,表达式为
在有限域
逆元
异或运算中,每个逻辑变量的逆元为其自身,即一个逻辑变量与自身进行异或运算,结果为加法单位元0,表达式为
在有限域
反转性质
异或运算的反转性质表明,一个逻辑变量与1进行异或运算,结果等价于该变量的非运算,表达式为
由非运算的代数表达式
奇偶校验性质
多个逻辑变量的异或运算结果,等价于所有变量取值之和对2取模,其核心作用是实现奇偶校验,即
证:采用数学归纳法证明,结合异或运算与有限域加法的等价性(
当
时, , ,等式成立;假设当
( )时,等式成立,即: 当 时,有: 由归纳假设和映射关系: 因此,当 时,等式仍成立。
综上,对任意正整数
2.6 同或运算性质
同或运算定义为异或运算的非运算,即
交换律
同或运算的交换律表明,两个逻辑变量进行同或运算时,交换变量顺序,结果不变,表达式为
在有限域
结合律
同或运算满足结合律。即:
证:
左边:
将括号内的
利用异或与取反的性质:
因此:
右边:
将括号内的
利用异或与取反的性质:
于是:
得证。
自反性质
同或运算的自反性质表明,一个逻辑变量与自身进行同或运算,结果恒为1。
第三章 加法器
在现代计算机体系结构中,加法运算是最基本的算术运算之一。几乎所有复杂算术操作,例如减法、乘法、除法以及地址计算等,都可以归结为若干次加法运算的组合。例如,减法可以通过补码表示转化为加法;乘法通常通过移位与加法的组合实现;除法可以通过迭代减法或恢复算法实现;而在处理器执行内存访问时,地址的计算通常表现为基址与偏移量之间的加法运算。因此,在计算机硬件层面,实现高效可靠的加法运算是算术逻辑单元设计的核心问题之一。
在数字电路中,所有数据均以二进制形式表示。第二章已经讲过,二进制数的每一位仅可能取值
3.1 半加器
半加器是实现两个一位二进制数相加的最基本逻辑电路。设两个输入变量
因此,一位加法可以表示为一个映射:
在十进制系统中,
为了得到
3.1.1 本位和
根据二进制加法规则可以得到本位和
第二章已经证明,异或运算在代数上等价于有限域
在数字电路实现中,这一公式表明,本位和的计算仅需要一个异或门即可完成。
3.1.2 进位
接下来分析进位
根据二进制加法规则,仅当两个输入变量同时为 1 时才会产生进位。例如:
这一条件与逻辑与运算的定义完全一致。第二章已经给出逻辑与运算与有限域乘法之间的对应关系:
因此进位可以表示为:
综合以上分析可以得到,半加器的逻辑结构完全由两个基本逻辑运算决定,因此半加器电路只需要两个基本逻辑门:一个异或门用于计算本位和,一个与门用于计算进位。因此,我们可以得到半加器的逻辑电路图:
简记为:
需要注意的是,半加器只能处理两个输入变量的加法运算,而在实际的多位加法中,每一位运算还可能接收到来自低位的进位信号。因此在实际处理器中,需要使用更一般的加法单元——全加器。
3.2 全加器
在多位二进制加法运算中,每一位的计算不仅依赖当前位的两个输入,还依赖来自低位的进位信号。因此,在第
该运算单元产生两个输出,其中
3.2.1 全加器的进位
我们现在先不关心全加器和半加器的具体联系,暂且将其看作是半加器的多输入推广。要将半加器推广到三个输入,其核心问题是推导进位信号在各个位之间传播的数学表达式。在现代处理器设计中,全加器不仅用于构建最简单的串行进位加法器,还为更高速的结构,例如超前进位加法器,提供理论基础。因此,对全加器进位关系的严格数学推导具有重要意义。
易知,产生进位存在两种情况。第一种情况是当前位的两个输入变量直接产生进位,此时有:
因此进位的逻辑表达式为:
我们从式
下面我们从数学归纳法出发,给出式
证:
设两个
当
假设当
3.2.2 串行进位加法器(Ripple Carry Adder)
我们已经得到了全加器的基本进位关系:
设两个
因此,在最坏情况下,最低位产生的进位需要依次经过所有中间位,最终才能到达最高位。这种逐级传播的过程正是“串行进位”名称的来源。
在电路实现中,一个
然而,这种结构的主要缺点在于进位传播延迟较大。设单个全加器的进位延迟为
3.3 超前进位加法器(Carry Lookahead Adder)
在上一节中已经讨论了串行进位加法器的结构。该结构通过逐级传播进位来完成多位加法运算,其实现方式简单,但由于进位必须从最低位依次传播到最高位,因此电路延迟会随着位数的增加而线性增长。当操作数的位宽较大时,这种进位传播延迟会成为限制运算速度的重要因素。
为了减少这种由逐级传播带来的延迟,可以利用全加器进位公式的代数结构,对进位关系进行展开,使得高位进位能够直接由输入变量计算得到,而不必等待低位进位逐级传递。这种通过并行计算进位信号来提高运算速度的思想,构成了超前进位加法器(Carry Lookahead Adder,简称 CLA)的基本原理。
根据全加器的进位关系式
为了便于分析这种关系,引入两个辅助信号。首先定义生成信号
其次定义传播信号
利用上述两个定义,可以将全加器的进位关系写为:
通过不断展开式
由此可以得到一般形式。对于第
在得到所有进位信号之后,各位的加法结果仍然可以通过全加器公式计算:
需要指出的是,当位数
3.4 分组超前进位加法器 (Block Carry-Lookahead Adder)
在上一节中已经讨论了 CLA 的基本原理。通过引入生成信号与传播信号:
可以将全加器的进位关系化简为迭代的代数形式:
因此,在实际电路设计中,通常采用分组超前进位(Block
Lookahead)结构来降低单级电路的复杂度。设一个加法器被划分为若干个
组生成信号定义为:
该信号表示:在没有任何外部输入进位(即
组传播信号定义为:
该信号表示:若外部输入进位为
由此,我们可以得到模块级的进位输出关系:
3.5 加法器的层次化结构
当加法器位宽
设一个
通过这种树状的层次划分,我们可以在不同的代数抽象层上分别进行计算,从而将极长的进位传播路径切分为短路径的并行计算。
3.6 加法器延迟分析与代数结合律证明
在数字电路中,加法器的性能通常通过其传播延迟来衡量。不同结构的加法器在进位传播方式上的代数差异,直接决定了其算法复杂度。
串行进位加法器(RCA):线性时延 在 RCA
中,每一位的进位都严格依赖于前一位的计算结果,代数计算必须串行执行。若单个全加器产生进位的延迟为
正是由于结合律的保障,我们计算