vault backup: 2026-07-04 12:12:55

This commit is contained in:
2026-07-04 12:12:55 +08:00
parent 3aac80fb26
commit ba1ad4e098
21 changed files with 8514 additions and 0 deletions

View File

@@ -0,0 +1,194 @@
# 计算机组成原理学习指南
> 📚 本笔记基于唐朔飞《计算机组成原理》第3版整理
> 🎯 适合初学者系统学习和考前快速复习
---
## 📖 课程概述
计算机组成原理是计算机科学的核心基础课程,主要研究计算机硬件系统的组成和工作原理。
### 学习目标
- 理解计算机系统的整体架构和工作原理
- 掌握各功能部件的组成和工作方式
- 理解指令的执行过程和数据通路
- 能够分析和设计简单的计算机系统
### 知识体系
```mermaid
graph TD
A[计算机组成原理] --> B[计算机系统概论]
A --> C[系统总线]
A --> D[存储器]
A --> E[输入输出系统]
A --> F[运算方法]
A --> G[指令系统]
A --> H[CPU结构与功能]
A --> I[控制单元功能]
A --> J[控制单元设计]
B --> B1[计算机层次结构]
B --> B2[冯·诺依曼体系]
C --> C1[总线类型]
C --> C2[总线仲裁]
D --> D1[主存储器]
D --> D2[高速缓冲存储器]
D --> D3[虚拟存储器]
E --> E1[IO方式]
E --> E2[程序中断]
F --> F1[定点数运算]
F --> F2[浮点数运算]
G --> G1[指令格式]
G --> G2[寻址方式]
H --> H1[CPU结构]
H --> H2[指令周期]
I --> I1[控制单元功能]
I --> I2[微操作序列]
J --> J1[组合逻辑设计]
J --> J2[微程序设计]
```
---
## 📝 章节笔记
| 章节 | 主题 | 重要程度 | 难度 | 补充版 |
|------|------|----------|------|--------|
| [[01_计算机系统概论]] | 计算机系统基础概念 | ⭐⭐⭐ | 简单 | [[01_计算机系统概论_补充版]] |
| [[03_系统总线]] | 总线结构和工作原理 | ⭐⭐⭐ | 中等 | [[03_系统总线_补充版]] |
| [[04_存储器]] | 存储系统层次结构 | ⭐⭐⭐⭐⭐ | 困难 | [[04_存储器_补充版]] |
| [[05_输入输出系统]] | IO系统工作方式 | ⭐⭐⭐⭐ | 中等 | [[05_输入输出系统_补充版]] |
| [[06_运算方法]] | 数据的表示和运算 | ⭐⭐⭐⭐⭐ | 困难 | [[06_运算方法_补充版]] |
| [[07_指令系统]] | 指令格式和寻址方式 | ⭐⭐⭐⭐ | 中等 | [[07_指令系统_补充版]] |
| [[08_CPU结构与功能]] | CPU组成和工作原理 | ⭐⭐⭐⭐⭐ | 困难 | [[08_CPU结构与功能_补充版]] |
| [[09_控制单元功能]] | 控制单元的基本功能 | ⭐⭐⭐⭐ | 中等 | [[09_控制单元功能_补充版]] |
| [[10_控制单元设计]] | 控制单元的设计方法 | ⭐⭐⭐⭐⭐ | 困难 | [[10_控制单元设计_补充版]] |
---
## 🎯 学习建议
### 初学者学习路径
```
第1章 概论 → 第3章 总线 → 第7章 指令系统 → 第6章 运算方法
第4章 存储器 → 第5章 IO系统 → 第8章 CPU → 第9-10章 控制单元
```
### 复习者快速回顾
1. **重点章节**第4章存储器、第6章运算方法、第8章CPU、第10章控制单元设计
2. **核心概念**:冯·诺依曼体系、存储层次、指令周期、微程序设计
3. **必考内容**补码运算、Cache映射、中断处理、微指令格式
---
## 📊 重要公式速查
### 数制转换
- 二进制 → 十进制:$\sum_{i=0}^{n} a_i \times 2^i$
- 十进制 → 二进制除2取余乘2取整
### 数据表示
- 原码范围:$-(2^{n-1}-1) \sim +(2^{n-1}-1)$
- 补码范围:$-2^{n-1} \sim +(2^{n-1}-1)$
- 移码:$[x]_{移} = 2^{n-1} + x$
### Cache相关
- Cache命中率$H = \frac{N_c}{N_c + N_m}$
- 平均访问时间:$T_a = HT_c + (1-H)T_m$
- 访问效率:$e = \frac{T_c}{T_a}$
---
## 🔧 实验资源
- [[实验1_中规模组合电路及运算器的应用]]
- [[实验3_基本模型机的数据通路]]
- [[实验4_基本模型机的微程序设计]]
---
## 📚 参考资料
- 教材《计算机组成原理》第3版 - 唐朔飞
- 复习资料:[[1-10章精简参考复习资料]]
- 习题:[[作业三]]、[[作业四]]
- 试卷:[[样卷2025]]、[[期中考试]]
---
## 💡 学习小贴士
> [!tip] 理解优先
> 计算机组成原理重在理解硬件工作原理,不要死记硬背。多画图、多思考数据流向。
> [!warning] 常见误区
> - 混淆计算机体系结构和计算机组成的概念
> - 不理解补码运算的本质
> - 忽视存储层次的整体性
> [!note] 考试重点
> - 补码加减运算及溢出判断
> - Cache地址映射和替换算法
> - 中断处理过程
> - 微程序设计方法
## 📚 补充版笔记说明
为了帮助更好地理解计算机组成原理的难点,我们为每个章节创建了补充版笔记,增加了以下内容:
### 补充版特点
1. **通俗易懂的解释**
- 用日常生活中的例子解释抽象概念
- 用类比的方法帮助理解难点
2. **实际例子**
- 每个概念都有对应的实际例子
- 帮助理解理论在实际中的应用
3. **详细例题**
- 每个章节都有5道例题
- 包含详细的解题步骤和答案
- 帮助掌握考试重点
4. **深入浅出的讲解**
- 从简单到复杂,循序渐进
- 帮助建立完整的知识体系
### 如何使用补充版笔记
1. **初学者**
- 先阅读基础版笔记,了解基本概念
- 再阅读补充版笔记,加深理解
- 做补充版笔记中的例题,巩固知识
2. **复习者**
- 快速浏览基础版笔记,回顾知识点
- 重点阅读补充版笔记中的例题
- 做补充版笔记中的例题,检验掌握程度
3. **考试前**
- 重点复习补充版笔记中的例题
- 理解解题思路和方法
- 掌握考试重点和难点
---
*最后更新2026年7月*

View File

