计组与微机控制
6.5 CPU工作时序
6.5 CPU工作时序
最大工作模式、8288 总线控制器、CPU 复位启动和总线读操作时序。
一、最大工作模式
前面讲过最小模式:CPU 自己直接产生大部分控制信号。最大模式不一样。
最大模式下系统中可能有:
8086/8088 主处理器 8087 数值协处理器8089 I/O 协处理器 DMA 控制器
所以总线控制更复杂,不能全靠 CPU 直接发 RD、WR、M/IO 这些信号。
因此最大模式下要加:8288 总线控制器 8289 总线仲裁控制器 8259A 中断控制器
1. 最大模式下 MN/MX 怎么接?
书上说:MN/MX 接地 → 最大模式 MN/MX 接 +5V → 最小模式
所以图 2.25 中 MN/MX 接地,表示 CPU 进入最大模式。

二、最大模式下 CPU 不直接输出 RD/WR
最大模式的核心变化是:8086/8088 不再直接输出完整的总线控制信号,而是输出状态信号,让 8288 根据状态信号产生控制命令。
也就是:
CPU 输出状态码 S2 S1 S0 8288 解码这些状态码8288 再产生 MRDC、MWTC、I ORC、IOWC 等总线命令
这和最小模式对比:
最小模式:CPU 直接告诉外部“我要读内存/写内存/读I/O/写I/O”最大模式:CPU 先告诉 8288“我现在是什么总线状态”,8288 再生成具体控制信号
三、QS1、QS0:指令队列状态信号
QS1、QS0这是 Instruction Queue Status,指令队列状态信号。
这两个信号告诉外部:8086/8088 内部指令队列现在发生了什么。
1. QS1 QS0 = 00:无操作
表示指令队列没有发生取代码操作。QS1 = 0 QS0 = 0 含义:无操作
2. QS1 QS0 = 01:从指令队列第一个字节取走代码
表示 EU 从指令队列的第一个字节取出指令代码。QS1 = 0 QS0 = 1含义:从队列第一个字节取代码
3. QS1 QS0 = 10:队列为空
表示指令队列已经空了。QS1 = 1 QS0 = 0含义:指令队列为空 这说明 BIU 预取没有跟上,EU 可能要等待取指。
4. QS1 QS0 = 11:从队列第一个字节及后续字节取代码
表示取走了一个多字节指令的后续字节。QS1 = 1 QS0 = 1含义:从队列第一个字节及后续字节取代码
QS1、QS0 是给外部观察 CPU 指令队列状态用的。
四、S2、S1、S0:总线周期状态信号
最大模式下最重要的是:S2、S1、S0它们表示当前总线周期的类型。
也就是 CPU 告诉 8288:我现在要进行什么总线操作?
然后 8288 根据这三个状态信号产生具体总线命令。
表 2.9:S2 S1 S0 对应操作
注意书上这些信号上方有横线,表示低电平有效的状态编码

