计算机组成 Computer Organization¶
第一讲 计算机基本结构(Basic Components of a Computer)¶
电子计算机的兴起¶
ENIAC:世界上第一台通用电子计算机
时间:1946 年 2 月 14 日
地点:美国宾夕法尼亚大学
主要特征:
组成:18000 个电子管
性能:每秒 5000 次加法
功率:150 千瓦
占地:170 平方米
重量:30 吨
成本:50 万美元
EDVAC:全称为”离散变量自动电子计算机“
存储程序式计算机(冯·诺依曼结构计算机):
主要特点:
- 实现”存储程序“概念,大幅提升了任务效率
- 指令和数据采用二进制,极大简化了逻辑线路
- 由五个基本部分组成:运算器、控制器、存储器、输入设备、输出设备
EDSAC:第一台使用的存储程序式计算机
- 1949 年 5 月 6 日正式运行
- 英国剑桥大学数学实验室研制
- 主设计师:莫里斯·威尔克斯
- 以 EDVAC 为蓝本设计和建造
- 五个组成部分
- 运算器和控制器:电子管
- 存储器:水银延迟线
- 输入设备:从穿孔纸带输入
- 输出设备:电传打印机
UNIVAC:开启了商用计算机的时代
冯·诺依曼结构的要点¶
冯·诺依曼计算机结构:《关于 EDVAC 的报告草案》
- 重要设计思想:存储程序、二进制
- 数据和程序均以二进制代码形式不加区别地存放在存储器中,存放位置由存储器的地址决定
- 计算机在工作时能够自动地从存储器中取出指令加以执行
Intel 4004:世界上第一个商业微处理器
- 1971年诞生
- 面积:4.2mm × 3.2mm
- 制造工艺:10 微米
- 晶体管数量:2250
- 主频:最高 740 KHz
- 字长:4 位
基于 4004 的计算器 Busicom 141—PF(1971年):Intel 4004 的最初产品
- 4001:只读存储器 ROM
- 4002:随机存储器 RAM
- 4003:移位寄存器 I/O
- 4004:微处理器 CPU
- 构成了一个完整的芯片组名为 MCS-4
计算机的五大组成部分:
- 运算器 CA(Central Arithmetical):对应现在计算机中的 CPU
- 控制器 CC(Central Control):对应现在计算机中的 CPU
- 存储器 M(Memory):对应现在计算机中的主存储器(又称主存或内存)
- 输入设备 I(Input)
-
输出设备 O(Output)
-
外部记录介质 R:Outside Recording Medium
冯·诺依曼结构的核心:

主存的组织形式:
- 地址:每个存储单元对应的序号
- 内容:存储单元中存放的信息
- 现在的计算机当中,一般一个存储单元就是一个字节,也就是 8 个二进制位
计算机结构的简化模型(模型机)¶

CPU和主存储器一般通过系统总线进行连接
系统总线:
- 控制总线:与存储器当中的控制总机相连,用于接收读、写信号或者反馈完成等控制信号
- 地址总线:如果地址总线宽度为 n ,则 CPU 能管理的存储单元最多为 2ⁿ 个
- 数据总线:数据总线宽度一般为存储单元位宽的整数倍
模型机的存储器:
- 存储单元的位宽由设计计算机时对存储器的编址方式确定。如果存储器按字节编址,则每个存储单元存放 8 位二进制数。
- 存储单元的地址是唯一的,不同存储单元地址互不相同
- MAR(Memory Address Register):用于存放 CPU 正在读或写的存储单元的地址
- MDR(Memory Data Register):用于存放 CPU 正在读出或者即将写入存储单元的数据
模型机的CPU:
控制器:用于控制计算机各部件完成取指令、分析指令和执行指令等功能,主要组成部分如下:
- 指令寄存器 IR(Instruction Register):存放”正在执行或即将执行的指令“
- 程序读数器 PC(Program Counter):存放”下一条指令的存储单元地址“,具有自动增量计数的功能
- 存储器地址寄存器 MAR(Memory Address Register):在访存时用于存放”存储单元的的地址“
- 存储器数据寄存器 MDR(Memory Data Register):在访存时用于存放”对存储单元读/写的数据“
- 指令译码部件:对 IR 中的指令进行译码,以确定 IR 中存放的是哪一条指令
- 控制电路:产生控制信号,在时序脉冲的同步下控制各个部件的动作
运算器:用于算术运算和逻辑运算
常见的算数运算:加、减、乘、除等
常见的逻辑运算:非、与、或等
基本组成:
ALU:用于完成算数运算和逻辑运算

