第10章 微处理器的内部组成及外部功能特性
课程:1A003 计算机组织与系统结构(第二部分) 主讲:北京大学课程 教材:80x86/Pentium 体系结构 状态:partial_extraction(图片型PPT,提取约1万字符文本,结构框图和时序图需结合文字描述理解)
一、本章概述
本章是微型计算机组成原理的核心章节,以 Intel 80386 DX 和 Pentium 为典型实例,讲解微处理器的两大方面:
- 内部组成:微处理器内部的功能模块划分与工作机制
- 外部功能特性:引脚信号定义与总线操作时序
以 80386 DX 为主要讲解对象(32位微处理器的经典代表),同时引入 Pentium 的高级特性(如 BTB 分支预测)作为扩展。
二、微处理器的内部组成(Pentium 为例)
1. Pentium 内部结构框图(图10.1)
Pentium 是 Intel 第五代 x86 微处理器,采用超标量(Superscalar)架构,内部包含多条并行执行流水线。
核心组成模块(结合 x86 经典结构推断):
- 总线接口单元(BIU):与外部系统总线连接,负责地址、数据和控制信号的传送
- 指令预取与译码单元:从存储器预取指令,进行译码
- 控制单元(CU):产生各种控制信号,协调各部件工作
- 算术逻辑单元(ALU):执行算术和逻辑运算
- 寄存器组:通用寄存器、段寄存器、标志寄存器等
- Cache 存储器:片内指令 Cache 和数据 Cache(Pentium 采用分离式 Cache)
- 浮点运算单元(FPU):集成在芯片内部的数值协处理器
- 分支目标缓冲器(BTB):动态分支预测
2. 分支目标缓冲器 BTB(Branch Target Buffer)
BTB 的工作机制(图10.3):
BTB 是 Pentium 中用于动态分支预测的关键部件,用于解决流水线中的分支指令导致的性能损失问题。
基本原理:
- BTB 保存最近执行过的分支指令的地址及其目标地址
- 当预取到一条分支指令时,同时查询 BTB
- 如果 BTB 中已有该分支的历史记录(命中),则直接预测目标地址,从目标地址处继续预取指令
- 如果预测正确,流水线不会断流,分支指令零开销执行
- 如果预测错误或 BTB 中无记录(未命中),则清空流水线,重新取指
BTB 历史位的意义及状态转换(图10.4):
BTB 中每个条目配有历史位(通常为 2 位饱和计数器),记录分支的历史走向:
- 两位计数器有四种状态:强不跳 → 弱不跳 → 弱跳 → 强跳
- 每次分支实际发生(跳),计数器加 1(向上饱和)
- 每次分支实际不发生(不跳),计数器减 1(向下饱和)
- 预测策略:高位为 1 则预测跳转,高位为 0 则预测不跳转
- 2 位饱和计数器的优势:需要连续两次预测错误才会翻转预测方向,抗噪声能力强
这是经典的 2-bit saturating counter 分支预测算法,也是现代处理器分支预测器的基础。
三、微处理器的外部引脚信号(80386 DX)
1. 引脚信号总览(图10.5)
80386 DX 是 Intel 第一代 32 位微处理器,共 132 个引脚(PGA 封装),按功能可分为:
| 信号类别 | 主要信号 | 方向 | 功能说明 |
|---|---|---|---|
| 地址信号 | A2~A31, BE0#~BE3# | 输出 | 32 位地址(字节寻址),BE 为字节允许 |
| 数据信号 | D0~D31 | 双向 | 32 位数据总线,可 8/16/32 位传送 |
| 时钟信号 | CLK2 | 输入 | 两倍频外部时钟 |
| 总线控制 | ADS#, NA#, LOCK#, BS16# | 输出/输入 | 地址状态、地址流水线、总线封锁、16位选择 |
| 总线周期指示 | M/IO#, D/C#, W/R# | 输出 | 三位编码定义总线周期类型 |
| 中断信号 | INTR, NMI, RESET | 输入 | 可屏蔽中断、非屏蔽中断、复位 |
| DMA 信号 | HOLD, HLDA | 输入/输出 | 总线保持请求、总线保持响应 |
| 协处理器信号 | PEREQ, BUSY#, ERROR# | 输入 | 协处理器请求、忙、出错 |
| 就绪信号 | READY# | 输入 | 总线周期结束确认,用于插入等待状态 |
2. 地址和数据信号
-
A2~A31:地址总线(输出),30 根地址线,寻址空间 4GB(2³² 字节)
- A0 和 A1 在内部译码产生 4 个字节允许信号 BE0#~BE3#
- BE0# 对应 D0
D7(最低字节),BE1# 对应 D8D15,以此类推 - 这种设计使 32 位微处理器可以直接支持字节、字、双字三种数据宽度的访问
-
D0~D31:数据总线(双向),32 位宽度
- 支持 32 位(双字)、16 位(字)、8 位(字节)数据传送
- 由 BS16# 信号决定是 32 位还是 16 位总线模式
3. 总线周期指示信号
三位信号 M/IO#、D/C#、W/R# 组合起来标识当前总线周期的类型,共 8 种组合:
| M/IO# | D/C# | W/R# | 总线周期类型 |
|---|---|---|---|
| 0 | 0 | 0 | 中断响应(Interrupt Acknowledge) |
| 0 | 0 | 1 | 停机/暂停(Shutdown/Halt) |
| 0 | 1 | 0 | I/O 读(I/O Read) |
| 0 | 1 | 1 | I/O 写(I/O Write) |
| 1 | 0 | 0 | 存储器代码读(Memory Code Read) |
| 1 | 0 | 1 | 存储器写(Memory Write — 注:实际为暂停/取指等特殊周期,以教材表10-3为准) |
| 1 | 1 | 0 | 存储器数据读(Memory Data Read) |
| 1 | 1 | 1 | 存储器数据写(Memory Data Write) |
记忆要点:M/IO 区分存储器与I/O,D/C 区分数据与代码/控制,W/R 区分写与读。
4. 总线控制信号
(1) ADS#(Address Status,地址状态)
- 输出信号,低电平有效
- 表示一个有效的地址已经出现在地址总线上,同时总线周期指示码也已有效
- 外部电路可用 ADS# 作为地址锁存信号
(2) NA#(Next Address,下一个地址/地址流水线)
- 输入信号,低电平有效
- 用于激活地址流水线方式
- 当 NA# 有效时,80386 可以在当前总线周期结束之前就发出下一个总线周期的地址和控制信号
- 目的:让存储器有更多时间进行地址译码和数据准备,用较低速的存储器获得较高的系统性能
地址流水线(Address Pipelining):下一个总线周期的地址在本周期 T2 期间就提前发出,使寻址与数据传送重叠,提高总线效率。
(3) LOCK#(总线封锁)
- 输出信号,低电平有效
- 用于支持多处理器系统中的共享资源保护
- 当 CPU 执行带
LOCK前缀的指令时,LOCK# 输出有效 - 在 LOCK# 有效期间,CPU 不响应总线保持请求(HOLD),独占总线使用权
- 典型应用:原子操作、信号量操作、存储器的读-修改-写周期
(4) BS16#(Bus Size 16,16位总线宽)
- 输入信号,低电平表示 16 位总线模式
- 用于选择数据总线宽度:32 位(BS16#=1)或 16 位(BS16#=0)
- CPU 在 T2 状态中间采样此信号
- 当外部设备是 16 位接口时,通过拉低 BS16#,CPU 自动将 32 位数据拆分为两次 16 位传送
5. 中断接口信号
(1) INTR(Interrupt Request,可屏蔽中断请求)
- 输入信号,高电平有效
- 外部设备通过此引脚向 CPU 发出中断请求
- CPU 在每条指令开始时刻采样 INTR
- 可屏蔽:由标志寄存器中的中断允许位 IF 控制
- IF = 1:允许中断(开中断)
- IF = 0:禁止中断(关中断)
- 响应过程:若 IF=1 且检测到有效请求,则启动中断响应总线周期(M/IO# D/C# W/R# = 000)
- 外部中断控制器(如 8259A)在响应周期中把中断类型号送到数据总线上
(2) NMI(Non-Maskable Interrupt,非屏蔽中断请求)
- 输入信号,上升沿触发(0→1跳变)
- 不可屏蔽:不受 IF 标志位影响
- 只要 NMI 引脚上出现 0→1 的跳变,CPU 在执行完当前指令后立即响应
- 中断类型号固定为 2,无需外部提供
- 通常用于处理系统紧急故障,如电源掉电、存储器奇偶校验错等
(3) RESET(系统复位)
- 输入信号,高电平有效
- 用于对微处理器进行硬件复位(如加电复位)
- RESET 为高电平时,初始化内部寄存器(设置为已知初始状态)
- RESET 从高变低后,CPU 从复位服务程序入口处开始执行
- 复位入口地址:8086 为 FFFF0H,80386 为 FFFFFFF0H
- 复位服务程序负责初始化 I/O 端口、中断标志、数据存储器等系统资源
6. DMA 接口信号
DMA(Direct Memory Access,直接存储器访问)接口只需两根信号:
(1) HOLD(总线保持请求)
- 输入信号,高电平有效
- 外部 DMA 控制器通过 HOLD 请求总线控制权
(2) HLDA(总线保持响应)
- 输出信号,高电平有效
- CPU 收到 HOLD 请求后,如果同意让出总线(未执行 LOCK 前缀指令),则在当前总线周期结束后:
- 使地址总线、数据总线和控制总线变为高阻态(第三态)
- 使 HLDA 输出高电平,表示已交出总线控制权
- HOLD 撤销后,HLDA 也随之变低,CPU 重新接管总线
总线仲裁:HOLD → 高阻 + HLDA → DMA 操作 → HOLD 撤销 → HLDA 撤销 → CPU 恢复
7. 协处理器接口信号
80386 DX 与 80387 DX(数值协处理器)通过 3 个信号连接:
(1) PEREQ(Processor Extension Request,协处理器请求)
- 输入信号,高电平有效
- 80387 需要读写存储器操作数时,通过 PEREQ 通知 80386
- CPU 响应后启动相应的总线周期,为协处理器传送数据
- 80387 不能独立进行数据传送,必须通过主 CPU 完成
(2) BUSY#(协处理器忙)
- 输入信号,低电平有效
- 80387 正在执行运算指令时,BUSY# 为低
- CPU 遇到数值协处理器指令时,先检测 BUSY#
- 若 BUSY#=0(忙),则等待(自动插入等待状态)
- 若 BUSY#=1(闲),则可以发出新的协处理器指令
(3) ERROR#(协处理器错)
- 输入信号,低电平有效
- 80387 运算出错时,ERROR# 变低
- CPU 检测到 ERROR# 有效后,产生异常 16(协处理器错误异常)
四、总线时序
1. 基本概念
(1) 指令周期(Instruction Cycle)
- 执行一条指令所需的时间
- 由取指令、译码、执行等步骤组成
- 不同指令的指令周期不同(如乘法指令比加法指令长得多)
(2) 总线周期(Bus Cycle)
- CPU 通过总线完成一次访问存储器或 I/O 接口操作所需的时间
- 一个指令周期由一个或多个总线周期组成
- 例如:MOV AX, [1234H] 需要取指总线周期 + 读存储器总线周期
(3) 时钟周期(Clock Cycle / T-State)
- CPU 主频的倒数,是 CPU 操作的基本时间单位
- 又称 T 状态
- 例如:8086 主频 5MHz → 时钟周期 200ns;Pentium 主频 500MHz → 时钟周期 2ns
不同处理器的总线周期长度:
| 处理器 | 总线周期包含时钟周期数 | 说明 |
|---|---|---|
| 8086/8088 | 4 个(T1, T2, T3, T4) | 16 位,地址数据复用 |
| 80286 及以后 | 2 个(T1, T2) | 更高性能,地址和数据已分离 |
趋势:随着微处理器架构演进,一个总线周期所需的时钟周期数不断减少(从 4 个到 2 个),总线效率不断提高。
2. 总线周期的两个基本过程
通过一个总线周期完成数据传送,一般包含两大阶段:
- 输出地址阶段:CPU 将地址送到地址总线上
- 传送数据阶段:在存储器或 I/O 接口与 CPU 之间传送数据
以 8086 为例(4 个 T 状态):
- T1:输出地址
- T2、T3、T4:传送数据
- 数据必须在 T2~T4 期间完成,否则 T4 之后开始下一个周期会出错
3. 等待状态(Tw — Wait State)
问题:当存储器或 I/O 设备速度较慢,无法在标准总线周期内完成数据传送怎么办?
解决方案:插入等待状态 Tw
- 慢速设备通过 CPU 的 READY# 引脚发出请求
- CPU 在 T3 结束时(或每个 T 状态结束时)检测 READY#
- READY# = 0(有效):表示数据已就绪,当前周期可以结束
- READY# = 1(无效):表示数据未就绪,插入一个等待状态 Tw
- Tw 的作用与 T3 相同:为数据传送提供额外时间
- 插入 Tw 的个数取决于 READY# 信号持续时间
4. 空闲状态(Ti — Idle State)
- 当一个总线周期后不立即执行下一个总线周期时,总线进入空闲状态
- CPU 在空闲状态执行内部操作,不进行外部数据传送
- 两个总线周期之间的 Ti 个数随指令不同而变化
5. 非流水线总线周期
特点:前一个总线周期完全结束后,才开始下一个总线周期,两个周期之间无重叠。
时序关系(80386,2 个 T 状态):
- T1:输出地址、ADS# 有效、总线周期指示码有效
- T2:数据传送,检测 READY# 决定是否结束周期
非流水线的优点:简单、时序清晰;缺点:总线利用率不高。
6. 流水线总线周期
基本思想:将下一个总线周期的地址输出与当前总线周期的数据传送重叠进行。
具体操作:
- 下一个总线周期的地址和控制信号在前一个总线周期的 T2 期间就提前发出
- 而不是等到下一个周期的 T1 才发出
效果:
- 存储器有更多的地址译码和数据准备时间
- 相当于给存储器多了一个 T 状态的准备时间
- 可以用较低速的存储器实现较高的系统性能
- 总线利用率提高
与指令流水线类似:指令流水线是取指和执行重叠,总线流水线是地址输出和数据传送重叠。
地址流水线的激活:
- 外部总线控制逻辑通过拉低 NA# 输入信号来激活流水线方式
- 一旦 NA# 有效,CPU 就会在下一个合适的时机进入流水线总线周期
7. 带等待状态的流水线总线周期
- 流水线总线周期也可以插入等待状态
- 每个总线周期结束时(T2 末尾)采样 READY#
- READY# = 0:当前是正常 T2,周期结束
- READY# = 1:当前是 Tw,继续等待
- 即使在流水线模式下,也可以通过 READY# 扩展总线周期
8. 8086 的简化读/写总线周期
(1) 写总线周期
- T1:CPU 输出存储单元地址到地址总线
- T2~T4:CPU 将数据放到数据总线上,同时发写命令 WR#
- 存储器在 WR# 控制下将数据写入指定单元
(2) 读总线周期
- T1:CPU 输出存储单元地址到地址总线
- T2:CPU 发读命令 RD#
- T3:存储器将数据读出到数据总线上
- T4:CPU 从数据总线上读取数据
8086 的两个重要特点:
- 4 个时钟周期构成一个总线周期(T1~T4)
- 地址和数据总线复用(AD0~AD15):
- T1 期间:传送地址信息
- T2~T4 期间:传送数据信息
- 目的:节省微处理器引脚数量
9. 80386 DX 的非流水线读总线周期
80386 的总线周期通常由 2 个 T 状态(T1 和 T2)组成,每个 T 状态包含两个外部时钟相位(相位1 和相位2)。
读周期操作步骤:
-
T1 开始:
- 地址 A2~A31 和字节允许 BE0#~BE3# 输出到地址总线
- ADS# 变为有效(低电平),表示地址有效
- M/IO#、D/C#、W/R# 变为有效,标识总线周期类型
- 读存储器数据 → M/IO#=1, D/C#=1, W/R#=0(编码 110)
-
T2 中间:
- 采样 BS16#,确定是 32 位还是 16 位数据传送
- BS16#=1 → 32 位传送
-
T2 结束:
- 检测 READY# 输入
- READY#=0 → 数据已就绪,读入数据,周期结束
- READY#=1 → 插入等待状态 Tw
-
非流水线特点:前一个周期的数据传送完成后,才启动下一个周期,无重叠
10. 80386 DX 的非流水线写总线周期
与读周期类似,主要区别:
- W/R# = 1(写操作)
- 地址、字节允许、ADS# 同样在 T1 输出
- 写数据在 T2 期间输出到数据总线
- 总线周期指示码:写存储器数据 → M/IO#=1, D/C#=1, W/R#=1(编码 111)
例题:80386 DX-20(主频 20MHz),一个带 1 个等待状态的写总线周期,持续时间是多少?
解答:
- 时钟频率 20MHz → T 状态 = 50ns
- 总线周期 = 2 个 T 状态 + 1 个 Tw = 3 个 T 状态
- 总时间 = 50ns × 3 = 150ns
11. 非流水线与流水线的对比(图10.14)
图中同时给出了两种总线周期时序:
- 周期 1、2:非流水线总线周期
- 周期 3、4:流水线总线周期(周期 3 为写,周期 4 为读)
对比要点:
- 非流水线:周期之间有明显间隔,地址输出在每个周期的 T1
- 流水线:后一个周期的地址在前一个周期的数据传送阶段就提前输出
- 流水线方式下,有效总线周期更短,总线吞吐量更高
五、关键概念汇总
| 概念 | 含义 | 关键信号/机制 |
|---|---|---|
| 地址流水线 | 下一个地址提前到当前周期发出,寻址与数据传送重叠 | NA# 输入信号 |
| 总线封锁 | 执行 LOCK 前缀指令时独占总线,用于多处理器共享资源 | LOCK# 输出信号 |
| 可屏蔽中断 | 受 IF 标志控制的外部中断 | INTR + IF 标志 |
| 非屏蔽中断 | 不受 IF 控制的紧急中断,上升沿触发 | NMI |
| 总线保持 | DMA 控制器请求总线控制权 | HOLD / HLDA 握手 |
| 协处理器接口 | 主 CPU 协助 80387 完成数据传送 | PEREQ / BUSY# / ERROR# |
| 等待状态 | 为慢速设备扩展总线周期 | READY# 采样 + Tw |
| 流水线总线周期 | 地址提前输出,提高总线效率 | NA# + T2 提前发地址 |
| BTB | 分支目标缓冲器,动态预测分支方向 | Pentium 特色部件 |
六、与前后章的关联
- 承接计算机组成-第5章-计算机微型计算机的组成及工作过程:第5章介绍了计算机组成的基本框架(冯·诺依曼结构、五大部件、三大总线),本章深入到微处理器内部模块和外部引脚与时序
- 承接汇编语言的基本语法-第7章-计算机组织与系统结构:第7章学习了汇编语言语法,本章的指令周期、总线时序是汇编指令执行的硬件基础
- 承接寻址方式与指令系统-第8章-计算机组织与系统结构:第8章的指令系统需要通过本章的总线周期来执行
- 后续章节:第 11 章输入输出接口、第 12 章存储器及其接口、第 13 章中断系统、第 14 章并行接口、第 15 章串行接口、第 18 章总线技术 —— 都是本章总线接口与时序知识的具体应用和扩展
七、学习要点
- 引脚分类:按功能把 80386 引脚信号分成 7 大类,每类掌握核心信号
- 总线周期指示码:3 位编码 → 8 种总线周期类型,务必熟练对应
- 三种周期:指令周期、总线周期、时钟周期的区别与联系
- 两种总线周期工作方式:非流水线 vs 流水线,理解地址流水线的原理和优势
- 等待状态的作用:READY# 信号如何控制 Tw 的插入
- 8086 与 80386 的对比:总线周期长度(4T vs 2T)、地址数据复用 vs 分离
- BTB 分支预测:Pentium 的高级特性,理解 2 位饱和计数器的工作原理
本章是理解微型计算机工作原理的关键:从”CPU 怎么和外部世界打交道”的角度,建立起总线操作的时间概念。