最大模式下,CPU 用 S2 S1 S0 编码告诉 8288 当前总线周期类型。
什么是“无源状态”?无源状态就是:当前总线周期即将结束,新的总线周期还没开始
书上说,当 S2、S1、S0 都为高电平时,表示无源状态。
如果在 T4 状态中 S2/S1/S0 有一个信号变化,就表示下一个新的总线周期要开始了。
五、LOCK:总线封锁信号
它的作用是:当 LOCK 有效时,其他总线主控部件不能占用总线。
1. 为什么需要 LOCK?
有些操作必须连续完成,不能中途被 DMA 或其他处理器抢走总线。
比如某些“读—修改—写”操作:
先读内存 修改数据 再写回内存
如果中间被别的主控部件抢走总线,数据可能就乱了。
所以 CPU 可以用 LOCK 锁住总线。
2. LOCK 什么时候有效?
LOCK 为低电平时,其他总线主控部件不能占用总线
LOCK 通常由带 LOCK 前缀的指令产生。
比如:LOCK XCHG ...
执行这类指令时,总线在关键操作期间被锁定。
3. 中断过程中 LOCK 也可能自动有效
书上提到,为防止中断过程中总线被其他主控部件占用,LOCK 信号也会自动变低。
LOCK = 防止别人抢总线
六、RQ/GT0、RQ/GT1:总线请求/允许信号
最大模式下不用最小模式的 HOLD/HLDA,而是用:
RQ/GT0 RQ/GT1
RQ/GT 是:Request / Grant 请求 / 允许
它们是双向信号,既可以输入请求,也可以输出允许。
1. 它们用来干什么?
外部协处理器或其他主控部件想使用总线,就通过 RQ/GT 向 CPU 请求。
CPU 同意后,通过同一根线返回 Grant 允许信号。
所以它承担了最小模式中 HOLD/HLDA 类似的功能。
2. 优先级
RQ/GT0 的优先级高于 RQ/GT1
所以如果两个外部部件同时请求总线,RQ/GT0 更优先。
七、8288 总线控制器 最大模式下,8086/8088 要配合 8288。
书上说 8288 由四部分组成:
状态译码器 命令信号发生器控制信号发生器 控制电路
重点是它的作用:8288 接收 CPU 输出的 S2、S1、S0 状态信号,经过译码,产生具体的总线命令和控制信号。
8288 产生哪些总线命令?

8288 会根据 S2 S1 S0 产生:INTA I ORCIOWC AIOWCMRDC MWTCAMWC 这些都是总线命令。
1. INTA:中断响应
对应:CPU 状态:中断响应8288 命令:INTA
和最小模式中的 INTA 功能类似。
2. I ORC:I/O 读命令
I ORC 是:I/O Read Command
表示读 I/O 端口。相当于最小模式下:
M/IO = 0 RD = 0
3. IOWC:I/O 写命令
IOWC 是:I/O Write Command
表示写 I/O 端口。相当于最小模式下:
M/IO = 0 WR = 0
4. AIOWC:提前 I/O 写命令
AIOWC 是 Advanced I/O Write Command。
它比 IOWC 提前一个时钟周期有效。
作用是让外部设备更早知道写操作即将发生。
5. MRDC:存储器读命令
MRDC 是:Memory Read Command
表示读内存。对应最小模式下:
M/IO = 1 RD = 0
“IO/M=0/1” 是因为最大模式 8288 的信号名称可能用 IO/M,和最小模式的 M/IO 正好相反
6. MWTC:存储器写命令
MWTC 是:Memory Write Command表示写内存。
7. AMWC:提前存储器写命令
AMWC 是 Advanced Memory Write Command。
比 MWTC 提前一个时钟周期有效。
九、8288 其他控制信号
这一页继续讲 8288 的几个控制输入/输出。
1. CEN:命令允许 CEN 是 Command Enable。
作用是允许或禁止 8288 输出总线控制命令。
CEN = 高电平:允许 8288 发出控制信号CEN = 低电平:禁止 8288 发出控制信号
当系统里有多片 8288 时,CEN 可以用来选择当前哪一片有效。
2. AEN:地址允许 AEN 是 Address Enable。
它来自总线仲裁器 8289,低电平有效。它用于支持多总线结构中的同步控制。
AEN 用于多处理器/多总线系统中控制 8288 是否响应当前总线周期。
3. MCE/PDEN:双功能信号
这个信号有两种用途。当 8288 工作在系统总线方式时,作为:
MCE:主级联允许信号
在中断响应周期 T1 状态有效,用于控制主 8259A 输出级联地址。
当 8288 工作在 I/O 总线方式时,作为:PDEN:外设数据允许信号
控制外部设备通过 I/O 总线传送数据。
4. IOB:总线方式控制
IOB 用来决定 8288 工作方式。
IOB = 1:8288 只控制 I/O 总线IOB = 0:8288 工作于系统总线方式
一般系统中,IOB 决定 8288 面向哪类总线组织。
十、8289 总线仲裁控制器
在多处理器系统中,可能有多个部件想使用总线。
比如:8086 8087 8089 DMA 控制器 其他处理器
这些主控部件不能同时控制系统总线,否则会冲突。
所以需要总线仲裁。8289 的作用就是:
决定当前总线使用权给谁 书上说它可以支持几种优先权处理方式:
并行优先权仲裁串行优先权仲裁循环优先权仲裁
8288:根据 CPU 状态产生总线控制命令8289:负责总线使用权仲裁
十一、8086/8088 的主要功能:
这里进入:2.3.3 8086/8088 的主要功能
第一部分讲:系统的复位和启动操作
RESET 复位和启动 复位信号加到 RESET 引脚。
前面讲过,RESET 有效后 CPU 进入复位状态。
通过图 2.27 讲具体时序。