通用寄存器:R0~Rn-1 是 n 个通用寄存器,用于临时存放数据。数据可能来自存储器,也可能来自其他通用寄存器或 ALU 的输出
内部总线:用于在 CPU 内部各个部件之间传递数据
计算机执行指令的过程¶
执行指令:计算机运转的核心内容
计算机执行一条指令的主要步骤:
- 取指 Fetch
- 译码 Decode
- 执行 Execute
- 回写 Write-back
执行指令的示例:
指令格式:ADD R0 , [6]
指令功能:通用寄存器 R0 的内容 + 地址为 6 的存储单元的内容 = 运算结果
默认第一个操作数既是源操作数又是目的操作数
计算机输入和输出¶
第一台微型计算机:Altair 8800(牛郎星 8800)
在现在的个人计算机当中,大多数的输入输出设备的控制芯片都会集中在主板的南桥芯片中。部分性能要求高或者用途特殊的输入输出接口采用独立芯片或板卡的形式。
冯·诺依曼结构和具体实现¶
BIOS 芯片:保存了 BIOS 软件的只读存储器
BIOS(Basic Input/Output System):基本输入输出系统
南北桥架构的演变¶
原来的北桥:提供各个芯片之间相互访问的通道
- 主存控制器:连接主存,主存通道的性能成为了计算机性能的关键瓶颈
- PCIe 控制器:连接 PCIe 显卡
- 集成显卡
现在,北桥的主存控制器移到了 CPU 芯片中,CPU 直接访问主存。PCIe 控制器和集成显卡也移到了 CPU 中,北桥的剩余一些功能和南桥芯片整合到一起,所谓的南北桥架构已经消失了。
系统芯片 SoC(System-on-a-Chip):将计算机或其他电子系统集成为单一芯片的集成电路,在智能手机、平板电脑等移动计算设备上得到广泛应用。
摩尔定律的原型:1965年,摩尔在《电子学》杂志上预测:在最低元件价格下,集成电路的复杂度每年大约增加一倍,这一增长率至少可以维持十年。1975年,摩尔调整了预测为”每两年增加一倍“。
第二讲 指令系统体系结构(Instruction Set Architecture)¶
设计自己的计算机¶
一个简单的计算机指令系统¶
- ADD R,M(运算类指令):将 R 的内容与 M 中的内容相加后存入 R
- LOAD R,M(传送类指令):将 M 中的内容装入 R
- STORE M,R(传送类指令):将 R 的内容存入 M 中
- JMP L(转移类指令):无条件转向 L 处
- 注:M 和 L 为存储器地址,R 为寄存器编号
指令的格式:

- 每条指令等长,均为 2 个字节
- 第一个字节的高 4 位是操作码
- LOAD:0000
- ADD:0001
- STORE:0010
- JMP:0011
- 目前只提供 4 条指令,最多可扩展到 16 条
- 第一个字节的低 4 位是寄存器号
- R0~R3:0000~0011
- 目前只提供 4 个寄存器,最多可扩展到 16 个
- 第二个字节是存储单元地址
x86 体系结构¶
x86 体系结构:是商业上最为成功,影响力最大的一种体系结构。

注:Intel 提出的 IA-64 是独立于 x86 的一种新的体系结构,不兼容 IA-32
Intel 8086(1978年)¶
主要特点:
- 内部的通用寄存器为 16 位,既能处理 16 位数据,也能处理 8 位数据
- 对外有 16 跟数据线和 20 根地址线,可寻址的内存空间为 1MByte(2^20)
- 物理地址的形成采用”段加偏移“的方式
8086 的寄存器模型:

数据寄存器:共有 4 个
- 均为 16 位寄存器
- 每个 16 位寄存器都可分为两个 8 位寄存器使用
- 适用于大多数算数运算和逻辑运算指令
- 除存放通用数据外,各有一些专门的用途:

标志寄存器:
- 标志位:

- FLAGS 寄存器中包含若干标志位
- 标志位分为两大类:
- 状态标志:反映 CPU 的工作状态(例:执行加法运算时是否产生进位、运算结果是否为零)
- 控制标志:对 CPU 的运行起特定控制作用(例:以单步方式还是连续方式运行、是否允许相应外部中断请求)
- 指令指针寄存器 IP(Instruction Pointer)
- 保存一个内存地址,指向当前需要取出的指令
- 当 CPU 从内存中取出一个指令后,IP 会自动增加,指向下一个指令的地址(实际情况会复杂得多)
- 程序员不能直接对 IP 进行存取操作
- 转移指令、过程调用/返回指令等会改变 IP 的内容
- IP 寄存器的寻址能力:2^16=65536(64K)字节单元
- 段寄存器(Segment Register)
- 与其他寄存器联合生成存储器地址:
- CS(Code Segment):代码段寄存器
- DS(Data Segment):数据段寄存器
- ES(Extra Segment):附加段寄存器
- SS(Stack Segment):堆栈段寄存器
- 8086 对外有 20 位地址线,寻址范围:2^20=1M 字节单元
- 8086 的物理地址生成:

Intel 80386(1985 年)¶
主要特点:
- 主频 12.5~33MHz
- 27.5 万个晶体管
- 80x86 系列中的第一款 32 位微处理器
- 支持 32 位的算数和逻辑运算,提供 32 位的通用寄存器
- 地址总线扩展到 32 位,可寻址 4GB 的内存空间
- 改进了”保护模式“(例:段范围可达 4GB)
- 增加了“虚拟 8086 模式”,可以同时模拟多个 8086 微处理器
IA-32 的寄存器模型¶

x86-64 的寄存器模型¶

x86指令简介¶
指令的主要类别:
- 运算类指令:(例:加、减、乘、除、与、或、非等)
-
逻辑运算和移位指令:
作用:实现对二进制位的操作和控制,又称“位操作指令”
操作数的限制:
- 对于单操作数指令,操作数不能是立即数
- 对于双操作数指令,限制与 MOV 指令相同

-
算数运算指令:
作用:
- 完成加、减、乘、除等算术运算
- 提供运算结果调整、符号扩展等功能
操作数的限制:
- 目的操作数不能是立即数或 CS 寄存器
- 两个操作数不能同时为存储器操作数

- 传送类指令:把数据或地址传送到寄存器或存储器单元中(例:从存储器到通用寄存器、从通用寄存器到 I/O 接口等)

- MOV 指令
- 格式:MOV DST,SRC(DST 表示目的操作时,SRC 表示源操作数)
- 操作:DST ← SRC
- MOV 指令把一个操作数从源传送至目的,源操作数保持不变
转移类指令:改变指令执行顺序(例:无条件转移、条件转移、过程调用等)
- 根据是否有判断条件,分为无条件转移指令和条件转移指令两大类
- 根据转移目标地址的提供方式,可分为直接转移和间接转移两种方式


- 控制类指令:控制 CPU 的功能。对标志位进行操作(例:暂停处理器、清楚标志位等)

复杂的x86指令举例¶
串操作指令¶
作用:
- 对存储器中的数据串进行每次一个元素的操作
- 串的基本单位是字节或字(即“一个元素”)
- 串长度可达 64KB
分类:
- 共有 5 条串操作指令
- 另有 3 中重复前缀,与串操作指令配合使用