@@ -0,0 +1,353 @@
# 第1章 计算机系统概论
> 📖 本章介绍计算机系统的基本概念和组成,是整个课程的基础。
> 🎯 重点理解计算机层次结构和冯·诺依曼体系
---
## 📋 本章目录
- [[#1.1 计算机系统简介]]
- [[#1.2 计算机的基本组成]]
- [[#1.3 计算机硬件的主要技术指标]]
- [[#本章小结]]
---
## 1.1 计算机系统简介
### 1.1.1 计算机的软硬件概念
计算机系统由 **硬件****软件** 两大部分组成。
```mermaid
graph TB
subgraph 计算机系统
subgraph 硬件
A[主机] --> A1[CPU]
A --> A2[主存储器]
A1 --> A11[运算器]
A1 --> A12[控制器]
B[外部设备] --> B1[输入设备]
B --> B2[输出设备]
end
subgraph 软件
C[系统软件] --> C1[操作系统]
C --> C2[语言处理程序]
C --> C3[数据库管理系统]
D[应用软件] --> D1[科学计算程序]
D --> D2[数据处理程序]
end
end
```
#### 硬件Hardware
> [!info] 定义
> 计算机的实体部分,由看得见摸得着的各种电子元器件组成。
- 主机CPU + 主存储器
- 外部设备:输入设备 + 输出设备
#### 软件Software
> [!info] 定义
> 人们事先编制的具有各类特殊功能的程序,存放在存储器中。
**系统软件**
- 操作系统Windows、Linux等
- 语言处理程序(编译程序、汇编程序)
- 数据库管理系统
- 服务程序(诊断、调试程序)
**应用软件**
- 科学计算程序
- 数据处理程序
- 过程控制程序
- 事务管理程序
> [!tip] 关键理解
> 计算机性能 = 硬件功能 + 软件功能。软硬件相互依存,缺一不可。
---
### 1.1.2 计算机系统的层次结构
计算机系统具有多级层次结构,从低到高依次为:
```mermaid
graph TB
subgraph "五级层次结构"
M4["虚拟机器 M4<br/>(高级语言机器)"] --> |"用编译程序翻译"| M3
M3["虚拟机器 M3<br/>(汇编语言机器)"] --> |"用汇编程序翻译"| M2
M2["虚拟机器 M2<br/>(操作系统机器)"] --> |"用机器语言解释"| M1
M1["传统机器 M1<br/>(机器语言机器)"] --> |"用微程序解释"| M0
M0["微程序机器 M0<br/>(微指令系统)"] --> |"由硬件直接执行"| HW["硬件电路"]
end
style M4 fill:#e1f5fe
style M3 fill:#b3e5fc
style M2 fill:#81d4fa
style M1 fill:#4fc3f7
style M0 fill:#29b6f6
style HW fill:#0288d1
```
#### 各层次说明
| 层次 | 名称 | 说明 | 语言 |
|------|------|------|------|
| M4 | 高级语言机器 | 用户编程层面 | 高级语言C、Java等 |
| M3 | 汇编语言机器 | 汇编语言层面 | 汇编语言 |
| M2 | 操作系统机器 | 操作系统层面 | 机器语言 |
| M1 | 传统机器 | 硬件指令层面 | 机器语言 |
| M0 | 微程序机器 | 微指令层面 | 微指令 |
> [!note] 重要概念
> - **虚拟机**:不是实际存在的机器,而是通过软件实现的功能层次
> - **实际机器**物理存在的硬件机器M0和M1
> - **软硬件交界**:随着技术发展,部分软件功能由硬件实现(固件)
#### 翻译程序的两种方式
```mermaid
graph LR
subgraph "编译程序"
A1[源程序] --> B1[一次性全部翻译] --> C1[目标程序] --> D1[执行]
end
subgraph "解释程序"
A2[源程序] --> B2[翻译一条] --> C2[执行一条] --> D2[下一条]
D2 --> B2
end
```
- **编译程序**一次性全部翻译然后执行如C、Pascal
- **解释程序**边翻译边执行如BASIC
---
### 1.1.3 计算机组成和计算机体系结构
这两个概念容易混淆,需要明确区分:
| 概念 | 定义 | 关注点 | 示例 |
|------|------|--------|------|
| 计算机体系结构 | 程序员所见到的计算机属性 | 指令集、数据类型、寻址技术 | 是否有乘法指令 |
| 计算机组成 | 体系结构的实现方式 | 硬件细节、电路实现 | 乘法指令用专用电路还是加法器实现 |
> [!example] 举例说明
> IBM System/370系列
> - **体系结构相同**:所有机型指令集相同
> - **组成不同**:不同型号性能、价格差异很大
> - **好处**:用户软件投资得到保护
---
## 1.2 计算机的基本组成
### 1.2.1 冯·诺依曼计算机的特点
> [!important] 冯·诺依曼体系1945年
> 基于"存储程序"概念的计算机体系结构
**五大特点**
1. 计算机由 **运算器、存储器、控制器、输入设备、输出设备** 五大部件组成
2. 指令和数据以同等地位存放于存储器内,并可按地址寻访
3. 指令和数据均用 **二进制数** 表示
4. 指令由 **操作码****地址码** 组成
5. 指令在存储器内按顺序存放,通常顺序执行
```mermaid
graph TB
subgraph "冯·诺依曼计算机结构"
direction TB
CU[控制器] --> |"控制信号"| ALU[运算器]
CU --> |"控制信号"| MEM[存储器]
CU --> |"控制信号"| IN[输入设备]
CU --> |"控制信号"| OUT[输出设备]
IN --> |"数据"| MEM
MEM --> |"数据"| ALU
ALU --> |"数据"| MEM
MEM --> |"数据"| OUT
end
style CU fill:#ff9999
style ALU fill:#99ccff
style MEM fill:#99ff99
style IN fill:#ffcc99
style OUT fill:#cc99ff
```
### 1.2.2 计算机的硬件框图
#### 传统结构(以运算器为中心)
```mermaid
graph LR
IN[输入设备] --> |"数据"| ALU[运算器]
ALU --> |"数据"| MEM[存储器]
MEM --> |"数据"| ALU
ALU --> |"数据"| OUT[输出设备]
CU[控制器] --> |"控制"| ALU
CU --> |"控制"| MEM
CU --> |"控制"| IN
CU --> |"控制"| OUT
```
#### 现代结构(以存储器为中心)
```mermaid
graph TB
IN[输入设备] --> |"数据"| MEM[存储器]
MEM --> |"数据"| OUT[输出设备]
MEM --> |"数据"| ALU[运算器]
ALU --> |"数据"| MEM
CU[控制器] --> |"控制信号"| ALU
CU --> |"控制信号"| MEM
CU --> |"控制信号"| IN
CU --> |"控制信号"| OUT
```
> [!tip] 结构变化的原因
> 以存储器为中心可以减少数据传输的瓶颈,提高系统效率。
### 1.2.3 各部件功能详解
| 部件 | 功能 | 关键特性 |
|------|------|----------|
| **运算器** | 完成算术运算和逻辑运算 | 暂存中间结果 |
| **存储器** | 存放数据和程序 | 按地址访问 |
| **控制器** | 控制指挥程序运行 | 产生控制信号 |
| **输入设备** | 信息形式转换(人→机) | 键盘、鼠标等 |
| **输出设备** | 信息形式转换(机→人) | 显示器、打印机等 |
### 1.2.4 现代计算机组成
```mermaid
graph TB
subgraph "现代计算机组成"
subgraph "主机"
CPU["CPU"] --> ALU["运算器"]
CPU --> CU["控制器"]
MM["主存储器<br/>(主存)"]
end
subgraph "外部设备"
IO["I/O设备"] --> INPUT["输入设备"]
IO --> OUTPUT["输出设备"]
end
end
CPU <--> |"数据/地址"| MM
CPU <--> |"数据"| IO
MM <--> |"数据"| IO
style CPU fill:#ff9999
style MM fill:#99ff99
style IO fill:#99ccff
```
**术语说明**
- **CPU** = 运算器 + 控制器
- **主机** = CPU + 主存储器
- **I/O设备** = 输入设备 + 输出设备(外部设备)
---
## 1.3 计算机硬件的主要技术指标
### 1.3.1 机器字长
> [!info] 定义
> CPU一次能处理数据的位数通常与CPU寄存器位数有关。
- 影响:字长越长,计算精度越高
- 常见8位、16位、32位、64位
### 1.3.2 存储容量
> [!info] 定义
> 存储器能存放二进制代码的总位数
**计算公式**
$$存储容量 = 存储单元数 \times 存储字长$$
**单位换算**
- 1KB = 1024B
- 1MB = 1024KB
- 1GB = 1024MB
- 1TB = 1024GB
### 1.3.3 运算速度
**常用指标**
| 指标 | 说明 | 计算方式 |
|------|------|----------|
| MIPS | 每秒百万条指令 | 指令数 / 执行时间 |
| CPI | 每条指令时钟周期数 | 时钟周期数 / 指令数 |
| FLOPS | 每秒浮点运算次数 | 浮点运算数 / 执行时间 |
### 1.3.4 其他指标
- **主频**CPU时钟频率GHz
- **带宽**数据传输速率MB/s
- **兼容性**:软件在不同机器上的通用性
---
## 📝 本章小结
### 核心概念
1. **计算机系统** = 硬件 + 软件
2. **层次结构**:从微程序机器到高级语言机器的多级层次
3. **冯·诺依曼体系**:存储程序、五大部件、二进制表示
4. **现代计算机**以存储器为中心CPU = 运算器 + 控制器
### 关键术语
| 术语 | 英文 | 含义 |
|------|------|------|
| CPU | Central Processing Unit | 中央处理器 |
| ALU | Arithmetic Logic Unit | 算术逻辑单元 |
| CU | Control Unit | 控制单元 |
| MM | Main Memory | 主存储器 |
| I/O | Input/Output | 输入输出 |
### 重点图示
> [!summary] 必须掌握的图
> 1. 计算机系统层次结构图
> 2. 冯·诺依曼计算机结构框图
> 3. 现代计算机组成框图(以存储器为中心)
---
## 🧪 自测练习
### 概念题
1. 简述计算机硬件和软件的关系。
2. 画出计算机系统的五级层次结构,并说明各层功能。
3. 冯·诺依曼计算机有哪些特点?
### 思考题
1. 为什么要区分计算机体系结构和计算机组成?
2. 现代计算机为什么采用以存储器为中心的结构?
---
## 🔗 相关链接
- [[00_计算机组成原理学习指南]] - 返回主目录
- [[03_系统总线]] - 下一章
- [[06_运算方法]] - 数据表示相关内容
- [[08_CPU结构与功能]] - CPU详细设计
---
*本章难度:⭐⭐ 简单*
*重要程度:⭐⭐⭐ 基础*

View File

@@ -0,0 +1,472 @@
# 第1章 计算机系统概论
> 📖 本章介绍计算机系统的基本概念和组成,是整个课程的基础。
> 🎯 重点理解计算机层次结构和冯·诺依曼体系
---
## 📋 本章目录
- [[#1.1 计算机系统简介]]
- [[#1.2 计算机的基本组成]]
- [[#1.3 计算机硬件的主要技术指标]]
- [[#本章小结]]
- [[#例题与解析]]
---
## 1.1 计算机系统简介
### 1.1.1 计算机的软硬件概念
计算机系统由 **硬件****软件** 两大部分组成。
```mermaid
graph TB
subgraph 计算机系统
subgraph 硬件
A[主机] --> A1[CPU]
A --> A2[主存储器]
A1 --> A11[运算器]
A1 --> A12[控制器]
B[外部设备] --> B1[输入设备]
B --> B2[输出设备]
end
subgraph 软件
C[系统软件] --> C1[操作系统]
C --> C2[语言处理程序]
C --> C3[数据库管理系统]
D[应用软件] --> D1[科学计算程序]
D --> D2[数据处理程序]
end
end
```
#### 硬件Hardware
> [!info] 定义
> 计算机的实体部分,由看得见摸得着的各种电子元器件组成。
- 主机CPU + 主存储器
- 外部设备:输入设备 + 输出设备
理解硬件最好的方式是类比人体CPU就像大脑负责思考和处理信息内存相当于短期记忆临时存放正在处理的信息硬盘是长期记忆永久保存数据键盘鼠标像眼睛和耳朵接收外界输入显示器则是嘴巴和手把处理结果输出给我们。
#### 软件Software
> [!info] 定义
> 人们事先编制的具有各类特殊功能的程序,存放在存储器中。
**系统软件**
- 操作系统Windows、Linux等
- 语言处理程序(编译程序、汇编程序)
- 数据库管理系统
- 服务程序(诊断、调试程序)
**应用软件**
- 科学计算程序
- 数据处理程序
- 过程控制程序
- 事务管理程序
软件可以类比为人的思想和知识:操作系统就像基本生活技能(吃饭、走路),编译程序像翻译官,把高级语言翻译成机器能懂的语言,应用软件则是各种专业知识和技能。
> [!tip] 关键理解
> 计算机性能 = 硬件功能 + 软件功能。软硬件相互依存,缺一不可。
举个实际的例子:一台高性能电脑如果没有安装任何软件,什么都做不了;反过来,再厉害的软件在配置太低的硬件上也跑不起来。所以硬件和软件必须配合才能发挥作用。
---
### 1.1.2 计算机系统的层次结构
计算机系统具有多级层次结构,从低到高依次为:
```mermaid
graph TB
subgraph "五级层次结构"
M4["虚拟机器 M4<br/>(高级语言机器)"] --> |"用编译程序翻译"| M3
M3["虚拟机器 M3<br/>(汇编语言机器)"] --> |"用汇编程序翻译"| M2
M2["虚拟机器 M2<br/>(操作系统机器)"] --> |"用机器语言解释"| M1
M1["传统机器 M1<br/>(机器语言机器)"] --> |"用微程序解释"| M0
M0["微程序机器 M0<br/>(微指令系统)"] --> |"由硬件直接执行"| HW["硬件电路"]
end
style M4 fill:#e1f5fe
style M3 fill:#b3e5fc
style M2 fill:#81d4fa
style M1 fill:#4fc3f7
style M0 fill:#29b6f6
style HW fill:#0288d1
```
#### 各层次说明
| 层次 | 名称 | 说明 | 语言 |
|------|------|------|------|
| M4 | 高级语言机器 | 用户编程层面 | 高级语言C、Java等 |
| M3 | 汇编语言机器 | 汇编语言层面 | 汇编语言 |
| M2 | 操作系统机器 | 操作系统层面 | 机器语言 |
| M1 | 传统机器 | 硬件指令层面 | 机器语言 |
| M0 | 微程序机器 | 微指令层面 | 微指令 |
这个层次结构可以想象成一栋大楼顶层M4是普通用户工作的地方他们用C、Java等高级语言编程就像说普通话一样自然往下一层M3是专业程序员用汇编语言更接近机器但人还能听懂再往下M2是系统管理员管理整栋大楼的资源底层M1是硬件工程师直接操作机器指令最底层M0是硬件电路执行最基础的微指令就像大楼的地基。
当我们用C语言写 `int a = 5 + 3;`这个简单的加法在不同层次的表现是不同的M4层看到的是 `5 + 3`M3层编译器把它翻译成汇编指令M2层操作系统负责分配资源M1层变成二进制机器指令M0层则是微指令控制ALU执行加法。
> [!note] 重要概念
> - **虚拟机**:不是实际存在的机器,而是通过软件实现的功能层次
> - **实际机器**物理存在的硬件机器M0和M1
> - **软硬件交界**:随着技术发展,部分软件功能由硬件实现(固件)
#### 翻译程序的两种方式
```mermaid
graph LR
subgraph "编译程序"
A1[源程序] --> B1[一次性全部翻译] --> C1[目标程序] --> D1[执行]
end
subgraph "解释程序"
A2[源程序] --> B2[翻译一条] --> C2[执行一条] --> D2[下一条]
D2 --> B2
end
```
- **编译程序**一次性全部翻译然后执行如C、Pascal
- **解释程序**边翻译边执行如BASIC
这两种方式的区别可以用看英文小说来理解:编译程序就像请翻译把整本小说翻译成中文,然后你读中文版,优点是读得快,缺点是翻译时间长;解释程序就像翻译坐在旁边,你读一句英文他翻译一句中文给你听,优点是马上能开始读,缺点是读得慢。
实际应用中C语言用编译方式先把 `.c` 文件编译成 `.exe` 文件再运行Python用解释方式边翻译边执行不需要生成单独的可执行文件。
---
### 1.1.3 计算机组成和计算机体系结构
这两个概念容易混淆,需要明确区分:
| 概念 | 定义 | 关注点 | 示例 |
|------|------|--------|------|
| 计算机体系结构 | 程序员所见到的计算机属性 | 指令集、数据类型、寻址技术 | 是否有乘法指令 |
| 计算机组成 | 体系结构的实现方式 | 硬件细节、电路实现 | 乘法指令用专用电路还是加法器实现 |
区分这两个概念可以类比买汽车:体系结构就像汽车的"功能规格"(几个座位、最高时速、有没有天窗),组成则是"具体实现"发动机是V6还是V8、变速箱是手动还是自动
IBM System/370系列就是很好的例子所有机型的体系结构相同指令集一样但组成不同不同型号性能、价格差异很大这样用户的软件投资就能得到保护。
> [!example] 举例说明
> 就像iPhone和Android手机体系结构不同指令集、系统调用完全不同但组成可以相同可能都用ARM处理器所以iOS应用不能直接在Android上运行。
---
## 1.2 计算机的基本组成
### 1.2.1 冯·诺依曼计算机的特点
> [!important] 冯·诺依曼体系1945年
> 基于"存储程序"概念的计算机体系结构
**五大特点**
1. 计算机由 **运算器、存储器、控制器、输入设备、输出设备** 五大部件组成
2. 指令和数据以同等地位存放于存储器内,并可按地址寻访
3. 指令和数据均用 **二进制数** 表示
4. 指令由 **操作码****地址码** 组成
5. 指令在存储器内按顺序存放,通常顺序执行
```mermaid
graph TB
subgraph "冯·诺依曼计算机结构"
direction TB
CU[控制器] --> |"控制信号"| ALU[运算器]
CU --> |"控制信号"| MEM[存储器]
CU --> |"控制信号"| IN[输入设备]
CU --> |"控制信号"| OUT[输出设备]
IN --> |"数据"| MEM
MEM --> |"数据"| ALU
ALU --> |"数据"| MEM
MEM --> |"数据"| OUT
end
style CU fill:#ff9999
style ALU fill:#99ccff
style MEM fill:#99ff99
style IN fill:#ffcc99
style OUT fill:#cc99ff
```
冯·诺依曼体系可以理解为一个高效的工厂:运算器是生产车间,负责加工产品;存储器是仓库,存放原材料和成品;控制器是厂长,指挥整个生产过程;输入设备是采购部,接收订单和原材料;输出设备是销售部,把成品交给客户。"存储程序"的概念就是把生产计划(程序)和原材料(数据)都放在仓库里,厂长按计划指挥生产。
当你用电脑计算 `5 + 3` 时,整个过程是这样的:键盘输入数据,存储器存放数字和指令,控制器指挥运算器执行加法,运算器计算结果,最后显示器显示答案。
### 1.2.2 计算机的硬件框图
#### 传统结构(以运算器为中心)
```mermaid
graph LR
IN[输入设备] --> |"数据"| ALU[运算器]
ALU --> |"数据"| MEM[存储器]
MEM --> |"数据"| ALU
ALU --> |"数据"| OUT[输出设备]
CU[控制器] --> |"控制"| ALU
CU --> |"控制"| MEM
CU --> |"控制"| IN
CU --> |"控制"| OUT
```
#### 现代结构(以存储器为中心)
```mermaid
graph TB
IN[输入设备] --> |"数据"| MEM[存储器]
MEM --> |"数据"| OUT[输出设备]
MEM --> |"数据"| ALU[运算器]
ALU --> |"数据"| MEM
CU[控制器] --> |"控制信号"| ALU
CU --> |"控制信号"| MEM
CU --> |"控制信号"| IN
CU --> |"控制信号"| OUT
```
> [!tip] 结构变化的原因
> 以存储器为中心可以减少数据传输的瓶颈,提高系统效率。
从传统结构到现代结构的变化,可以用快递公司来理解:传统结构中,所有快递都要经过分拣中心(运算器),即使是从仓库直接发给客户的也要先绕一圈,效率很低;现代结构中,仓库可以直接发货给客户,分拣中心只处理需要加工的快递,效率大大提高。
比如从硬盘复制文件到U盘时传统结构需要经过CPU现代结构则可以直接通过内存传输不占用CPU资源。
### 1.2.3 各部件功能详解
| 部件 | 功能 | 关键特性 |
|------|------|----------|
| **运算器** | 完成算术运算和逻辑运算 | 暂存中间结果 |
| **存储器** | 存放数据和程序 | 按地址访问 |
| **控制器** | 控制指挥程序运行 | 产生控制信号 |
| **输入设备** | 信息形式转换(人→机) | 键盘、鼠标等 |
| **输出设备** | 信息形式转换(机→人) | 显示器、打印机等 |
把这些部件想象成一个餐厅:运算器是厨师,负责加工食材,能做各种菜,会把做好的菜暂时放在操作台上;存储器是冰箱和货架,存放食材和菜谱,每个格子都有编号,需要什么直接去对应编号的格子拿;控制器是餐厅经理,看订单决定做什么菜,指挥厨师工作,协调各部门配合;输入设备是服务员,接收顾客点单,把点单翻译成厨房能懂的语言;输出设备是传菜员,把做好的菜端给顾客。
### 1.2.4 现代计算机组成
```mermaid
graph TB
subgraph "现代计算机组成"
subgraph "主机"
CPU["CPU"] --> ALU["运算器"]
CPU --> CU["控制器"]
MM["主存储器<br/>(主存)"]
end
subgraph "外部设备"
IO["I/O设备"] --> INPUT["输入设备"]
IO --> OUTPUT["输出设备"]
end
end
CPU <--> |"数据/地址"| MM
CPU <--> |"数据"| IO
MM <--> |"数据"| IO
style CPU fill:#ff9999
style MM fill:#99ff99
style IO fill:#99ccff
```
**术语说明**
- **CPU** = 运算器 + 控制器
- **主机** = CPU + 主存储器
- **I/O设备** = 输入设备 + 输出设备(外部设备)
现代计算机就像一个现代化的办公大楼CPU是总经理办公室其中运算器是财务部负责计算控制器是总经理指挥全局主存储器是办公桌临时存放正在处理的文件速度快但容量小外部设备包括前台输入设备和公关部输出设备
---
## 1.3 计算机硬件的主要技术指标
### 1.3.1 机器字长
> [!info] 定义
> CPU一次能处理数据的位数通常与CPU寄存器位数有关。
- 影响:字长越长,计算精度越高
- 常见8位、16位、32位、64位
机器字长可以理解为工人一次能搬多少东西8位工人一次搬8块砖16位搬16块32位搬32块64位搬64块。搬得越多处理速度越快计算精度越高。早期的单片机是8位大多数嵌入式系统是32位现代个人电脑和服务器是64位。
### 1.3.2 存储容量
> [!info] 定义
> 存储器能存放二进制代码的总位数
**计算公式**
$$存储容量 = 存储单元数 \times 存储字长$$
**单位换算**
- 1KB = 1024B
- 1MB = 1024KB
- 1GB = 1024MB
- 1TB = 1024GB
存储容量就像仓库的大小存储单元数是仓库有多少个格子存储字长是每个格子能放多少东西两者相乘就是总容量。比如一个仓库有1024个格子每个格子能放8个鸡蛋总容量就是1024×8=8192个鸡蛋也就是1KB。
### 1.3.3 运算速度
**常用指标**
| 指标 | 说明 | 计算方式 |
|------|------|----------|
| MIPS | 每秒百万条指令 | 指令数 / 执行时间 |
| CPI | 每条指令时钟周期数 | 时钟周期数 / 指令数 |
| FLOPS | 每秒浮点运算次数 | 浮点运算数 / 执行时间 |
这三个指标可以这样理解MIPS是工人每秒能处理多少个订单CPI是处理一个订单需要多少个步骤FLOPS是每秒能计算多少道数学题。MIPS越高处理越快CPI越低效率越高FLOPS越强计算能力越强。
### 1.3.4 其他指标
- **主频**CPU时钟频率GHz
- **带宽**数据传输速率MB/s
- **兼容性**:软件在不同机器上的通用性
主频就像工人的心跳速度,主频越高干活越快,但不一定效率高;带宽就像高速公路的车道数,车道越多能通过的车辆越多;兼容性就像不同品牌的手机能不能用同一个充电器。
---
## 📝 本章小结
### 核心概念
1. **计算机系统** = 硬件 + 软件
2. **层次结构**:从微程序机器到高级语言机器的多级层次
3. **冯·诺依曼体系**:存储程序、五大部件、二进制表示
4. **现代计算机**以存储器为中心CPU = 运算器 + 控制器
### 关键术语
| 术语 | 英文 | 含义 |
|------|------|------|
| CPU | Central Processing Unit | 中央处理器 |
| ALU | Arithmetic Logic Unit | 算术逻辑单元 |
| CU | Control Unit | 控制单元 |
| MM | Main Memory | 主存储器 |
| I/O | Input/Output | 输入输出 |
### 重点图示
> [!summary] 必须掌握的图
> 1. 计算机系统层次结构图
> 2. 冯·诺依曼计算机结构框图
> 3. 现代计算机组成框图(以存储器为中心)
---
## 🧪 例题与解析
### 例题1计算机层次结构
**题目**:简述计算机系统的五级层次结构,并说明各层的作用。
**答案**
计算机系统的五级层次结构从低到高依次为:
1. **微程序机器M0微指令系统**执行最基础的微指令由硬件直接执行速度最快。比如控制ALU执行加法操作的微指令。
2. **传统机器M1机器语言机器**:执行机器语言程序,直接执行二进制指令。比如执行 `000001 0000000101` 这样的机器指令。
3. **虚拟机器M2操作系统机器**管理计算机资源提供系统服务。比如Windows管理内存分配、进程调度。
4. **虚拟机器M3汇编语言机器**:执行汇编语言程序,用汇编程序翻译成机器语言。比如执行 `ADD R1, R2, R3` 这样的汇编指令。
5. **虚拟机器M4高级语言机器**:执行高级语言程序,用编译程序翻译成汇编语言或机器语言。比如执行 `int a = 5 + 3;` 这样的C语言语句。
这就像一栋5层大楼1楼是地基和电路2楼是生产车间3楼是管理部门4楼是设计部门5楼是销售部门。
### 例题2编译与解释
**题目**:比较编译程序和解释程序的区别,并举例说明。
**答案**
| 特性 | 编译程序 | 解释程序 |
|------|----------|----------|
| 翻译方式 | 一次性全部翻译 | 边翻译边执行 |
| 执行速度 | 快(已翻译成目标程序) | 慢(每次都要翻译) |
| 错误处理 | 编译时发现所有错误 | 运行时逐行发现错误 |
| 代表语言 | C、Pascal、FORTRAN | BASIC、Python、JavaScript |
编译程序就像请翻译把整本小说翻译成中文,然后你读中文版,读得快但翻译时间长;解释程序就像翻译坐在旁边,你读一句他翻译一句,马上能开始读但读得慢。
C语言是编译型`hello.c``gcc``hello.exe` → 运行Python是解释型`python hello.py` → 边翻译边执行。
### 例题3冯·诺依曼体系
**题目**:简述冯·诺依曼计算机的特点,并说明为什么现代计算机采用以存储器为中心的结构。
**答案**
冯·诺依曼计算机的五大特点:五大部件组成(运算器、存储器、控制器、输入设备、输出设备);存储程序概念(指令和数据同等地位存放于存储器);二进制表示;指令格式(操作码+地址码);顺序执行。
现代计算机采用以存储器为中心的结构主要是为了减少数据传输瓶颈、提高系统效率。传统结构中所有数据都要经过运算器现代结构中存储器可以直接与I/O设备交换数据CPU可以专心处理计算任务I/O操作不占用CPU时间。
比如从硬盘复制文件到U盘时传统结构需要经过CPU现代结构可以直接通过内存传输效率更高。
### 例题4技术指标计算
**题目**某计算机主频为2GHzCPI为4求该计算机的MIPS。
**答案**
主频2GHz = 2×10⁹ HzCPI=4代入公式
$$MIPS = \frac{主频}{CPI \times 10^6} = \frac{2 \times 10^9}{4 \times 10^6} = 500$$
该计算机的MIPS为500即每秒执行5亿条指令。
可以理解为心跳速度主频每秒跳20亿次每个订单需要4次心跳CPI=4每秒能处理20亿÷4=5亿个订单。
### 例题5存储容量计算
**题目**某计算机存储器有16位地址线8位数据线求该存储器的容量。
**答案**
16位地址线可以表示 2¹⁶ = 65536 个地址即有65536个存储单元8位数据线表示每个单元存8位数据1字节
存储容量 = 65536 × 8位 = 65536字节 = 64KB。
这就像一个仓库有65536个格子每个格子能放8个鸡蛋总容量就是64KB。
---
## ⚡ 知识点速记卡
> 考前快速过一遍30秒回忆整章核心
**计算机系统 = 硬件 + 软件**,两者缺一不可。
**五级层次**从下往上微程序机器M0 → 传统机器M1 → 操作系统M2 → 汇编语言M3 → 高级语言M4。底下两层是实际机器上面三层是虚拟机器。
**冯·诺依曼五大特点**:①五大部件(运算器+存储器+控制器+输入+输出)②存储程序(指令和数据同等地位存放)③二进制表示 ④指令=操作码+地址码 ⑤顺序执行。
**现代计算机**以存储器为中心不是运算器CPU = 运算器 + 控制器,主机 = CPU + 主存。
**三个速度指标**MIPS每秒百万条指令越大越快、CPI每条指令时钟周期数越小越高效、FLOPS每秒浮点运算次数
**编译 vs 解释**编译一次性全部翻译再执行C解释边翻译边执行Python。编译快但调试慢解释慢但调试快。
**容量计算**:存储容量 = 存储单元数 × 字长。20位地址线 → 2²⁰ = 1M个单元。
---
## 🔗 相关链接
- [[00_计算机组成原理学习指南]] - 返回主目录
- [[03_系统总线]] - 下一章
- [[06_运算方法]] - 数据表示相关内容
- [[08_CPU结构与功能]] - CPU详细设计
---
*本章难度:⭐⭐ 简单*
*重要程度:⭐⭐⭐ 基础*

View File

@@ -0,0 +1,423 @@
# 第3章 系统总线
> 📖 本章介绍系统总线的基本概念、分类和控制逻辑。
> 🎯 重点理解总线结构和总线仲裁方式
---
## 📋 本章目录
- [[#3.1 总线的基本概念]]
- [[#3.2 总线的分类]]
- [[#3.3 总线特性及性能指标]]
- [[#3.4 总线结构]]
- [[#3.5 总线控制]]
- [[#本章小结]]
---
## 3.1 总线的基本概念
### 3.1.1 什么是总线
> [!info] 定义
> 总线是连接多个部件的信息传输线,是各部件**共享**的传输介质。
**关键特性**
- 同一时刻只允许**一个部件**向总线发送信息
- 多个部件可以**同时**从总线上接收相同的信息
```mermaid
graph TB
subgraph "总线结构"
CPU[CPU] <--> |"共享总线"| BUS[系统总线]
MEM[主存] <--> |"共享总线"| BUS
IO1[I/O设备1] <--> |"共享总线"| BUS
IO2[I/O设备2] <--> |"共享总线"| BUS
IO3[I/O设备3] <--> |"共享总线"| BUS
end
style BUS fill:#ffcc00
```
### 3.1.2 总线连接方式
#### 分散连接 vs 总线连接
| 特性 | 分散连接 | 总线连接 |
|------|----------|----------|
| 连线方式 | 各部件单独连线 | 共享传输线 |
| 灵活性 | 差,增删设备困难 | 好,便于扩展 |
| 复杂度 | 高 | 低 |
| 成本 | 高 | 低 |
### 3.1.3 总线结构类型
#### 1. 面向CPU的双总线结构
```mermaid
graph TB
subgraph "面向CPU的双总线"
CPU[CPU] <--> |"M总线"| MEM[主存]
CPU <--> |"I/O总线"| IO1[I/O设备1]
CPU <--> |"I/O总线"| IO2[I/O设备2]
CPU <--> |"I/O总线"| ION[I/O设备n]
end
style CPU fill:#ff9999
style MEM fill:#99ff99
```
**特点**
- 两组总线M总线存储总线和I/O总线
- I/O设备与主存交换信息需经过CPU
- 影响CPU工作效率
#### 2. 单总线结构
```mermaid
graph TB
subgraph "单总线结构"
CPU[CPU] <--> |"系统总线"| BUS[系统总线]
MEM[主存] <--> |"系统总线"| BUS
IO1[I/O设备1] <--> |"系统总线"| BUS
IO2[I/O设备2] <--> |"系统总线"| BUS
ION[I/O设备n] <--> |"系统总线"| BUS
end
style BUS fill:#ffcc00
```
**特点**
- 所有部件挂到同一组总线
- I/O与主存交换信息不占用CPU
- 需要总线判优逻辑解决冲突
#### 3. 以存储器为中心的双总线结构
```mermaid
graph TB
subgraph "以存储器为中心的双总线"
CPU[CPU] <--> |"存储总线"| MEM[主存]
MEM <--> |"系统总线"| IO1[I/O设备1]
MEM <--> |"系统总线"| IO2[I/O设备2]
MEM <--> |"系统总线"| ION[I/O设备n]
CPU <--> |"系统总线"| IO1
CPU <--> |"系统总线"| IO2
CPU <--> |"系统总线"| ION
end
style CPU fill:#ff9999
style MEM fill:#99ff99
```
**特点**
- 在单总线基础上增加CPU与主存的专用总线
- 提高传输效率,减轻系统总线负担
- I/O与存储器交换信息不经过CPU
---
## 3.2 总线的分类
### 按连接部件分类
```mermaid
graph LR
A[总线分类] --> B[片内总线]
A --> C[系统总线]
A --> D[通信总线]
B --> B1[芯片内部总线]
C --> C1[数据总线]
C --> C2[地址总线]
C --> C3[控制总线]
D --> D1[串行通信]
D --> D2[并行通信]
```
### 3.2.1 片内总线
> [!info] 定义
> 芯片内部的总线如CPU芯片内部寄存器之间、寄存器与ALU之间的连线。
### 3.2.2 系统总线
系统总线传输三类信息:
#### 数据总线Data Bus
| 特性 | 说明 |
|------|------|
| 传输内容 | 各功能部件之间的数据信息 |
| 传输方向 | **双向**传输 |
| 位数 | 与机器字长、存储字长有关8/16/32位 |
| 影响 | 数据总线宽度影响系统性能 |
> [!example] 示例
> 数据总线宽度为8位指令字长为16位则取指需**两次**访问主存。
#### 地址总线Address Bus
| 特性 | 说明 |
|------|------|
| 传输内容 | 指明CPU欲访问的存储单元或I/O端口地址 |
| 传输方向 | **单向**由CPU输出 |
| 位数 | 与存储单元个数有关 |
| 计算 | n位地址线 → $2^n$ 个存储单元 |
> [!example] 示例
> 20根地址线 → $2^{20} = 1M$ 个存储单元
#### 控制总线Control Bus
| 特性 | 说明 |
|------|------|
| 传输内容 | 各种控制信号和状态信号 |
| 传输方向 | 单根单向,总体**双向** |
| 功能 | 控制总线使用权、同步操作、状态反馈 |
**常见控制信号**
| 信号 | 方向 | 功能 |
|------|------|------|
| 时钟 | CPU→ | 同步各种操作 |
| 复位 | CPU→ | 初始化所有部件 |
| 总线请求 | ←部件 | 部件请求总线使用权 |
| 总线允许 | CPU→ | 授予总线使用权 |
| 中断请求 | ←部件 | 部件提出中断请求 |
| 中断响应 | CPU→ | 接收中断请求 |
| 存储器读 | CPU→ | 从存储器读数据 |
| 存储器写 | CPU→ | 向存储器写数据 |
| I/O读 | CPU→ | 从I/O端口读数据 |
| I/O写 | CPU→ | 向I/O端口写数据 |
### 3.2.3 通信总线
用于计算机系统之间或与其他系统之间的通信。
| 类型 | 特点 | 适用距离 |
|------|------|----------|
| 串行通信 | 数据在单条线上逐位传输 | 远距离(可利用电话网络) |
| 并行通信 | 数据在多条线上同时传输 | 近距离(通常<30m |
```mermaid
graph LR
subgraph "串行通信"
A1[发送端] --> |"1条线<br/>逐位传输"| B1[接收端]
end
subgraph "并行通信"
A2[发送端] --> |"8条线<br/>同时传输"| B2[接收端]
end
```
---
## 3.3 总线特性及性能指标
### 3.3.1 总线特性
| 特性 | 说明 |
|------|------|
| 机械特性 | 尺寸、形状、管脚数、排列顺序 |
| 电气特性 | 传输方向、有效电平范围 |
| 功能特性 | 每根传输线的功能定义 |
| 时间特性 | 信号的时序关系 |
### 3.3.2 总线性能指标
| 指标 | 定义 | 影响因素 |
|------|------|----------|
| 总线宽度 | 数据总线的根数 | 决定一次传输的数据量 |
| 总线带宽 | 单位时间传输数据量 | 总线宽度 × 总线频率 |
| 总线复用 | 地址线与数据线复用 | 减少引脚数,降低效率 |
| 信号线数 | 地址、数据、控制线总数 | 影响接口复杂度 |
| 总线控制方式 | 同步/异步、突发传输等 | 影响传输效率 |
**总线带宽计算**
$$总线带宽 = \frac{总线宽度}{8} \times 总线频率 \quad (MB/s)$$
> [!example] 示例
> 总线宽度32位频率66MHz
> $$带宽 = \frac{32}{8} \times 66 = 264 \quad MB/s$$
---
## 3.4 总线结构
### 3.4.1 单总线结构
所有部件共享同一组总线,结构简单但效率有限。
### 3.4.2 多总线结构
```mermaid
graph TB
subgraph "多总线结构示例"
CPU[CPU] <--> |"前端总线"| NB[北桥]
NB <--> |"存储总线"| MEM[内存]
NB <--> |"PCI总线"| PCI[PCI设备]
PCI <--> |"ISA总线"| ISA[ISA设备]
NB <--> |"AGP总线"| AGP[显卡]
end
style CPU fill:#ff9999
style NB fill:#ffcc00
style MEM fill:#99ff99
```
**优点**
- 不同速度设备使用不同总线
- 提高整体效率
- 便于扩展
---
## 3.5 总线控制
### 3.5.1 总线判优控制
> [!info] 问题
> 多个部件同时请求总线时,如何决定谁先使用?
#### 集中式仲裁
```mermaid
graph TB
subgraph "集中式仲裁"
BC[总线控制器] --> |"控制信号"| CPU[CPU]
BC --> |"控制信号"| MEM[主存]
BC --> |"控制信号"| IO1[I/O设备1]
BC --> |"控制信号"| IO2[I/O设备2]
end
style BC fill:#ff9999
```
**三种方式**
| 方式 | 原理 | 优点 | 缺点 |
|------|------|------|------|
| 链式查询 | 依次查询各部件 | 结构简单 | 优先级固定,对故障敏感 |
| 计数器定时查询 | 计数器指定设备号 | 灵活,可编程 | 需要设备地址线 |
| 独立请求方式 | 每个设备有独立请求线 | 响应速度快 | 控制线多,复杂 |
```mermaid
graph TB
subgraph "链式查询"
BG1[总线同意] --> CPU
CPU --> IO1
IO1 --> IO2
IO2 --> ION
BR[总线请求] --> BC[总线控制器]
BS[总线忙] --> BC
end
subgraph "独立请求"
BR1[请求1] --> BC[总线控制器]
BR2[请求2] --> BC
BRN[请求n] --> BC
BG1[同意1] --> CPU
BG2[同意2] --> IO1
BGN[同意n] --> ION
end
```
#### 分布式仲裁
各设备自行判断优先级,无需中央控制器。
### 3.5.2 总线通信控制
> [!info] 目标
> 解决通信双方如何获知传输开始和结束,以及如何协调配合。
#### 四种通信方式
| 方式 | 同步方式 | 特点 | 适用场景 |
|------|----------|------|----------|
| 同步通信 | 统一时钟 | 简单,速度快 | 速度匹配的设备 |
| 异步通信 | 应答信号 | 灵活,可靠 | 速度差异大的设备 |
| 半同步通信 | 时钟+等待 | 兼顾两者 | 中等速度差异 |
| 分离式通信 | 分阶段 | 效率最高 | 高性能系统 |
#### 异步通信的三种类型
```mermaid
sequenceDiagram
participant 主模块
participant 从模块
Note over 主模块,从模块: 不互锁方式
主模块->>从模块: 请求
主模块-->>从模块: (等待固定时间)
从模块->>主模块: 回答
Note over 主模块,从模块: 半互锁方式
主模块->>从模块: 请求
从模块->>主模块: 回答
主模块-->>从模块: (撤销请求)
Note over 主模块,从模块: 全互锁方式
主模块->>从模块: 请求
从模块->>主模块: 回答
主模块->>从模块: 撤销请求
```
---
## 📝 本章小结
### 核心概念
1. **总线定义**:多个部件共享的传输介质
2. **总线分类**:片内总线、系统总线、通信总线
3. **系统总线**:数据总线(双向)、地址总线(单向)、控制总线(总体双向)
4. **总线仲裁**:集中式(链式查询、计数器查询、独立请求)、分布式
5. **通信方式**:同步、异步、半同步、分离式
### 关键公式
- **总线带宽** = 总线宽度/8 × 总线频率
- **地址空间** = $2^n$n为地址线位数
### 重点图示
> [!summary] 必须掌握的图
> 1. 三种总线结构框图面向CPU、单总线、以存储器为中心
> 2. 总线仲裁方式对比图
> 3. 异步通信三种类型时序图
---
## 🧪 自测练习
### 概念题
1. 什么是总线?为什么需要总线?
2. 比较三种总线结构的优缺点。
3. 说明数据总线、地址总线、控制总线的区别。
### 计算题
1. 某系统总线宽度为32位总线频率为100MHz求总线带宽。
2. 若地址线为24位可寻址多少存储单元若存储字长为16位存储容量是多少
### 分析题
1. 比较三种集中式仲裁方式的优缺点。
2. 说明同步通信和异步通信的区别和适用场景。
---
## 🔗 相关链接
- [[01_计算机系统概论]] - 上一章
- [[04_存储器]] - 下一章
- [[08_CPU结构与功能]] - CPU与总线的连接
---
*本章难度:⭐⭐⭐ 中等*
*重要程度:⭐⭐⭐ 基础*

View File

@@ -0,0 +1,422 @@
# 第3章 系统总线
> 📖 本章介绍系统总线的基本概念、分类和控制逻辑。
> 🎯 重点理解总线结构和总线仲裁方式
---
## 📋 本章目录
- [[#3.1 总线的基本概念]]
- [[#3.2 总线的分类]]
- [[#3.3 总线特性及性能指标]]
- [[#3.4 总线结构]]
- [[#3.5 总线控制]]
- [[#本章小结]]
- [[#例题与解析]]
---
## 3.1 总线的基本概念
### 3.1.1 什么是总线
> [!info] 定义
> 总线是连接多个部件的信息传输线,是各部件**共享**的传输介质。
**关键特性**
- 同一时刻只允许**一个部件**向总线发送信息
- 多个部件可以**同时**从总线上接收相同的信息
```mermaid
graph TB
subgraph "总线结构"
CPU[CPU] <--> |"共享总线"| BUS[系统总线]
MEM[主存] <--> |"共享总线"| BUS
IO1[I/O设备1] <--> |"共享总线"| BUS
IO2[I/O设备2] <--> |"共享总线"| BUS
IO3[I/O设备3] <--> |"共享总线"| BUS
end
style BUS fill:#ffcc00
```
总线就像一条公共马路:所有车辆(部件)都使用同一条马路,但同一时刻只能过一辆车(单车道),不过一个电台广播时很多人可以同时收听(多人同时接收)。
或者想象一个会议室:麦克风(总线)是共享的,所有人都可以用,但不能两个人同时说话,不过一个人说话时所有人都能听到。
### 3.1.2 总线连接方式
#### 分散连接 vs 总线连接
| 特性 | 分散连接 | 总线连接 |
|------|----------|----------|
| 连线方式 | 各部件单独连线 | 共享传输线 |
| 灵活性 | 差,增删设备困难 | 好,便于扩展 |
| 复杂度 | 高 | 低 |
| 成本 | 高 | 低 |
这两种连接方式可以类比电话系统分散连接就像每个办公室之间都拉一条专用电话线A要打给B需要A-B专线打给C需要A-C专线线多成本高总线连接就像所有办公室都连到一条电话总线上通过总线转接线少成本低增加新办公室只需接一条线。
### 3.1.3 总线结构类型
#### 1. 面向CPU的双总线结构
```mermaid
graph TB
subgraph "面向CPU的双总线"
CPU[CPU] <--> |"M总线"| MEM[主存]
CPU <--> |"I/O总线"| IO1[I/O设备1]
CPU <--> |"I/O总线"| IO2[I/O设备2]
CPU <--> |"I/O总线"| ION[I/O设备n]
end
style CPU fill:#ff9999
style MEM fill:#99ff99
```
**特点**
- 两组总线M总线存储总线和I/O总线
- I/O设备与主存交换信息需经过CPU
- 影响CPU工作效率
这种结构就像公司的物流系统M总线是仓库和生产车间之间的专用通道I/O总线是生产车间和客户之间的通道。问题是客户要从仓库取货必须经过生产车间影响生产效率。
#### 2. 单总线结构
```mermaid
graph TB
subgraph "单总线结构"
CPU[CPU] <--> |"系统总线"| BUS[系统总线]
MEM[主存] <--> |"系统总线"| BUS
IO1[I/O设备1] <--> |"系统总线"| BUS
IO2[I/O设备2] <--> |"系统总线"| BUS
ION[I/O设备n] <--> |"系统总线"| BUS
end
style BUS fill:#ffcc00
```
**特点**
- 所有部件挂到同一组总线
- I/O与主存交换信息不占用CPU
- 需要总线判优逻辑解决冲突
单总线就像公司内部只有一条快递通道,所有部门共用。优点是客户可以直接从仓库取货,不经过生产车间;缺点是如果多个部门同时要用通道就会冲突,需要排队。
#### 3. 以存储器为中心的双总线结构
```mermaid
graph TB
subgraph "以存储器为中心的双总线"
CPU[CPU] <--> |"存储总线"| MEM[主存]
MEM <--> |"系统总线"| BUS[系统总线]
IO1[I/O设备1] <--> |"系统总线"| BUS
IO2[I/O设备2] <--> |"系统总线"| BUS
ION[I/O设备n] <--> |"系统总线"| BUS
end
style MEM fill:#99ff99
style BUS fill:#ffcc00
```
**特点**
- 在单总线基础上增加CPU与主存之间的专用总线
- 存储总线速度高只供CPU与主存传输信息
- 既提高传输效率,又减轻系统总线负担
这是对单总线的改进增加了仓库和生产车间之间的高速专用通道。这样既提高了CPU和内存之间的传输效率其他部门又可以直接从仓库取货系统总线负担也减轻了。现代计算机大多采用这种结构。
---
## 3.2 总线的分类
### 3.2.1 按连接部件分类
#### 1. 片内总线
> [!info] 定义
> 片内总线是指芯片内部的总线如在CPU芯片内部寄存器与寄存器之间、寄存器与算逻单元ALU之间都由片内总线连接。
片内总线就像公司内部各部门之间的内部电话,只在公司内部(芯片内部)使用,用于各部门之间沟通工作,速度快距离短。
#### 2. 系统总线
> [!info] 定义
> 系统总线是指CPU、主存、I/O设备各大部件之间的信息传输线。由于这些部件通常都安放在主板或各个插件板上故又称板级总线或板间总线。
**系统总线的三类**
```mermaid
graph TB
subgraph "系统总线"
DB[数据总线] --> |"传输数据"| DATA[数据信息]
AB[地址总线] --> |"传输地址"| ADDR[地址信息]
CB[控制总线] --> |"传输控制"| CTRL[控制信号]
end
```
1. **数据总线**传输各功能部件之间的数据信息双向传输宽度与机器字长有关8位、16位、32位
2. **地址总线**指出源数据或目的数据在主存单元的地址或I/O设备的地址单向输出由CPU输出宽度与存储单元个数有关
3. **控制总线**:发出各种控制信号,每根线单向但整体有输入也有输出,包括存储器读/写、I/O读/写、中断请求等
系统总线可以理解为公司的三套沟通系统数据总线是快递通道传送实际的文件和包裹双向传输地址总线是门牌号系统告诉快递员送到哪个办公室只有总经理CPU能指定地址控制总线是指令系统传达各种指令和状态有输入有输出。
当你在电脑上保存文件时CPU通过地址总线告诉内存"我要存到地址1000",通过数据总线把文件数据传给内存,通过控制总线发出"写入"命令。
#### 3. 通信总线
> [!info] 定义
> 通信总线用于计算机系统之间或计算机系统与其他系统之间的通信。
**分类**
1. **串行通信**数据在单条1位宽的传输线上一位一位地按顺序传送适合远距离成本低但速度慢
2. **并行通信**数据在多条并行1位宽的传输线上同时传送速度快但适合近距离成本高
串行通信就像一个人骑自行车送信一次只能带一封信分8次送完8封信成本低适合远距离并行通信就像8个人同时骑自行车送信一次就能送8封信速度快但成本高。
USB、网络线、电话线用串行通信打印机接口、早期硬盘接口用并行通信。
---
## 3.3 总线特性及性能指标
### 3.3.1 总线特性
总线特性包括以下几项:
1. **机械特性**:总线在机械连接方式上的一些性能,如插头与插座标准、几何尺寸、引脚个数、排列顺序。就像电源插头的形状和大小。
2. **电气特性**总线的每一根传输线上信号的传递方向和有效的电平范围高电平表示1低电平表示0。就像电源的电压标准220V还是110V
3. **功能特性**:总线中每根传输线的功能,如地址线、数据线、控制线。就像不同颜色的电线代表不同功能。
4. **时间特性**:总线中的任一根线在什么时间内有效,信号时序关系。就像交通信号灯的时序(红灯停、绿灯行)。
### 3.3.2 总线性能指标
| 指标 | 说明 | 计算方式 |
|------|------|----------|
| 总线宽度 | 数据总线的根数 | 8位、16位、32位、64位 |
| 总线带宽 | 数据传输速率 | 总线宽度 × 总线频率 |
| 时钟同步 | 数据与时钟同步方式 | 同步总线、异步总线 |
| 总线复用 | 一条线传送多种信号 | 地址/数据复用 |
| 信号线数 | 三种总线数的总和 | 地址线+数据线+控制线 |
这些指标可以类比公路总线宽度是车道数8位就是8车道总线带宽是车流量计算方式是车道数×车速时钟同步就像交通信号灯同步总线所有车按信号灯行驶总线复用就像多功能车道白天走汽车晚上走自行车。
假设总线工作频率为33MHz总线宽度为32位总线带宽 = 33MHz × (32÷8) = 132MBps意味着每秒可以传输132MB的数据。
### 3.3.3 总线标准
> [!info] 定义
> 总线标准是系统与各模块、模块与模块之间的一个互连的标准界面。
总线标准就像交通规则,标准化使得所有车辆都遵守同一套规则,不同品牌的车都能在同一条路上行驶,便于扩展。
常见的总线标准包括ISA、EISA、VESA、PCI、USB等。USB总线是统一的外部设备接口标准手机、U盘、鼠标都可以用USB接口不同品牌的设备都能互相兼容即插即用。
---
## 3.4 总线结构
### 3.4.1 单总线结构
```mermaid
graph TB
subgraph "单总线结构"
CPU[CPU] <--> |"系统总线"| BUS[系统总线]
MEM[主存] <--> |"系统总线"| BUS
IO1[I/O设备1] <--> |"系统总线"| BUS
IO2[I/O设备2] <--> |"系统总线"| BUS
end
style BUS fill:#ffcc00
```
**优点**:结构简单,便于扩展,成本低
**缺点**:总线成为瓶颈,多设备同时使用会冲突,影响系统性能
单总线就像一条单车道公路,建设成本低维护简单,但如果车多就会堵车。早期的个人计算机采用单总线结构。
### 3.4.2 双总线结构
```mermaid
graph TB
subgraph "双总线结构"
CPU[CPU] <--> |"存储总线"| MEM[主存]
CPU <--> |"I/O总线"| IO[I/O设备]
MEM <--> |"I/O总线"| IO
end
style MEM fill:#99ff99
```
**优点**CPU和I/O可以并行工作减轻总线负担提高系统性能
**缺点**:结构复杂,成本高
双总线就像两条公路存储总线是仓库和生产车间之间的专用高速公路I/O总线是仓库和其他部门之间的普通公路专用通道效率高不会互相干扰。现代计算机采用双总线结构。
### 3.4.3 三总线结构
```mermaid
graph TB
subgraph "三总线结构"
CPU[CPU] <--> |"存储总线"| MEM[主存]
CPU <--> |"I/O总线"| IO[I/O设备]
MEM <--> |"DMA总线"| IO
end
style MEM fill:#99ff99
```
**优点**支持DMA直接内存访问I/O设备可以直接访问内存进一步提高系统性能
三总线增加了仓库和其他部门之间的直达通道DMA总线其他部门可以直接从仓库取货不经过生产车间。现代计算机支持DMA技术硬盘可以直接把数据传到内存不经过CPU。
---
## 3.5 总线控制
### 3.5.1 总线仲裁
> [!info] 定义
> 总线仲裁是解决多个部件同时申请使用总线时,如何决定哪个部件获得总线使用权的机制。
**仲裁方式**
1. **集中式仲裁**:有一个中央仲裁器,控制简单,但有单点故障风险。就像路口的交通警察,指挥统一秩序井然,但如果警察不在交通就乱了。
2. **分布式仲裁**:每个设备都有仲裁逻辑,可靠性高,但控制复杂。就像没有警察,车辆自己按规则(如先到先行)通过,容易混乱但没有单点故障。
传统的电话系统用集中式仲裁,由交换机决定谁先通话;以太网用分布式仲裁,设备自己检测冲突并重试。
### 3.5.2 总线通信控制
**通信方式**
1. **同步通信**:所有操作按统一时钟进行,控制简单,但速度受限于最慢设备。就像全公司统一上下班时间,管理简单但如果某个部门慢其他部门都要等。
2. **异步通信**:没有统一时钟,用握手信号,速度灵活但控制复杂。就像各部门按自己的节奏工作,用"准备好"和"收到"信号协调,各部门可以按自己的速度工作。
工厂的流水线用同步通信,所有工位按同一节奏工作;快递系统用异步通信,快递员按自己的节奏送货,用"已签收"信号确认。
---
## 📝 本章小结
### 核心概念
1. **总线**:连接多个部件的共享传输介质
2. **总线分类**:片内总线、系统总线、通信总线
3. **总线结构**:单总线、双总线、三总线
4. **总线控制**:仲裁方式、通信控制
### 关键术语
| 术语 | 英文 | 含义 |
|------|------|------|
| Bus | Bus | 总线 |
| Arbitration | Arbitration | 仲裁 |
| Synchronous | Synchronous | 同步 |
| Asynchronous | Asynchronous | 异步 |
| DMA | Direct Memory Access | 直接内存访问 |
### 重点图示
> [!summary] 必须掌握的图
> 1. 三种总线结构框图(单总线、双总线、三总线)
> 2. 系统总线的三类(数据、地址、控制)
> 3. 总线仲裁方式
---
## 🧪 例题与解析
### 例题1总线带宽计算
**题目**某计算机总线工作频率为66MHz总线宽度为32位求总线带宽。
**答案**
总线带宽 = 总线频率 × 总线宽度(字节)= 66×10⁶ × 4 = 264×10⁶ 字节/秒 = 264 MBps
这就像一条公路每秒可以通过66百万辆车每辆车能装4个包裹32位=4字节每秒能送264百万个包裹。
### 例题2地址总线计算
**题目**某计算机有20位地址线求该计算机能访问的最大存储单元数。
**答案**
20位地址线可以表示 2²⁰ = 1048576 个地址即能访问1048576个存储单元。
这就像仓库的门牌号系统20位地址线表示门牌号有20位数字最多能编1048576个门牌号。
### 例题3总线结构比较
**题目**:比较单总线结构和双总线结构的优缺点。
**答案**
单总线结构简单、成本低但总线成为瓶颈多设备同时使用会冲突双总线结构复杂、成本高但CPU和I/O可以并行工作总线负担轻系统性能高。
单总线就像一条主干道,所有车辆都走这条路容易堵车;双总线有两条主干道,一条高速一条普通,车辆分流不容易堵车。
### 例题4总线仲裁
**题目**:简述集中式仲裁和分布式仲裁的区别。
**答案**
集中式仲裁有中央仲裁器,控制简单但有单点故障风险;分布式仲裁每个设备都有仲裁逻辑,可靠性高但控制复杂。
集中式仲裁就像路口有警察指挥,秩序井然但警察不在就乱了;分布式仲裁没有警察,车辆自己按规则行驶,没有单点故障但容易混乱。
### 例题5串行与并行通信
**题目**:比较串行通信和并行通信的优缺点。
**答案**
串行通信一位一位传送,速度慢但成本低,适合远距离;并行通信多位同时传送,速度快但成本高,适合近距离。
串行通信就像一个人骑自行车送信成本低适合远距离并行通信就像8个人同时骑自行车送信速度快但成本高。
---
## ⚡ 知识点速记卡
> 考前快速过一遍30秒回忆整章核心
**总线** = 各部件共享的传输介质,同一时刻只能一个部件发送,但多个部件可以同时接收。
**系统总线三类**数据总线双向传数据、地址总线单向CPU输出地址、控制总线有读有写传控制信号
**三种总线结构**:单总线(简单但有瓶颈)→ 双总线CPU-主存专用线+系统总线)→ 三总线再加DMA总线
**总线带宽 = 总线宽度 × 总线频率**。32位宽度、66MHz频率 → 带宽 = 4B × 66M = 264MBps。
**总线仲裁**集中式有中央仲裁器简单但有单点故障vs 分布式(各设备自己仲裁,可靠但复杂)。
**通信方式**同步统一时钟简单但受限于最慢设备vs 异步(握手信号,灵活但复杂)。
**串行 vs 并行**:串行一位一位传,慢但便宜适合远距离;并行多位同时传,快但贵适合近距离。
---
## 🔗 相关链接
- [[00_计算机组成原理学习指南]] - 返回主目录
- [[01_计算机系统概论]] - 上一章
- [[04_存储器]] - 下一章
- [[05_输入输出系统]] - I/O相关内容
---
*本章难度:⭐⭐⭐ 中等*
*重要程度:⭐⭐⭐ 基础*

View File

@@ -0,0 +1,705 @@
# 第4章 存储器
> 📖 本章介绍存储器的分类、工作原理和层次结构,是课程的重点和难点。
> 🎯 重点理解存储层次、主存组成、Cache和虚拟存储器
---
## 📋 本章目录
- [[#4.1 概述]]
- [[#4.2 主存储器]]
- [[#4.3 高速缓冲存储器]]
- [[#4.4 虚拟存储器]]
- [[#本章小结]]
---
## 4.1 概述
### 4.1.1 存储器分类
```mermaid
graph TB
A[存储器分类] --> B[按存储介质]
A --> C[按存取方式]
A --> D[按作用]
B --> B1[半导体存储器]
B --> B2[磁表面存储器]
B --> B3[光盘存储器]
C --> C1[随机存储器RAM]
C --> C2[只读存储器ROM]
C --> C3[串行访问存储器]
D --> D1[主存储器]
D --> D2[辅助存储器]
D --> D3[缓冲存储器Cache]
```
#### 按存储介质分类
| 类型 | 特点 | 示例 |
|------|------|------|
| 半导体存储器 | 体积小、功耗低、速度快、易失性 | SRAM、DRAM |
| 磁表面存储器 | 非易失、容量大、速度慢 | 磁盘、磁带 |
| 光盘存储器 | 非易失、容量大、可移动 | CD、DVD |
#### 按存取方式分类
| 类型 | 特点 | 应用 |
|------|------|------|
| **RAM** | 随机读写、存取时间与位置无关 | 主存 |
| **ROM** | 只读不写(或受限写入) | 固件、BIOS |
| **顺序存取** | 按物理顺序寻找(如磁带) | 磁带 |
| **直接存取** | 先直接定位区域,再顺序寻找(如磁盘) | 磁盘 |
#### RAM和ROM的细分
```mermaid
graph LR
RAM[随机存储器RAM] --> SRAM[静态RAM<br/>触发器原理]
RAM --> DRAM[动态RAM<br/>电容充放电]
ROM[只读存储器ROM] --> MROM[掩模ROM]
ROM --> PROM[可编程ROM]
ROM --> EPROM[可擦除PROM]
ROM --> EEPROM[电擦除PROM]
ROM --> Flash[闪速存储器]
```
### 4.1.2 存储器的层次结构
> [!important] 核心问题
> 速度、容量、价格三者不可兼得,需要通过层次结构解决矛盾。
#### 存储器性能指标关系
```mermaid
graph TB
subgraph "存储器层次结构"
REG["寄存器<br/>速度最快、容量最小、价格最高"] --> CACHE["Cache<br/>高速缓冲存储器"]
CACHE --> MEM["主存储器<br/>主存"]
MEM --> DISK["磁盘<br/>辅助存储器"]
DISK --> TAPE["磁带<br/>辅助存储器"]
end
style REG fill:#ff9999
style CACHE fill:#ffcc99
style MEM fill:#ffff99
style DISK fill:#99ff99
style TAPE fill:#9999ff
```
| 层次 | 速度 | 容量 | 价格 | 位置 |
|------|------|------|------|------|
| 寄存器 | 最快 | 最小 | 最高 | CPU内部 |
| Cache | 很快 | 小 | 高 | CPU内部/外部 |
| 主存 | 较快 | 中等 | 中等 | 主板 |
| 磁盘 | 慢 | 大 | 低 | 外部设备 |
| 磁带 | 最慢 | 最大 | 最低 | 外部设备 |
#### 两个存储层次
```mermaid
graph TB
subgraph "缓存-主存层次"
CPU1[CPU] <--> |"速度接近Cache"| CACHE[Cache]
CACHE <--> |"容量接近主存"| MEM1[主存]
end
subgraph "主存-辅存层次"
MEM2[主存] <--> |"速度接近主存"| DISK[辅存]
CPU2[CPU] -.-> |"不直接访问"| DISK
end
style CPU1 fill:#ff9999
style CPU2 fill:#ff9999
style CACHE fill:#ffcc99
style MEM1 fill:#ffff99
style MEM2 fill:#ffff99
style DISK fill:#99ff99
```
**缓存-主存层次**
- 解决CPU和主存**速度不匹配**问题
- 数据调动由**硬件**自动完成
- 对程序员**透明**
**主存-辅存层次**
- 解决存储系统**容量**问题
- 数据调动由**硬件+操作系统**完成
- 对程序员**透明**
---
## 4.2 主存储器
### 4.2.1 主存的基本组成
```mermaid
graph TB
subgraph "主存结构"
MAR[MAR<br/>地址寄存器] --> |"地址"| DEC[译码器]
DEC --> |"选择信号"| MEM[存储体]
MEM <--> |"数据"| MDR[MDR<br/>数据寄存器]
MDR <--> |"数据"| DBUS[数据总线]
MAR <--> |"地址"| ABUS[地址总线]
CTRL[控制电路] --> |"读写控制"| MEM
end
style MAR fill:#ff9999
style MDR fill:#99ccff
style MEM fill:#99ff99
style DEC fill:#ffcc99
```
**工作过程**
1. **读操作**CPU将地址送MAR → 地址总线 → 译码器选中单元 → 读出数据到MDR → 数据总线
2. **写操作**CPU将地址送MAR数据送MDR → 发写命令 → 数据写入选中单元
### 4.2.2 主存中存储单元地址的分配
#### 字节寻址与字寻址
```mermaid
graph TB
subgraph "IBM 37032位字长"
A1["地址0"] --> B1["字节0"]
A2["地址1"] --> B2["字节1"]
A3["地址2"] --> B3["字节2"]
A4["地址3"] --> B4["字节3"]
A5["地址4字地址"] --> B5["下一个字"]
end
subgraph "PDP-1116位字长"
C1["地址0字地址"] --> D1["字节0"]
C2["地址1"] --> D2["字节1"]
C3["地址2字地址"] --> D3["下一个字"]
end
```
> [!note] 地址表示
> - IBM 370字地址 = 高位字节地址4的倍数
> - PDP-11字地址 = 低位字节地址2的倍数
### 4.2.3 主存的技术指标
#### 1. 存储容量
$$存储容量 = 存储单元个数 \times 存储字长$$
**字节表示**
$$存储容量 = 存储单元个数 \times 存储字长 / 8$$
> [!example] 示例
> 24位地址线按字节寻址
> - 寻址范围:$2^{24} = 16M$ 个字节
> - 若字长32位按字寻址范围 = $16M / 4 = 4M$ 个字
#### 2. 存储速度
| 指标 | 定义 | 关系 |
|------|------|------|
| **存取时间** | 启动一次操作到完成的时间 | 读出时间或写入时间 |
| **存取周期** | 连续两次操作的最小间隔 | 存取周期 > 存取时间 |
| **存储器带宽** | 单位时间存取信息量 | 带宽 = 存储字长 / 存取周期 |
**提高带宽的措施**
1. 缩短存取周期
2. 增加存储字长
3. 增加存储体
### 4.2.4 半导体存储芯片
#### 芯片基本结构
```mermaid
graph LR
subgraph "存储芯片"
ADDR[地址线] --> DEC[译码驱动]
DEC --> MEM[存储矩阵]
MEM <--> RW[读/写电路]
RW <--> DATA[数据线]
CS[片选线] --> DEC
RW_CTRL[读写控制线] --> RW
end
```
**容量计算**
$$芯片容量 = 2^{地址线位数} \times 数据线位数$$
> [!example] 示例
> - 10根地址线4根数据线$2^{10} \times 4 = 4K$ 位
> - 14根地址线1根数据线$2^{14} \times 1 = 16K$ 位
#### 译码驱动方式
| 方式 | 特点 | 适用场景 |
|------|------|----------|
| **线选法** | 一根字线直接选中一个单元 | 容量小的芯片 |
| **重合法** | X、Y两个方向译码交叉点选中 | 大容量芯片 |
```mermaid
graph TB
subgraph "线选法16×1字节"
A1["A3A2A1A0 = 1111"] --> B1["第15根字线选中"]
B1 --> C1["8位数据读出"]
end
subgraph "重合法1K×1位"
A2["地址译码"] --> B2["X方向32根线"]
A2 --> C2["Y方向32根线"]
B2 --> D2["交叉点选中1位"]
C2 --> D2
end
```
### 4.2.5 随机存取存储器RAM
#### 静态RAMSRAM
**基本单元电路**6个MOS管组成的触发器
**特点**
- 用触发器原理寄存信息
- 速度快,不需要刷新
- 集成度低,功耗大
- 用于Cache
**典型芯片**Intel 21141K×4位
#### 动态RAMDRAM
**基本单元电路**1个MOS管 + 电容
**特点**
- 用电容充放电原理寄存信息
- 需要定期**刷新**
- 集成度高,功耗小
- 用于主存
**典型芯片**Intel 411616K×1位
**刷新方式**
| 方式 | 特点 | 效率 |
|------|------|------|
| 集中刷新 | 一段时间集中刷新所有行 | 有死区 |
| 分散刷新 | 每行刷新分散到各周期 | 无死区,效率低 |
| 异步刷新 | 各行刷新均匀分散 | 折中方案 |
#### SRAM vs DRAM 对比
| 特性 | SRAM | DRAM |
|------|------|------|
| 存储原理 | 触发器 | 电容 |
| 速度 | 快 | 较慢 |
| 集成度 | 低 | 高 |
| 功耗 | 大 | 小 |
| 刷新 | 不需要 | 需要 |
| 价格 | 高 | 低 |
| 应用 | Cache | 主存 |
### 4.2.6 只读存储器ROM
| 类型 | 特点 | 应用 |
|------|------|------|
| **MROM** | 厂家掩模制作,不可更改 | 批量生产 |
| **PROM** | 用户可编程一次 | 小批量 |
| **EPROM** | 紫外线擦除,可重复编程 | 开发调试 |
| **EEPROM** | 电擦除,可重复编程 | 参数存储 |
| **Flash** | 电擦除,速度快 | U盘、SSD |
### 4.2.7 存储器与CPU的连接
#### 存储器容量扩展
**三种扩展方式**
```mermaid
graph TB
subgraph "位扩展"
A1["芯片18位"] --> C1["组合16位"]
A2["芯片28位"] --> C1
end
subgraph "字扩展"
B1["芯片11K×8"] --> D1["组合2K×8"]
B2["芯片21K×8"] --> D1
end
subgraph "字位同时扩展"
E1["芯片1"] --> F1["组合"]
E2["芯片2"] --> F1
E3["芯片3"] --> F1
E4["芯片4"] --> F1
end
```
| 扩展方式 | 连接方法 | 应用场景 |
|----------|----------|----------|
| **位扩展** | 地址线、控制线并联,数据线串联 | 增加字长 |
| **字扩展** | 地址线、数据线、控制线并联,片选线用高位地址 | 增加字数 |
| **字位扩展** | 先位扩展,再字扩展 | 大容量存储器 |
#### 存储器与CPU连接示例
```mermaid
graph TB
subgraph "CPU"
MAR[MAR] --> |"地址"| ADDR[地址总线]
MDR[MDR] <--> |"数据"| DATA[数据总线]
CTRL[控制信号] --> |"读写"| RW[读写控制]
end
subgraph "存储器"
ADDR --> |"地址"| CHIP1[芯片1]
ADDR --> |"地址"| CHIP2[芯片2]
CHIP1 <--> |"数据"| DATA
CHIP2 <--> |"数据"| DATA
CS1[片选1] --> CHIP1
CS2[片选2] --> CHIP2
RW --> CHIP1
RW --> CHIP2
end
```
### 4.2.8 存储器的校验
#### 奇偶校验
**原理**增加1位校验位使数据中1的个数为奇数奇校验或偶数偶校验
**特点**
- 简单,只能检测奇数位错误
- 不能纠错
#### 海明码Hamming Code
**原理**:在数据位中插入多个校验位,通过校验位的组合定位错误位。
**校验位数r满足**$2^r \geq m + r + 1$m为数据位数
**特点**
- 可以检测并纠正1位错误
- 可以检测2位错误
> [!example] 示例
> 8位数据需要4位校验码
> - 总位数8 + 4 = 12位
> - 校验位位置1, 2, 4, 8
> - 可纠正1位错误
---
## 4.3 高速缓冲存储器Cache
### 4.3.1 Cache的基本原理
> [!important] 为什么需要Cache
> CPU速度远快于主存Cache作为中间缓冲解决速度不匹配问题。
```mermaid
graph LR
CPU[CPU] <--> |"速度匹配"| CACHE[Cache]
CACHE <--> |"容量大"| MEM[主存]
style CPU fill:#ff9999
style CACHE fill:#ffcc99
style MEM fill:#99ff99
```
**工作原理**
1. CPU访问数据时先查Cache
2. **命中**直接从Cache读取
3. **未命中**从主存读取同时调入Cache
### 4.3.2 Cache命中率
**命中率**
$$H = \frac{N_c}{N_c + N_m}$$
- $N_c$Cache访问次数
- $N_m$:主存访问次数
**平均访问时间**
$$T_a = HT_c + (1-H)T_m$$
**访问效率**
$$e = \frac{T_c}{T_a} = \frac{1}{H + (1-H)r}$$
其中 $r = T_m / T_c$主存与Cache访问时间之比
> [!example] 示例
> Cache命中率95%Cache访问时间10ns主存访问时间100ns
> $$T_a = 0.95 \times 10 + 0.05 \times 100 = 14.5ns$$
> $$e = \frac{10}{14.5} = 69\%$$
### 4.3.3 Cache地址映射
> [!info] 问题
> 主存块如何放入Cache需要地址映射。
#### 三种映射方式
##### 1. 直接映射Direct Mapping
**规则**每个主存块只能映射到Cache的固定行。
**映射公式**$i = j \mod m$
- iCache行号
- j主存块号
- mCache行数
```mermaid
graph LR
subgraph "直接映射"
M0[主存块0] --> C0[Cache行0]
M1[主存块1] --> C1[Cache行1]
Mm[主存块m] --> Cm[Cache行m]
Mm1[主存块m+1] --> C0
end
```
**地址结构**
| 标记Tag | Cache行号Index | 块内地址Offset |
|-------------|-------------------|-------------------|
**优点**:实现简单,查找速度快
**缺点**:灵活性差,命中率低
##### 2. 全相联映射Fully Associative Mapping
**规则**主存块可以映射到Cache的任意行。
```mermaid
graph LR
subgraph "全相联映射"
M0[主存块0] --> |"任意行"| CACHE[Cache]
M1[主存块1] --> |"任意行"| CACHE
Mn[主存块n] --> |"任意行"| CACHE
end
```
**地址结构**
| 标记Tag | 块内地址Offset |
|-------------|-------------------|
**优点**:灵活性好,命中率高
**缺点**:查找速度慢,硬件成本高
##### 3. 组相联映射Set Associative Mapping
**规则**将Cache分组主存块映射到固定组组内任意行。
**映射公式**$q = j \mod u$
- qCache组号
- j主存块号
- uCache组数
```mermaid
graph LR
subgraph "组相联映射"
M0[主存块0] --> G0[Cache组0]
M1[主存块1] --> G1[Cache组1]
Mu[主存块u] --> Gu[Cache组u]
Mu1[主存块u+1] --> G0
end
```
**地址结构**
| 标记Tag | 组号Index | 块内地址Offset |
|-------------|--------------|-------------------|
**优点**:折中方案,兼顾速度和命中率
**应用**现代Cache常用2路、4路、8路组相联
#### 三种映射方式对比
| 方式 | 映射规则 | 灵活性 | 命中率 | 硬件复杂度 |
|------|----------|--------|--------|------------|
| 直接映射 | 固定行 | 差 | 低 | 简单 |
| 全相联映射 | 任意行 | 好 | 高 | 复杂 |
| 组相联映射 | 固定组,任意行 | 中 | 中 | 中等 |
### 4.3.4 Cache替换算法
> [!info] 问题
> Cache满时新块调入需要替换旧块如何选择
#### 常用替换算法
| 算法 | 原则 | 优点 | 缺点 |
|------|------|------|------|
| **FIFO** | 先进先出 | 实现简单 | 不考虑访问频率 |
| **LRU** | 最近最少使用 | 命中率高 | 实现复杂 |
| **LFU** | 最不经常使用 | 考虑频率 | 需要计数器 |
| **随机替换** | 随机选择 | 实现简单 | 命中率不稳定 |
**LRU算法实现**
- 为每行设置计数器
- 每次访问命中行计数器清零其他行加1
- 替换计数器值最大的行
### 4.3.5 Cache写策略
> [!info] 问题
> Cache数据修改后如何与主存保持一致
#### 写策略
| 策略 | 方法 | 优点 | 缺点 |
|------|------|------|------|
| **写直达** | 同时写Cache和主存 | 数据一致性好 | 速度慢 |
| **写回法** | 只写Cache替换时写回主存 | 速度快 | 数据可能不一致 |
```mermaid
graph TB
subgraph "写直达"
CPU1[CPU] --> |"写"| CACHE1[Cache]
CPU1 --> |"同时写"| MEM1[主存]
end
subgraph "写回法"
CPU2[CPU] --> |"写"| CACHE2[Cache]
CACHE2 --> |"替换时写回"| MEM2[主存]
end
```
### 4.3.6 Cache性能分析
**加速比**
$$加速比 = \frac{T_m}{T_a} = \frac{r}{1 + (r-1)H}$$
**Cache容量选择**
- 太小:命中率低
- 太大:成本高,速度可能下降
- 通常几十KB到几MB
---
## 4.4 虚拟存储器
### 4.4.1 虚拟存储器的概念
> [!info] 定义
> 虚拟存储器是一个逻辑模型,程序员看到的地址空间远大于实际主存。
**特点**
- **虚拟地址**(逻辑地址):程序员使用的地址
- **物理地址**(实地址):主存实际地址
- 地址转换由硬件和OS自动完成
```mermaid
graph TB
subgraph "虚拟存储器"
VA[虚拟地址空间<br/>很大] --> |"地址转换"| PA[物理地址空间<br/>较小]
PA --> MEM[主存]
MEM --> DISK[辅存]
end
```
### 4.4.2 页式虚拟存储器
**基本思想**
- 虚拟地址空间划分为固定大小的**页**
- 主存划分为相同大小的**页框**
- 通过**页表**建立映射关系
**地址结构**
| 虚页号 | 页内地址 |
|--------|----------|
**页表项**
| 虚页号 | 实页号 | 有效位 | 修改位 |
|--------|--------|--------|--------|
**地址转换过程**
1. 从虚拟地址取出虚页号
2. 查页表得到实页号
3. 实页号 + 页内地址 = 物理地址
### 4.4.3 TLB快表
> [!info] 问题
> 页表在主存中,每次访问都要查页表,速度慢。
**解决方案**在CPU中设置TLBTranslation Lookaside Buffer
**特点**
- 高速小容量存储器
- 存放最近使用的页表项
- 命中率通常 > 99%
**访问流程**
1. 先查TLB
2. **TLB命中**:直接得到物理地址(快)
3. **TLB未命中**查页表更新TLB
---
## 📝 本章小结
### 核心概念
1. **存储层次**:寄存器 → Cache → 主存 → 辅存
2. **主存组成**:存储体 + MAR + MDR + 译码驱动 + 读写电路
3. **RAM分类**SRAM用于Cache、DRAM用于主存
4. **Cache映射**:直接映射、全相联映射、组相联映射
5. **虚拟存储器**:虚拟地址 → 物理地址的转换
### 关键公式
- **存储容量** = 存储单元个数 × 存储字长
- **Cache命中率** $H = N_c / (N_c + N_m)$
- **平均访问时间** $T_a = HT_c + (1-H)T_m$
- **访问效率** $e = T_c / T_a$
### 重点图示
> [!summary] 必须掌握的图
> 1. 存储器层次结构图
> 2. 主存基本组成框图
> 3. Cache三种映射方式示意图
> 4. Cache访问流程图
---
## 🧪 自测练习
### 概念题
1. 说明存储器层次结构的必要性。
2. 比较SRAM和DRAM的特点。
3. 解释Cache三种映射方式的区别。
### 计算题
1. 某系统Cache命中率90%Cache访问时间20ns主存访问时间200ns求平均访问时间和访问效率。
2. 24位地址线按字节寻址存储字长32位求存储容量。
### 分析题
1. 设计一个16K×8位的存储器使用4K×4位的芯片。
2. 说明Cache写策略的选择依据。
---
## 🔗 相关链接
- [[03_系统总线]] - 上一章
- [[05_输入输出系统]] - 下一章
- [[08_CPU结构与功能]] - CPU访问存储器
- [[06_运算方法]] - 数据表示
---
*本章难度:⭐⭐⭐⭐⭐ 困难*
*重要程度:⭐⭐⭐⭐⭐ 核心重点*

View File

@@ -0,0 +1,682 @@
# 第4章 存储器
> 📖 本章介绍存储器的分类、工作原理和层次结构,是课程的重点和难点。
> 🎯 重点理解存储层次、主存组成、Cache和虚拟存储器
---
## 📋 本章目录
- [[#4.1 概述]]
- [[#4.2 主存储器]]
- [[#4.3 高速缓冲存储器Cache]]
- [[#4.4 虚拟存储器]]
- [[#本章小结]]
- [[#例题与解析]]
---
## 4.1 概述
### 4.1.1 存储器分类
```mermaid
graph TB
A[存储器分类] --> B[按存储介质]
A --> C[按存取方式]
A --> D[按作用]
B --> B1[半导体存储器]
B --> B2[磁表面存储器]
B --> B3[光盘存储器]
C --> C1[随机存储器RAM]
C --> C2[只读存储器ROM]
C --> C3[串行访问存储器]
D --> D1[主存储器]
D --> D2[辅助存储器]
D --> D3[缓冲存储器Cache]
```
#### 按存储介质分类
| 类型 | 特点 | 示例 |
|------|------|------|
| 半导体存储器 | 体积小、功耗低、速度快、易失性 | SRAM、DRAM |
| 磁表面存储器 | 非易失、容量大、速度慢 | 磁盘、磁带 |
| 光盘存储器 | 非易失、容量大、可移动 | CD、DVD |
半导体存储器就像办公室的便签纸写得快但关灯断电就没了比如内存条、Cache磁表面存储器像记事本写得慢但关灯还在比如机械硬盘、磁带光盘存储器像刻在石头上的字只能读不能改或改起来麻烦比如CD、DVD。
#### 按存取方式分类
| 类型 | 特点 | 应用 |
|------|------|------|
| **RAM** | 随机读写、存取时间与位置无关 | 主存 |
| **ROM** | 只读不写(或受限写入) | 固件、BIOS |
| **顺序存取** | 按物理顺序寻找(如磁带) | 磁带 |
| **直接存取** | 先直接定位区域,再顺序寻找(如磁盘) | 磁盘 |
RAM就像图书馆的书架可以直接走到任何一本书前找任何一本书的时间都一样ROM像图书馆的珍本室只能看不能改顺序存取像听磁带要听第5首歌必须快进到第5首直接存取像唱片先移动唱针到大致位置再慢慢找精确位置。
#### RAM和ROM的细分
```mermaid
graph LR
RAM[随机存储器RAM] --> SRAM[静态RAM<br/>触发器原理]
RAM --> DRAM[动态RAM<br/>电容充放电]
ROM[只读存储器ROM] --> MROM[掩模ROM]
ROM --> PROM[可编程ROM]
ROM --> EPROM[可擦除PROM]
ROM --> EEPROM[电擦除PROM]
ROM --> Flash[闪速存储器]
```
SRAM用两个互锁的开关存储信息速度快不需要刷新但体积大功耗高用于CPU的CacheDRAM用电容存储电荷需要定期刷新就像漏水的桶需要不断加水但体积小功耗低用于电脑的内存条。
ROM家族中MROM出厂时就写好了不能改像印刷好的书PROM用户可以写一次像一次性写入的光盘EPROM用紫外线擦除可以重写像用铅笔写的字可以用橡皮擦掉EEPROM用电擦除更方便Flash电擦除速度快容量大用于U盘、SSD。
### 4.1.2 存储器的层次结构
> [!important] 核心问题
> 速度、容量、价格三者不可兼得,需要通过层次结构解决矛盾。
```mermaid
graph TB
subgraph "存储器层次结构"
REG["寄存器<br/>速度最快、容量最小、价格最高"] --> CACHE["Cache<br/>高速缓冲存储器"]
CACHE --> MEM["主存储器<br/>主存"]
MEM --> DISK["磁盘<br/>辅助存储器"]
DISK --> TAPE["磁带<br/>辅助存储器"]
end
style REG fill:#ff9999
style CACHE fill:#ffcc99
style MEM fill:#ffff99
style DISK fill:#99ff99
style TAPE fill:#9999ff
```
| 层次 | 速度 | 容量 | 价格 | 位置 |
|------|------|------|------|------|
| 寄存器 | 最快 | 最小 | 最高 | CPU内部 |
| Cache | 很快 | 小 | 高 | CPU内部/外部 |
| 主存 | 较快 | 中等 | 中等 | 主板 |
| 磁盘 | 慢 | 大 | 低 | 外部设备 |
| 磁带 | 最慢 | 最大 | 最低 | 外部设备 |
这个层次结构可以理解为公司的文件管理系统寄存器是办公桌上的便签伸手就能拿到但只能放几张Cache是办公桌抽屉拉开就能拿到但容量有限主存是办公室的文件柜要站起来走到文件柜前磁盘是公司的档案室要走到档案室磁带是公司的地下室仓库走得最远但容量最大。
#### 两个存储层次
```mermaid
graph TB
subgraph "缓存-主存层次"
CPU1[CPU] <--> |"速度接近Cache"| CACHE[Cache]
CACHE <--> |"容量接近主存"| MEM1[主存]
end
subgraph "主存-辅存层次"
MEM2[主存] <--> |"速度接近主存"| DISK[辅存]
CPU2[CPU] -.-> |"不直接访问"| DISK
end
style CPU1 fill:#ff9999
style CPU2 fill:#ff9999
style CACHE fill:#ffcc99
style MEM1 fill:#ffff99
style MEM2 fill:#ffff99
style DISK fill:#99ff99
```
**缓存-主存层次**解决CPU和主存速度不匹配问题数据调动由硬件自动完成对程序员透明。就像在办公桌上放一个常用文件架找文件时先看文件架上有没有有就直接拿没有就去文件柜拿同时放到文件架上。
**主存-辅存层次**解决存储系统容量问题,数据调动由硬件+操作系统完成,对程序员透明。就像把不常用的文件放到档案室,需要时再取,办公室空间小档案室空间大。
---
## 4.2 主存储器
### 4.2.1 主存的基本组成
```mermaid
graph TB
subgraph "主存结构"
MAR[MAR<br/>地址寄存器] --> |"地址"| DEC[译码器]
DEC --> |"选择信号"| MEM[存储体]
MEM <--> |"数据"| MDR[MDR<br/>数据寄存器]
MDR <--> |"数据"| DBUS[数据总线]
MAR <--> |"地址"| ABUS[地址总线]
CTRL[控制电路] --> |"读写控制"| MEM
end
style MAR fill:#ff9999
style MDR fill:#99ccff
style MEM fill:#99ff99
style DEC fill:#ffcc99
```
**工作过程**
1. **读操作**CPU将地址送MAR → 地址总线 → 译码器选中单元 → 读出数据到MDR → 数据总线
2. **写操作**CPU将地址送MAR数据送MDR → 发写命令 → 数据写入选中单元
主存就像一个巨大的图书馆MAR地址寄存器记住你要找哪本书的书号译码器根据书号找到对应的书架存储体是存放所有书籍的书架MDR数据寄存器暂时存放找到的书控制电路控制是借书还是还书
当你从内存地址1000读取数据时CPU把地址1000放到MAR中MAR通过地址总线把1000传给译码器译码器找到地址1000对应的存储单元存储单元的数据读出到MDRMDR通过数据总线把数据传给CPU。
### 4.2.2 主存中存储单元地址的分配
```mermaid
graph TB
subgraph "IBM 37032位字长"
A1["地址0"] --> B1["字节0"]
A2["地址1"] --> B2["字节1"]
A3["地址2"] --> B3["字节2"]
A4["地址3"] --> B4["字节3"]
A5["地址4字地址"] --> B5["下一个字"]
end
subgraph "PDP-1116位字长"
C1["地址0字地址"] --> D1["字节0"]
C2["地址1"] --> D2["字节1"]
C3["地址2字地址"] --> D3["下一个字"]
end
```
> [!note] 地址表示
> - IBM 370字地址 = 高位字节地址4的倍数
> - PDP-11字地址 = 低位字节地址2的倍数
这就像仓库有两种编号方式IBM 370中每个小格子都有独立编号每4个小格子组成一个大格子大格子的编号是第一个小格子的编号PDP-11中每2个小格子组成一个大格子。
### 4.2.3 主存的技术指标
#### 1. 存储容量
$$存储容量 = 存储单元个数 \times 存储字长$$
**字节表示**
$$存储容量 = 存储单元个数 \times 存储字长 / 8$$
> [!example] 示例
> 24位地址线按字节寻址
> - 寻址范围:$2^{24} = 16M$ 个字节
> - 若字长32位按字寻址范围 = $16M / 4 = 4M$ 个字
存储容量就像仓库的大小存储单元个数是仓库有多少个格子存储字长是每个格子能放多少东西。假设一个仓库有1024个格子每个格子能放8个鸡蛋总容量就是1024×8=8192个鸡蛋=1KB。
#### 2. 存储速度
| 指标 | 定义 | 关系 |
|------|------|------|
| **存取时间** | 启动一次操作到完成的时间 | 读出时间或写入时间 |
| **存取周期** | 连续两次操作的最小间隔 | 存取周期 > 存取时间 |
| **存储器带宽** | 单位时间存取信息量 | 带宽 = 存储字长 / 存取周期 |
存取时间就像从你要一本书到拿到书的时间;存取周期是连续两次取书的最小间隔,比存取时间长因为管理员需要休息;存储器带宽是单位时间能取多少本书。
假设存储字长为32位4字节存取周期为100ns带宽 = 32位/100ns = 4字节/100ns = 40MBps。
### 4.2.4 半导体存储芯片
```mermaid
graph LR
subgraph "存储芯片"
ADDR[地址线] --> DEC[译码驱动]
DEC --> MEM[存储矩阵]
MEM <--> RW[读/写电路]
RW <--> DATA[数据线]
CS[片选线] --> DEC
RW_CTRL[读写控制线] --> RW
end
```
**容量计算**
$$芯片容量 = 2^{地址线位数} \times 数据线位数$$
存储芯片就像一个小型仓库:地址线告诉仓库你要哪个格子的东西,数据线传送你拿到的东西,译码驱动根据地址找到对应的格子,存储矩阵是存放所有东西的格子,读/写电路控制是取东西还是放东西,片选线选择是哪个仓库。
一个存储芯片有10根地址线和4根数据线容量 = 2¹⁰ × 4 = 1024 × 4 = 4096位 = 512字节。
#### 译码驱动方式
| 方式 | 特点 | 适用场景 |
|------|------|----------|
| **线选法** | 一根字线直接选中一个单元 | 容量小的芯片 |
| **重合法** | X、Y两个方向译码交叉点选中 | 大容量芯片 |
线选法就像图书馆的书架每个格子都有独立的编号你说要第15本书管理员直接走到第15个格子重合法就像电影院的座位用行号和列号定位你说要第3排第5个座位管理员先找第3排再找第5个。
16个格子用线选法需要16根选择线1024个格子用重合法只需要64根线32根X方向+32根Y方向
### 4.2.5 随机存取存储器RAM
#### 静态RAMSRAM
**基本单元电路**6个MOS管组成的触发器
**特点**
- 用触发器原理寄存信息
- 速度快,不需要刷新
- 集成度低,功耗大
- 用于Cache
SRAM就像一个稳定的开关用两个互锁的开关存储信息状态改变很快且稳定不需要刷新但每个存储单元需要6个晶体管体积大。CPU的L1、L2、L3 Cache通常使用SRAM。
#### 动态RAMDRAM
**基本单元电路**1个MOS管 + 电容
**特点**
- 用电容充放电原理寄存信息
- 需要定期**刷新**
- 集成度高,功耗小
- 用于主存
DRAM就像一个漏水的桶用电容存储电荷表示0和1但电容会漏电需要定期补充刷新每个存储单元只需要1个晶体管和1个电容体积小。电脑的8GB内存条通常使用DRAM。
**刷新方式**
| 方式 | 特点 | 效率 |
|------|------|------|
| 集中刷新 | 一段时间集中刷新所有行 | 有死区 |
| 分散刷新 | 每行刷新分散到各周期 | 无死区,效率低 |
| 异步刷新 | 各行刷新均匀分散 | 折中方案 |
集中刷新就像每隔一段时间暂停所有工作集中给所有桶加水,有死区;分散刷新每次取水后顺便给这个桶加点水,没有死区但效率低;异步刷新把加水任务均匀分配到各个时间段,没有死区效率较高。
#### SRAM vs DRAM 对比
| 特性 | SRAM | DRAM |
|------|------|------|
| 存储原理 | 触发器 | 电容 |
| 速度 | 快 | 较慢 |
| 集成度 | 低 | 高 |
| 功耗 | 大 | 小 |
| 刷新 | 不需要 | 需要 |
| 价格 | 高 | 低 |
| 应用 | Cache | 主存 |
SRAM像高级记事本用特殊墨水写上就不掉写得快不用维护但贵容量小用于记录重要信息CacheDRAM像普通记事本用铅笔写容易掉写得较慢需要经常描但便宜容量大用于记录一般信息主存
### 4.2.6 只读存储器ROM
| 类型 | 特点 | 应用 |
|------|------|------|
| **MROM** | 厂家掩模制作,不可更改 | 批量生产 |
| **PROM** | 用户可编程一次 | 小批量 |
| **EPROM** | 紫外线擦除,可重复编程 | 开发调试 |
| **EEPROM** | 电擦除,可重复编程 | 参数存储 |
| **Flash** | 电擦除,速度快 | U盘、SSD |
MROM像印刷好的书出厂时就印好了不能改成本低适合批量生产PROM像一次性写入的光盘用户可以写一次但不能改EPROM像用铅笔写的书可以用橡皮擦掉重写EEPROM用电子橡皮擦更方便Flash是高速电子橡皮擦又快又大。
### 4.2.7 存储器与CPU的连接
#### 存储器容量扩展
**三种扩展方式**
```mermaid
graph TB
subgraph "位扩展"
A1["芯片18位"] --> C1["组合16位"]
A2["芯片28位"] --> C1
end
subgraph "字扩展"
B1["芯片11K×8"] --> D1["组合2K×8"]
B2["芯片21K×8"] --> D1
end
subgraph "字位同时扩展"
E1["芯片1"] --> F1["组合"]
E2["芯片2"] --> F1
E3["芯片3"] --> F1
E4["芯片4"] --> F1
end
```
| 扩展方式 | 连接方法 | 应用场景 |
|----------|----------|----------|
| **位扩展** | 地址线、控制线并联,数据线串联 | 增加字长 |
| **字扩展** | 地址线、数据线、控制线并联,片选线用高位地址 | 增加字数 |
| **字位扩展** | 先位扩展,再字扩展 | 大容量存储器 |
位扩展就像把两个小盒子并排增加每个格子的容量两个8位的芯片合并成16位字扩展就像增加更多的格子两个1K×8的芯片组合成2K×8字位扩展先增加每个格子的容量再增加格子数量。
### 4.2.8 存储器的校验
#### 奇偶校验
**原理**增加1位校验位使数据中1的个数为奇数奇校验或偶数偶校验
**特点**:简单,只能检测奇数位错误,不能纠错。
奇校验让数据中1的个数为奇数比如数据 `10110001` 有4个1偶数校验位设为1变成 `101100011`5个1偶校验让数据中1的个数为偶数。接收方检查1的个数是否符合约定不符合说明有错误。
#### 海明码Hamming Code
**原理**:在数据位中插入多个校验位,通过校验位的组合定位错误位。
**校验位数r满足**$2^r \geq m + r + 1$m为数据位数
**特点**可以检测并纠正1位错误可以检测2位错误。
8位数据需要4位校验码总位数12位校验位位置1、2、4、8可以纠正1位错误。对于8位数据m=8$2^3 = 8 \geq 12$不满足,$2^4 = 16 \geq 13$满足所以需要4位校验码。
---
## 4.3 高速缓冲存储器Cache
### 4.3.1 Cache的基本原理
> [!important] 为什么需要Cache
> CPU速度远快于主存Cache作为中间缓冲解决速度不匹配问题。
```mermaid
graph LR
CPU[CPU] <--> |"速度匹配"| CACHE[Cache]
CACHE <--> |"容量大"| MEM[主存]
style CPU fill:#ff9999
style CACHE fill:#ffcc99
style MEM fill:#99ff99
```
**工作原理**
1. CPU访问数据时先查Cache
2. **命中**直接从Cache读取
3. **未命中**从主存读取同时调入Cache
Cache就像办公桌上的常用文件架CPU找文件很快但文件柜主存找文件慢所以在桌上放一个常用文件架。找文件时先看文件架上有没有有就直接拿命中没有就去文件柜拿同时放到文件架上未命中
### 4.3.2 Cache命中率
**命中率**
$$H = \frac{N_c}{N_c + N_m}$$
**平均访问时间**
$$T_a = HT_c + (1-H)T_m$$
**访问效率**
$$e = \frac{T_c}{T_a} = \frac{1}{H + (1-H)r}$$
其中 $r = T_m / T_c$主存与Cache访问时间之比
> [!example] 示例
> Cache命中率95%Cache访问时间10ns主存访问时间100ns
> $$T_a = 0.95 \times 10 + 0.05 \times 100 = 14.5ns$$
> $$e = \frac{10}{14.5} = 69\%$$
命中率就像在文件架上找到文件的概率。假设文件架上找到文件的概率是95%从文件架拿文件需要10秒去文件柜拿需要100秒平均每次拿文件需要0.95×10+0.05×100=14.5秒效率10/14.5=69%。
如果命中率提高到99%平均访问时间变为0.99×10+0.01×100=10.9ns,效率提高很多。
### 4.3.3 Cache地址映射
> [!info] 问题
> 主存块如何放入Cache需要地址映射。
#### 1. 直接映射Direct Mapping
**规则**每个主存块只能映射到Cache的固定行。
**映射公式**$i = j \mod m$
- iCache行号
- j主存块号
- mCache行数
```mermaid
graph LR
subgraph "直接映射"
M0[主存块0] --> C0[Cache行0]
M1[主存块1] --> C1[Cache行1]
Mm[主存块m] --> Cm[Cache行m]
Mm1[主存块m+1] --> C0
end
```
**地址结构**
| 标记Tag | Cache行号Index | 块内地址Offset |
|-------------|-------------------|-------------------|
**优点**:实现简单,查找速度快
**缺点**:灵活性差,命中率低
直接映射就像图书馆的固定书架,每本书只能放在固定的书架上。要找某本书直接去对应的书架找,找得快但位置固定,如果两本书都想放在同一个书架就会冲突。
假设Cache有4行主存有8块主存块0→Cache行00 mod 4=0主存块1→Cache行1主存块2→Cache行2主存块3→Cache行3主存块4→Cache行0冲突
#### 2. 全相联映射Fully Associative Mapping
**规则**主存块可以映射到Cache的任意行。
```mermaid
graph LR
subgraph "全相联映射"
M0[主存块0] --> |"任意行"| CACHE[Cache]
M1[主存块1] --> |"任意行"| CACHE
Mn[主存块n] --> |"任意行"| CACHE
end
```
**地址结构**
| 标记Tag | 块内地址Offset |
|-------------|-------------------|
**优点**:灵活性好,命中率高
**缺点**:查找速度慢,硬件成本高
全相联映射就像图书馆的自由书架,每本书可以放在任何书架上,灵活不会冲突,但找得慢因为要搜索所有书架。
#### 3. 组相联映射Set Associative Mapping
**规则**将Cache分组主存块映射到固定组组内任意行。
**映射公式**$q = j \mod u$
- q组号
- j主存块号
- u组数
**地址结构**
| 标记Tag | 组号Index | 块内地址Offset |
|-------------|--------------|-------------------|
**优点**:折中方案,兼顾速度和灵活性
**缺点**:实现复杂度中等
组相联映射就像图书馆的分组书架,每本书只能放在固定的组,但可以放在组内的任何书架上。先找对应的组,再在组内搜索,比直接映射灵活,比全相联映射快。
### 4.3.4 Cache替换策略
> [!info] 问题
> 当Cache满时需要替换哪一行需要替换策略。
| 策略 | 规则 | 优点 | 缺点 |
|------|------|------|------|
| **FIFO** | 先进先出 | 实现简单 | 可能替换常用数据 |
| **LRU** | 最近最少使用 | 命中率高 | 实现复杂 |
| **LFU** | 最不经常使用 | 考虑频率 | 需要计数器 |
| **随机替换** | 随机选择 | 实现简单 | 性能不稳定 |
FIFO先进先出最早放上去的文件先被替换简单但可能把常用文件拿走LRU最近最少使用最近最少用的文件先被替换常用文件不容易被替换命中率高LFU最不经常使用使用次数最少的文件先被替换随机替换随机选择一个文件替换实现简单但性能不稳定。
### 4.3.5 Cache写策略
> [!info] 问题
> 当CPU写数据时如何保证Cache和主存数据一致性需要写策略。
| 策略 | 规则 | 优点 | 缺点 |
|------|------|------|------|
| **写直达** | 同时写Cache和主存 | 数据一致 | 速度慢 |
| **写回** | 只写Cache替换时写回主存 | 速度快 | 数据可能不一致 |
写直达每次修改文件同时修改文件架和文件柜数据一致但每次都要去文件柜速度慢写回只修改文件架等文件架满了要替换时才去文件柜修改速度快但数据可能不一致。大多数Cache系统用写回策略因为速度快。
---
## 4.4 虚拟存储器
### 4.4.1 虚拟存储器的基本概念
> [!info] 定义
> 虚拟存储器是一种通过硬件和软件结合,使程序认为自己拥有连续完整内存的技术。
虚拟存储器就像一个魔法书架:你的书架(主存)很小,但你的书(程序)很多,通过魔法让你觉得有一个很大的书架。只把常用的书放在书架上,不常用的书放在地下室(辅存),当你要看不在书架上的书时,魔法自动把书从地下室取来。
Windows的虚拟内存系统主存是电脑的8GB内存辅存是硬盘上的页面文件让程序认为自己有32GB内存。
### 4.4.2 页式虚拟存储器
**基本概念**
- **页面**把程序和内存分成固定大小的块通常4KB
- **页表**:记录虚拟页面和物理页面的对应关系
- **缺页中断**:当访问的页面不在内存时,产生中断,从辅存调入
页式虚拟存储器就像图书馆的借书系统:页面是每本书分成固定大小的章节,页表是图书馆的借书记录,记录哪些章节在图书馆(内存)哪些在外面(辅存),缺页中断是你要看的章节不在图书馆需要去外面取。
### 4.4.3 段式虚拟存储器
**基本概念**
- **段**:把程序按逻辑分成不同的段(代码段、数据段等)
- **段表**:记录段的起始地址和长度
- **段错误**:访问越界时产生错误
段式虚拟存储器就像图书馆的分类系统:段是图书馆按类别分成不同的区域(科技区、文学区等),段表是图书馆的区域地图,记录每个区域的位置和大小,段错误是你要去科技区却走到了文学区越界了。
### 4.4.4 段页式虚拟存储器
**基本概念**
- **结合**:先分段,再分页
- **优点**:兼顾段式和页式的优点
- **缺点**:实现复杂
段页式虚拟存储器先按类别分成不同的区域,每个区域再分成固定大小的书架,既方便分类管理又方便查找。现代操作系统大多采用段页式虚拟存储器。
---
## 📝 本章小结
### 核心概念
1. **存储器层次**:寄存器 → Cache → 主存 → 辅存
2. **主存组成**MAR、译码器、存储体、MDR、控制电路
3. **Cache原理**解决CPU和主存速度不匹配
4. **虚拟存储器**:解决主存容量不足
### 关键术语
| 术语 | 英文 | 含义 |
|------|------|------|
| Cache | Cache | 高速缓冲存储器 |
| SRAM | Static RAM | 静态随机存取存储器 |
| DRAM | Dynamic RAM | 动态随机存取存储器 |
| Hit Rate | Hit Rate | 命中率 |
| Virtual Memory | Virtual Memory | 虚拟存储器 |
### 重点图示
> [!summary] 必须掌握的图
> 1. 存储器层次结构图
> 2. 主存组成框图
> 3. Cache地址映射方式
> 4. 虚拟存储器工作原理
---
## 🧪 例题与解析
### 例题1存储容量计算
**题目**某计算机有24位地址线8位数据线按字节寻址求存储容量。
**答案**
24位地址线可以表示 2²⁴ = 16777216 个地址8位数据线表示每个单元存8位数据1字节存储容量 = 16777216 × 8位 = 16777216字节 = 16MB。
这就像一个仓库有16777216个格子每个格子能放8个鸡蛋总容量就是16MB。
### 例题2Cache命中率计算
**题目**某计算机Cache命中率为90%Cache访问时间为20ns主存访问时间为200ns求平均访问时间和访问效率。
**答案**
平均访问时间 $T_a = 0.9 × 20 + 0.1 × 200 = 18 + 20 = 38ns$
访问效率 $e = 20/38 = 52.6\%$
就像90%的时候你要的书在书架上从书架拿书需要20秒去档案室拿需要200秒平均每次拿书需要38秒效率52.6%。
### 例题3Cache地址映射
**题目**某计算机Cache有4行采用直接映射主存有16块求主存块5映射到Cache的哪一行
**答案**
映射公式 $i = j \mod m = 5 \mod 4 = 1$主存块5映射到Cache的第1行。
这就像4个书架书号除以书架数余数就是书架号5÷4=1余1第5本书在第1个书架上。
### 例题4存储器扩展
**题目**用1K×4位的芯片组成4K×8位的存储器需要多少芯片如何连接
**答案**
位扩展8位÷4位=2个芯片增加字长字扩展4K÷1K=4组增加字数总芯片数2×4=8个。
先位扩展每2个芯片组成1K×8位地址线、控制线并联数据线串联再字扩展4组1K×8位组成4K×8位地址线、数据线、控制线并联用高位地址选择是哪一组。
### 例题5海明码计算
**题目**对于8位数据需要多少位海明码校验位写出校验位的位置。
**答案**
校验位数r满足 $2^r \geq m + r + 1$对于8位数据m=8r=3时 $2^3=8 \geq 12$ 不满足r=4时 $2^4=16 \geq 13$ 满足所以需要4位校验码。
校验位放在2的幂次方位置1、2、4、8数据位放在其他位置3、5、6、7、9、10、11、12。
---
## ⚡ 知识点速记卡
> 考前快速过一遍30秒回忆整章核心
**存储层次**(从快到慢、从小到大):寄存器 → Cache → 主存 → 磁盘 → 磁带。速度和容量不可兼得,靠层次结构解决。
**SRAM vs DRAM**SRAM用触发器快、不用刷新、贵、用于CacheDRAM用电容慢、要刷新、便宜、用于主存。
**主存组成**MAR地址→ 译码器 → 存储体 ↔ MDR数据加上控制电路。
**容量扩展三种方式**:位扩展(增加字长,数据线串联)、字扩展(增加字数,片选线用高位地址)、字位同时扩展。
**Cache三个核心问题**:①映射(直接/全相联/组相联②替换FIFO/LRU/LFU/随机)③写策略(写直达/写回)。
**Cache命中率公式**:平均访问时间 T_a = H·T_c + (1-H)·T_m。命中率95%、Cache 10ns、主存100ns → T_a = 14.5ns。
**直接映射**i = j mod m主存块号 mod Cache行数简单但冲突多。**组相联**:折中方案,先定组再组内任意放。
**虚拟存储器**:页式(固定大小页面+页表)、段式(逻辑分段+段表)、段页式(先分段再分页)。
**海明码**校验位数r满足 2^r ≥ m+r+18位数据需要4位校验码可纠正1位错误。
---
## 🔗 相关链接
- [[00_计算机组成原理学习指南]] - 返回主目录
- [[03_系统总线]] - 上一章
- [[05_输入输出系统]] - 下一章
- [[06_运算方法]] - 数据表示相关内容
---
*本章难度:⭐⭐⭐⭐⭐ 困难*
*重要程度:⭐⭐⭐⭐⭐ 重点*

View File

@@ -0,0 +1,583 @@
# 第5章 输入输出系统
> 📖 本章介绍I/O设备与主机交换信息的三种控制方式程序查询、中断和DMA。
> 🎯 重点理解中断处理过程和DMA工作原理
---
## 📋 本章目录
- [[#5.1 概述]]
- [[#5.2 I/O设备]]
- [[#5.3 接口]]
- [[#5.4 程序查询方式]]
- [[#5.5 程序中断方式]]
- [[#5.6 DMA方式]]
- [[#本章小结]]
---
## 5.1 概述
### 5.1.1 输入输出系统的发展
```mermaid
graph LR
A[早期阶段] --> B[接口模块阶段]
B --> C[DMA阶段]
C --> D[通道阶段]
D --> E[IO处理机阶段]
style A fill:#ff9999
style B fill:#ffcc99
style C fill:#ffff99
style D fill:#99ff99
style E fill:#99ccff
```
| 阶段 | 特点 | CPU参与度 |
|------|------|----------|
| 早期阶段 | IO设备直接连CPU串行工作 | 完全参与 |
| 接口模块阶段 | 通过接口连接,可并行工作 | 部分参与 |
| DMA阶段 | IO与主存直接通路CPU不参与数据传输 | 少量参与 |
| 通道阶段 | 通道独立管理IO | 不参与 |
| IO处理机阶段 | IO处理机独立工作 | 不参与 |
### 5.1.2 输入输出系统的组成
```mermaid
graph TB
A[输入输出系统] --> B[I/O软件]
A --> C[I/O硬件]
B --> B1[I/O指令]
B --> B2[通道指令]
B --> B3[管理程序]
C --> C1[I/O接口]
C --> C2[I/O设备]
```
#### I/O指令格式
```mermaid
graph LR
subgraph "I/O指令格式"
OP[操作码] --> CMD[命令码] --> DEV[设备码]
end
```
**命令码功能**
- 数据输入IO → CPU
- 数据输出CPU → IO
- 状态测试(查询设备状态)
- 形成操作命令
---
## 5.2 I/O设备
### 5.2.1 I/O设备分类
| 类型 | 设备 | 特点 |
|------|------|------|
| 输入设备 | 键盘、鼠标、扫描仪 | 人 → 机 |
| 输出设备 | 显示器、打印机 | 机 → 人 |
| 外存储器 | 磁盘、磁带、光盘 | 存储信息 |
### 5.2.2 I/O设备与主机联系方式
```mermaid
graph TB
subgraph "联系方式"
A[I/O设备] --> B[编址方式]
B --> B1[统一编址]
B --> B2[独立编址]
A --> C[联络方式]
C --> C1[立即响应]
C --> C2[异步联络]
C --> C3[同步联络]
A --> D[连接方式]
D --> D1[辐射式]
D --> D2[总线式]
end
```
---
## 5.3 接口
### 5.3.1 接口的功能
> [!info] 接口定义
> 接口是主机与I/O设备之间的桥梁实现数据缓冲、格式转换和控制信号传递。
**主要功能**
1. **选址功能**:识别设备地址
2. **传送命令**接收并执行CPU命令
3. **传送数据**:缓冲数据传输
4. **反映状态**向CPU报告设备状态
### 5.3.2 接口的组成
```mermaid
graph TB
subgraph "I/O接口"
DR[数据缓冲寄存器] <--> |"数据"| DATA[数据总线]
CR[控制/状态寄存器] <--> |"控制"| CTRL[控制总线]
AR[设备选择电路] <--> |"地址"| ADDR[地址总线]
DR --> |"数据"| DEV[I/O设备]
CR --> |"控制"| DEV
end
```
**寄存器说明**
| 寄存器 | 功能 | 方向 |
|--------|------|------|
| 数据缓冲寄存器 | 暂存传输数据 | 双向 |
| 控制寄存器 | 存放CPU命令 | CPU→接口 |
| 状态寄存器 | 存放设备状态 | 接口→CPU |
| 设备选择电路 | 识别设备地址 | CPU→接口 |
### 5.3.3 接口类型
| 类型 | 特点 | 应用 |
|------|------|------|
| 并行接口 | 数据并行传输 | 近距离 |
| 串行接口 | 数据串行传输 | 远距离 |
| 可编程接口 | 功能可编程设置 | 灵活应用 |
---
## 5.4 程序查询方式
### 5.4.1 工作原理
> [!info] 核心思想
> CPU主动查询I/O设备状态设备准备好后才进行数据传输。
```mermaid
sequenceDiagram
participant CPU
participant IO as I/O设备
loop 查询过程
CPU->>IO: 查询状态
IO-->>CPU: 返回状态
alt 设备未就绪
Note over CPU: 继续查询
else 设备就绪
CPU->>IO: 传输数据
IO-->>CPU: 完成传输
end
end
```
### 5.4.2 程序流程
```mermaid
graph TB
START[开始] --> INIT[初始化]
INIT --> QUERY[查询状态]
QUERY --> CHECK{就绪?}
CHECK -->|否| QUERY
CHECK -->|是| TRANS[传输数据]
TRANS --> NEXT[下一个数据?]
NEXT -->|是| QUERY
NEXT -->|否| END[结束]
```
### 5.4.3 特点分析
| 优点 | 缺点 |
|------|------|
| 实现简单 | CPU效率低 |
| 硬件成本低 | 实时性差 |
| 易于理解 | 不能并行工作 |
> [!warning] 适用场景
> 适用于I/O设备较少、数据传输不频繁的简单系统。
---
## 5.5 程序中断方式
### 5.5.1 中断的概念
> [!info] 定义
> 中断是指CPU暂停现行程序转去处理中断请求处理完毕后返回原程序继续执行。
```mermaid
sequenceDiagram
participant CPU
participant IO as I/O设备
Note over CPU: 执行主程序
CPU->>IO: 启动设备
Note over CPU: 继续执行主程序
Note over IO: 设备准备数据
IO->>CPU: 中断请求
Note over CPU: 保存现场
CPU->>IO: 中断响应
Note over CPU: 执行中断服务程序
CPU->>IO: 传输数据
Note over CPU: 恢复现场
Note over CPU: 返回主程序
```
### 5.5.2 中断系统的功能
#### 1. 中断请求
```mermaid
graph LR
subgraph "中断请求信号"
INTR[INTR<br/>可屏蔽中断] --> CPU
NMI[NMI<br/>不可屏蔽中断] --> CPU
end
```
**中断源分类**
- **外部中断**I/O设备请求、定时器中断
- **内部中断**:溢出、除零、缺页
#### 2. 中断判优
> [!info] 问题
> 多个中断同时请求时,如何确定优先级?
**判优方法**
| 方法 | 原理 | 特点 |
|------|------|------|
| 硬件判优 | 硬件优先级电路 | 速度快 |
| 软件判优 | 程序查询顺序 | 灵活,速度慢 |
**优先级原则**
- 硬件故障 > 软件中断
- 高速设备 > 低速设备
- 输入 > 输出
- 实时设备 > 普通设备
#### 3. 中断响应
**响应条件**
1. 中断源有请求
2. CPU允许中断开中断
3. 一条指令执行完毕
4. 没有更高优先级中断
**响应过程**
1. 关中断
2. 保存断点PC、PSW
3. 识别中断源
4. 转入中断服务程序
#### 4. 中断处理
```mermaid
graph TB
subgraph "中断处理过程"
A[关中断] --> B[保存断点]
B --> C[保存现场]
C --> D[识别中断源]
D --> E[执行中断服务程序]
E --> F[恢复现场]
F --> G[开中断]
G --> H[返回断点]
end
```
#### 5. 中断返回
**返回指令**IRET中断返回
**功能**
1. 恢复断点PC
2. 恢复程序状态字PSW
3. 开中断
### 5.5.3 中断服务程序流程
```mermaid
graph TB
START[中断响应] --> SAVE1[保存断点]
SAVE1 --> SAVE2[保存现场]
SAVE2 --> EI[开中断]
EI --> SERVICE[执行服务程序]
SERVICE --> DI[关中断]
DI --> RESTORE1[恢复现场]
RESTORE1 --> RESTORE2[恢复断点]
RESTORE2 --> RET[中断返回]
```
> [!note] 现场保存
> - **断点**由硬件自动保存PC、PSW
> - **现场**:由软件保存(通用寄存器)
### 5.5.4 多重中断
> [!info] 概念
> 在处理中断时,允许更高优先级的中断打断当前中断处理。
**实现方法**
1. 中断服务程序开始时**关中断**
2. 保存现场后**开中断**
3. 允许更高优先级中断
4. 返回前**关中断**
```mermaid
sequenceDiagram
participant CPU
participant IO1 as 低优先级设备
participant IO2 as 高优先级设备
Note over CPU: 执行主程序
IO1->>CPU: 中断请求1
Note over CPU: 保存现场,开中断
Note over CPU: 执行服务程序1
IO2->>CPU: 中断请求2优先级高
Note over CPU: 保存现场,开中断
Note over CPU: 执行服务程序2
Note over CPU: 恢复现场,返回
Note over CPU: 继续服务程序1
Note over CPU: 恢复现场,返回
Note over CPU: 继续主程序
```
### 5.5.5 中断接口
```mermaid
graph TB
subgraph "中断接口"
DR[数据缓冲寄存器] <--> DATA[数据总线]
AR[设备选择电路] <--> ADDR[地址总线]
IR[中断请求触发器] --> INTR[INTR线]
IM[中断屏蔽触发器] --> MASK[屏蔽信号]
READY[准备就绪触发器] --> DR
end
```
**关键触发器**
- **中断请求触发器IR**:记录中断请求
- **中断屏蔽触发器IM**:控制中断是否允许
- **准备就绪触发器READY**:设备是否就绪
### 5.5.6 程序中断方式特点
| 优点 | 缺点 |
|------|------|
| CPU效率提高 | 保护和恢复现场开销 |
| 实时性好 | 硬件成本增加 |
| 可处理突发事件 | 程序设计复杂 |
---
## 5.6 DMA方式
### 5.6.1 DMA的基本概念
> [!info] 定义
> DMADirect Memory Access是I/O设备与主存直接进行数据交换不经过CPU的方式。
```mermaid
graph TB
subgraph "DMA方式"
CPU[CPU] <--> |"控制"| DMA[DMA控制器]
DMA <--> |"数据"| MEM[主存]
DMA <--> |"数据"| IO[I/O设备]
CPU -.-> |"不参与数据传输"| MEM
end
```
**特点**
- 数据传输不经过CPU
- CPU与I/O设备并行工作
- 适用于高速I/O设备
### 5.6.2 DMA与中断方式对比
| 特性 | 中断方式 | DMA方式 |
|------|----------|---------|
| 数据传输 | 通过CPU | 直接访问主存 |
| CPU参与 | 参与每次传输 | 只参与启动和结束 |
| 传输单位 | 字 | 数据块 |
| 适用速度 | 中低速设备 | 高速设备 |
| 开销 | 保护/恢复现场 | 硬件成本 |
### 5.6.3 DMA传送方式
#### 1. 停止CPU访问主存
```mermaid
sequenceDiagram
participant CPU
participant DMA
participant MEM as 主存
Note over CPU: 正常访问主存
DMA->>CPU: DMA请求
Note over CPU: 停止访问主存
DMA->>MEM: 数据传输
Note over CPU: 等待
DMA->>CPU: DMA结束
Note over CPU: 恢复访问主存
```
**特点**CPU处于空闲状态效率低
#### 2. 周期挪用Cycle Stealing
```mermermaid
sequenceDiagram
participant CPU
participant DMA
participant MEM as 主存
Note over CPU: 执行指令
DMA->>DMA: DMA请求
Note over DMA: 等待CPU周期结束
DMA->>MEM: 挪用一个周期传输
Note over CPU: 继续执行
Note over DMA: 重复挪用
```
**特点**CPU效率影响小常用
#### 3. DMA与CPU交替访问
```mermaid
sequenceDiagram
participant CPU
participant DMA
participant MEM as 主存
Note over CPU,DMA: CPU周期
CPU->>MEM: CPU访问
Note over CPU,DMA: DMA周期
DMA->>MEM: DMA访问
Note over CPU,DMA: 交替进行
```
**特点**:效率最高,硬件复杂
### 5.6.4 DMA控制器组成
```mermaid
graph TB
subgraph "DMA控制器"
AR[地址寄存器] <--> |"地址"| MEM[主存]
WC[字计数器] --> |"计数"| CTRL[控制逻辑]
DAR[数据缓冲寄存器] <--> |"数据"| IO[I/O设备]
CSR[控制状态寄存器] <--> |"控制"| CPU
CTRL --> |"请求"| DREQ[DREQ线]
CTRL <--> |"响应"| DACK[DACK线]
end
```
**寄存器功能**
| 寄存器 | 功能 |
|--------|------|
| 地址寄存器AR | 存放主存地址,每次传输后+1 |
| 字计数器WC | 存放传输字数,每次传输后-1 |
| 数据缓冲寄存器DAR | 暂存传输数据 |
| 控制状态寄存器CSR | 存放控制命令和状态 |
### 5.6.5 DMA传送过程
```mermaid
graph TB
subgraph "DMA传送过程"
A[CPU初始化DMA] --> B[DMA请求]
B --> C[DMA响应]
C --> D[数据传输]
D --> E{传输完成?}
E -->|否| D
E -->|是| F[DMA结束]
F --> G[中断CPU]
G --> H[CPU处理]
end
```
**详细步骤**
1. **预处理**CPU完成
- 设置起始地址
- 设置传输字数
- 设置传输方向
- 启动DMA
2. **数据传输**DMA完成
- 地址送主存
- 发读/写命令
- 数据传输
- 地址+1字计数-1
3. **后处理**CPU完成
- 检测传输是否出错
- 是否继续传输
### 5.6.6 DMA方式特点
| 优点 | 缺点 |
|------|------|
| 传输速度快 | 硬件成本高 |
| CPU效率高 | 控制复杂 |
| 适用于高速设备 | 需要额外硬件 |
---
## 📝 本章小结
### 核心概念
1. **三种IO方式**程序查询、程序中断、DMA
2. **中断处理**:中断请求 → 判优 → 响应 → 处理 → 返回
3. **DMA方式**直接访问主存CPU不参与数据传输
### 关键对比
| 方式 | CPU参与度 | 传输单位 | 速度 | 复杂度 |
|------|----------|----------|------|--------|
| 程序查询 | 完全 | 字 | 慢 | 低 |
| 程序中断 | 部分 | 字 | 中 | 中 |
| DMA | 极少 | 数据块 | 快 | 高 |
### 重点图示
> [!summary] 必须掌握的图
> 1. 中断处理流程图
> 2. DMA控制器组成框图
> 3. 三种IO方式工作时序对比图
---
## 🧪 自测练习
### 概念题
1. 比较三种IO方式的特点和适用场景。
2. 说明中断处理的基本过程。
3. 解释DMA的三种传送方式。
### 分析题
1. 设计一个支持多重中断的处理流程。
2. 说明DMA控制器的工作原理。
---
## 🔗 相关链接
- [[04_存储器]] - 上一章
- [[06_运算方法]] - 下一章
- [[08_CPU结构与功能]] - CPU中断处理
---
*本章难度:⭐⭐⭐ 中等*
*重要程度:⭐⭐⭐⭐ 重点*

View File

@@ -0,0 +1,441 @@
# 第5章 输入输出系统
> 📖 本章介绍I/O设备与主机交换信息的三种控制方式程序查询、中断和DMA。
> 🎯 重点理解中断处理过程和DMA工作原理
---
## 📋 本章目录
- [[#5.1 概述]]
- [[#5.2 I/O设备]]
- [[#5.3 接口]]
- [[#5.4 程序查询方式]]
- [[#5.5 程序中断方式]]
- [[#5.6 DMA方式]]
- [[#本章小结]]
- [[#例题与解析]]
---
## 5.1 概述
### 5.1.1 输入输出系统的发展
```mermaid
graph LR
A[早期阶段] --> B[接口模块阶段]
B --> C[DMA阶段]
C --> D[通道阶段]
D --> E[IO处理机阶段]
style A fill:#ff9999
style B fill:#ffcc99
style C fill:#ffff99
style D fill:#99ff99
style E fill:#99ccff
```
| 阶段 | 特点 | CPU参与度 |
|------|------|----------|
| 早期阶段 | IO设备直接连CPU串行工作 | 完全参与 |
| 接口模块阶段 | 通过接口连接,可并行工作 | 部分参与 |
| DMA阶段 | IO与主存直接通路CPU不参与数据传输 | 少量参与 |
| 通道阶段 | 通道独立管理IO | 不参与 |
| IO处理机阶段 | IO处理机独立工作 | 不参与 |
I/O系统的发展可以理解为物流系统的进化早期阶段CPU亲自搬运所有货物效率低下接口模块阶段有了快递员接口CPU可以做其他事情DMA阶段有了直达通道I/O设备和内存之间直接传送数据通道阶段有了物流中心通道独立管理I/O处理机阶段有了独立物流公司完全独立工作。
### 5.1.2 输入输出系统的组成
```mermaid
graph TB
A[输入输出系统] --> B[I/O软件]
A --> C[I/O硬件]
B --> B1[I/O指令]
B --> B2[通道指令]
B --> B3[管理程序]
C --> C1[I/O接口]
C --> C2[I/O设备]
```
#### I/O指令格式
```mermaid
graph LR
subgraph "I/O指令格式"
OP[操作码] --> CMD[命令码] --> DEV[设备码]
end
```
**命令码功能**
- 数据输入IO → CPU
- 数据输出CPU → IO
- 状态测试(查询设备状态)
- 形成操作命令
I/O指令就像快递单操作码告诉CPU要做什么操作读数据、写数据、查询状态命令码告诉I/O设备要做什么设备码告诉CPU是哪个I/O设备打印机、硬盘、键盘
---
## 5.2 I/O设备
### 5.2.1 I/O设备分类
| 类型 | 设备 | 特点 |
|------|------|------|
| 输入设备 | 键盘、鼠标、扫描仪 | 人 → 机 |
| 输出设备 | 显示器、打印机 | 机 → 人 |
| 外存储器 | 磁盘、磁带、光盘 | 存储信息 |
输入设备像人的感官(键盘像手,鼠标像手,扫描仪像眼睛),接收外界信息传给计算机;输出设备像表达器官(显示器像眼睛,打印机像手),把计算机的信息传给人;外存储器像记忆器官(磁盘像大脑,磁带像笔记本),存储信息长期保存。
### 5.2.2 I/O设备与主机联系方式
```mermaid
graph TB
subgraph "联系方式"
A[I/O设备] --> B[编址方式]
B --> B1[统一编址]
B --> B2[独立编址]
A --> C[联络方式]
C --> C1[立即响应]
C --> C2[异步联络]
C --> C3[同步联络]
end
```
#### 编址方式
| 方式 | 特点 | 优点 | 缺点 |
|------|------|------|------|
| **统一编址** | I/O设备和内存使用同一地址空间 | 指令统一,编程简单 | 占用内存地址 |
| **独立编址** | I/O设备和内存使用不同地址空间 | 不占用内存地址 | 指令不同,编程复杂 |
统一编址就像办公室和仓库使用同一套门牌号,找办公室和仓库都用同一套门牌号简单,但仓库占用了办公室的门牌号;独立编址就像办公室和仓库使用不同的门牌号系统,仓库不占用办公室的门牌号,但找办公室和仓库要用不同的门牌号系统复杂。
#### 联络方式
| 方式 | 特点 | 适用场景 |
|------|------|----------|
| **立即响应** | 设备立即响应CPU请求 | 简单设备 |
| **异步联络** | 使用握手信号,速度灵活 | 大多数设备 |
| **同步联络** | 使用统一时钟,速度固定 | 高速设备 |
立即响应就像你问一个问题对方立即回答,只能用于简单设备;异步联络像你问一个问题对方准备好后回答,速度灵活适合大多数设备;同步联络像所有设备按同一时钟工作,速度快但受限于最慢设备。
---
## 5.3 接口
### 5.3.1 I/O接口的功能
**主要功能**
1. **设备选择**选择是哪个I/O设备
2. **数据缓冲**:缓冲数据,解决速度不匹配
3. **数据格式转换**:串行/并行转换
4. **控制命令传递**传递CPU的控制命令
5. **状态反馈**:反馈设备状态
I/O接口就像快递站设备选择告诉快递站是哪个包裹数据缓冲暂时存放包裹解决速度不匹配数据格式转换把包裹转换成适合运输的形式控制命令传递传递发货人的命令状态反馈反馈包裹的状态。
### 5.3.2 I/O接口的类型
| 类型 | 特点 | 应用 |
|------|------|------|
| **并行接口** | 多位数据同时传输 | 打印机接口 |
| **串行接口** | 一位一位传输 | USB、网络 |
| **专用接口** | 为特定设备设计 | 显卡接口 |
并行接口像8个人同时送8封信速度快但成本高距离短串行接口像一个人送8封信分8次送成本低距离长但速度慢专用接口专门为某种设备设计性能好兼容性好但只能用于特定设备。
---
## 5.4 程序查询方式
### 5.4.1 工作原理
```mermaid
graph TB
A[CPU启动设备] --> B[CPU查询设备状态]
B --> C{设备准备好?}
C -->|否| B
C -->|是| D[CPU传输数据]
D --> E[操作完成]
```
**工作流程**
1. CPU启动I/O设备
2. CPU不断查询设备状态
3. 设备准备好后CPU传输数据
4. 操作完成
程序查询方式就像你等公交车你到公交站等车CPU启动设备不断看公交站牌看车来了没有查询设备状态公交车来了设备准备好你上车CPU传输数据到达目的地操作完成
**特点**
- **优点**:简单,容易实现
- **缺点**CPU要不断查询效率低
早期计算机和简单嵌入式系统常用这种方式CPU要等打印机打印完才能做其他事情。
---
## 5.5 程序中断方式
### 5.5.1 中断的基本概念
> [!info] 定义
> 中断是指CPU暂时中止当前程序转去处理某个紧急事件处理完后返回原程序继续执行。
中断就像你正在工作时有人敲门你正在工作CPU执行程序有人按门铃I/O设备请求服务你暂停工作CPU暂停当前程序去开门CPU处理中断请求回来继续工作CPU返回原程序继续执行
### 5.5.2 中断的分类
| 分类方式 | 类型 | 特点 |
|----------|------|------|
| **产生原因** | 硬件中断、软件中断 | 硬件中断由设备产生,软件中断由程序产生 |
| **是否可屏蔽** | 可屏蔽中断、不可屏蔽中断 | 可屏蔽中断可以被禁止,不可屏蔽中断不能 |
| **优先级** | 高优先级、低优先级 | 高优先级中断可以打断低优先级中断 |
硬件中断像有人按门铃,由硬件设备产生;软件中断像你自己决定要开门,由程序产生。可屏蔽中断像你可以选择不开门,某些不重要的中断可以被禁止;不可屏蔽中断像你必须开门,电源故障、硬件错误不能被禁止。
### 5.5.3 中断处理过程
```mermaid
graph TB
A[中断请求] --> B[中断判优]
B --> C[中断响应]
C --> D[保存现场]
D --> E[中断服务]
E --> F[恢复现场]
F --> G[中断返回]
```
**详细流程**
1. **中断请求**I/O设备向CPU发送中断请求信号CPU在每条指令执行完后检查中断请求
2. **中断判优**:如果有多个中断请求,需要判优,优先级高的中断先处理
3. **中断响应**CPU响应中断请求关中断防止新的中断打断
4. **保存现场**保存当前程序的状态PC、寄存器等以便中断返回后继续执行
5. **中断服务**执行中断服务程序处理I/O设备的请求
6. **恢复现场**:恢复之前保存的状态,准备返回原程序
7. **中断返回**:返回原程序继续执行,开中断允许新的中断
这就像你正在工作时有人敲门:有人按门铃(中断请求),如果有多个人按门铃决定先开哪个门(中断判优),你决定去开门(中断响应),把正在做的工作记下来(保存现场),去开门处理事情(中断服务),回来看看之前做到哪里了(恢复现场),继续之前的工作(中断返回)。
当你按键盘时键盘向CPU发送中断请求如果有其他中断键盘中断可能优先级较低CPU响应键盘中断保存当前程序的状态执行键盘中断服务程序处理按键恢复之前保存的状态返回原程序继续执行。
### 5.5.4 中断判优方法
| 方法 | 特点 | 优点 | 缺点 |
|------|------|------|------|
| **软件查询** | CPU用程序查询哪个设备请求中断 | 简单,灵活 | 速度慢 |
| **硬件判优** | 用硬件电路判优 | 速度快 | 复杂,成本高 |
软件查询像你挨个问"是你按门铃吗?",简单容易实现但速度慢;硬件判优像有一个专门的设备告诉你谁按了门铃,速度快立即知道是谁但需要额外设备成本高。
### 5.5.5 中断优先级
**设置原则**
1. **硬件故障中断**:最高优先级
2. **软件中断**:较高优先级
3. **I/O中断**:中等优先级
4. **用户程序中断**:较低优先级
硬件故障中断像火灾报警最紧急软件中断像重要电话比较紧急I/O中断像门铃响了一般紧急用户程序中断像有人找你聊天不紧急。
### 5.5.6 中断屏蔽
**原理**:通过设置中断屏蔽字,可以禁止某些中断。
中断屏蔽就像你设置了"请勿打扰"设置了门铃响了你也不去开门不设置门铃响了你就去开门。CPU正在处理重要任务时屏蔽某些中断CPU空闲时允许所有中断。
---
## 5.6 DMA方式
### 5.6.1 DMA的基本概念
> [!info] 定义
> DMADirect Memory Access是指I/O设备和内存之间直接传送数据不经过CPU。
DMA就像直达快递传统方式你要从A地寄东西到B地必须经过C地CPUDMA方式A地直接寄到B地不经过C地。硬盘读取数据时直接把数据传到内存不经过CPU。
### 5.6.2 DMA的工作方式
| 方式 | 特点 | 优点 | 缺点 |
|------|------|------|------|
| **停止CPU访问** | DMA传送时CPU停止访问内存 | 简单 | CPU效率低 |
| **周期挪用** | DMA在CPU不访问内存时传送 | CPU效率高 | 控制复杂 |
| **交替访问** | DMA和CPU交替访问内存 | 效率最高 | 硬件复杂 |
停止CPU访问像高速公路完全给DMA使用CPU不能使用简单但CPU效率低周期挪用像DMA在CPU不使用高速公路时使用CPU效率高但需要复杂的控制逻辑交替访问像DMA和CPU轮流使用高速公路效率最高但硬件复杂成本高。
### 5.6.3 DMA的工作过程
```mermaid
graph TB
A[CPU初始化DMA] --> B[DMA请求]
B --> C[DMA响应]
C --> C1[DMA接管总线]
C1 --> D[数据传送]
D --> E[传送完成]
E --> F[DMA释放总线]
F --> G[CPU继续工作]
```
**详细流程**
1. **CPU初始化DMA**CPU设置DMA控制器的参数包括内存起始地址、传送字节数、传送方向
2. **DMA请求**I/O设备向DMA控制器发送请求DMA控制器向CPU发送总线请求
3. **DMA响应**CPU响应总线请求DMA控制器接管总线
4. **数据传送**DMA控制器控制数据传送I/O设备和内存直接传送数据
5. **传送完成**DMA控制器传送完成向CPU发送中断请求
6. **DMA释放总线**DMA控制器释放总线CPU继续工作
这就像你让快递员帮你寄东西你告诉快递员要寄什么东西寄到哪里CPU初始化DMA快递员去取东西DMA请求快递员拿到东西DMA响应快递员把东西送到目的地数据传送快递员告诉你东西送到了传送完成快递员去忙其他事情DMA释放总线
当你从硬盘复制文件到内存时CPU告诉DMA控制器要从硬盘读取多少数据到内存哪里DMA控制器向CPU请求总线使用权CPU把总线使用权给DMA控制器硬盘直接把数据传到内存不经过CPUDMA控制器告诉CPU传送完成了DMA控制器释放总线CPU继续工作。
### 5.6.4 DMA与中断的区别
| 特性 | DMA | 中断 |
|------|-----|------|
| **数据传送** | I/O和内存直接传送 | 通过CPU传送 |
| **CPU参与度** | 只在开始和结束参与 | 全程参与 |
| **响应时间** | 每个机器周期结束响应 | 每条指令结束响应 |
| **适用场景** | 大量数据传送 | 少量数据传送 |
DMA像直达快递东西直接从A地寄到B地不经过C地速度快C地可以做其他事情但需要额外的快递员中断像普通快递东西从A地寄到C地再从C地寄到B地简单不需要额外快递员但速度慢C地要全程参与。
硬盘读取大量数据到内存用DMA键盘按键、鼠标点击用中断。
---
## 📝 本章小结
### 核心概念
1. **I/O系统发展**从CPU完全参与到完全不参与
2. **I/O设备**:输入设备、输出设备、外存储器
3. **I/O接口**:设备选择、数据缓冲、格式转换
4. **程序查询**CPU不断查询效率低
5. **程序中断**CPU响应中断效率较高
6. **DMA**I/O和内存直接传送效率最高
### 关键术语
| 术语 | 英文 | 含义 |
|------|------|------|
| I/O | Input/Output | 输入输出 |
| DMA | Direct Memory Access | 直接内存访问 |
| Interrupt | Interrupt | 中断 |
| Interface | Interface | 接口 |
### 重点图示
> [!summary] 必须掌握的图
> 1. I/O系统发展过程图
> 2. 中断处理过程图
> 3. DMA工作过程图
> 4. 三种I/O方式的比较
---
## 🧪 例题与解析
### 例题1中断处理过程
**题目**:简述中断处理的完整过程。
**答案**
中断处理的完整过程中断请求I/O设备向CPU发送中断请求信号中断判优如果有多个中断请求决定先处理哪个中断响应CPU响应中断请求关中断保存现场保存当前程序的状态中断服务执行中断服务程序恢复现场恢复之前保存的状态中断返回返回原程序继续执行开中断
这就像你正在工作时有人敲门:有人按门铃,如果有多个人按门铃决定先开哪个门,你决定去开门,把正在做的工作记下来,去开门处理事情,回来看看之前做到哪里了,继续之前的工作。
### 例题2DMA与中断比较
**题目**比较DMA和中断两种I/O方式的区别。
**答案**
DMA是I/O和内存直接传送CPU只在开始和结束参与每个机器周期结束响应适合大量数据传送中断是通过CPU传送CPU全程参与每条指令结束响应适合少量数据传送。
DMA像直达快递东西直接从A地寄到B地不经过C地速度快C地可以做其他事情但需要额外的快递员中断像普通快递东西从A地寄到C地再从C地寄到B地简单不需要额外快递员但速度慢C地要全程参与。
### 例题3程序查询方式
**题目**:简述程序查询方式的工作原理和优缺点。
**答案**
工作原理CPU启动I/O设备不断查询设备状态设备准备好后CPU传输数据操作完成。优点是简单容易实现不需要额外硬件缺点是CPU效率低要不断查询不能同时处理多个设备。
这就像你等公交车:你到公交站等车,不断看公交站牌看车来了没有,公交车来了你上车,到达目的地。简单但你不能做其他事情效率低。
### 例题4中断优先级
**题目**:简述中断优先级的设置原则。
**答案**
硬件故障中断最高优先级火灾报警最紧急软件中断较高优先级重要电话比较紧急I/O中断中等优先级门铃响了一般紧急用户程序中断较低优先级有人找你聊天不紧急
### 例题5DMA工作过程
**题目**简述DMA的完整工作过程。
**答案**
DMA的完整工作过程CPU初始化DMA设置参数DMA请求I/O设备向DMA控制器发送请求DMA响应CPU响应总线请求DMA控制器接管总线数据传送I/O设备和内存直接传送数据传送完成向CPU发送中断请求DMA释放总线CPU继续工作
这就像你让快递员帮你寄东西:你告诉快递员要寄什么东西寄到哪里,快递员去取东西,快递员拿到东西,快递员把东西送到目的地,快递员告诉你东西送到了,快递员去忙其他事情。
---
## ⚡ 知识点速记卡
> 考前快速过一遍30秒回忆整章核心
**三种I/O方式**CPU参与度从高到低程序查询CPU一直等→ 程序中断设备准备好通知CPU→ DMAI/O和内存直接传CPU只管开头和结尾
**程序查询**CPU不断轮询设备状态简单但CPU效率最低适合简单嵌入式系统。
**中断处理七步**:中断请求 → 中断判优 → 中断响应(关中断)→ 保存现场 → 中断服务 → 恢复现场 → 中断返回(开中断)。
**中断优先级**:硬件故障 > 软件中断 > I/O中断 > 用户程序。
**DMA三大要点**①I/O和内存直接传送不经过CPU ②CPU只在初始化和结束时参与 ③每个机器周期结束时响应(比中断更快)。
**DMA三种工作方式**停止CPU访问简单但CPU空等、周期挪用CPU不访存时DMA传送、交替访问效率最高但硬件复杂
**DMA vs 中断**DMA适合大量数据传送硬盘中断适合少量数据键盘。DMA在机器周期末响应中断在指令周期末响应。
---
## 🔗 相关链接
- [[00_计算机组成原理学习指南]] - 返回主目录
- [[04_存储器]] - 上一章
- [[06_运算方法]] - 下一章
- [[08_CPU结构与功能]] - CPU相关内容
---
*本章难度:⭐⭐⭐⭐ 中等*
*重要程度:⭐⭐⭐⭐ 重要*

View File

@@ -0,0 +1,477 @@
# 第6章 运算方法
> 📖 本章介绍计算机中数据的表示方法和算术运算,是课程的重点和难点。
> 🎯 重点理解补码运算和浮点数表示
---
## 📋 本章目录
- [[#6.1 无符号数和有符号数]]
- [[#6.2 定点数]]
- [[#6.3 浮点数]]
- [[#6.4 定点运算]]
- [[#6.5 浮点运算]]
- [[#本章小结]]
---
## 6.1 无符号数和有符号数
### 6.1.1 无符号数
> [!info] 定义
> 没有符号的数,所有位都表示数值。
**表示范围**n位
$$0 \sim 2^n - 1$$
> [!example] 示例
> 16位无符号数0 ~ 65535
### 6.1.2 有符号数
#### 机器数与真值
| 概念 | 定义 | 示例 |
|------|------|------|
| **真值** | 带正负号的数 | +1100, -1100 |
| **机器数** | 符号数字化的数 | 0,1100, 1,1100 |
**符号编码**
- 0 表示正数
- 1 表示负数
#### 1. 原码表示法
> [!info] 定义
> 符号位 + 数值的绝对值
**整数原码**
$$[x]_{原} = \begin{cases} 0,x & 2^n > x \geq 0 \\ 2^n - x & 0 \geq x > -2^n \end{cases}$$
**小数原码**
$$[x]_{原} = \begin{cases} x & 1 > x \geq 0 \\ 1 - x & 0 \geq x > -1 \end{cases}$$
> [!example] 示例
> - x = +1110 → [x]原 = 0,1110
> - x = -1110 → [x]原 = 1,1110
> - x = +0.1101 → [x]原 = 0.1101
> - x = -0.1101 → [x]原 = 1.1101
**零的表示**
- [+0]原 = 0.0000
- [-0]原 = 1.0000
**特点**
- 表示简单,易于转换
- 加减运算复杂
- 零有两种表示
#### 2. 补码表示法
> [!important] 核心思想
> 用正数代替负数,将减法转换为加法。
**补数的概念**(时钟例子):
- 时钟模为12
- -3 ≡ +9 (mod 12)
- 9 - 5 = 9 + 7 = 16 ≡ 4 (mod 12)
**整数补码**
$$[x]_{补} = \begin{cases} 0,x & 2^n > x \geq 0 \\ 2^{n+1} + x & 0 > x \geq -2^n \end{cases}$$
**小数补码**
$$[x]_{补} = \begin{cases} x & 1 > x \geq 0 \\ 2 + x & 0 > x \geq -1 \end{cases}$$
> [!example] 示例
> - x = +1010 → [x]补 = 0,1010
> - x = -1010 → [x]补 = 2^5 + (-1010) = 100000 - 1010 = 1,0110
> - x = +0.1001 → [x]补 = 0.1001
> - x = -0.1001 → [x]补 = 2 + (-0.1001) = 1.0111
**零的表示**
- [+0]补 = [-0]补 = 0.0000(唯一表示)
**补码范围**n位整数
$$-2^n \sim +(2^n - 1)$$
> [!warning] 特殊值
> 8位补码-128的补码为10000000没有对应的原码
#### 3. 反码表示法
**整数反码**
$$[x]_{反} = \begin{cases} 0,x & 2^n > x \geq 0 \\ (2^{n+1}-1) + x & 0 \geq x > -2^n \end{cases}$$
**小数反码**
$$[x]_{反} = \begin{cases} x & 1 > x \geq 0 \\ (2-2^{-n}) + x & 0 \geq x > -1 \end{cases}$$
> [!example] 示例
> - x = +1101 → [x]反 = 0,1101
> - x = -1101 → [x]反 = 1,0010
**零的表示**
- [+0]反 = 0.0000
- [-0]反 = 1.1111
#### 4. 移码表示法
> [!info] 定义
> 移码 = 补码符号位取反
**用途**:便于比较大小(移码大的真值大)
**整数移码**
$$[x]_{移} = 2^n + x \quad (-2^n \leq x < 2^n)$$
> [!example] 示例
> - x = +1010 → [x]移 = 1,1010
> - x = -1010 → [x]移 = 0,0110
#### 四种编码对比
| 编码 | 符号位 | 零的表示 | 范围 | 运算 |
|------|--------|----------|------|------|
| 原码 | 0正1负 | 两种 | $-(2^{n-1}-1) \sim +(2^{n-1}-1)$ | 复杂 |
| 补码 | 0正1负 | 唯一 | $-2^{n-1} \sim +(2^{n-1}-1)$ | 简单 |
| 反码 | 0正1负 | 两种 | $-(2^{n-1}-1) \sim +(2^{n-1}-1)$ | 较复杂 |
| 移码 | 1正0负 | 唯一 | $-2^{n-1} \sim +(2^{n-1}-1)$ | 便于比较 |
**转换关系**
- 正数:原码 = 反码 = 补码
- 负数:补码 = 反码 + 1
---
## 6.2 定点数
### 6.2.1 定点表示
> [!info] 定义
> 小数点位置固定的数
**两种形式**
```mermaid
graph LR
subgraph "定点整数"
A1[符号位] --> B1[数值部分] --> C1[小数点在最后]
end
subgraph "定点小数"
A2[符号位] --> B2[小数点] --> C2[数值部分]
end
```
**表示范围**
| 类型 | 原码范围 | 补码范围 |
|------|----------|----------|
| 定点整数 | $-(2^{n-1}-1) \sim +(2^{n-1}-1)$ | $-2^{n-1} \sim +(2^{n-1}-1)$ |
| 定点小数 | $-(1-2^{-(n-1)}) \sim +(1-2^{-(n-1)})$ | $-1 \sim +(1-2^{-(n-1)})$ |
---
## 6.3 浮点数
### 6.3.1 浮点表示
> [!info] 定义
> 小数点位置可浮动的数,类似科学计数法。
**表示形式**
$$N = S \times r^j$$
- S尾数小数
- j阶码整数
- r基数通常为2
**存储格式**
```mermaid
graph LR
subgraph "浮点数格式"
MS[阶符] --> E[阶码] --> M[数符] --> N[尾数]
end
```
### 6.3.2 浮点数规格化
> [!info] 目的
> 提高精度,使尾数最高位为有效数字。
**规格化条件**
- 原码尾数最高位为1
- 补码:尾数最高位与符号位相反
**左规**尾数左移阶码减1
**右规**尾数右移阶码加1
> [!example] 示例
> 非规格化0.001011 × 2^5
> 左规后0.1011 × 2^2
### 6.3.3 IEEE 754标准
**单精度32位格式**
```mermaid
graph LR
subgraph "IEEE 754 单精度"
S[符号位1位] --> E[阶码8位] --> M[尾数23位]
end
```
**双精度64位格式**
```mermaid
graph LR
subgraph "IEEE 754 双精度"
S[符号位1位] --> E[阶码11位] --> M[尾数52位]
end
```
**特点**
- 隐含尾数最高位1
- 阶码用移码表示偏置值127或1023
- 尾数用原码表示
**数值计算**
$$N = (-1)^S \times 1.M \times 2^{E-127}$$
> [!example] 示例
> 单精度S=0, E=10000010, M=10010000000000000000000
> - 真值 = +1.1001 × 2^(130-127) = +1.1001 × 2^3 = +1100.1 = +12.5
### 6.3.4 浮点数范围
| 类型 | 最小正数 | 最大正数 | 溢出条件 |
|------|----------|----------|----------|
| 规格化 | $2^{-1} \times 2^{-2^{k-1}}$ | $(1-2^{-n}) \times 2^{2^{k-1}-1}$ | 阶码溢出 |
---
## 6.4 定点运算
### 6.4.1 移位运算
#### 算术移位
| 编码 | 左移 | 右移 |
|------|------|------|
| 原码 | 数值左移右补0 | 数值右移左补0 |
| 补码 | 数值左移右补0 | 数值右移,左补符号位 |
| 反码 | 数值左移右补0 | 数值右移,左补符号位 |
#### 逻辑移位
- 逻辑左移高位移出低位补0
- 逻辑右移低位移出高位补0
### 6.4.2 补码加减运算
> [!important] 核心公式
> $$[x+y]_{补} = [x]_{补} + [y]_{补}$$
> $$[x-y]_{补} = [x]_{补} + [-y]_{补}$$
**溢出判断**
| 方法 | 条件 | 说明 |
|------|------|------|
| 单符号位 | 符号位进位与最高位进位异或 | 结果为1则溢出 |
| 双符号位 | 两个符号位不同 | 01正溢10负溢 |
| 变形补码 | 双符号位 | 同上 |
> [!example] 示例
> 8位补码x = +100, y = +100
> - [x]补 = 0,01100100
> - [y]补 = 0,01100100
> - [x+y]补 = 0,11001000+200
> - 结果正确,无溢出
### 6.4.3 乘法运算
#### 原码一位乘法
**算法**
1. 符号位单独处理(异或)
2. 数值部分相乘
3. 部分累加
**流程**
```mermaid
graph TB
A[初始化] --> B{乘数末位}
B -->|1| C[加被乘数]
B -->|0| D[加0]
C --> E[右移部分积]
D --> E
E --> F{n次?}
F -->|否| B
F -->|是| G[得到乘积]
```
#### 补码一位乘法Booth算法
**特点**
- 符号位参与运算
- 最后一步不移位
- 根据乘数末两位决定操作
**操作规则**
| 乘数末两位 | 操作 |
|------------|------|
| 00 | 部分积右移 |
| 01 | 加[x]补,右移 |
| 10 | 加[-x]补,右移 |
| 11 | 部分积右移 |
### 6.4.4 除法运算
#### 原码一位除法(恢复余数法)
**算法**
1. 符号位单独处理
2. 被除数减除数
3. 若够减商1不够减商0恢复余数
4. 左移,重复
#### 加减交替法(不恢复余数法)
**特点**
- 不恢复余数
- 根据余数符号决定下一步操作
**操作规则**
| 余数符号 | 操作 | 商 |
|----------|------|-----|
| 正 | 左移,减除数 | 1 |
| 负 | 左移,加除数 | 0 |
---
## 6.5 浮点运算
### 6.5.1 浮点加减运算
**步骤**
```mermaid
graph TB
A[对阶] --> B[尾数运算]
B --> C[规格化]
C --> D[舍入处理]
D --> E[溢出判断]
```
#### 1. 对阶
**目的**:使两个操作数的阶码相同
**方法**:小阶向大阶看齐,小阶尾数右移
> [!example] 示例
> x = 0.1101 × 2^3, y = 0.1011 × 2^1
> - 对阶y = 0.001011 × 2^3
> - 尾数运算0.1101 + 0.001011 = 0.111111
> - 结果0.111111 × 2^3
#### 2. 尾数运算
- 按定点加减运算规则
- 使用双符号位
#### 3. 规格化
- 左规尾数左移阶码减1
- 右规尾数右移阶码加1
#### 4. 舍入处理
| 方法 | 规则 | 特点 |
|------|------|------|
| 0舍1入 | 移出位为1则入 | 误差小 |
| 恒置1 | 右移后末位置1 | 简单 |
#### 5. 溢出判断
- **上溢**:阶码大于最大值,溢出中断
- **下溢**阶码小于最小值置0
### 6.5.2 浮点乘除运算
**乘法**
$$N_1 \times N_2 = (S_1 \times S_2) \times r^{j_1+j_2}$$
**除法**
$$N_1 / N_2 = (S_1 / S_2) \times r^{j_1-j_2}$$
**步骤**
1. 阶码加/减
2. 尾数乘/除
3. 规格化
4. 溢出判断
---
## 📝 本章小结
### 核心概念
1. **数据表示**:原码、补码、反码、移码
2. **定点数**:小数点位置固定
3. **浮点数**:小数点位置可变,类似科学计数法
4. **运算方法**:移位、加减、乘除
### 关键公式
- **补码加法**$[x+y]_{补} = [x]_{补} + [y]_{补}$
- **补码减法**$[x-y]_{补} = [x]_{补} + [-y]_{补}$
- **浮点数**$N = S \times r^j$
- **IEEE 754**$N = (-1)^S \times 1.M \times 2^{E-127}$
### 重点图示
> [!summary] 必须掌握的内容
> 1. 四种编码方式的转换关系
> 2. 补码加减运算及溢出判断
> 3. 浮点数加减运算步骤
> 4. IEEE 754标准格式
---
## 🧪 自测练习
### 概念题
1. 比较原码、补码、反码的特点。
2. 说明浮点数规格化的目的和方法。
3. 解释IEEE 754标准的格式。
### 计算题
1. 将十进制数转换为补码表示。
2. 进行补码加减运算并判断溢出。
3. 进行浮点数加减运算。
### 分析题
1. 说明Booth算法的原理和步骤。
2. 设计一个浮点加法器的数据通路。
---
## 🔗 相关链接
- [[05_输入输出系统]] - 上一章
- [[07_指令系统]] - 下一章
- [[08_CPU结构与功能]] - 运算器实现
- [[04_存储器]] - 数据存储
---
*本章难度:⭐⭐⭐⭐⭐ 困难*
*重要程度:⭐⭐⭐⭐⭐ 核心重点*

View File

@@ -0,0 +1,414 @@
# 第6章 运算方法
> 📖 本章介绍计算机中数据的表示方法和算术运算,是课程的重点和难点。
> 🎯 重点理解补码运算和浮点数表示
---
## 📋 本章目录
- [[#6.1 无符号数和有符号数]]
- [[#6.2 定点数]]
- [[#6.3 浮点数]]
- [[#6.4 定点运算]]
- [[#6.5 浮点运算]]
- [[#本章小结]]
- [[#例题与解析]]
---
## 6.1 无符号数和有符号数
### 6.1.1 无符号数
> [!info] 定义
> 没有符号的数,所有位都表示数值。
**表示范围**n位
$$0 \sim 2^n - 1$$
> [!example] 示例
> 16位无符号数0 ~ 65535
无符号数就像你钱包里的钱只有正数没有负数范围从0到最大值。内存地址、数组索引、颜色值通常用无符号数表示。
### 6.1.2 有符号数
#### 机器数与真值
| 概念 | 定义 | 示例 |
|------|------|------|
| **真值** | 带正负号的数 | +1100, -1100 |
| **机器数** | 符号数字化的数 | 0,1100, 1,1100 |
**符号编码**
- 0 表示正数
- 1 表示负数
真值用"+"和"-"表示正负人容易理解但计算机不好处理机器数用0和1表示正负计算机容易处理但人不好理解。就像温度计用"+"和"-"表示零上和零下。
#### 1. 原码表示法
> [!info] 定义
> 符号位 + 数值的绝对值
**整数原码**
$$[x]_{原} = \begin{cases} 0,x & 2^n > x \geq 0 \\ 2^n - x & 0 \geq x > -2^n \end{cases}$$
**小数原码**
$$[x]_{原} = \begin{cases} x & 1 > x \geq 0 \\ 1 - x & 0 \geq x > -1 \end{cases}$$
> [!example] 示例
> - x = +1110 → [x]原 = 0,1110
> - x = -1110 → [x]原 = 1,1110
> - x = +0.1101 → [x]原 = 0.1101
> - x = -0.1101 → [x]原 = 1.1101
**零的表示**
- [+0]原 = 0.0000
- [-0]原 = 1.0000
**特点**:表示简单易于转换,但加减运算复杂,零有两种表示。
原码用0表示正数1表示负数后面跟着数值的绝对值。表示简单容易理解但加减运算需要考虑符号零有两种表示+0和-0。就像温度计用"+"和"-"表示零上和零下。
#### 2. 补码表示法
> [!important] 核心思想
> 用正数代替负数,将减法转换为加法。
**补数的概念**(时钟例子):
- 时钟模为12
- -3 ≡ +9 (mod 12)
- 9 - 5 = 9 + 7 = 16 ≡ 4 (mod 12)
**整数补码**
$$[x]_{补} = \begin{cases} 0,x & 2^n > x \geq 0 \\ 2^{n+1} + x & 0 > x \geq -2^n \end{cases}$$
**小数补码**
$$[x]_{补} = \begin{cases} x & 1 > x \geq 0 \\ 2 + x & 0 > x \geq -1 \end{cases}$$
> [!example] 示例
> - x = +1010 → [x]补 = 0,1010
> - x = -1010 → [x]补 = 2^5 + (-1010) = 100000 - 1010 = 1,0110
> - x = +0.1001 → [x]补 = 0.1001
> - x = -0.1001 → [x]补 = 2 + (-0.1001) = 1.0111
**零的表示**[+0]补 = [-0]补 = 0.0000(唯一表示)
**补码范围**n位整数$-2^n \sim +(2^n - 1)$
> [!warning] 特殊值
> 8位补码-128的补码为10000000没有对应的原码
补码可以用时钟来理解时钟模为12-3小时相当于+9小时因为-3+12=9。补码就是用正数代替负数将减法转换为加法。正数直接用原码表示负数用模减去绝对值。
比如8位二进制-10的补码是256-10=246=11110110。补码的优点是加减运算简单不需要考虑符号零只有一种表示范围比原码大1。缺点是表示不直观需要转换。所有整数运算都用补码。
#### 3. 反码表示法
**整数反码**
$$[x]_{反} = \begin{cases} 0,x & 2^n > x \geq 0 \\ (2^{n+1}-1) + x & 0 \geq x > -2^n \end{cases}$$
**小数反码**
$$[x]_{反} = \begin{cases} x & 1 > x \geq 0 \\ (2-2^{-n}) + x & 0 \geq x > -1 \end{cases}$$
> [!example] 示例
> - x = +1101 → [x]反 = 0,1101
> - x = -1101 → [x]反 = 1,0010
**零的表示**
- [+0]反 = 0.0000
- [-0]反 = 1.1111
反码是补码减1正数和原码相同负数是原码除符号位外取反。是计算补码的中间步骤某些旧计算机使用反码。
#### 4. 移码表示法
> [!info] 定义
> 移码 = 补码符号位取反
**用途**:便于比较大小(移码大的真值大)
**整数移码**
$$[x]_{移} = 2^n + x \quad (-2^n \leq x < 2^n)$$
> [!example] 示例
> - x = +1010 → [x]移 = 1,1010
> - x = -1010 → [x]移 = 0,0110
移码把所有数都加上一个偏移量变成正数便于比较大小。偏移量是1288位移码-128变成00变成128+127变成255。浮点数的阶码通常用移码表示。
#### 四种编码对比
| 编码 | 符号位 | 零的表示 | 范围 | 运算 |
|------|--------|----------|------|------|
| 原码 | 0正1负 | 两种 | $-(2^{n-1}-1) \sim +(2^{n-1}-1)$ | 复杂 |
| 补码 | 0正1负 | 唯一 | $-2^{n-1} \sim +(2^{n-1}-1)$ | 简单 |
| 反码 | 0正1负 | 两种 | $-(2^{n-1}-1) \sim +(2^{n-1}-1)$ | 较复杂 |
| 移码 | 1正0负 | 唯一 | $-2^{n-1} \sim +(2^{n-1}-1)$ | 便于比较 |
**转换关系**:正数原码=反码=补码,负数补码=反码+1。
原码直接用符号位和绝对值简单直观但运算复杂零有两种表示补码用正数代替负数运算简单零只有一种表示但表示不直观反码是补码减1是计算补码的中间步骤移码补码符号位取反便于比较大小。
---
## 6.2 定点数
### 6.2.1 定点表示
> [!info] 定义
> 小数点位置固定的数
**两种形式**
```mermaid
graph LR
subgraph "定点整数"
A1[符号位] --> B1[数值部分] --> C1[小数点在最后]
end
subgraph "定点小数"
A2[符号位] --> B2[小数点] --> C2[数值部分]
end
```
**表示范围**
| 类型 | 原码范围 | 补码范围 |
|------|----------|----------|
| 定点整数 | $-(2^{n-1}-1) \sim +(2^{n-1}-1)$ | $-2^{n-1} \sim +(2^{n-1}-1)$ |
| 定点小数 | $-(1-2^{-(n-1)}) \sim +(1-2^{-(n-1)})$ | $-1 \sim +(1-2^{-(n-1)})$ |
定点数用固定刻度的尺子定点整数小数点在最后只表示整数比如1010表示10定点小数小数点在符号位后面只表示小数比如0.1010表示0.625。
---
## 6.3 浮点数
### 6.3.1 浮点表示
> [!info] 定义
> 小数点位置可浮动的数,类似科学计数法。
**表示形式**
$$N = S \times r^j$$
- S尾数小数
- j阶码整数
- r基数通常为2
**存储格式**
```mermaid
graph LR
subgraph "浮点数格式"
MS[阶符] --> E[阶码] --> M[数符] --> N[尾数]
end
```
浮点数就像科学计数法把一个数表示成尾数乘以2的阶码次方。比如101.1=1.011×可以表示很大或很小的数。
### 6.3.2 浮点数规格化
**规格化目的**提高精度使尾数的最高位为1。
**规格化方法**
- **左规**尾数左移阶码减1
- **右规**尾数右移阶码加1
规格化前0.001011×2³尾数前面有0精度低规格化后1.011×2⁰尾数最高位为1精度高。
### 6.3.3 IEEE 754标准
**单精度浮点数32位**符号位1位阶码8位移码表示尾数23位
**双精度浮点数64位**符号位1位阶码11位移码表示尾数52位
IEEE 754标准是浮点数的"国家标准"单精度32位精度较低但速度快用于大多数图形处理和科学计算双精度64位精度高但速度慢用于高精度科学计算和金融计算。
---
## 6.4 定点运算
### 6.4.1 移位运算
**算术移位**左移相当于乘以2右移相当于除以2
**逻辑移位**左移高位移出低位补0右移低位移出高位补0
算术移位像移动小数点左移小数点向右移动数值变大右移小数点向左移动数值变小。逻辑移位所有位向左或向右移动。1010左移1位变成1010010→20
### 6.4.2 加减运算
**补码加减运算**:加法直接相加,减法减数变补码后相加
**溢出判断**:正溢出两个正数相加结果为负,负溢出两个负数相加结果为正
补码加减运算像时钟运算9+7=16≡4(mod 12)9-5=9+7=16≡4(mod 12)。127+1=-1288位补码溢出
### 6.4.3 乘法运算
**原码乘法**:符号位单独处理,数值部分相乘
**补码乘法**:直接用补码相乘
乘法运算像重复加法10×13=130-6×-3=18。
### 6.4.4 除法运算
**原码除法**:符号位单独处理,数值部分相除
**补码除法**:直接用补码相除
除法运算像重复减法10÷2=5-6÷2=-3。
---
## 6.5 浮点运算
### 6.5.1 浮点加减运算
**步骤**
1. **对阶**:使两个数的阶码相同
2. **尾数运算**:对阶后进行尾数加减
3. **规格化**:结果规格化
4. **舍入**:处理精度问题
5. **溢出判断**:检查阶码是否溢出
浮点加减运算像科学计数法加减:对阶使两个数的阶码相同,小阶向大阶看齐;尾数运算对阶后进行尾数加减;规格化使结果符合规格化要求;舍入处理精度问题;溢出判断检查阶码是否溢出。
1.01×2²+1.10×对阶变成1.01×2²+0.110×尾数运算1.01+0.110=10.00规格化10.00×2²=1.00×2³=8。
### 6.5.2 浮点乘除运算
**乘法**:阶码相加,尾数相乘,规格化
**除法**:阶码相减,尾数相除,规格化
浮点乘除运算像科学计数法乘除10²×10³=10⁵1.2×3.4=4.081.2×10²×3.4×10³=4.08×10⁵。
---
## 📝 本章小结
### 核心概念
1. **数据表示**:原码、补码、反码、移码
2. **定点数**:小数点位置固定
3. **浮点数**:小数点位置可浮动
4. **定点运算**:移位、加减、乘除
5. **浮点运算**:对阶、尾数运算、规格化
### 关键术语
| 术语 | 英文 | 含义 |
|------|------|------|
| 原码 | Sign-Magnitude | 符号位+绝对值 |
| 补码 | Two's Complement | 用正数代替负数 |
| 反码 | One's Complement | 补码减1 |
| 移码 | Excess Code | 补码符号位取反 |
| 浮点数 | Floating Point | 小数点位置可浮动 |
### 重点图示
> [!summary] 必须掌握的图
> 1. 四种编码的转换关系
> 2. 定点数和浮点数的表示
> 3. 浮点数加减运算流程
> 4. IEEE 754标准格式
---
## 🧪 例题与解析
### 例题1补码计算
**题目**计算8位补码的表示范围并求-5的补码。
**答案**
8位补码范围-2⁷=-128到2⁷-1=127即-128~127。
-5的补码5的二进制00000101取反11111010加1得11111011。
这就像一个8位的时钟范围-128到127-5的补码是时钟倒退5小时。
### 例题2浮点数表示
**题目**:将十进制数-0.75表示为IEEE 754单精度浮点数。
**答案**
0.75=0.11(二进制)-0.75=-0.11,规格化-1.1×2⁻¹。
符号位1负数阶码-1+127=126=01111110尾数10000000000000000000000。
完整表示1 01111110 10000000000000000000000。
### 例题3补码加法
**题目**:用补码计算 5 + (-3)。
**答案**
5的补码00000101-3的补码11111101相加
```
00000101
+ 11111101
-----------
1 00000010
```
补码结果00000010真值+2。5+(-3)=2✓
### 例题4浮点数加法
**题目**:计算 1.01 × 2² + 1.10 × 2¹。
**答案**
对阶1.10×2¹=0.110×
尾数运算1.010+0.110=10.000
规格化10.000×2²=1.000×2³=8
验证1.01×2²=51.10×2¹=35+3=8✓
### 例题5溢出判断
**题目**判断8位补码运算 127 + 1 是否溢出。
**答案**
127的补码011111111的补码00000001相加得10000000。
两个正数相加结果为负数10000000是-128的补码发生正溢出。
真正结果128实际结果-128溢出。
---
## ⚡ 知识点速记卡
> 考前快速过一遍30秒回忆整章核心
**四种编码速记**:原码(符号+绝对值,零有两种)、补码(正代负,零唯一,运算最简单)、反码(补码-1过渡用、移码补码符号取反便于比较大小
**正数**:原码=反码=补码。**负数**:补码=反码+1。口诀正数不变负数取反加1。
**补码范围**n位-2^(n-1) ~ +(2^(n-1)-1)。8位补码-128~127。-128没有对应原码
**补码加减运算**:加法直接加,减法变补码后加。溢出判断:两个正数相加得负数(正溢出),两个负数相加得正数(负溢出)。
**定点数**:小数点位置固定。定点整数(小数点在末尾)、定点小数(小数点在符号位后)。
**浮点数 = 尾数 × 2^阶码**类似科学计数法。规格化尾数最高位为1左规尾数左移阶码减1右规尾数右移阶码加1。
**IEEE 754单精度32位**1位符号 + 8位阶码移码偏移127+ 23位尾数。阶码全0和全1有特殊含义。
**浮点加减五步**:对阶(小阶向大阶看齐)→ 尾数运算 → 规格化 → 舍入 → 溢出判断。
**移位运算**:算术左移=×2算术右移=÷2。逻辑移位补0算术移位保持符号位。
---
## 🔗 相关链接
- [[00_计算机组成原理学习指南]] - 返回主目录
- [[05_输入输出系统]] - 上一章
- [[07_指令系统]] - 下一章
- [[08_CPU结构与功能]] - CPU相关内容
---
*本章难度:⭐⭐⭐⭐⭐ 困难*
*重要程度:⭐⭐⭐⭐⭐ 重点*

View File

@@ -0,0 +1,475 @@
# 第7章 指令系统
> 📖 本章介绍机器指令系统的分类、寻址方式和指令格式设计。
> 🎯 重点理解寻址方式和指令格式设计
---
## 📋 本章目录
- [[#7.1 机器指令]]
- [[#7.2 操作数类型和操作类型]]
- [[#7.3 寻址方式]]
- [[#7.4 指令格式]]
- [[#7.5 RISC技术]]
- [[#本章小结]]
---
## 7.1 机器指令
### 7.1.1 指令的一般格式
> [!info] 定义
> 机器指令是计算机能识别和执行的基本命令,由操作码和地址码组成。
```mermaid
graph LR
subgraph "指令格式"
OP[操作码] --> ADDR[地址码]
end
```
#### 操作码
**功能**:指明指令要完成的操作
**长度**
- **固定长度**:便于硬件设计,译码快
- **可变长度**:节省空间,译码复杂
#### 地址码
**功能**:指出操作数地址、结果地址、下条指令地址
**格式分类**
```mermaid
graph TB
A[指令格式] --> B[四地址指令]
A --> C[三地址指令]
A --> D[二地址指令]
A --> E[一地址指令]
A --> F[零地址指令]
```
| 格式 | 地址字段 | 操作 | 访存次数 |
|------|----------|------|----------|
| 四地址 | A1, A2, A3, A4 | (A1)OP(A2)→A3 | 4次 |
| 三地址 | A1, A2, A3 | (A1)OP(A2)→A3 | 4次 |
| 二地址 | A1, A2 | (A1)OP(A2)→A1 | 4次 |
| 一地址 | A1 | ACCOP(A1)→ACC | 2次 |
| 零地址 | 无 | 栈操作 | 0-2次 |
> [!example] 示例
> 四地址指令OP A1 A2 A3 A4
> - (A1) OP (A2) → A3
> - 下条指令地址 = A4
### 7.1.2 扩展操作码技术
> [!info] 目的
> 在指令字长固定的情况下,增加指令种类。
**原理**:操作码长度随地址数减少而增加
```mermaid
graph TB
subgraph "扩展操作码示例16位指令"
A["4位操作码<br/>15条三地址指令"] --> B["8位操作码<br/>15条二地址指令"]
B --> C["12位操作码<br/>15条一地址指令"]
C --> D["16位操作码<br/>16条零地址指令"]
end
```
**设计原则**
- 使用频度高的指令用短操作码
- 使用频度低的指令用长操作码
- 为扩展留有余地
---
## 7.2 操作数类型和操作类型
### 7.2.1 操作数类型
| 类型 | 说明 | 示例 |
|------|------|------|
| 地址 | 无符号整数 | 指向存储器位置 |
| 数值 | 定点数、浮点数 | 算术运算 |
| 字符 | ASCII码 | 文本处理 |
| 逻辑数 | 位串 | 逻辑运算 |
### 7.2.2 操作类型
#### 数据传送类
| 指令 | 功能 | 示例 |
|------|------|------|
| MOV | 数据传送 | MOV AX, BX |
| LOAD | 从存储器取数 | LOAD R1, [addr] |
| STORE | 存数到存储器 | STORE [addr], R1 |
| PUSH/POP | 栈操作 | PUSH AX |
#### 算术逻辑类
| 指令 | 功能 | 示例 |
|------|------|------|
| ADD/SUB | 加/减 | ADD AX, BX |
| MUL/DIV | 乘/除 | MUL BX |
| AND/OR/NOT | 逻辑运算 | AND AX, BX |
| CMP | 比较 | CMP AX, BX |
| SHL/SHR | 移位 | SHL AX, 1 |
#### 控制转移类
| 指令 | 功能 | 示例 |
|------|------|------|
| JMP | 无条件跳转 | JMP addr |
| JZ/JNZ | 条件跳转 | JZ addr |
| CALL | 调用子程序 | CALL addr |
| RET | 返回 | RET |
| INT | 中断 | INT 21H |
---
## 7.3 寻址方式
> [!info] 定义
> 寻址方式是指令中如何给出操作数地址或操作数的方式。
### 7.3.1 指令寻址
#### 顺序寻址
```mermaid
graph LR
PC[PC] --> |"PC+1"| NEXT[下一条指令]
```
#### 跳跃寻址
```mermaid
graph LR
PC[PC] --> |"JMP addr"| TARGET[目标指令]
```
### 7.3.2 数据寻址
**指令格式**
```mermaid
graph LR
subgraph "数据寻址格式"
OP[操作码] --> MOD[寻址特征] --> ADDR[形式地址]
end
```
**有效地址**$EA = f(寻址方式, 形式地址)$
#### 常见寻址方式
##### 1. 立即寻址
> [!info] 特点
> 操作数直接在指令中
**格式**OP #立即数
**有效地址**$EA = 指令地址 + 1$(操作数在指令中)
**优点**:速度快,不需要访存
**缺点**:操作数范围受地址字段限制
##### 2. 直接寻址
> [!info] 特点
> 地址字段直接给出操作数地址
**格式**OP A
**有效地址**$EA = A$
**优点**:简单,只需一次访存
**缺点**:寻址范围受地址字段限制
##### 3. 间接寻址
> [!info] 特点
> 地址字段给出的是操作数地址的地址
**格式**OP (A)
**有效地址**$EA = (A)$
**优点**:寻址范围大
**缺点**:多次访存,速度慢
```mermaid
graph LR
A[形式地址A] --> |"第一次访存"| B[地址B]
B --> |"第二次访存"| C[操作数]
```
##### 4. 寄存器寻址
> [!info] 特点
> 操作数在寄存器中
**格式**OP R
**有效地址**$EA = R$
**优点**:速度快,不需要访存
**缺点**:寄存器数量有限
##### 5. 寄存器间接寻址
> [!info] 特点
> 寄存器中存放的是操作数的地址
**格式**OP (R)
**有效地址**$EA = (R)$
**优点**:寻址范围大,只需一次访存
**缺点**:需要一次访存
##### 6. 偏移寻址
###### 基址寻址
**格式**OP A基址寄存器BR
**有效地址**$EA = (BR) + A$
**特点**
- 便于程序重定位
- 基址寄存器内容不变
- 形式地址可变
###### 变址寻址
**格式**OP A变址寄存器IX
**有效地址**$EA = (IX) + A$
**特点**
- 便于数组操作
- 变址寄存器内容可变
- 形式地址不变
> [!example] 数组访问示例
> 访问数组元素:$EA = (IX) + A$
> - A数组首地址
> - IX元素下标
> - 每次IX+1访问下一个元素
###### 相对寻址
**格式**OP A
**有效地址**$EA = (PC) + A$
**特点**
- 程序浮动
- A是相对于PC的偏移量
##### 7. 堆栈寻址
**格式**PUSH/POP 操作数
**有效地址**
- PUSH先SP-1再存数
- POP先取数再SP+1
**特点**后进先出LIFO
#### 寻址方式对比
| 寻址方式 | 有效地址 | 访存次数 | 优点 | 缺点 |
|----------|----------|----------|------|------|
| 立即寻址 | 操作数在指令中 | 0 | 速度快 | 范围小 |
| 直接寻址 | EA=A | 1 | 简单 | 范围小 |
| 间接寻址 | EA=(A) | 2+ | 范围大 | 速度慢 |
| 寄存器寻址 | EA=R | 0 | 速度最快 | 数量有限 |
| 寄存器间接 | EA=(R) | 1 | 范围大 | 需要访存 |
| 基址寻址 | EA=(BR)+A | 1 | 便于重定位 | 需要基址寄存器 |
| 变址寻址 | EA=(IX)+A | 1 | 便于数组操作 | 需要变址寄存器 |
| 相对寻址 | EA=(PC)+A | 1 | 程序浮动 | 范围有限 |
| 堆栈寻址 | 栈顶 | 0-1 | 自动管理 | 只能栈操作 |
---
## 7.4 指令格式
### 7.4.1 指令格式设计考虑因素
| 因素 | 考虑内容 |
|------|----------|
| 指令字长 | 固定/可变,长度选择 |
| 操作码 | 固定/可变,长度分配 |
| 地址码 | 地址个数,寻址方式 |
| 数据类型 | 支持的数据类型 |
| 寻址方式 | 提供哪些寻址方式 |
### 7.4.2 指令字长
**固定字长**
- 优点:取指时间固定,硬件简单
- 缺点:浪费空间
**可变字长**
- 优点:节省空间
- 缺点:取指时间不固定
### 7.4.3 指令格式举例
#### IBM 370指令格式
```mermaid
graph LR
subgraph "IBM 370 指令格式"
OP[操作码8位] --> R1[寄存器1] --> R2[寄存器2] --> B2[基址寄存器] --> D2[位移量]
end
```
**特点**
- 固定操作码长度8位
- 基址+位移寻址
- 16个通用寄存器
#### Intel 8086指令格式
```mermaid
graph LR
subgraph "Intel 8086 指令格式"
OP[操作码] --> MOD[寻址方式] --> R/M[寄存器/存储器] --> DISP[位移量]
end
```
**特点**
- 可变操作码长度
- 多种寻址方式
- 8个通用寄存器
### 7.4.4 指令系统设计原则
1. **完备性**:指令功能完整
2. **规整性**:指令格式统一
3. **对称性**:操作对称
4. **可扩充性**:便于扩展
5. **兼容性**:向上兼容
---
## 7.5 RISC技术
### 7.5.1 RISC与CISC
| 特性 | CISC | RISC |
|------|------|------|
| 指令数量 | 多(几百条) | 少(几十条) |
| 指令长度 | 可变 | 固定 |
| 寻址方式 | 多种 | 少数几种 |
| 执行时间 | 不固定 | 固定(一个周期) |
| 访存方式 | 多种指令可访存 | 只有LOAD/STORE |
| 控制方式 | 微程序 | 硬布线 |
| 优化目标 | 缩短程序长度 | 提高执行速度 |
### 7.5.2 RISC特点
**主要特点**
1. **指令数量少**:只包含常用指令
2. **指令长度固定**:简化取指和译码
3. **寻址方式少**:简化寻址逻辑
4. **只有LOAD/STORE访存**:简化数据通路
5. **大量寄存器**:减少访存次数
6. **硬布线控制**:提高执行速度
7. **流水线技术**:提高并行度
8. **优化编译**:充分利用硬件
### 7.5.3 RISC优势
| 优势 | 说明 |
|------|------|
| 速度快 | 指令执行时间固定,便于流水线 |
| 硬件简单 | 控制逻辑简单,成本低 |
| 设计周期短 | 指令少,验证容易 |
| 功耗低 | 逻辑简单,功耗小 |
### 7.5.4 RISC vs CISC对比
```mermaid
graph TB
subgraph "CISC"
A1[复杂指令] --> B1[微程序执行]
B1 --> C1[多周期]
end
subgraph "RISC"
A2[简单指令] --> B2[硬布线执行]
B2 --> C2[单周期]
C2 --> D2[流水线]
end
```
---
## 📝 本章小结
### 核心概念
1. **指令格式**:操作码 + 地址码
2. **寻址方式**:立即、直接、间接、寄存器、基址、变址、相对、堆栈
3. **指令系统设计**:完备性、规整性、可扩充性
4. **RISC技术**:简化指令,提高速度
### 关键公式
- **有效地址**$EA = f(寻址方式, 形式地址)$
- **基址寻址**$EA = (BR) + A$
- **变址寻址**$EA = (IX) + A$
- **相对寻址**$EA = (PC) + A$
### 重点图示
> [!summary] 必须掌握的内容
> 1. 指令格式分类(四地址到零地址)
> 2. 扩展操作码技术
> 3. 各种寻址方式的计算方法
> 4. RISC与CISC的区别
---
## 🧪 自测练习
### 概念题
1. 比较各种指令格式的特点。
2. 说明扩展操作码技术的原理。
3. 解释RISC技术的主要特点。
### 计算题
1. 给定指令字长和操作数地址,设计扩展操作码。
2. 计算各种寻址方式下的有效地址。
### 分析题
1. 设计一个简单的指令系统。
2. 分析RISC和CISC的优缺点。
---
## 🔗 相关链接
- [[06_运算方法]] - 上一章
- [[08_CPU结构与功能]] - 下一章
- [[10_控制单元设计]] - 指令执行
- [[04_存储器]] - 存储器访问
---
*本章难度:⭐⭐⭐⭐ 中等偏难*
*重要程度:⭐⭐⭐⭐ 重点*

View File

@@ -0,0 +1,323 @@
# 第7章 指令系统
> 📖 本章介绍机器指令系统的分类、寻址方式和指令格式设计。
> 🎯 重点理解寻址方式和指令格式设计
---
## 📋 本章目录
- [[#7.1 机器指令]]
- [[#7.2 操作数类型和操作类型]]
- [[#7.3 寻址方式]]
- [[#7.4 指令格式]]
- [[#7.5 RISC技术]]
- [[#本章小结]]
- [[#例题与解析]]
---
## 7.1 机器指令
### 7.1.1 指令的一般格式
> [!info] 定义
> 机器指令是计算机能识别和执行的基本命令,由操作码和地址码组成。
```mermaid
graph LR
subgraph "指令格式"
OP[操作码] --> ADDR[地址码]
end
```
#### 操作码
**功能**:指明指令要完成的操作
**长度**
- **固定长度**:便于硬件设计,译码快
- **可变长度**:节省空间,译码复杂
操作码就像菜谱上的"动作",告诉厨师要做什么(炒、煮、蒸、烤)。固定长度每个动作都用相同长度的编码,可变长度常用动作用短编码不常用动作用长编码。
#### 地址码
**功能**:指出操作数地址、结果地址、下条指令地址
**格式分类**
```mermaid
graph TB
A[指令格式] --> B[四地址指令]
A --> C[三地址指令]
A --> D[二地址指令]
A --> E[一地址指令]
A --> F[零地址指令]
```
| 格式 | 地址字段 | 操作 | 访存次数 |
|------|----------|------|----------|
| 四地址 | A1, A2, A3, A4 | (A1)OP(A2)→A3 | 4次 |
| 三地址 | A1, A2, A3 | (A1)OP(A2)→A3 | 4次 |
| 二地址 | A1, A2 | (A1)OP(A2)→A1 | 4次 |
| 一地址 | A1 | ACCOP(A1)→ACC | 2次 |
| 零地址 | 无 | 栈操作 | 0-2次 |
地址码就像菜谱上的"材料"四地址指令把A1和A2的数相加结果存到A3下条指令在A4三地址指令把A1和A2的数相加结果存到A3二地址指令把A1和A2的数相加结果存到A1一地址指令把ACC和A1的数相加结果存到ACC零地址指令弹出栈顶两个数相加结果压入栈。
### 7.1.2 扩展操作码技术
> [!info] 目的
> 在指令字长固定的情况下,增加指令种类。
**原理**:操作码长度随地址数减少而增加
```mermaid
graph TB
subgraph "扩展操作码示例16位指令"
A["4位操作码<br/>15条三地址指令"] --> B["8位操作码<br/>15条二地址指令"]
B --> C["12位操作码<br/>15条一地址指令"]
C --> D["16位操作码<br/>16条零地址指令"]
end
```
**设计原则**
- 使用频度高的指令用短操作码
- 使用频度低的指令用长操作码
- 为扩展留有余地
扩展操作码就像邮政编码系统短操作码常用指令用短编码节省空间长操作码不常用指令用长编码种类多。4位操作码15条三地址指令1111保留8位操作码15条二地址指令12位操作码15条一地址指令16位操作码16条零地址指令。
---
## 7.2 操作数类型和操作类型
### 7.2.1 操作数类型
| 类型 | 说明 | 示例 |
|------|------|------|
| 地址 | 无符号整数 | 指向存储器位置 |
| 数值 | 定点数、浮点数 | 算术运算 |
| 字符 | ASCII码 | 文本处理 |
| 逻辑数 | 逻辑运算 | 位操作 |
地址是无符号整数指向存储器位置用于寻址操作数值是定点数或浮点数用于算术运算字符是ASCII码用于文本处理逻辑数用于逻辑运算和位操作。
### 7.2.2 操作类型
**数据传送**LOAD从存储器取数据到寄存器、STORE从寄存器存数据到存储器
**算术逻辑运算**ADD加法、SUB减法、AND逻辑与、OR逻辑或
**移位操作**SHL逻辑左移、SHR逻辑右移、SAL算术左移、SAR算术右移
**转移操作**JMP无条件转移、JZ条件转移、CALL调用子程序、RET返回
**输入输出**IN从I/O端口读数据、OUT向I/O端口写数据
数据传送像从仓库取材料到工作台;算术逻辑运算像把两个数加起来或相减;移位操作像所有位向左移动;转移操作像跳转到指定位置;输入输出像从外部设备读数据。
---
## 7.3 寻址方式
### 7.3.1 指令寻址
**顺序寻址**PC = PC + 1按顺序执行指令
**跳跃寻址**PC = 跳转地址,跳转到指定地址执行
指令寻址像找下一条指令的方式:顺序寻址按顺序执行下一条指令,跳跃寻址跳转到指定地址执行。
### 7.3.2 数据寻址
**立即寻址**操作数在指令中比如MOV A, #5把5存到A。东西就在你手里速度快不需要访问内存只能用于常数。
**直接寻址**操作数地址在指令中比如MOV A, [1000]把地址1000的数存到A。东西在仓库的某个位置简单直接访问地址范围有限。
**间接寻址**操作数地址的地址在指令中比如MOV A, [[1000]]。仓库里有一张纸条告诉你东西在哪里,灵活可以动态改变地址,但速度慢需要多次访问内存。
**寄存器寻址**操作数在寄存器中比如MOV A, R1把R1的数存到A。东西就在你手边的盒子里速度最快不需要访问内存寄存器数量有限。
**寄存器间接寻址**操作数地址在寄存器中比如MOV A, [R1]。盒子里有一张纸条告诉你东西在哪里,灵活可以动态改变地址,需要访问内存。
**基址寻址**:操作数地址 = 基址 + 偏移量比如MOV A, [BASE + 100]。东西在仓库的某个区域,用区域号+偏移量定位,适合程序重定位。
**变址寻址**:操作数地址 = 变址 + 偏移量比如MOV A, [INDEX + 100]。东西在仓库的某个位置,用变址+偏移量定位,适合数组访问。
**相对寻址**:操作数地址 = PC + 偏移量比如JMP +10跳转到PC+10的位置。东西在当前位置的某个偏移位置适合相对跳转。
---
## 7.4 指令格式
### 7.4.1 指令格式设计原则
**设计原则**
1. **规整性**:指令长度对齐,便于译码
2. **高效性**:常用指令短,不常用指令长
3. **兼容性**:保持向后兼容
4. **扩展性**:留有扩展空间
指令格式设计就像设计邮票:规整性指令长度对齐便于译码,高效性常用指令短不常用指令长,兼容性新处理器能运行旧程序,扩展性保留一些编码用于未来扩展。
### 7.4.2 指令格式举例
**x86指令格式**:变长指令,格式复杂,代码密度高兼容性好,译码复杂。
**ARM指令格式**:固定长度指令,格式简单,译码简单速度快,代码密度低。
---
## 7.5 RISC技术
### 7.5.1 RISC与CISC对比
| 特性 | RISC | CISC |
|------|------|------|
| 指令数量 | 少 | 多 |
| 指令长度 | 固定 | 可变 |
| 寻址方式 | 简单 | 复杂 |
| 指令周期 | 单周期 | 多周期 |
| 流水线 | 支持 | 部分支持 |
| 编译器 | 复杂 | 简单 |
RISC精简指令集指令少简单速度快容易实现流水线但编译器复杂代码密度低CISC复杂指令集指令多复杂功能强编译器简单代码密度高但难以实现流水线速度慢。
ARM处理器手机、MIPS处理器嵌入式是RISCx86处理器个人电脑是CISC。
### 7.5.2 RISC特点
**主要特点**
1. **指令数量少**:通常只有几十条指令
2. **指令长度固定**:所有指令长度相同
3. **寻址方式简单**:只有几种简单的寻址方式
4. **单周期执行**:大多数指令在一个周期内完成
5. **流水线支持**:容易实现流水线
6. **大量寄存器**通常有32个以上寄存器
7. **硬布线控制**:用硬布线实现控制单元
指令数量少容易实现速度快但功能有限;指令长度固定译码简单容易实现流水线但代码密度低;寻址方式简单译码简单速度快但灵活性差;单周期执行速度快容易实现流水线但某些复杂指令需要多个周期;流水线支持提高吞吐率但需要处理流水线冲突;大量寄存器减少访存次数速度快但增加硬件成本;硬布线控制速度快但不灵活难以修改。
---
## 📝 本章小结
### 核心概念
1. **指令格式**:操作码 + 地址码
2. **寻址方式**:立即寻址、直接寻址、间接寻址等
3. **指令类型**:数据传送、算术逻辑、移位、转移、输入输出
4. **RISC技术**:精简指令集,速度快
### 关键术语
| 术语 | 英文 | 含义 |
|------|------|------|
| 指令 | Instruction | 机器指令 |
| 操作码 | Operation Code | 指明操作类型 |
| 地址码 | Address Code | 指明操作数地址 |
| 寻址方式 | Addressing Mode | 找到操作数的方式 |
| RISC | Reduced Instruction Set Computer | 精简指令集计算机 |
| CISC | Complex Instruction Set Computer | 复杂指令集计算机 |
### 重点图示
> [!summary] 必须掌握的图
> 1. 指令格式图
> 2. 各种寻址方式图
> 3. 扩展操作码图
> 4. RISC与CISC对比图
---
## 🧪 例题与解析
### 例题1指令格式设计
**题目**设计一个16位指令系统要求支持15条三地址指令、15条二地址指令、15条一地址指令、16条零地址指令。
**答案**
三地址指令4位操作码1111保留3个×4位=12位地址码指令数2⁴-1=15条。
二地址指令8位操作码1111xxxxxxxx≠11112个×4位=8位地址码指令数15条。
一地址指令12位操作码1111xxxxxxxxxxxxxxxx≠111111111个×4位=4位地址码指令数15条。
零地址指令16位操作码1111xxxxxxxxxxxx0位地址码指令数16条。
### 例题2寻址方式分析
**题目**:分析以下指令的寻址方式:
1. MOV A, #5
2. MOV A, [1000]
3. MOV A, R1
4. MOV A, [R1]
5. MOV A, [BASE + 100]
**答案**
1. MOV A, #5立即寻址操作数5在指令中速度快不需要访问内存。
2. MOV A, [1000]直接寻址操作数在地址1000简单直接访问。
3. MOV A, R1寄存器寻址操作数在寄存器R1速度最快不需要访问内存。
4. MOV A, [R1]寄存器间接寻址R1指向的地址的数灵活可以动态改变地址。
5. MOV A, [BASE + 100]基址寻址BASE+100的数适合程序重定位。
### 例题3RISC与CISC比较
**题目**比较RISC和CISC的特点。
**答案**
RISC指令数量少几十条、指令长度固定、寻址方式简单、单周期执行、支持流水线、编译器复杂、寄存器多、硬布线控制CISC指令数量多几百条、指令长度可变、寻址方式复杂、多周期执行、部分支持流水线、编译器简单、寄存器少、微程序控制。
RISC像精简工具工具少简单速度快容易使用效率高但功能有限CISC像复杂工具工具多复杂功能强功能强大使用方便但使用复杂效率低。
### 例题4扩展操作码设计
**题目**设计一个12位指令系统要求支持15条二地址指令、15条一地址指令、16条零地址指令。
**答案**
二地址指令4位操作码1111保留2个×4位=8位地址码指令数2⁴-1=15条。
一地址指令8位操作码1111xxxxxxxx≠11111个×4位=4位地址码指令数15条。
零地址指令12位操作码1111xxxxxxxx0位地址码指令数16条。
### 例题5寻址方式计算
**题目**某计算机有16位地址线8位数据线采用直接寻址方式求寻址范围。
**答案**
16位地址线可以表示2¹⁶=65536个地址即有65536个存储单元。8位数据线表示每个单元存8位数据1字节总容量65536×8位=64KB。
这就像一个仓库有65536个格子每个格子能放8个鸡蛋总容量就是64KB。
---
## ⚡ 知识点速记卡
> 考前快速过一遍30秒回忆整章核心
**指令 = 操作码 + 地址码**。操作码指明做什么,地址码指明操作数在哪。
**地址码个数**四地址A1 OP A2 → A3下条在A4、三地址→A3、二地址→A1、一地址ACC OP A1 → ACC、零地址栈操作
**扩展操作码**:地址数越少,操作码越长,指令种类越多。常用指令用短操作码,不常用指令用长操作码。
**七种寻址方式**:立即(数在指令里,最快)、直接(地址在指令里)、间接(地址指向的位置存着真正地址)、寄存器(数在寄存器,最快之一)、寄存器间接(寄存器里存地址)、基址(基址+偏移,适合重定位)、变址(变址+偏移适合数组、相对PC+偏移,适合跳转)。
**RISC vs CISC**RISC指令少、固定长度、单周期、流水线友好、硬布线控制ARM/MIPSCISC指令多、可变长度、多周期、微程序控制x86
**指令格式设计**:规整性(长度对齐)、高效性(常用指令短)、兼容性(向后兼容)、扩展性(留余地)。
---
## 🔗 相关链接
- [[00_计算机组成原理学习指南]] - 返回主目录
- [[06_运算方法]] - 上一章
- [[08_CPU结构与功能]] - 下一章
- [[09_控制单元功能]] - 控制单元相关内容
---
*本章难度:⭐⭐⭐⭐ 中等*
*重要程度:⭐⭐⭐⭐ 重要*

View File

@@ -0,0 +1,423 @@
# 第8章 CPU的结构和功能
> 📖 本章介绍CPU的功能、内部结构和指令执行过程。
> 🎯 重点理解CPU组成和指令周期
---
## 📋 本章目录
- [[#8.1 CPU的结构]]
- [[#8.2 指令周期]]
- [[#8.3 指令流水]]
- [[#8.4 中断系统]]
- [[#本章小结]]
---
## 8.1 CPU的结构
### 8.1.1 CPU的功能
> [!info] 核心功能
> CPU负责协调并控制计算机各部件执行程序的指令序列。
**基本功能**
| 功能 | 说明 |
|------|------|
| **指令控制** | 控制程序的顺序执行 |
| **操作控制** | 产生完成每条指令所需的控制命令 |
| **时间控制** | 对各种操作加以时间上的控制 |
| **数据加工** | 对数据进行算术运算和逻辑运算 |
| **中断处理** | 处理异常情况和特殊请求 |
### 8.1.2 CPU结构框图
```mermaid
graph TB
subgraph "CPU内部结构"
subgraph "运算器"
ALU[ALU<br/>算术逻辑单元]
ACC[ACC<br/>累加寄存器]
PSW[PSW<br/>程序状态字]
REG[通用寄存器组]
end
subgraph "控制器"
CU[CU<br/>控制单元]
PC[PC<br/>程序计数器]
IR[IR<br/>指令寄存器]
MAR[MAR<br/>存储器地址寄存器]
MDR[MDR<br/>存储器数据寄存器]
end
end
ALU <--> |"数据"| REG
ALU <--> |"数据"| ACC
CU --> |"控制信号"| ALU
CU --> |"控制信号"| REG
PC --> |"地址"| MAR
IR --> |"指令"| CU
MAR <--> |"地址"| MEM[主存]
MDR <--> |"数据"| MEM
style ALU fill:#ff9999
style CU fill:#99ccff
style PC fill:#99ff99
style IR fill:#ffcc99
```
### 8.1.3 CPU的寄存器
#### 用户可见寄存器
| 寄存器类型 | 功能 | 示例 |
|------------|------|------|
| **通用寄存器** | 可编程使用,存放操作数 | AX, BX, CX, DX |
| **数据寄存器** | 存放操作数 | 数据寄存器 |
| **地址寄存器** | 存放地址 | 基址寄存器、变址寄存器 |
| **条件码寄存器** | 存放运算结果状态 | Z、C进位、S符号、O溢出 |
#### 控制和状态寄存器
| 寄存器 | 功能 | 可见性 |
|--------|------|--------|
| **PC** | 程序计数器,存放现行指令地址 | 用户可见 |
| **IR** | 指令寄存器,存放当前指令 | 用户不可见 |
| **MAR** | 存储器地址寄存器 | 用户不可见 |
| **MDR** | 存储器数据寄存器 | 用户不可见 |
| **PSW** | 程序状态字寄存器 | 部分可见 |
**PC程序计数器**
- 存放现行指令地址
- 具有计数功能PC+1→PC
- 遇到转移指令时可被修改
**IR指令寄存器**
- 存放当前正在执行的指令
- 包含操作码和地址码
- 操作码送CU译码
**MAR存储器地址寄存器**
- 存放将被访问的存储单元地址
- 位数与地址总线宽度相同
**MDR存储器数据寄存器**
- 存放欲存入存储器的数据或从存储器读出的数据
- 位数与数据总线宽度相同
### 8.1.4 数据通路
```mermaid
graph TB
subgraph "CPU内部数据通路"
PC[PC] --> |"地址"| MAR[MAR]
MAR --> |"地址"| MEM[主存]
MEM --> |"数据"| MDR[MDR]
MDR --> |"指令"| IR[IR]
MDR --> |"数据"| ALU[ALU]
REG[通用寄存器] <--> |"数据"| ALU
ALU --> |"结果"| REG
ALU --> |"状态"| PSW[PSW]
end
```
---
## 8.2 指令周期
### 8.2.1 指令周期的基本概念
> [!info] 定义
> 指令周期是取出一条指令并执行这条指令的时间。
**组成**
```mermaid
graph LR
A[指令周期] --> B[取指周期]
A --> C[执行周期]
B --> B1[取指令]
B --> B2[分析指令]
C --> C1[执行指令]
```
### 8.2.2 指令周期流程
```mermaid
graph TB
START[开始] --> FETCH[取指周期]
FETCH --> DECODE[分析指令]
DECODE --> EXEC[执行周期]
EXEC --> CHECK{中断?}
CHECK -->|是| INT[中断处理]
CHECK -->|否| NEXT[取下一条指令]
INT --> NEXT
NEXT --> FETCH
```
### 8.2.3 取指周期
**操作序列**
1. PC → MAR地址送MAR
2. MAR → 地址总线 → 主存(地址送主存)
3. CU发读命令控制信号
4. 主存 → 数据总线 → MDR指令送MDR
5. MDR → IR指令送IR
6. PC + 1 → PC程序计数器加1
7. OP(IR) → CU操作码送CU译码
```mermaid
sequenceDiagram
participant PC
participant MAR
participant MEM as 主存
participant MDR
participant IR
participant CU
PC->>MAR: PC → MAR
MAR->>MEM: 地址送主存
CU->>MEM: 发读命令
MEM->>MDR: 指令送MDR
MDR->>IR: 指令送IR
Note over PC: PC+1 → PC
IR->>CU: 操作码送CU
```
### 8.2.4 执行周期
**不同指令的执行周期**
| 指令类型 | 执行操作 |
|----------|----------|
| **取数指令** | MAR → 主存 → MDR → 寄存器 |
| **存数指令** | 寄存器 → MDR → 主存 |
| **加法指令** | 取操作数 → ALU运算 → 存结果 |
| **转移指令** | 修改PC值 |
| **空操作指令** | 无操作 |
### 8.2.5 指令周期的时序
```mermaid
graph TB
subgraph "指令周期时序"
T0[时钟周期T0] --> T1[时钟周期T1]
T1 --> T2[时钟周期T2]
T2 --> T3[时钟周期T3]
end
subgraph "取指周期"
T0 --> F1[PC → MAR]
F1 --> F2[读主存]
F2 --> F3[MDR → IR]
F3 --> F4[PC+1]
end
subgraph "执行周期"
T0 --> E1[分析指令]
E1 --> E2[取操作数]
E2 --> E3[执行操作]
E3 --> E4[存结果]
end
```
### 8.2.6 指令流水
> [!info] 概念
> 将指令执行过程分解为多个阶段,各阶段并行执行。
**流水线阶段**
```mermaid
graph LR
subgraph "指令流水线"
IF[取指IF] --> ID[译码ID] --> EX[执行EX] --> MEM[访存MEM] --> WB[写回WB]
end
```
**流水线时序**
```mermaid
gantt
title 指令流水线时序
dateFormat X
axisFormat %s
section 指令1
取指IF : 0, 1
译码ID : 1, 2
执行EX : 2, 3
访存MEM : 3, 4
写回WB : 4, 5
section 指令2
取指IF : 1, 2
译码ID : 2, 3
执行EX : 3, 4
访存MEM : 4, 5
写回WB : 5, 6
section 指令3
取指IF : 2, 3
译码ID : 3, 4
执行EX : 4, 5
访存MEM : 5, 6
写回WB : 6, 7
```
**加速比**
$$S = \frac{非流水线时间}{流水线时间} = \frac{n \times k}{k + (n-1)}$$
- n指令数
- k流水线级数
**流水线冲突**
| 冲突类型 | 原因 | 解决方法 |
|----------|------|----------|
| **结构冲突** | 硬件资源冲突 | 资源复制 |
| **数据冲突** | 数据依赖 | 数据前递、流水线暂停 |
| **控制冲突** | 分支指令 | 分支预测、延迟分支 |
---
## 8.3 中断系统
### 8.3.1 中断的作用
> [!info] 中断定义
> 中断是指CPU暂停现行程序转去处理中断请求处理完毕后返回原程序继续执行。
**主要作用**
1. **实现CPU与IO设备并行工作**
2. **处理机器故障**
3. **实现人机交互**
4. **实现多道程序**
### 8.3.2 中断系统组成
```mermaid
graph TB
subgraph "中断系统"
subgraph "中断源"
IO[I/O设备]
TIMER[定时器]
FAULT[故障]
SOFT[软件中断]
end
subgraph "中断判优"
PRIO[优先级电路]
end
subgraph "中断响应"
MASK[中断屏蔽]
INTR[中断请求]
INTA[中断响应]
end
subgraph "中断处理"
SAVE[保存现场]
SERVICE[中断服务]
RESTORE[恢复现场]
end
end
IO --> INTR
TIMER --> INTR
FAULT --> INTR
SOFT --> INTR
INTR --> PRIO
PRIO --> MASK
MASK --> INTA
INTA --> SAVE
SAVE --> SERVICE
SERVICE --> RESTORE
```
### 8.3.3 中断处理过程
```mermaid
graph TB
START[中断请求] --> CHECK{允许中断?}
CHECK -->|否| WAIT[等待]
CHECK -->|是| SAVE1[保存断点]
SAVE1 --> SAVE2[保存现场]
SAVE2 --> EI[开中断]
EI --> SERVICE[执行中断服务程序]
SERVICE --> DI[关中断]
DI --> RESTORE1[恢复现场]
RESTORE1 --> RESTORE2[恢复断点]
RESTORE2 --> RET[中断返回]
RET --> END[继续执行]
```
### 8.3.4 中断判优
**优先级原则**
1. 硬件故障 > 软件中断
2. 高速设备 > 低速设备
3. 输入 > 输出
4. 实时设备 > 普通设备
**判优方法**
| 方法 | 原理 | 特点 |
|------|------|------|
| 硬件判优 | 优先级电路 | 速度快 |
| 软件判优 | 程序查询 | 灵活,速度慢 |
---
## 📝 本章小结
### 核心概念
1. **CPU功能**:指令控制、操作控制、时间控制、数据加工、中断处理
2. **CPU寄存器**PC、IR、MAR、MDR、通用寄存器、PSW
3. **指令周期**:取指周期 + 执行周期
4. **指令流水**:提高并行度,加速指令执行
5. **中断系统**实现CPU与IO并行处理异常
### 关键公式
- **流水线加速比**$S = \frac{n \times k}{k + (n-1)}$
### 重点图示
> [!summary] 必须掌握的内容
> 1. CPU内部结构框图
> 2. 指令周期流程图
> 3. 指令流水线时序图
> 4. 中断处理流程图
---
## 🧪 自测练习
### 概念题
1. 说明CPU的基本功能。
2. 比较CPU中各类寄存器的作用。
3. 解释指令流水线的原理和冲突。
### 分析题
1. 画出取指周期的时序图。
2. 设计一个简单的中断处理流程。
---
## 🔗 相关链接
- [[07_指令系统]] - 上一章
- [[09_控制单元功能]] - 下一章
- [[10_控制单元设计]] - 控制单元设计
- [[05_输入输出系统]] - 中断系统
---
*本章难度:⭐⭐⭐⭐⭐ 困难*
*重要程度:⭐⭐⭐⭐⭐ 核心重点*

View File

@@ -0,0 +1,349 @@
# 第8章 CPU的结构和功能
> 📖 本章介绍CPU的功能、内部结构和指令执行过程。
> 🎯 重点理解CPU组成和指令周期
---
## 📋 本章目录
- [[#8.1 CPU的结构]]
- [[#8.2 指令周期]]
- [[#8.3 指令流水]]
- [[#8.4 中断系统]]
- [[#本章小结]]
- [[#例题与解析]]
---
## 8.1 CPU的结构
### 8.1.1 CPU的功能
> [!info] 核心功能
> CPU负责协调并控制计算机各部件执行程序的指令序列。
**基本功能**
| 功能 | 说明 |
|------|------|
| **指令控制** | 控制程序的顺序执行 |
| **操作控制** | 产生完成每条指令所需的控制命令 |
| **时间控制** | 对各种操作加以时间上的控制 |
| **数据加工** | 对数据进行算术运算和逻辑运算 |
| **中断处理** | 处理异常情况和特殊请求 |
CPU就像公司的大脑指令控制按顺序执行程序像总经理按顺序安排工作操作控制产生控制信号像总经理发出工作指令时间控制控制操作时序像总经理控制工作进度数据加工进行各种运算像员工处理数据中断处理处理紧急事件像总经理处理紧急情况。
### 8.1.2 CPU结构框图
```mermaid
graph TB
subgraph "CPU内部结构"
subgraph "运算器"
ALU[ALU<br/>算术逻辑单元]
ACC[ACC<br/>累加寄存器]
PSW[PSW<br/>程序状态字]
REG[通用寄存器组]
end
subgraph "控制器"
CU[CU<br/>控制单元]
PC[PC<br/>程序计数器]
IR[IR<br/>指令寄存器]
MAR[MAR<br/>存储器地址寄存器]
MDR[MDR<br/>存储器数据寄存器]
end
end
ALU <--> |"数据"| REG
ALU <--> |"数据"| ACC
CU --> |"控制信号"| ALU
CU --> |"控制信号"| REG
PC --> |"地址"| MAR
IR --> |"指令"| CU
MAR <--> |"地址"| MEM[主存]
MDR <--> |"数据"| MEM
style ALU fill:#ff9999
style CU fill:#99ccff
style PC fill:#99ff99
style IR fill:#ffcc99
```
CPU结构就像公司的组织架构运算器中ALU算术逻辑单元是生产车间负责加工产品ACC累加寄存器是操作台临时存放加工中的产品PSW程序状态字是状态指示灯显示当前工作状态通用寄存器组是工具箱存放常用工具。控制器中CU控制单元是总经理指挥整个公司运转PC程序计数器是任务清单记录下一个要执行的任务IR指令寄存器是当前任务单记录正在执行的任务MAR存储器地址寄存器是仓库地址簿记录要访问的仓库位置MDR存储器数据寄存器是传送带传送仓库和车间之间的物品。
当你执行一条加法指令时PC记录下一条指令的地址IR存放当前加法指令CU译码并发出控制信号ALU执行加法运算ACC存放运算结果PSW记录运算状态。
### 8.1.3 CPU的寄存器
#### 用户可见寄存器
| 寄存器类型 | 功能 | 示例 |
|------------|------|------|
| **通用寄存器** | 可编程使用,存放操作数 | AX, BX, CX, DX |
| **数据寄存器** | 存放操作数 | 数据寄存器 |
| **地址寄存器** | 存放地址 | 基址寄存器、变址寄存器 |
| **条件码寄存器** | 存放运算结果状态 | Z、C进位、S符号、O溢出 |
通用寄存器像员工可以使用的工具,可编程使用存放各种数据;数据寄存器专门存放数据;地址寄存器专门存放地址;条件码寄存器记录运算结果的状态。
#### 控制和状态寄存器
| 寄存器 | 功能 | 可见性 |
|--------|------|--------|
| **PC** | 程序计数器,存放现行指令地址 | 用户可见 |
| **IR** | 指令寄存器,存放当前指令 | 用户不可见 |
| **MAR** | 存储器地址寄存器 | 用户不可见 |
| **MDR** | 存储器数据寄存器 | 用户不可见 |
| **PSW** | 程序状态字寄存器 | 部分可见 |
PC程序计数器记录下一个要执行的任务执行完一个任务后自动指向下一个任务遇到跳转指令时指向跳转目标。IR指令寄存器记录正在执行的任务包含操作码要做什么和地址码操作数在哪里操作码送给CU译码。MAR存储器地址寄存器记录要访问的仓库位置把地址送到仓库。MDR存储器数据寄存器传送仓库和车间之间的物品。PSW程序状态字寄存器显示当前工作状态包括条件码、中断屏蔽位等。
---
## 8.2 指令周期
### 8.2.1 指令周期的基本概念
> [!info] 定义
> 指令周期是指从取指令到执行完该指令所需的全部时间。
**指令周期的组成**
- **取指周期**:取指令的时间
- **执行周期**:执行指令的时间
指令周期就像完成一个任务的时间:取指周期是从仓库取任务单的时间,执行周期是执行任务的时间。简单指令取指周期+执行周期,复杂指令取指周期+多个执行周期。
### 8.2.2 指令周期的时序
```mermaid
graph TB
A[取指周期] --> B[执行周期]
B --> C[取指周期]
C --> D[执行周期]
D --> E[...]
```
**时序信号**
- **时钟周期**CPU的最小时间单位
- **机器周期**:完成一个基本操作的时间
- **指令周期**:完成一条指令的时间
时钟周期像CPU的最小工作时间单位1GHz CPU的时钟周期是1ns机器周期完成一个基本操作的时间通常包含几个时钟周期指令周期完成一条指令的时间根据指令类型不同而不同。
### 8.2.3 指令执行过程
**取指周期**
1. PC → MAR → 地址总线
2. CU发出读命令
3. 存储器 → 数据总线 → MDR
4. MDR → IR
5. PC + 1 → PC
**执行周期**
1. IR的操作码 → CU译码
2. CU发出控制信号
3. 执行指令操作
取指周期像从仓库取任务单:把任务单地址送到仓库地址簿,告诉仓库要取任务单,仓库把任务单送到传送带,任务单送到当前任务单,任务清单指向下一个任务。执行周期像执行任务:总经理看任务单决定要做什么,总经理发出工作指令,员工执行任务。
当你执行一条加法指令时取指周期从内存取加法指令到CPU执行周期执行加法运算。
---
## 8.3 指令流水
### 8.3.1 流水线的基本概念
> [!info] 定义
> 流水线是指将指令执行过程分成多个阶段,多个指令可以同时在不同阶段执行。
**流水线的阶段**
- **取指IF**:取指令
- **译码ID**:译码指令
- **执行EX**:执行指令
- **访存MEM**:访问存储器
- **写回WB**:写回结果
流水线就像工厂的生产线:取指从仓库取原材料,译码看图纸决定要做什么,执行加工产品,访存从仓库取需要的材料,写回把成品放到仓库。多个指令可以同时在不同阶段执行,提高吞吐率和效率。
### 8.3.2 流水线的性能
**吞吐率**
$$TP = \frac{n}{k + (n-1)}$$
**加速比**
$$S = \frac{nk}{k + (n-1)}$$
**效率**
$$E = \frac{S}{k} = \frac{n}{k + (n-1)}$$
流水线性能像工厂的生产效率:吞吐率是单位时间完成的任务数,加速比是流水线比非流水线快多少倍,效率是流水线的利用率。
假设流水线有4个阶段执行100条指令吞吐率100/(4+99)=0.97条/周期加速比100×4/(4+99)=3.88效率3.88/4=97%。
### 8.3.3 流水线冲突
**结构冲突**:硬件资源不足,两个指令同时访问同一个存储器,增加硬件资源解决。
**数据冲突**:指令之间有数据依赖,后面的指令需要前面指令的结果,数据旁路或流水线暂停解决。
**控制冲突**:分支指令改变程序流,跳转指令导致流水线需要重新取指,分支预测或延迟分支解决。
结构冲突像两个工人都要用同一个工具,多买几个工具解决;数据冲突像上一个产品还没做完下一个产品需要它的零件,等做完或先做其他产品解决;控制冲突像突然改变生产计划,提前预测或等确定后再生产解决。
---
## 8.4 中断系统
### 8.4.1 中断系统的基本功能
**主要功能**
1. **中断请求**:接收中断请求信号
2. **中断判优**:决定哪个中断先处理
3. **中断响应**:响应中断请求
4. **中断处理**:执行中断服务程序
5. **中断返回**:返回原程序
中断系统像公司的紧急事件处理系统:中断请求接收紧急事件报告,中断判优决定先处理哪个紧急事件,中断响应决定处理紧急事件,中断处理执行紧急事件处理程序,中断返回返回原工作。
### 8.4.2 中断系统的实现
**硬件实现**
- **中断请求触发器**:保存中断请求信号
- **中断屏蔽触发器**:控制中断是否被屏蔽
- **中断判优电路**:决定中断优先级
- **中断向量表**:存放中断服务程序入口地址
**软件实现**
- **中断服务程序**:处理中断的程序
- **中断处理流程**:中断处理的步骤
硬件实现像紧急事件处理流程:中断请求触发器是紧急事件报告箱,中断屏蔽触发器是请勿打扰标志,中断判优电路是紧急事件分类器,中断向量表是紧急事件处理手册。
---
## 📝 本章小结
### 核心概念
1. **CPU功能**:指令控制、操作控制、时间控制、数据加工、中断处理
2. **CPU结构**:运算器、控制器、寄存器
3. **指令周期**:取指周期、执行周期
4. **指令流水**提高CPU效率的重要技术
5. **中断系统**:处理紧急事件的机制
### 关键术语
| 术语 | 英文 | 含义 |
|------|------|------|
| CPU | Central Processing Unit | 中央处理器 |
| ALU | Arithmetic Logic Unit | 算术逻辑单元 |
| CU | Control Unit | 控制单元 |
| PC | Program Counter | 程序计数器 |
| IR | Instruction Register | 指令寄存器 |
| 流水线 | Pipeline | 指令流水 |
| 中断 | Interrupt | 紧急事件处理 |
### 重点图示
> [!summary] 必须掌握的图
> 1. CPU内部结构图
> 2. 指令周期时序图
> 3. 流水线示意图
> 4. 中断处理流程图
---
## 🧪 例题与解析
### 例题1CPU功能分析
**题目**简述CPU的五大功能。
**答案**
CPU的五大功能指令控制控制程序的顺序执行像总经理按顺序安排工作操作控制产生完成每条指令所需的控制信号像总经理发出工作指令时间控制对各种操作加以时间上的控制像总经理控制工作进度数据加工对数据进行算术运算和逻辑运算像员工处理数据中断处理处理异常情况和特殊请求像总经理处理紧急情况。
### 例题2指令周期计算
**题目**某CPU主频为1GHz取指周期为4个时钟周期执行周期为6个时钟周期求执行100条指令所需时间。
**答案**
主频1GHz=10⁹Hz时钟周期1/10⁹=1ns。
取指周期4个时钟周期=4ns执行周期6个时钟周期=6ns。
单条指令时间=4+6=10ns。
100条指令时间=100×10ns=1000ns=1μs。
### 例题3流水线性能计算
**题目**某CPU有4级流水线执行100条指令求吞吐率、加速比和效率。
**答案**
流水线阶段数k=4指令数n=100。
吞吐率TP=100/(4+99)=0.97条/周期。
加速比S=100×4/(4+99)=3.88。
效率E=3.88/4=97%。
### 例题4流水线冲突分析
**题目**:分析以下指令序列中的数据冲突:
```
ADD R1, R2, R3 ; R1 = R2 + R3
SUB R4, R1, R5 ; R4 = R1 - R5
```
**答案**
ADD指令产生R1的值SUB指令需要R1的值。如果ADD指令还没执行完SUB指令就需要R1的值就会发生数据冲突。
解决方案数据旁路ADD指令执行完后直接把结果传给SUB指令或流水线暂停等ADD指令执行完后再执行SUB指令
### 例题5中断系统设计
**题目**设计一个简单的中断系统支持4个中断源。
**答案**
中断请求4个中断请求触发器IR0-IR3保存中断请求信号。
中断屏蔽4个中断屏蔽触发器IM0-IM3控制中断是否被屏蔽。
中断判优优先级编码器IR0>IR1>IR2>IR3。
中断响应中断响应信号INTACPU响应中断请求。
中断向量表4个中断向量存放中断服务程序入口地址。
---
## ⚡ 知识点速记卡
> 考前快速过一遍30秒回忆整章核心
**CPU五大功能**指令控制顺序执行、操作控制发控制信号、时间控制时序、数据加工ALU运算、中断处理。
**CPU内部关键寄存器**PC下条指令地址、IR当前指令、MAR访存地址、MDR访存数据、PSW程序状态、ACC累加器、通用寄存器组。
**指令周期四阶段**:取指周期(所有指令都有)→ 间址周期(间接寻址才有)→ 执行周期(都有)→ 中断周期(有中断才有)。
**流水线五阶段**IF取指→ ID译码→ EX执行→ MEM访存→ WB写回
**流水线公式**:吞吐率 TP = n/(k+n-1),加速比 S = nk/(k+n-1)。n=100条、k=4级 → TP≈0.97S≈3.88。
**流水线三种冲突**:结构冲突(争硬件,加资源)、数据冲突(数据依赖,旁路或暂停)、控制冲突(分支跳转,预测或延迟)。
**中断系统**:中断请求触发器保存请求,中断屏蔽触发器控制屏蔽,中断判优电路决定优先级,中断向量表存入口地址。
---
## 🔗 相关链接
- [[00_计算机组成原理学习指南]] - 返回主目录
- [[07_指令系统]] - 上一章
- [[09_控制单元功能]] - 下一章
- [[10_控制单元设计]] - 控制单元设计
---
*本章难度:⭐⭐⭐⭐⭐ 困难*
*重要程度:⭐⭐⭐⭐⭐ 重点*

View File

@@ -0,0 +1,332 @@
# 第9章 控制单元的功能
> 📖 本章分析控制单元为完成不同指令所发出的各种微操作命令。
> 🎯 重点理解微操作命令和指令执行过程
---
## 📋 本章目录
- [[#9.1 微操作命令的分析]]
- [[#9.2 控制单元的功能]]
- [[#本章小结]]
---
## 9.1 微操作命令的分析
### 9.1.1 微操作命令的概念
> [!info] 定义
> 微操作命令是控制单元发出的最基本控制信号,控制计算机各部件完成相应操作。
**特点**
- 是最基本的操作,不可再分
- 由控制单元发出
- 控制数据通路和功能部件
### 9.1.2 指令周期的四个阶段
```mermaid
graph LR
A[指令周期] --> B[取指周期]
A --> C[间址周期]
A --> D[执行周期]
A --> E[中断周期]
```
### 9.1.3 取指周期的微操作
**操作序列**
| 步骤 | 微操作 | 说明 |
|------|--------|------|
| 1 | PC → MAR | 现行指令地址送MAR |
| 2 | 1 → R | 向主存发读命令 |
| 3 | M(MAR) → MDR | 指令从主存读至MDR |
| 4 | MDR → IR | 指令送指令寄存器 |
| 5 | OP(IR) → CU | 操作码送CU译码 |
| 6 | (PC) + 1 → PC | 程序计数器加1 |
```mermaid
sequenceDiagram
participant PC
participant MAR
participant MEM as 主存
participant MDR
participant IR
participant CU
PC->>MAR: PC → MAR
Note over MAR: 1 → R发读命令
MEM->>MDR: M(MAR) → MDR
MDR->>IR: MDR → IR
IR->>CU: OP(IR) → CU
Note over PC: (PC) + 1 → PC
```
### 9.1.4 间址周期的微操作
**操作序列**
| 步骤 | 微操作 | 说明 |
|------|--------|------|
| 1 | Ad(IR) → MAR | 形式地址送MAR |
| 2 | 1 → R | 向主存发读命令 |
| 3 | M(MAR) → MDR | 有效地址从主存读至MDR |
| 4 | MDR → Ad(IR) | 有效地址送IR地址字段 |
```mermaid
sequenceDiagram
participant IR
participant MAR
participant MEM as 主存
participant MDR
IR->>MAR: Ad(IR) → MAR
Note over MAR: 1 → R发读命令
MEM->>MDR: M(MAR) → MDR
MDR->>IR: MDR → Ad(IR)
```
### 9.1.5 执行周期的微操作
#### 1. 非访存指令
| 指令 | 微操作 | 说明 |
|------|--------|------|
| CLA | 0 → ACC | 清除累加器 |
| COM | $\overline{ACC}$ → ACC | 累加器取反 |
| SHR | L(ACC) → R(ACC), ACC₀ → ACC₀ | 算术右移 |
| CSL | R(ACC) → L(ACC), ACC₀ → ACCₙ | 循环左移 |
| STP | 0 → G | 停机 |
#### 2. 访存指令
##### 加法指令 ADD X
| 步骤 | 微操作 | 说明 |
|------|--------|------|
| 1 | Ad(IR) → MAR | 地址送MAR |
| 2 | 1 → R | 发读命令 |
| 3 | M(MAR) → MDR | 操作数读至MDR |
| 4 | (ACC) + (MDR) → ACC | 加法运算 |
##### 存数指令 STA X
| 步骤 | 微操作 | 说明 |
|------|--------|------|
| 1 | Ad(IR) → MAR | 地址送MAR |
| 2 | 1 → W | 发写命令 |
| 3 | ACC → MDR | 数据送MDR |
| 4 | MDR → M(MAR) | 数据写入主存 |
##### 取数指令 LDA X
| 步骤 | 微操作 | 说明 |
|------|--------|------|
| 1 | Ad(IR) → MAR | 地址送MAR |
| 2 | 1 → R | 发读命令 |
| 3 | M(MAR) → MDR | 数据读至MDR |
| 4 | MDR → ACC | 数据送累加器 |
#### 3. 转移类指令
| 指令 | 微操作 | 说明 |
|------|--------|------|
| JMP X | Ad(IR) → PC | 无条件转移 |
| BAN X | A₀·Ad(IR) + $\overline{A₀}$·(PC) → PC | 条件转移(负则转) |
### 9.1.6 中断周期的微操作
**操作序列**
| 步骤 | 微操作 | 说明 |
|------|--------|------|
| 1 | 0 → MAR | 特定地址送MAR |
| 2 | 1 → W | 发写命令 |
| 3 | PC → MDR | 断点送MDR |
| 4 | MDR → M(MAR) | 断点存入主存 |
| 5 | 向量地址 → PC | 中断服务程序入口送PC |
| 6 | 0 → EINT | 关中断 |
```mermaid
sequenceDiagram
participant PC
participant MAR
participant MDR
participant MEM as 主存
Note over MAR: 0 → MAR
Note over MAR: 1 → W发写命令
PC->>MDR: PC → MDR
MDR->>MEM: MDR → M(MAR)
Note over PC: 向量地址 → PC
Note over PC: 0 → EINT关中断
```
---
## 9.2 控制单元的功能
### 9.2.1 控制单元的外特性
```mermaid
graph TB
subgraph "控制单元CU"
INPUT[输入] --> CU[控制单元]
CU --> OUTPUT[输出]
end
subgraph "输入信号"
CLK[时钟]
INST[指令寄存器]
FLAG[标志]
INT[中断请求]
BUS[总线信号]
end
subgraph "输出信号"
CTRL[控制信号]
ADDR[地址信号]
DATA[数据信号]
end
CLK --> INPUT
INST --> INPUT
FLAG --> INPUT
INT --> INPUT
BUS --> INPUT
OUTPUT --> CTRL
OUTPUT --> ADDR
OUTPUT --> DATA
```
### 9.2.2 控制信号
**控制信号分类**
| 类型 | 说明 | 示例 |
|------|------|------|
| **操作控制信号** | 控制数据通路操作 | ALU操作、寄存器读写 |
| **时序控制信号** | 控制操作时序 | 时钟、节拍 |
| **总线控制信号** | 控制总线操作 | 总线请求、总线允许 |
### 9.2.3 控制信号举例
#### 取指周期的控制信号
| 时钟 | 控制信号 | 功能 |
|------|----------|------|
| T₀ | PCout, MARin | PC → MAR |
| T₁ | MemR, MARout | 读主存 |
| T₂ | MDRinE | M(MAR) → MDR |
| T₃ | MDRout, IRin | MDR → IR |
| T₄ | PC+1 | PC加1 |
#### 执行周期的控制信号(加法指令)
| 时钟 | 控制信号 | 功能 |
|------|----------|------|
| T₀ | IRout, MARin | Ad(IR) → MAR |
| T₁ | MemR, MARout | 读主存 |
| T₂ | MDRinE | M(MAR) → MDR |
| T₃ | MDRout, Yin | MDR → Y |
| T₄ | ADD, Zin | ACC + Y → Z |
| T₅ | Zout, ACCin | Z → ACC |
### 9.2.4 多级时序系统
```mermaid
graph TB
subgraph "多级时序系统"
MACHINE[机器周期] --> CLOCK[时钟周期]
CLOCK --> MICRO[微操作]
end
subgraph "时序关系"
T[指令周期] --> M1[机器周期1]
T --> M2[机器周期2]
T --> M3[机器周期3]
M1 --> C1[时钟周期T0]
M1 --> C2[时钟周期T1]
M1 --> C3[时钟周期T2]
end
```
**时序关系**
- **指令周期**:取出并执行一条指令的时间
- **机器周期**:完成一个基本操作的时间
- **时钟周期**:最基本的时序单位
### 9.2.5 控制方式
#### 1. 同步控制方式
> [!info] 特点
> 所有操作由统一时钟控制,时序固定。
**优点**:设计简单,可靠性高
**缺点**:效率低,不灵活
#### 2. 异步控制方式
> [!info] 特点
> 操作按需进行,采用应答方式。
**优点**:效率高,灵活
**缺点**:设计复杂
#### 3. 联合控制方式
> [!info] 特点
> 同步和异步结合,大部分操作同步,特殊操作异步。
**应用**:现代计算机常用
---
## 📝 本章小结
### 核心概念
1. **微操作命令**:最基本的控制信号
2. **指令周期**:取指周期、间址周期、执行周期、中断周期
3. **控制信号**:控制数据通路和功能部件
4. **时序系统**:机器周期、时钟周期
### 重点图示
> [!summary] 必须掌握的内容
> 1. 指令周期四个阶段的微操作序列
> 2. 控制单元的外特性
> 3. 多级时序系统
> 4. 各类指令的控制信号
---
## 🧪 自测练习
### 概念题
1. 说明微操作命令的概念和特点。
2. 比较指令周期四个阶段的微操作。
3. 解释控制信号的作用和分类。
### 分析题
1. 写出加法指令的微操作序列。
2. 设计取指周期的控制信号。
---
## 🔗 相关链接
- [[08_CPU结构与功能]] - 上一章
- [[10_控制单元设计]] - 下一章
- [[07_指令系统]] - 指令格式
---
*本章难度:⭐⭐⭐⭐ 中等偏难*
*重要程度:⭐⭐⭐⭐ 重点*

View File

@@ -0,0 +1,312 @@
# 第9章 控制单元功能(详细补充版)
> 📖 本章分析控制单元为完成不同指令所发出的各种微操作命令。
> 🎯 重点理解微操作命令和指令执行过程
---
## 📋 本章目录
- [[#9.1 微操作命令的分析]]
- [[#9.2 控制单元的功能]]
- [[#本章小结]]
- [[#例题与解析]]
---
## 9.1 微操作命令的分析
### 9.1.1 微操作命令的概念
> [!info] 定义
> 微操作命令是控制单元发出的最基本控制信号,控制计算机各部件完成相应操作。
要理解微操作命令,可以把它想象成工厂里最细粒度的工作指令——"拿起零件"、"转动螺丝"这样的最小动作,不能再拆分了。整个计算机的工作,就是由控制单元不断发出这些最基础的信号,指挥数据通路和各个功能部件协同配合。
比如 `PC → MAR` 就是一条微操作命令,意思是把程序计数器的值送到地址寄存器;`1 → R` 是向主存发出读命令。每一条都很简单,但组合起来就能完成复杂的指令执行。
### 9.1.2 指令周期的四个阶段
```mermaid
graph LR
A[指令周期] --> B[取指周期]
A --> C[间址周期]
A --> D[执行周期]
A --> E[中断周期]
```
一条指令从开始执行到完成,要经历四个阶段,就像完成一个任务需要"拿任务单→确认地址→干活→处理突发情况"这几个步骤。
**取指周期**是每条指令都有的负责从内存把指令取到CPU里。**间址周期**只有间接寻址的指令才需要——就像你拿到的纸条上写的是"去3号柜找"但3号柜里放的才是真正的东西的地址你需要先去3号柜拿到真实地址。**执行周期**是真正干活的阶段,不同指令做的事情不同,花的时间也不同。**中断周期**不是每条指令都有,只有发生了中断(比如键盘按键、打印机完成)才会进入这个阶段去处理紧急事件。
### 9.1.3 取指周期的微操作
取指周期是所有指令共有的阶段,它的微操作序列是固定的:
| 步骤 | 微操作 | 说明 |
|------|--------|------|
| 1 | PC → MAR | 现行指令地址送MAR |
| 2 | 1 → R | 向主存发读命令 |
| 3 | M(MAR) → MDR | 指令从主存读至MDR |
| 4 | MDR → IR | 指令送指令寄存器 |
| 5 | OP(IR) → CU | 操作码送CU译码 |
| 6 | (PC) + 1 → PC | 程序计数器加1 |
```mermaid
sequenceDiagram
participant PC
participant MAR
participant MEM as 主存
participant MDR
participant IR
participant CU
PC->>MAR: PC → MAR
Note over MAR: 1 → R发读命令
MEM->>MDR: M(MAR) → MDR
MDR->>IR: MDR → IR
IR->>CU: OP(IR) → CU
Note over PC: (PC) + 1 → PC
```
这个过程很直白先把PC里的地址送到MAR告诉主存"我要读这个地址的东西"主存把指令送到MDR再从MDR搬到IR同时把操作码送给CU去译码最后PC加1指向下一条指令。整个流程就像从货架上取货——先告诉仓库你要哪个货架的东西PC→MAR仓库把东西放到传送带上M(MAR)→MDR你从传送带上拿过来MDR→IR然后看看是什么东西OP(IR)→CU同时记一下下一个要取的位置(PC)+1→PC
### 9.1.4 间址周期的微操作
间址周期只在间接寻址时出现,目的是把形式地址转换成有效地址:
| 步骤 | 微操作 | 说明 |
|------|--------|------|
| 1 | Ad(IR) → MAR | 形式地址送MAR |
| 2 | 1 → R | 向主存发读命令 |
| 3 | M(MAR) → MDR | 有效地址从主存读至MDR |
| 4 | MDR → Ad(IR) | 有效地址送IR地址字段 |
```mermaid
sequenceDiagram
participant IR
participant MAR
participant MEM as 主存
participant MDR
IR->>MAR: Ad(IR) → MAR
Note over MAR: 1 → R发读命令
MEM->>MDR: M(MAR) → MDR
MDR->>IR: MDR → Ad(IR)
```
间接寻址就像你拿到一张纸条写着"去3号柜找"3号柜里放的才是真正的目标地址。间址周期做的事情就是先把纸条上的地址形式地址送去查然后从那个位置拿到真正的地址有效地址再把有效地址写回指令的地址字段这样后面执行周期就知道该去哪取数据了。
### 9.1.5 执行周期的微操作
执行周期的微操作取决于指令类型,不同指令差异很大。
**非访存指令**不需要访问内存操作直接在CPU内部完成
| 指令 | 微操作 | 说明 |
|------|--------|------|
| CLA | 0 → ACC | 清除累加器 |
| COM | $\overline{ACC}$ → ACC | 累加器取反 |
| SHR | L(ACC) → R(ACC), ACC₀ → ACC₀ | 算术右移 |
| CSL | L(ACC) → R(ACC), ACC₀ → ACCₙ | 循环左移 |
| STP | 0 → G | 停机指令 |
这些指令都很简单——CLA就是把累加器清零COM是把每一位取反0变1、1变0SHR是算术右移一位相当于除以2CSL是循环左移STP是停机。它们不需要去内存取数据所以执行周期很短。
**访存指令**需要访问内存,执行周期包含访存操作:
| 指令 | 微操作 | 说明 |
|------|--------|------|
| ADD X | Ad(IR) → MAR, 1 → R, M(MAR) → MDR, (ACC) + (MDR) → ACC | 加法指令 |
| STA X | Ad(IR) → MAR, 1 → W, ACC → MDR, MDR → M(MAR) | 存数指令 |
| LDA X | Ad(IR) → MAR, 1 → R, M(MAR) → MDR, MDR → ACC | 取数指令 |
ADD X 是把内存地址X处的数取出来加到累加器STA X 是把累加器的值存到内存地址XLDA X 是把内存地址X处的数取到累加器。它们都需要先送地址、再读写内存、最后在CPU内部完成数据操作。
**转移指令**改变程序的执行顺序:
| 指令 | 微操作 | 说明 |
|------|--------|------|
| JMP X | Ad(IR) → PC | 无条件转移 |
| BAN X | A₀ · Ad(IR) + $\overline{A₀}$ · (PC) → PC | 条件转移(负则转) |
JMP X 就是无条件跳转到地址X直接把X送到PC。BAN X 是条件转移——如果累加器最高位符号位为1表示负数就跳转到X否则继续执行下一条指令。
---
## 9.2 控制单元的功能
### 9.2.1 控制单元的外特性
控制单元是整个CPU的指挥中心它接收各种输入信号然后发出控制信号指挥各部件工作。
**输入信号**包括四类时钟信号让CU按节拍工作就像乐队指挥跟着节拍器指令寄存器送来操作码告诉CU当前要执行什么指令标志位条件码提供运算结果的状态信息帮助CU决定是否跳转外来信号包括中断请求、总线请求等外部事件。
**输出信号**分两类CPU内部控制信号控制ALU、寄存器等内部部件的操作到控制总线的信号则控制主存和I/O设备的读写。
### 9.2.2 控制信号的时序
控制信号不是随意发出的必须按照严格的时序来。时钟周期是CPU的最小时间单位比如1GHz CPU的时钟周期是1ns机器周期完成一个基本操作通常包含几个时钟周期指令周期完成一条指令包含一个或几个机器周期
在取指周期每个时钟周期发出一组控制信号按固定顺序完成取指操作。在执行周期根据指令类型的不同CU会发出不同的控制信号组合——加法指令需要ALU做加法存数指令需要向内存发写命令转移指令需要修改PC的值。
### 9.2.3 控制信号的组成
控制信号按控制对象可以分为四类ALU控制信号决定ALU做什么运算加法、减法、逻辑与、逻辑或等寄存器控制信号控制寄存器的读写哪些寄存器要读、哪些要写数据通路控制信号控制数据在CPU内部的传输方向比如从ALU输出送到哪个寄存器总线控制信号控制总线的读写操作读内存还是写内存
这些信号配合时序,在正确的时刻发出,就能指挥整个计算机协调工作。
---
## 📝 本章小结
### 核心概念
1. **微操作命令**:控制单元发出的最基本控制信号,不可再分
2. **指令周期**:取指周期→间址周期→执行周期→中断周期
3. **控制单元功能**:根据指令和时序,发出各种控制信号
### 关键术语
| 术语 | 英文 | 含义 |
|------|------|------|
| 微操作 | Micro-operation | 最基本的操作 |
| 控制单元 | Control Unit | 发出控制信号的部件 |
| 指令周期 | Instruction Cycle | 完成一条指令的时间 |
| 机器周期 | Machine Cycle | 完成一个基本操作的时间 |
### 重点图示
> [!summary] 必须掌握的图
> 1. 指令周期的四个阶段图
> 2. 取指周期的微操作序列图
> 3. 间址周期的微操作序列图
> 4. 各种指令的微操作序列图
---
## 🧪 例题与解析
### 例题1取指周期分析
**题目**:写出取指周期的微操作序列。
**答案**
取指周期的微操作序列:
1. **PC → MAR**现行指令地址送MAR
2. **1 → R**:向主存发读命令
3. **M(MAR) → MDR**指令从主存读至MDR
4. **MDR → IR**:指令送指令寄存器
5. **OP(IR) → CU**操作码送CU译码
6. **(PC) + 1 → PC**程序计数器加1
这六步是所有指令共有的顺序不能变——必须先送地址才能读内存必须先读到MDR才能送到IR必须先送到IR才能译码。唯一可以和其他操作重叠的是最后一步PC加1它和前面的译码操作可以并行。
### 例题2间址周期分析
**题目**:写出间址周期的微操作序列。
**答案**
间址周期的微操作序列:
1. **Ad(IR) → MAR**形式地址送MAR
2. **1 → R**:向主存发读命令
3. **M(MAR) → MDR**有效地址从主存读至MDR
4. **MDR → Ad(IR)**有效地址送IR地址字段
间址周期的目的就是把形式地址变成有效地址。形式地址是指令里给出的地址,但它不是最终地址——那个位置存放的才是真正的有效地址。所以需要额外访问一次内存,把有效地址取出来,写回指令的地址字段,这样后续的执行周期就知道该去哪操作了。
### 例题3加法指令分析
**题目**:写出加法指令 ADD X 的微操作序列。
**答案**
加法指令 ADD X 的微操作序列:
1. **Ad(IR) → MAR**形式地址送MAR
2. **1 → R**:向主存发读命令
3. **M(MAR) → MDR**操作数从主存读至MDR
4. **(ACC) + (MDR) → ACC**累加器内容与MDR内容相加结果送ACC
前三步和取数指令一样都是把内存地址X处的操作数取到MDR。第四步是关键——把累加器里原来的值和MDR里的值送到ALU做加法结果写回累加器。如果X是间接寻址的还需要在前面加一个间址周期来获取有效地址。
### 例题4存数指令分析
**题目**:写出存数指令 STA X 的微操作序列。
**答案**
存数指令 STA X 的微操作序列:
1. **Ad(IR) → MAR**形式地址送MAR
2. **1 → W**:向主存发写命令
3. **ACC → MDR**累加器内容送MDR
4. **MDR → M(MAR)**MDR内容写入主存
STA X 和 LDA X 的区别在于方向相反LDA 是从内存读到累加器STA 是从累加器写到内存。注意第二步发的是写命令1→W而不是读命令1→R数据流方向也反过来——从ACC到MDR再到内存。
### 例题5控制单元功能分析
**题目**:简述控制单元的功能和输入输出信号。
**答案**
**控制单元的功能**:发出各种控制信号,控制计算机各部件在正确的时刻完成正确的操作。
**输入信号**
- **时钟**CU按节拍工作每个时钟周期发出一组控制信号
- **指令寄存器**操作码决定CU要发出什么控制信号
- **标志**:条件码决定是否需要跳转
- **外来信号**:中断请求、总线请求等外部事件
**输出信号**
- **CPU内控制信号**控制ALU、寄存器等内部部件
- **到控制总线的信号**控制主存、I/O设备的读写
CU的工作可以这样理解它看着指令操作码结合当前状态标志按照时钟节拍在每个时刻发出正确的控制信号指挥数据在各个部件之间流动完成指令的功能。
---
## ⚡ 知识点速记卡
> 考前快速过一遍30秒回忆整章核心
**微操作命令** = 控制单元发出的最基本控制信号,不可再分。如 PC→MAR、1→R。
**指令周期四阶段**:取指(所有指令)→ 间址(间接寻址才要)→ 执行(所有指令)→ 中断(有中断才要)。
**取指周期六步**必须背PC→MAR → 1→R → M(MAR)→MDR → MDR→IR → OP(IR)→CU → (PC)+1→PC。
**间址周期四步**Ad(IR)→MAR → 1→R → M(MAR)→MDR → MDR→Ad(IR)。目的:形式地址→有效地址。
**访存指令执行周期**ADD X读+加、STA X、LDA X读+送ACC。先送地址再读写内存最后CPU内部操作。
**非访存指令**CLA清零、COM取反、SHR右移、CSL循环左移、STP停机不访存所以快。
**控制单元输入**时钟、操作码IR、标志、外来信号中断/总线请求)。**输出**CPU内部控制信号 + 控制总线信号。
---
## 🔗 相关链接
- [[00_计算机组成原理学习指南]] - 返回主目录
- [[08_CPU结构与功能]] - 上一章
- [[10_控制单元设计]] - 下一章
---
## 📚 参考资料
- 教材《计算机组成原理》第3版 - 唐朔飞
- 复习资料:计算机组成原理知识点总结
- 习题:作业三、作业四
---
*本章难度:⭐⭐⭐⭐ 中等*
*重要程度:⭐⭐⭐⭐ 重要*
*补充版本:增加了通俗解释、实际例子和例题*

View File

@@ -0,0 +1,444 @@
# 第10章 控制单元的设计
> 📖 本章介绍控制单元的两种设计方法:组合逻辑设计和微程序设计。
> 🎯 重点理解微程序设计方法
---
## 📋 本章目录
- [[#10.1 组合逻辑设计]]
- [[#10.2 微程序设计]]
- [[#本章小结]]
---
## 10.1 组合逻辑设计
### 10.1.1 组合逻辑控制单元框图
```mermaid
graph TB
subgraph "组合逻辑控制单元"
IR[IR<br/>指令寄存器] --> |"操作码"| DEC[操作码译码器]
CLK[时钟] --> |"时钟信号"| TG[节拍发生器]
DEC --> |"译码输出"| CU[控制单元]
TG --> |"节拍信号"| CU
FLAG[标志] --> CU
CU --> |"控制信号"| CTRL[控制信号输出]
end
```
**组成部分**
- **操作码译码器**:将操作码译码,产生操作控制信号
- **节拍发生器**:产生时序信号,控制微操作顺序
- **控制单元**:根据译码结果和时序信号,产生控制信号
### 10.1.2 微操作的节拍安排
#### 安排原则
1. **顺序原则**:有些微操作次序不能改变
2. **并行原则**:不同控制对象的微操作可并行执行
3. **紧凑原则**:时间短的微操作可安排在同一节拍
#### 取指周期节拍安排
| 节拍 | 微操作 | 说明 |
|------|--------|------|
| T₀ | PC → MAR, 1 → R | 地址送MAR发读命令 |
| T₁ | M(MAR) → MDR, (PC)+1 → PC | 读指令PC加1 |
| T₂ | MDR → IR, OP(IR) → ID | 指令送IR译码 |
```mermaid
sequenceDiagram
participant T0 as 节拍T0
participant T1 as 节拍T1
participant T2 as 节拍T2
Note over T0: PC → MAR, 1 → R
Note over T1: M(MAR) → MDR, (PC)+1 → PC
Note over T2: MDR → IR, OP(IR) → ID
```
#### 间址周期节拍安排
| 节拍 | 微操作 | 说明 |
|------|--------|------|
| T₀ | Ad(IR) → MAR, 1 → R | 形式地址送MAR |
| T₁ | M(MAR) → MDR | 读有效地址 |
| T₂ | MDR → Ad(IR) | 有效地址送IR |
#### 执行周期节拍安排
##### 非访存指令
| 指令 | T₀ | T₁ | T₂ |
|------|----|----|-----|
| CLA | 空 | 空 | 0 → ACC |
| COM | 空 | 空 | $\overline{ACC}$ → ACC |
| SHR | 空 | 空 | L(ACC) → R(ACC) |
| CSL | 空 | 空 | R(ACC) → L(ACC) |
| STP | 空 | 空 | 0 → G |
##### 访存指令
**加法指令 ADD X**
| 节拍 | 微操作 |
|------|--------|
| T₀ | Ad(IR) → MAR, 1 → R |
| T₁ | M(MAR) → MDR |
| T₂ | (ACC) + (MDR) → ACC |
**存数指令 STA X**
| 节拍 | 微操作 |
|------|--------|
| T₀ | Ad(IR) → MAR, 1 → W |
| T₁ | ACC → MDR |
| T₂ | MDR → M(MAR) |
**取数指令 LDA X**
| 节拍 | 微操作 |
|------|--------|
| T₀ | Ad(IR) → MAR, 1 → R |
| T₁ | M(MAR) → MDR |
| T₂ | MDR → ACC |
##### 转移指令
**无条件转移 JMP X**
| 节拍 | 微操作 |
|------|--------|
| T₀ | 空 |
| T₁ | 空 |
| T₂ | Ad(IR) → PC |
**条件转移 BAN X**
| 节拍 | 微操作 |
|------|--------|
| T₀ | 空 |
| T₁ | 空 |
| T₂ | A₀·Ad(IR) + $\overline{A₀}$·(PC) → PC |
#### 中断周期节拍安排
| 节拍 | 微操作 | 说明 |
|------|--------|------|
| T₀ | 0 → MAR, 1 → W | 特定地址送MAR |
| T₁ | PC → MDR | 断点送MDR |
| T₂ | MDR → M(MAR), 向量地址 → PC | 存断点置PC |
### 10.1.3 组合逻辑设计方法
#### 设计步骤
```mermaid
graph TB
A[列出微操作时间表] --> B[写出微操作逻辑表达式]
B --> C[画出逻辑电路图]
C --> D[优化电路]
```
#### 微操作逻辑表达式
**取指周期**
- T₀$PC \to MAR = T_0 \cdot FE$
- T₀$1 \to R = T_0 \cdot FE$
- T₁$M(MAR) \to MDR = T_1 \cdot FE$
- T₁$(PC)+1 \to PC = T_1 \cdot FE$
- T₂$MDR \to IR = T_2 \cdot FE$
- T₂$OP(IR) \to ID = T_2 \cdot FE$
**加法指令 ADD X**
- T₀$Ad(IR) \to MAR = T_0 \cdot ADD \cdot EX$
- T₀$1 \to R = T_0 \cdot ADD \cdot EX$
- T₁$M(MAR) \to MDR = T_1 \cdot ADD \cdot EX$
- T₂$(ACC)+(MDR) \to ACC = T_2 \cdot ADD \cdot EX$
#### 逻辑电路实现
```mermaid
graph TB
subgraph "组合逻辑电路实现"
DEC[操作码译码器] --> |"ADD"| AND1[与门]
TG[节拍发生器] --> |"T0"| AND1
AND1 --> |"控制信号"| OR[或门]
FLAG[标志] --> AND1
OR --> |"最终控制信号"| CTRL[控制信号输出]
end
```
### 10.1.4 组合逻辑设计特点
| 优点 | 缺点 |
|------|------|
| 速度快 | 电路复杂 |
| 设计灵活 | 不易修改 |
| 适合RISC | 扩展困难 |
---
## 10.2 微程序设计
### 10.2.1 微程序设计思想
> [!info] 核心思想
> 将每条机器指令的执行过程编写成一个微程序,存放在控制存储器中。
**基本概念**
| 术语 | 定义 |
|------|------|
| **微命令** | 控制信号,控制微操作 |
| **微操作** | 由微命令控制的最基本操作 |
| **微指令** | 一组微命令的集合 |
| **微程序** | 微指令序列 |
| **控制存储器** | 存放微程序的存储器 |
```mermaid
graph TB
subgraph "微程序层次结构"
MACHINE[机器指令] --> |"对应"| MICRO_PROG[微程序]
MICRO_PROG --> |"包含"| MICRO_INST[微指令]
MICRO_INST --> |"包含"| MICRO_CMD[微命令]
MICRO_CMD --> |"控制"| MICRO_OP[微操作]
end
```
### 10.2.2 微程序控制单元框图
```mermaid
graph TB
subgraph "微程序控制单元"
IR[IR] --> |"操作码"| CMAR[控制存储器地址寄存器]
CMAR --> |"地址"| CM[控制存储器]
CM --> |"微指令"| CMDR[控制存储器数据寄存器]
CMDR --> |"微命令"| CTRL[控制信号]
CMDR --> |"下地址"| CMAR
SEQ[顺序逻辑] --> CMAR
end
```
**组成部分**
- **控制存储器CM**:存放所有微程序
- **控制存储器地址寄存器CMAR**:存放微指令地址
- **控制存储器数据寄存器CMDR**:存放微指令
- **顺序逻辑**:产生下条微指令地址
### 10.2.3 微指令格式
#### 水平型微指令
```mermaid
graph LR
subgraph "水平型微指令"
CMD[操作控制字段] --> SEQ[顺序控制字段]
end
```
**特点**
- 每个微命令占一位
- 并行性好,速度快
- 指令字长较长
#### 垂直型微指令
```mermaid
graph LR
subgraph "垂直型微指令"
OP[操作码] --> ADDR[地址码]
end
```
**特点**
- 类似机器指令格式
- 指令字长较短
- 并行性差,速度慢
#### 混合型微指令
**特点**
- 结合水平型和垂直型优点
- 兼顾速度和效率
### 10.2.4 微指令编码方式
#### 1. 直接编码
**特点**:每个微命令占一位,控制字段直接对应控制信号
**优点**:简单,并行性好
**缺点**:指令字长较长
#### 2. 字段直接编码
**特点**:将微命令分组,每组编码
**原则**
- 互斥微命令在同一字段
- 相容微命令在不同字段
**优点**:减少指令字长
**缺点**:需要译码器
#### 3. 字段间接编码
**特点**:一个字段的含义取决于另一个字段
**优点**:进一步减少指令字长
**缺点**:译码复杂
### 10.2.5 微地址形成方式
| 方式 | 说明 | 应用 |
|------|------|------|
| **计数器方式** | CMAR自动加1 | 顺序执行 |
| **下地址字段** | 微指令中直接给出下地址 | 分支跳转 |
| **操作码映射** | 根据机器指令操作码映射 | 微程序入口 |
| **测试条件** | 根据条件选择地址 | 条件分支 |
### 10.2.6 微程序设计举例
#### 指令周期的微程序
```mermaid
graph TB
subgraph "取指周期微程序"
F1[PC → MAR, 1 → R] --> F2[M(MAR) → MDR, (PC)+1 → PC]
F2 --> F3[MDR → IR, OP(IR) → ID]
end
subgraph "执行周期微程序(加法指令)"
E1[Ad(IR) → MAR, 1 → R] --> E2[M(MAR) → MDR]
E2 --> E3[(ACC)+(MDR) → ACC]
end
F3 --> |"ADD"| E1
```
#### 微程序流程图
```mermaid
graph TB
START[开始] --> FETCH[取指周期微程序]
FETCH --> DECODE[指令译码]
DECODE --> |"ADD"| ADD[加法微程序]
DECODE --> |"STA"| STA[存数微程序]
DECODE --> |"LDA"| LDA[取数微程序]
DECODE --> |"JMP"| JMP[转移微程序]
ADD --> END[结束]
STA --> END
LDA --> END
JMP --> END
```
### 10.2.7 动态微程序设计
> [!info] 概念
> 微程序可根据需要动态改变,支持不同指令系统。
**特点**
- 灵活性高
- 可支持不同指令集
- 硬件复杂
### 10.2.8 毫微程序设计
> [!info] 概念
> 用毫微程序解释微指令,进一步提高灵活性。
**层次结构**
- 机器指令 → 微程序解释
- 微指令 → 毫微程序解释
### 10.2.9 微程序设计特点
| 优点 | 缺点 |
|------|------|
| 规整性好 | 速度较慢 |
| 易于修改 | 需要控制存储器 |
| 灵活性高 | 硬件成本增加 |
| 适合CISC | 设计复杂 |
---
## 10.3 两种设计方法比较
| 特性 | 组合逻辑设计 | 微程序设计 |
|------|--------------|------------|
| **速度** | 快 | 较慢 |
| **灵活性** | 差 | 好 |
| **规整性** | 差 | 好 |
| **修改** | 困难 | 容易 |
| **成本** | 较低 | 较高 |
| **应用** | RISC | CISC |
```mermaid
graph TB
subgraph "设计方法选择"
A[指令系统] --> B{复杂程度}
B -->|简单| C[组合逻辑设计]
B -->|复杂| D[微程序设计]
C --> E[RISC处理器]
D --> F[CISC处理器]
end
```
---
## 📝 本章小结
### 核心概念
1. **组合逻辑设计**:用组合逻辑电路实现控制单元
2. **微程序设计**:将控制信号编写成微程序
3. **微指令格式**:水平型、垂直型、混合型
4. **微指令编码**:直接编码、字段编码
### 关键公式
- **微指令字长**$L = \sum_{i=1}^{n} \lceil \log_2(m_i + 1) \rceil$
- n字段数
- m_i第i字段的微命令数
### 重点图示
> [!summary] 必须掌握的内容
> 1. 组合逻辑控制单元框图
> 2. 微程序控制单元框图
> 3. 微指令格式和编码方式
> 4. 微程序流程图设计
---
## 🧪 自测练习
### 概念题
1. 比较组合逻辑设计和微程序设计的优缺点。
2. 说明微指令的编码方式。
3. 解释微程序设计的基本原理。
### 设计题
1. 设计一个简单指令的微程序。
2. 画出微程序控制单元的框图。
---
## 🔗 相关链接
- [[09_控制单元功能]] - 上一章
- [[08_CPU结构与功能]] - CPU结构
- [[07_指令系统]] - 指令格式
- [[00_计算机组成原理学习指南]] - 返回主目录
---
*本章难度:⭐⭐⭐⭐⭐ 困难*
*重要程度:⭐⭐⭐⭐⭐ 核心重点*

View File

@@ -0,0 +1,322 @@
# 第10章 控制单元设计(详细补充版)
> 📖 本章介绍控制单元的两种设计方法:组合逻辑设计和微程序设计。
> 🎯 重点理解微程序设计方法
---
## 📋 本章目录
- [[#10.1 组合逻辑设计]]
- [[#10.2 微程序设计]]
- [[#本章小结]]
- [[#例题与解析]]
---
## 10.1 组合逻辑设计
### 10.1.1 组合逻辑控制单元框图
```mermaid
graph TB
subgraph "组合逻辑控制单元"
IR[IR<br/>指令寄存器] --> |"操作码"| DEC[操作码译码器]
CLK[时钟] --> |"时钟信号"| TG[节拍发生器]
DEC --> |"译码输出"| CU[控制单元]
TG --> |"节拍信号"| CU
FLAG[标志] --> CU
CU --> |"控制信号"| CTRL[控制信号输出]
end
```
组合逻辑控制单元由三个核心部件组成。操作码译码器负责把指令的操作码翻译成具体的控制信号——比如加法指令的码进来,就输出"做加法"的信号。节拍发生器产生时序信号,控制微操作的先后顺序,就像节拍器控制乐队的节奏。控制单元则是核心,它综合译码结果、节拍信号和标志位,在正确的时刻发出正确的控制信号。
这种设计方式的特点是速度快——信号通过逻辑门直接产生,不需要访问存储器。但缺点也很明显:电路复杂,修改困难,每增加一条指令可能都要重新设计电路。
### 10.1.2 微操作的节拍安排
安排微操作的节拍时,需要遵循三个原则。
**顺序原则**有些微操作的次序不能改变。比如必须先送地址到MAR才能读内存必须先读到MDR才能送到IR——这些顺序是硬件决定的不能颠倒。
**并行原则**不同控制对象的微操作可以同时执行。比如ALU做加法的同时寄存器可以读数据——因为它们控制的是不同的硬件部件互不干扰。
**紧凑原则**时间短的微操作可以安排在同一节拍。比如PC送MAR和发读命令可以同时进行因为它们的操作对象不同而且都很快速。
#### 取指周期节拍安排
| 节拍 | 微操作 | 说明 |
|------|--------|------|
| T₀ | PC → MAR, 1 → R | 地址送MAR发读命令 |
| T₁ | M(MAR) → MDR, (PC)+1 → PC | 读指令PC加1 |
| T₂ | MDR → IR, OP(IR) → ID | 指令送IR译码 |
```mermaid
sequenceDiagram
participant T0 as 节拍T0
participant T1 as 节拍T1
participant T2 as 节拍T2
Note over T0: PC → MAR, 1 → R
Note over T1: M(MAR) → MDR, (PC)+1 → PC
Note over T2: MDR → IR, OP(IR) → ID
```
三个节拍就完成了取指。T₀节拍同时做两件事送地址和发读命令因为它们操作的对象不同MAR和控制总线可以并行。T₁节拍也是两件事并行从内存读指令到MDR同时PC加1——读内存是主存的操作PC加1是CPU内部操作互不影响。T₂节拍把指令从MDR搬到IR同时操作码送到译码器。
#### 间址周期节拍安排
| 节拍 | 微操作 | 说明 |
|------|--------|------|
| T₀ | Ad(IR) → MAR, 1 → R | 形式地址送MAR |
| T₁ | M(MAR) → MDR | 读有效地址 |
| T₂ | MDR → Ad(IR) | 有效地址送IR |
间址周期和取指周期结构类似但目的不同——这里是为了获取有效地址。T₀送形式地址并发读命令T₁从内存读有效地址到MDRT₂把有效地址写回指令的地址字段。这样后续执行周期就知道该去哪操作了。
#### 执行周期节拍安排
**非访存指令**不需要访问内存所以很多只需要用到T₂节拍
| 指令 | T₀ | T₁ | T₂ |
|------|----|----|-----|
| CLA | 空 | 空 | 0 → ACC |
| COM | 空 | 空 | $\overline{ACC}$ → ACC |
| SHR | 空 | 空 | L(ACC) → R(ACC) |
| CSL | 空 | 空 | R(ACC) → L(ACC) |
| STP | 空 | 空 | 0 → G |
这些指令都是CPU内部操作不需要去内存取数据所以T₀和T₁空闲只在T₂执行一个操作。这也是为什么非访存指令通常比访存指令快。
**访存指令**需要访问内存,三个节拍都用满了:
**加法指令 ADD X**
| 节拍 | 微操作 |
|------|--------|
| T₀ | Ad(IR) → MAR, 1 → R |
| T₁ | M(MAR) → MDR |
| T₂ | (ACC) + (MDR) → ACC |
T₀送地址并发读命令T₁从内存读操作数到MDRT₂把累加器的值和MDR的值送到ALU做加法结果写回累加器。
**存数指令 STA X**
| 节拍 | 微操作 |
|------|--------|
| T₀ | Ad(IR) → MAR, 1 → W |
| T₁ | ACC → MDR |
| T₂ | MDR → M(MAR) |
STA X 和 ADD X 的区别在于方向ADD 是从内存读到CPUSTA 是从CPU写到内存。所以T₀发的是写命令1→WT₁把累加器的值送到MDRT₂把MDR的内容写入内存。
**取数指令 LDA X**
| 节拍 | 微操作 |
|------|--------|
| T₀ | Ad(IR) → MAR, 1 → R |
| T₁ | M(MAR) → MDR |
| T₂ | MDR → ACC |
LDA X 和 ADD X 的前三步完全一样区别在T₂ADD 是做加法后送回累加器LDA 是直接把MDR的值送到累加器累加器原来的值被覆盖
---
## 10.2 微程序设计
### 10.2.1 微程序设计的基本概念
> [!info] 定义
> 微程序设计是用程序的方法来设计控制单元,把控制信号编成微指令,存放在控制存储器中。
组合逻辑设计虽然速度快,但电路复杂、修改困难。微程序设计的思路完全不同——它把控制信号看成"数据"存到一个ROM只读存储器执行指令时从ROM中读取控制信号。这样设计控制单元就变成了编写"微程序",和写软件的思路类似。
三个核心概念:**微指令**是一组控制信号的集合,一条微指令可以同时激活多个控制信号;**微程序**是微指令的有序序列,一条机器指令对应一个微程序;**控制存储器**CS是存放微程序的ROM通常在CPU内部。
举个例子执行一条加法指令它的微程序可能包含三条微指令第一条完成取指PC→MAR、1→R等第二条完成取操作数Ad(IR)→MAR、M(MAR)→MDR第三条完成加法运算(ACC)+(MDR)→ACC。每条微指令里的控制信号可以并行发出。
### 10.2.2 微指令的格式
微指令由两部分组成:**操作控制字段**产生各种控制信号,**顺序控制字段**决定下一条微指令的地址。
根据操作控制字段的编码方式,微指令分为两种格式。
**水平型微指令**的操作控制字段很长每一位或每几位对应一个控制信号可以同时激活多个信号实现并行操作。优点是执行速度快一条微指令就能完成很多操作缺点是微指令很长占用存储空间大。现代高性能CPU通常采用水平型微指令。
**垂直型微指令**的操作控制字段很短,采用编码方式,一条微指令只能控制一个或少数几个操作。优点是微指令短、节省空间,缺点是执行速度慢(需要更多微指令才能完成一条机器指令)。简单处理器常用垂直型微指令。
### 10.2.3 微程序设计的步骤
微程序设计可以分为四步。
第一步是**分析指令**把每条机器指令分解成微操作序列确定需要哪些控制信号。比如加法指令需要PC→MAR、1→R、M(MAR)→MDR、(ACC)+(MDR)→ACC这些控制信号。
第二步是**设计微指令格式**:确定操作控制字段和顺序控制字段的宽度和编码方式。操作控制字段要能表示所有需要的控制信号,顺序控制字段要能表示微程序的地址范围。
第三步是**编写微程序**:为每条机器指令编写对应的微程序。取指周期的微程序是所有指令共用的,执行周期的微程序因指令而异。
第四步是**实现控制存储器**把微程序固化到ROM中。ROM的内容在制造时就确定了不能修改除非用可擦写的EPROM
### 10.2.4 微程序设计的优缺点
微程序设计最大的优点是**规整性和灵活性**。用程序的方法设计控制单元逻辑清晰、容易理解需要增加新指令时只需要在ROM中添加对应的微程序不需要重新设计电路调试和维护也方便可以通过修改微程序来修复bug。
缺点主要是**速度**。每条微指令都要从控制存储器读取,增加了访存时间,比组合逻辑直接产生信号要慢。另外需要额外的控制存储器,增加了硬件成本。
实际应用中现代复杂CPU如x86系列通常采用微程序设计因为指令集复杂、需要灵活扩展。而简单处理器如一些嵌入式处理器可能采用组合逻辑设计追求更高的执行速度。
---
## 📝 本章小结
### 核心概念
1. **组合逻辑设计**:用组合逻辑电路直接产生控制信号,速度快但设计复杂
2. **微程序设计**把控制信号存到ROM中用读取ROM的方式产生控制信号灵活但速度较慢
3. **微指令**:一组控制信号的集合
4. **微程序**:微指令的有序序列,一条机器指令对应一个微程序
5. **控制存储器**存放微程序的ROM
### 关键术语
| 术语 | 英文 | 含义 |
|------|------|------|
| 组合逻辑 | Combinational Logic | 用逻辑电路实现 |
| 微程序 | Microprogram | 用程序实现 |
| 微指令 | Microinstruction | 控制信号的集合 |
| 控制存储器 | Control Storage | 存放微程序的ROM |
### 重点图示
> [!summary] 必须掌握的图
> 1. 组合逻辑控制单元框图
> 2. 微程序控制单元框图
> 3. 微指令格式图
> 4. 取指周期的节拍安排图
---
## 🧪 例题与解析
### 例题1取指周期节拍安排
**题目**:写出取指周期的节拍安排。
**答案**
| 节拍 | 微操作 | 说明 |
|------|--------|------|
| T₀ | PC → MAR, 1 → R | 地址送MAR发读命令 |
| T₁ | M(MAR) → MDR, (PC)+1 → PC | 读指令PC加1 |
| T₂ | MDR → IR, OP(IR) → ID | 指令送IR译码 |
每个节拍都安排了两个可以并行的操作T₀送地址和发读命令操作对象不同可以同时进行T₁读内存和PC加1一个是主存操作、一个是CPU内部操作互不干扰T₂送指令和译码也是类似道理。这样三个节拍就完成了取指效率很高。
### 例题2加法指令节拍安排
**题目**:写出加法指令 ADD X 的节拍安排。
**答案**
| 节拍 | 微操作 |
|------|--------|
| T₀ | Ad(IR) → MAR, 1 → R |
| T₁ | M(MAR) → MDR |
| T₂ | (ACC) + (MDR) → ACC |
ADD X 的执行周期需要三次访存操作中的两次送地址、读数据然后做加法。T₀送地址并发读命令T₁等待内存响应并把数据读到MDRT₂把累加器的值和MDR的值送到ALU做加法结果写回累加器。如果X是间接寻址的还需要在前面加一个间址周期。
### 例题3微程序设计步骤
**题目**:简述微程序设计的步骤。
**答案**
微程序设计的步骤:
1. **分析指令**:把每条机器指令分解成微操作序列,确定需要哪些控制信号
2. **设计微指令格式**:确定操作控制字段和顺序控制字段的宽度和编码方式
3. **编写微程序**:为每条机器指令编写对应的微程序,取指周期的微程序是共用的
4. **实现控制存储器**把微程序固化到ROM中
这四步的核心思想是"用数据代替逻辑"——把原本需要复杂电路实现的控制逻辑变成存储在ROM中的数据通过读取ROM来产生控制信号。这样设计更灵活但代价是速度稍慢。
### 例题4组合逻辑与微程序比较
**题目**:比较组合逻辑设计和微程序设计的优缺点。
**答案**
| 特性 | 组合逻辑设计 | 微程序设计 |
|------|--------------|------------|
| **设计方法** | 用逻辑电路直接实现 | 用程序ROM实现 |
| **优点** | 速度快 | 规整性好,灵活,易修改 |
| **缺点** | 设计复杂,不灵活,难修改 | 速度较慢需要额外的ROM |
| **应用** | 简单CPU、RISC处理器 | 复杂CPU、CISC处理器 |
选择哪种方式取决于设计目标追求极致速度就用组合逻辑追求灵活性和可扩展性就用微程序。现代CPU往往混合使用——简单常用的指令用组合逻辑加速复杂指令用微程序实现。
### 例题5微指令格式设计
**题目**设计一个简单的微指令格式支持8种控制信号。
**答案**
**操作控制字段**8种控制信号如果采用水平型编码每位对应一个信号需要8位。如果采用垂直型编码用3位二进制编码选择8种信号之一只需要3位但一次只能激活一个信号。
**顺序控制字段**需要支持顺序执行和跳转。假设微程序最多16条微指令地址需要4位再加1位跳转标志是否跳转共5位。
**水平型微指令格式**16位
- 操作控制字段8位每位控制一个信号可同时激活多个
- 顺序控制字段4位地址 + 1位跳转标志 + 3位备用 = 8位
**垂直型微指令格式**8位
- 操作控制字段3位编码选择8种信号之一
- 顺序控制字段4位地址 + 1位跳转标志 = 5位
水平型微指令更灵活(一条指令可以同时控制多个操作),但占用更多空间;垂直型微指令更紧凑,但需要更多条微指令才能完成同样的功能。
---
## ⚡ 知识点速记卡
> 考前快速过一遍30秒回忆整章核心
**两种CU设计方法**组合逻辑硬连线快但难改vs 微程序ROM存控制信号灵活但慢
**组合逻辑CU三部件**:操作码译码器(指令→控制信号)、节拍发生器(产生时序)、控制单元(综合输出)。
**节拍安排三原则**顺序原则先MAR后读内存、并行原则不同部件可同时工作、紧凑原则短操作放同一节拍
**取指周期三拍**T₀=PC→MAR+1→RT₁=M(MAR)→MDR+(PC)+1→PCT₂=MDR→IR+OP(IR)→ID。
**微程序核心三概念**微指令一组控制信号、微程序微指令序列一条机器指令对应一个微程序、控制存储器CS存微程序的ROM
**水平型 vs 垂直型微指令**水平型位长可并行多信号快但占空间vs 垂直型(位短,编码方式,省空间但慢)。
**微程序设计四步**分析指令→设计微指令格式→编写微程序→固化到ROM。核心思想用数据ROM代替逻辑电路
**选择策略**追求速度→组合逻辑RISC追求灵活→微程序CISC。现代CPU常混合使用。
---
## 🔗 相关链接
- [[00_计算机组成原理学习指南]] - 返回主目录
- [[09_控制单元功能]] - 上一章
- [[01_计算机系统概论]] - 返回第一章
---
## 📚 参考资料
- 教材《计算机组成原理》第3版 - 唐朔飞
- 复习资料:计算机组成原理知识点总结
- 习题:作业三、作业四
---
*本章难度:⭐⭐⭐⭐⭐ 困难*
*重要程度:⭐⭐⭐⭐⭐ 重点*
*补充版本:增加了通俗解释、实际例子和例题*

View File

@@ -0,0 +1,149 @@
# 计算机组成原理学习笔记
> 📚 基于唐朔飞《计算机组成原理》第3版整理
> 🎯 适合初学者系统学习和考前快速复习
> 📝 符合Obsidian笔记软件格式
---
## 📖 笔记目录
| 文件 | 内容 | 难度 | 重要程度 |
|------|------|------|----------|
| [[00_计算机组成原理学习指南]] | 学习指南和整体框架 | ⭐ | ⭐⭐⭐ |
| [[01_计算机系统概论]] | 计算机系统基础概念 | ⭐⭐ | ⭐⭐⭐ |
| [[03_系统总线]] | 总线结构和工作原理 | ⭐⭐⭐ | ⭐⭐⭐ |
| [[04_存储器]] | 存储系统层次结构 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| [[05_输入输出系统]] | IO系统工作方式 | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| [[06_运算方法]] | 数据的表示和运算 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| [[07_指令系统]] | 指令格式和寻址方式 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| [[08_CPU结构与功能]] | CPU组成和工作原理 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| [[09_控制单元功能]] | 控制单元的基本功能 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| [[10_控制单元设计]] | 控制单元的设计方法 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
---
## 🎯 学习建议
### 初学者学习路径
```
第1章 概论 → 第3章 总线 → 第7章 指令系统 → 第6章 运算方法
第4章 存储器 → 第5章 IO系统 → 第8章 CPU → 第9-10章 控制单元
```
### 复习者快速回顾
1. **重点章节**第4章存储器、第6章运算方法、第8章CPU、第10章控制单元设计
2. **核心概念**:冯·诺依曼体系、存储层次、指令周期、微程序设计
3. **必考内容**补码运算、Cache映射、中断处理、微指令格式
---
## 📊 重要公式速查
### 数制转换
- 二进制 → 十进制:$\sum_{i=0}^{n} a_i \times 2^i$
- 十进制 → 二进制除2取余乘2取整
### 数据表示
- 原码范围:$-(2^{n-1}-1) \sim +(2^{n-1}-1)$
- 补码范围:$-2^{n-1} \sim +(2^{n-1}-1)$
- 移码:$[x]_{移} = 2^{n-1} + x$
### Cache相关
- Cache命中率$H = \frac{N_c}{N_c + N_m}$
- 平均访问时间:$T_a = HT_c + (1-H)T_m$
- 访问效率:$e = \frac{T_c}{T_a}$
### 浮点数
- IEEE 754$N = (-1)^S \times 1.M \times 2^{E-127}$
### 流水线
- 加速比:$S = \frac{n \times k}{k + (n-1)}$
---
## 📝 笔记使用说明
### Obsidian特性使用
1. **双链链接**:使用 `[[文件名]]` 创建笔记间链接
2. **Callout提示**:使用 `> [!info]``> [!tip]` 等创建提示框
3. **Mermaid图表**:使用 ````mermaid` 创建流程图、时序图等
4. **数学公式**:使用 `$...$` 行内公式,`$$...$$` 块级公式
5. **标签**:使用 `#标签` 对笔记分类
### 推荐标签
- `#计算机组成` - 主标签
- `#重点` - 重点内容
- `#公式` - 重要公式
- `#图例` - 图示说明
- `#习题` - 练习题
---
## 🔧 实验资源
- 实验1中规模组合电路及运算器的应用
- 实验3基本模型机的数据通路
- 实验4基本模型机的微程序设计
---
## 📚 参考资料
- 教材《计算机组成原理》第3版 - 唐朔飞
- 复习资料1-10章精简参考复习资料
- 习题:作业三、作业四
- 试卷样卷2025、期中考试
---
## 💡 学习小贴士
> [!tip] 理解优先
> 计算机组成原理重在理解硬件工作原理,不要死记硬背。多画图、多思考数据流向。
> [!warning] 常见误区
> - 混淆计算机体系结构和计算机组成的概念
> - 不理解补码运算的本质
> - 忽视存储层次的整体性
> [!note] 考试重点
> - 补码加减运算及溢出判断
> - Cache地址映射和替换算法
> - 中断处理过程
> - 微程序设计方法
---
## 📁 文件结构
```
学习笔记/
├── README.md # 本文件
├── 00_计算机组成原理学习指南.md # 学习指南
├── 01_计算机系统概论.md # 第1章
├── 03_系统总线.md # 第3章
├── 04_存储器.md # 第4章
├── 05_输入输出系统.md # 第5章
├── 06_运算方法.md # 第6章
├── 07_指令系统.md # 第7章
├── 08_CPU结构与功能.md # 第8章
├── 09_控制单元功能.md # 第9章
└── 10_控制单元设计.md # 第10章
```
---
*笔记整理完成2026年7月4日*
*总文件数11个*
*总字数约10万字*

View File

@@ -0,0 +1,219 @@
# 计算机组成原理学习笔记 - 补充版说明
## 📋 补充工作概述
我已经为计算机组成原理学习笔记的每个章节创建了详细补充版,增加了通俗易懂的解释、实际例子和例题,帮助更好地理解课程中的难点。
## 📚 补充版笔记列表
| 章节 | 基础版 | 补充版 | 主要补充内容 |
|------|--------|--------|--------------|
| 第1章 | 01_计算机系统概论.md | 01_计算机系统概论_补充版.md | 计算机层次结构、冯·诺依曼体系 |
| 第3章 | 03_系统总线.md | 03_系统总线_补充版.md | 总线结构、总线仲裁、总线控制 |
| 第4章 | 04_存储器.md | 04_存储器_补充版.md | 存储层次、Cache、虚拟存储器 |
| 第5章 | 05_输入输出系统.md | 05_输入输出系统_补充版.md | 程序查询、中断、DMA |
| 第6章 | 06_运算方法.md | 06_运算方法_补充版.md | 补码运算、浮点数表示 |
| 第7章 | 07_指令系统.md | 07_指令系统_补充版.md | 寻址方式、指令格式、RISC |
| 第8章 | 08_CPU结构与功能.md | 08_CPU结构与功能_补充版.md | CPU结构、指令周期、流水线 |
| 第9章 | 09_控制单元功能.md | 09_控制单元功能_补充版.md | 微操作命令、控制单元功能 |
| 第10章 | 10_控制单元设计.md | 10_控制单元设计_补充版.md | 组合逻辑设计、微程序设计 |
## 🎯 补充版特点
### 1. 通俗易懂的解释
- 用日常生活中的例子解释抽象概念
- 用类比的方法帮助理解难点
- 避免使用过于专业的术语
### 2. 实际例子
- 每个概念都有对应的实际例子
- 帮助理解理论在实际中的应用
- 增强学习的趣味性
### 3. 详细例题
- 每个章节都有5道例题
- 包含详细的解题步骤和答案
- 帮助掌握考试重点
### 4. 深入浅出的讲解
- 从简单到复杂,循序渐进
- 帮助建立完整的知识体系
- 强调重点和难点
## 📖 如何使用补充版笔记
### 初学者学习路径
1. 先阅读基础版笔记,了解基本概念
2. 再阅读补充版笔记,加深理解
3. 做补充版笔记中的例题,巩固知识
4. 遇到不理解的地方,参考补充版笔记中的解释
### 复习者快速回顾
1. 快速浏览基础版笔记,回顾知识点
2. 重点阅读补充版笔记中的例题
3. 做补充版笔记中的例题,检验掌握程度
4. 针对薄弱环节,重点复习补充版笔记
### 考试前重点复习
1. 重点复习补充版笔记中的例题
2. 理解解题思路和方法
3. 掌握考试重点和难点
4. 做模拟试题,检验复习效果
## 🔍 补充内容详解
### 第1章计算机系统概论
**补充重点**
- 计算机层次结构的通俗解释
- 冯·诺依曼体系的实际例子
- 计算机体系结构与组成的区别
- 编译程序与解释程序的比较
**例题类型**
- 计算机层次结构分析
- 编译与解释程序比较
- 冯·诺依曼体系特点
- 技术指标计算
### 第3章系统总线
**补充重点**
- 总线的通俗解释(公共马路)
- 三种总线结构的比较
- 总线仲裁的实际例子
- 总线性能指标的计算
**例题类型**
- 总线带宽计算
- 地址总线计算
- 总线结构比较
- 总线仲裁分析
### 第4章存储器
**补充重点**
- 存储层次的通俗解释(办公室文件系统)
- SRAM与DRAM的比较
- Cache工作原理的实际例子
- 虚拟存储器的概念
**例题类型**
- 存储容量计算
- Cache命中率计算
- Cache地址映射
- 存储器扩展
### 第5章输入输出系统
**补充重点**
- I/O系统发展的通俗解释
- 三种I/O方式的比较
- 中断处理过程的实际例子
- DMA工作原理
**例题类型**
- 中断处理过程分析
- DMA与中断比较
- 程序查询方式分析
- 中断优先级设计
### 第6章运算方法
**补充重点**
- 补码的通俗解释(时钟例子)
- 四种编码的比较
- 浮点数表示的实际例子
- 定点运算和浮点运算
**例题类型**
- 补码计算
- 浮点数表示
- 补码加法
- 溢出判断
### 第7章指令系统
**补充重点**
- 指令格式的通俗解释
- 各种寻址方式的实际例子
- RISC与CISC的比较
- 扩展操作码设计
**例题类型**
- 指令格式设计
- 寻址方式分析
- RISC与CISC比较
- 扩展操作码设计
### 第8章CPU结构与功能
**补充重点**
- CPU功能的通俗解释
- CPU结构的实际例子
- 指令周期的概念
- 指令流水线的原理
**例题类型**
- CPU功能分析
- 指令周期计算
- 流水线性能计算
- 流水线冲突分析
### 第9章控制单元功能
**补充重点**
- 微操作命令的通俗解释
- 指令周期四个阶段的实际例子
- 各种指令的微操作序列
- 控制单元的功能
**例题类型**
- 取指周期分析
- 间址周期分析
- 加法指令分析
- 控制单元功能分析
### 第10章控制单元设计
**补充重点**
- 组合逻辑设计的通俗解释
- 微程序设计的实际例子
- 微指令格式的设计
- 两种设计方法的比较
**例题类型**
- 取指周期节拍安排
- 加法指令节拍安排
- 微程序设计步骤
- 组合逻辑与微程序比较
## 📊 学习建议
### 重点章节
1. **第4章 存储器**Cache映射、虚拟存储器
2. **第6章 运算方法**:补码运算、浮点数表示
3. **第8章 CPU结构与功能**:指令周期、流水线
4. **第10章 控制单元设计**:微程序设计
### 难点突破
1. **补码运算**:用时钟例子理解补码概念
2. **Cache映射**:用图书馆书架例子理解映射方式
3. **流水线**:用工厂生产线理解流水线原理
4. **微程序设计**:用程序控制机器理解微程序概念
### 考试重点
1. **补码加减运算及溢出判断**
2. **Cache地址映射和替换算法**
3. **中断处理过程**
4. **微程序设计方法**
## 📝 学习小贴士
1. **理解优先**:不要死记硬背,要理解原理
2. **多画图**:用图形帮助理解抽象概念
3. **多思考**:思考数据流向和控制信号
4. **多练习**:做例题巩固知识
5. **多总结**:总结知识点和解题方法
## 🔗 相关资源
- 教材《计算机组成原理》第3版 - 唐朔飞
- 复习资料:计算机组成原理知识点总结
- 习题:作业三、作业四
- 试卷样卷2025、期中考试
---
*补充版笔记创建完成,希望对学习有所帮助!*