1. RESET 高电平第一个时钟上升沿
当 RESET 引脚收到高电平后的第一个时钟周期上升沿,8086/8088 进入内部 RESET 阶段。这时 CPU 开始停止当前工作,准备复位。
2. 之后三态输出线变高阻
再过一个时钟周期,所有三态输出线被设置成高阻状态。
高阻就是:CPU 不驱动这些引脚这些引脚像断开一样
这可以避免复位过程中 CPU 对外部总线造成干扰。
3. 复位要求保持多久?
RESET 至少保持 4 个时钟周期高电平
如果是初次加电启动,则要求高电平持续:大于 50 μs
这是为了确保电源和硬件稳定后再启动 CPU。
4. 哪些引脚进入高阻?
书上列了一堆三态输出线:
AD15~AD0 A19/S6~A16/S3BHE/S7 M/IODT/R DENWR RD INTA
这些在复位时会进入高阻。
还有一些非三态输出线,复位后无效但不浮空,比如:
ALE HLDA RQ/GT0RQ/GT1 QS0 QS1
复位后内部寄存器状态
复位后:
FLAGS = 0000HIP = 0000HCS = FFFFHDS = 0000HSS = 0000HES = 0000H指令队列 = 空其他寄存器 = 0000H
所以 CPU 复位后的第一条指令物理地址是:
CS × 10H + IP= FFFFH × 10H + 0000H= FFFF0H
也就是:CPU 从 FFFF0H 开始取指令
十二. 为什么 BIOS 程序入口在高地址附近?
因为 CPU 复位后固定从 FFFF0H 开始执行。
所以系统设计时,会把一段启动代码或跳转指令放在这个位置附近。
通常 FFFF0H 处不是完整 BIOS 程序,而是一条跳转指令,跳到真正的初始化程序。
FLAGS 清零有什么影响?FLAGS 被清零意味着所有标志位都清除。
所以系统程序启动时,不能假设某个标志位天然就是想要的状态。
必须通过指令设置相关标志。
十三、复位结束后什么时候开始正常工作?:
RESET 从高电平到低电平的跳变会触发 CPU 内部复位逻辑。
经过 7 个时钟周期后,CPU 启动并恢复正常工作,从 FFFF0H 开始执行程序。
所以启动过程大致是:
RESET 高电平保持足够时间CPU 内部清零/初始化RESET 变低 等待若干时钟从 FFFF0H 取指执行
十四、总线读和总线写操作
CPU 和内存/I/O 之间的数据交换都通过总线操作实现。
一个总线周期至少包含:T1、T2、T3、T4
如果外设或存储器慢,还要插入:Tw 等待周期
十六、最小模式下的总线读操作
图 2.28 是最小模式下总线读操作时序。
这是很重要的时序图。按时间分阶段看。