- 例如:
- MOVSB 指令(字节串传送)
- 格式:MOVSB
- 操作:在存储器中将指定位置的一个字节单元传送到另一个指定的位置
- REP 前缀(无条件重复)
- 格式:REP 串操作指令
- 操作:当 CX≠0 时,重复执行串操作指令
特性:
- 隐含操作数:
- 源串地址为 DS:SI,目的串地址为 ES:DI
- 串的长度在 CX 寄存器中
- 处理完一个串元素后的操作(硬件自动完成)
- 修改 SI 和 DI,指向下一个串元素
- 若使用重复前缀,则 CX ← CX-1
串传送方向(标志寄存器中的 DF 标志位):
- 作用:应对”源串“和”目的串“的存储区域部分重叠的问题
- 设置 DF=0
- 从“源串”的低地址开始传送
- 传送过程中,SI 和 DI 自动增量修改
- 设置 DF=1
- 从“源串”的高地址开始传送
- 传送过程中,SI 和 DI 自动减量修改


”最长的指令“¶
LOCK ADD DWORD PTR ES:[EAX+ECX*8+11223344H],12345678H
指令编码(15 个字节):26 66 67 F0 81 84 C8 44 33 22 11 78 56 34 12

MIPS 体系结构¶
MIPS 的设计者和 RISC 的先驱:约翰·亨尼西(John Hennessy,1953)
RISC:Reduced Instruction Set Computing,精简指令系统计算机
CISC:Complex Instruction Set Computer,复杂指令系统计算机
MIPS¶
MIPS:Microprocessor without Interlocked Pipeline Stages
主要关注点:
主要特点:
- 固定的指令长度:32-bit,即 1 word
- 简化了从存储器取指令
- 简单的寻址模式
- 简化了从存储器取操作数
- 指令数量少,指令功能简单(一条指令只完成一个操作)
- 简化指令的执行过程
- 只有 Load 和 Store 指令可以访问存储器
- 例如,不支持 x86 指令的这种操作:ADD AX,[3000H]
- 需要优秀的编译器支持
MIPS 的通用寄存器:32 个,每个都是 32 位宽

MIPS 处理器广泛应用的领域:数字电视、机顶盒、蓝光播放器、游戏机、网络设备等
MIPS 指令的发展:

MIPS 指令简介¶
MIPS 指令的基本格式¶


