# 第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_输入输出系统]] - 中断系统

---

*本章难度：⭐⭐⭐⭐⭐ 困难*
*重要程度：⭐⭐⭐⭐⭐ 核心重点*