1. 一个读周期的基本结构
读操作大致是:
T1:CPU 输出地址,ALE 锁存地址T2:CPU 发读控制信号,数据总线方向设为接收T3:外部设备把数据送上数据总线,CPU 检查 READYTw:如果设备没准备好,就等待T4:CPU 读入数据,结束总线周期
T1 状态做什么?T1 状态主要做三件事。
1. M/IO 指出访问对象 读操作开始时,CPU 先用 M/IO 表明这次读的是:
内存 还是 I/O 端口
在最小模式下:M/IO = 1:访问内存 M/IO = 0:访问 I/O 所以 M/IO 是选择对象。
2. 地址总线输出地址
T1 期间:
AD15~AD0 输出低 16 位地址A19/S6~A16/S3 输出高 4 位地址BHE/S7 输出 BHE
也就是 CPU 把本次要访问的地址送到总线上。
因为 AD 线后面要变成数据线,所以地址必须在 T1 被锁存。
3. ALE 有效,锁存地址
T1 中 ALE 输出高电平。 ALE 告诉外部地址锁存器:
现在总线上是地址,请锁存下来
之后即使 AD15~AD0 改成数据线,外部系统仍然能通过锁存器得到稳定地址。
十八、读时序图里各信号怎么理解?

图 2.28 里有很多信号,我们按关键线看。
1. CLK CLK 是时钟。
T1、T2、T3、Tw、T4 都是根据 CLK 划分的。
2. M/IO M/IO 在读周期一开始就确定本次访问类型。
高:存储器 低:I/O
3. A19/S6 ~ A16/S3
T1 时输出高 4 位地址。 T2 以后变为状态信号输出。
所以图中 T1 部分标“地址输出”,后面标“状态输出”。
4. BHE/S7
T1 时输出 BHE,用于选择高 8 位数据总线是否有效。
后面变成 S7 状态信号。
5. AD15~AD0
T1 时输出低 16 位地址。 T2 以后切换成数据总线。
读操作中,T2 后期或 T3 开始,外部设备把数据放到 AD15~AD0 上,CPU 在合适时刻采样。
所以图中先是“地址输出”,后面是“数据输入”。
6. A LEALE 在 T1 出现一个高脉冲。
作用就是锁存地址。
7. RD RD 是低电平有效。
读操作时,RD 在 T2、T3、Tw 期间有效为低。
它告诉外部设备:CPU 要读数据,请把数据送到数据总线
8. DT/R
读操作时,CPU 是接收数据。所以:DT/R = 0
表示数据方向是:外部设备 → CPU
9. DEN
DEN 是数据允许信号,用来打开总线收发器。
读操作中,DEN 有效后,外部数据才能通过收发器送到 CPU。
十九、读操作全过程总结
最小模式下总线读操作可以这样背:
T1:CPU 输出地址输出 M/IO输出 BHEALE 有效,锁存地址T2:AD 总线由地址切换为数据方向RD 变低,发出读命令DT/R 指示接收方向DEN 有效,打开数据收发器T3:外部存储器或 I/O 把数据送上数据总线CPU 检测 READYTw:如果 READY=0,插入等待周期直到 READY=1T4:CPU 采样并读入数据撤销 RD、DEN 等信号总线周期结束
这就是图 2.28 的主线。
这一段总结:
最大模式:MN/MX 接地CPU 输出 S2 S1 S08288 根据 S2 S1 S0 产生总线命令8289 负责总线仲裁
QS1 QS0:表示指令队列状态
S2 S1 S0:表示总线周期类型000 中断响应001 读 I/O010 写 I/O100 取指101 读内存110 写内存111 无源状态
LOCK:低电平有效,锁住总线,不让其他主控部件占用
RQ/GT0、RQ/GT1:最大模式下的总线请求/允许信号RQ/GT0 优先级更高
复位后:CS = FFFFHIP = 0000H物理地址 = FFFF0HCPU 从 FFFF0H 开始执行
总线读周期:T1 给地址并锁存T2 发读命令T3 读数据并检查 READYTw 等待T4 完成