R(Register):寄存器
- R 型指令格式包含 6 个域
- 2 个 6-bit 域,可表示 0~63 的数
- 4 个 5-bit 域,可表示 0~31 的数
- opcode 域:用于指定指令的类型。对于所有 R 型指令,该域的值均为 0
- funct:与 opcode 域组合,精确地指定指令的类型
- rs(Source Register) 域:通常用于指定第一个源操作数所在的寄存器编号
- rt(Target Register) 域:通常用于指定第二个源操作数所在的寄存器编号
- rd(Destination Register) 域:通常用于指定目的操作数(保存运算结果)的寄存器编号
- 5-bit 的域可表示 0~31,对应 32 个通用寄存器
- shamt(Shift Amount) 域:
- 用于指定移位指令进行移位操作的位数
- 5-bit 的域可表示 0~31,对于 32-bit 数,更多移位没有实际意义
- 对于非移位指令,该域设为 0
I(Immediate):立即数
- R 型指令只有一个 5-bit 域表示立即数,范围为 0~31
- 常用的立即数远大于这个范围,因此需要新的指令格式
- I 型指令的大部分域与 R 型指令相同
- opcode 域:用于指定指令的操作类型(但没有 funct 域)
- rs(Source Register) 域:指定第一个源操作数所在的寄存器编号
- rt(Target Register) 域:
- 指定用于目的操作数(保存运算结果)的寄存器编号
- 对于某些指令,指定第二个源操作数所在的寄存器编号
- immediate 域:
- 16-bit 的立即数,可以表示 2^16 个不同数值
- 对于访存指令(例:lw rt,imm(rs)),通常可以满足访存地址偏移量的需求(-32768~+32768)
- 对于运算指令(例:addi rt,rs,imm),无法满足全部需求,但大多数时候可以满足需求
J(Jump):无条件转义
分支指令的分类:
- Branch
- 分支:改变控制流
- Conditional Branch
- 条件分支:根据比较的结果改变控制流
- 两条指令:branch i_f_ equal(beq);branch if not equal(bne)
- Unconditional Branch
- 非条件分支:无条件地改变控制流
- 一条指令:jump(j)
条件分值指令的目标地址范围:
- 如何充分发挥 16-bit 的作用?
- 以当前 PC 为基准,16-bit 位移量可以表示 ±2^15bytes
- MIPS 的指令长度固定为 32-bit(word)
- 16-bit 位移量可以表示 ±2^15words = ±2^17bytes(±128KB)
- 目标地址计算方法:
- 分支条件不成立,PC = PC + 4 = next instruction
- 分支条件成立,PC = ( PC+4 ) + ( immediate*4 )
非条件分值指令(J 型):
- 在不需要条件判断的情况下,如何扩大目标地址范围
- 理想情况,直接使用 32-bit 地址
- 冲突:MIPS 的指令长度固定为 32-bit,opcode 占用了 6-bit
- 目标地址计算方法
- New PC = { ( PC+4 ) [ 31..28 ] , address , 00 }
非条件分支指令(R 型):
- J 型指令的目标地址范围:±2^28bytes(±256MB)
- 如何到达更远的目标地址
- 2 次调用 j 指令(简单但不方便)
- 使用 jr 指令:jr rs
第三讲 算术逻辑单元(Arithmetic Logic Unit)¶
算术运算和逻辑运算¶
算术运算¶
- 两个 32-bit 数的加法,结果为一个 32-bit 数
- 两个 32-bit 数的减法,结果为一个 32-bit 数
- 检查加减法的结果是否溢出
逻辑运算¶
- 两个 32-bit 数的“与”操作,结果为一个 32-bit 数
- 两个 32-bit 数的“或”操作,结果为一个 32-bit 数
- 两个 32-bit 数的“或非”操作,结果为一个 32-bit 数
门电路的基本原理¶
晶体管(Transistor)¶
现代集成电路中通常使用 MOS 晶体管
MOS(Metal-Oxide-Semiconductor):金属-氧化物-半导体
类型:
1.N 型 MOS 管(NMOS)
- 符号表示:
- Gate:门
- Source:源
- Drain:漏
- 导通条件:Gate 端连接高电平

2.P 型 MOS 管(PMOS)
- 符号表示:
- 导通条件:Gate 端连接低电平

CMOS 集成电路(Complementary MOS):由 PMOS 和 NMOS 共同构成的互补型 MOS 集成电路
非门(NOT Gate)¶
逻辑符号:

- A:输入
- Y:输出
真值表:

逻辑函数表示:

Y=~A,Y=!A
原理图:

与门(AND Gate)¶
逻辑符号:

逻辑函数表示:Y=A·B(其中的点是乘号的一种表示方式)
真值表:

原理图:
- 实际用”与非门“和”非门“实现与门


或门(OR Gate)¶
逻辑符号:

逻辑函数表示:Y=A+B
真值表:

异或门(Exclusive-OR Gate,XOR Gate)¶
逻辑符号:

异或运算:

- 两个值不相同,则异或结果为真。反之,为假。
逻辑函数表示:
Y=A⊕B
Y=A^B
真值表:

寄存器的基本原理¶
D 触发器(D flip-flop,DFF)¶
- 触发器是具有存储信息能力的基本单元
- 由若干逻辑门构成,有多种实现方式
- 主要有一个数据输入、一个数据输出和一个时钟输入
- 在时钟 clock 的上升沿(0 → 1),采样输入 D 的值,传送到输出 Q,其余时间输出 Q 的值不变
- 输入信号需要在时钟上升沿之前(Setup)和之后(Hold)都需要一段很短的稳定时间

- 时序图:

逻辑运算的实现¶

加法和减法的实现¶
二进制的加法¶

- 两个 1-bit 二进制数相加
- 进位输入参与运算
- 可以产生进位输出
半加器(Half Adder)¶
半加器的功能是将两个一位二进制数相加

- 输入端口:A、B
- 输出端口:S(和)、C(进位)
全加器(Full Adder)¶
全加器由两个半加器构成

- 输入端口:A、B、Cin(进位输入)
- 输出端口:S(和)、Cout(进位输出)
4-bit 加法器¶
由四个全加器构成的 4-bit 加法器


检查加法运算结果是否溢出:
溢出(overflow):运算结果超出了正常的表示范围
溢出仅针对有符号数运算:
”进位“和”溢出“实例:
- 有“溢出”时,不一定有“进位”
- 有“进位”时,不一定有“溢出”
“溢出”的检查方法:“最高位的进位输入”不等于“最高位的进位输出”
MIPS 对”溢出“的处理方式:
-
将操作数看做有符号数,发生”溢出“时产生异常
add rd,rs,rt # R[rd] = R [rs] + R [rt]addi rt,rs,imm # R[rt] = R [rs] + SignExtImm* 将操作数看做无符号数,不处理”溢出“addu rd,rs,rt # R[rd] = R [rs]+ R [rt]addiu rt,rs,imm # R[rt] = R [rs]+ SignExtImm
x86 对”溢出“的处理方式:溢出标志 OF(Overflow Flag)
- 如果把操作数看做有符号数,运算结果是否发生溢出
- 若发生溢出,则自动设置 OF=1,否则,OF=0
减法运算¶
- 减法运算均可转换为加法运算
- 补码表示的二进制数的相反数的转换规则:按位取反,末位加一
- 在加法器的基础上实现减法器:A + ( -B ) = A + ( ~B + 1 )

减法运算的实现实例¶
通过 sub-mode 可以控制执行加法或减法运算

加法器的优化¶
行波进位加法器(Ripple-Carry Adder,RCA)¶
- 结构特点:低位全加器的 \(C_{out}\) 连接到高一位全加器 \(C_{in}\)
- 优点:电路布局简单,设计方便
- 缺点:高位的运算必须等待低位的运算完成,延迟时间长
4-bit RCA 门电路的关键路径(延迟最长的路径)

- 输入信号存在线延迟和门延迟,在进行设计原理分析时主要考虑门延迟
- 把一个门延迟记为 \(T\),总延迟时间为:\(( T + T ) × 4 + T = 9T\)
- \(n\) 位加法器的总延迟时间为 \(( 2n + 1 )T\)
加法器的优化思路¶
主要问题:高位的运算必须等待低位的”进位输出信号“
优化思路:
设:
生成(Generate)信号:
传播(Propagate)信号:
则:
超前进位加法器(Carry-Lookahead Adder,CLA)¶
超前进位加法器的门延迟与加法器的位宽无关
通常的实现方法:采用多个小规模的超前进位加法器拼接而成(例:用 4 个 8-bit 的超前进位加法器连接成 32-bit 加法器)
第四讲 乘法器和除法器(Multiplier and Divider)¶
乘法器的实现¶

乘法器的优化¶
N 位乘法器的工作流程图:

优化方法:
1.加法移位并行:
- 时钟上升沿到来之前,寄存器内容不会发生变化
- 时钟上升沿到来时,寄存器根据输入改变其内容

2.减少不必要的硬件资源
- “被乘数寄存器”缩减为 4 位而且取消左移功能
- 取消“乘数寄存器”,乘数初始置于“乘积寄存器”低 4 位
- ”乘积寄存器“增加右移功能,乘积初始值置于其中高 4 位,随着运算过程不断右移
- ”加法器“缩减为 4 位宽,”乘积寄存器“只有高 4 位参与运算

除法器的实现¶
32-bit 除法器的工作流程图¶

除法器的工作过程图¶

除法器的优化¶
面积优化¶
- 除数寄存器缩小为 32-bit,无需支持移位
- 取消商寄存器
- 64-bit ALU 缩小为 32-bit
- 余数寄存器只有高 32-bit 参与加减法运算
- 余数寄存器需支持左移和右移
- 商从右端逐位移入余数寄存器
- 运算结束时,商占据余数寄存器的低 32-bit