总线定时
总线定时只回答一个问题:
主设备和从设备是两块独立的芯片,它们怎么知道「这一步完成了,可以进入下一步」?
答案只有两类:
- 看表——事先约定”第几拍做什么”,双方各自数拍子。这是同步定时。
- 打招呼——你做完了告诉我一声,我收到才继续。这是异步定时。
判据只有一句话:有没有公共时钟。 这一节所有的辨析题,追到底都是这一句。特别注意不要用”要不要等”来判断——同步定时里也有等(等待周期
机制
同步定时
所有动作都参照一个公共时钟,在约定的周期或边沿发生。双方不需要互相确认,各自数拍子就行。
8086 的基本总线周期是这个模型最标准的样本:
| T 状态 | 这一拍在做什么 | 通用名字 |
|---|---|---|
| T1 | 主设备输出地址,用 ALE 通知从设备锁存 | 寻址 |
| T2 | 撤销地址,数据线转向,发出读/写命令 | 发命令 |
| T3 | 读:从设备把数据放上总线;写:主设备输出数据 | 数据准备/有效 |
| T4 | 采样数据,撤销命令,释放总线 | 传输结束 |
优点:控制逻辑简单,时序分析容易,便于流水化,省掉了每一步的往返握手。适合速度接近、距离较短的部件之间。
缺点:固定的拍数必须按最慢的那个从设备留余量,快设备只能陪着等。
这是本书那条老规律的第六次出现——5.2.1 机器周期按访存时间定、5.2.3 单周期按最慢指令定、5.4.2 同步控制按最慢操作定、5.6.1 流水段按最慢段定、5.6.2 快指令补空段陪着走完,现在是同步总线按最慢设备定。要整齐,就得让快的等慢的。(完整七次见 第 1 章总览)
疑问点:之前学微机接口,好像深入学了同步和异步总线,带我回忆一下;我记得是 4 个时钟,或者中间插入
个 记得没错,而且你记住的这两件事正好就是这一节的两个核心。
“4 个时钟” 说的就是上表的 T1
T4——8086 的基本总线周期。它是同步定时的标准模型,通用名字就在表的第三列。顺带一提,8086 的地址/数据线是复用的(AD0AD15),所以 T1 送地址、T2 之后同一组线改送数据——这正是 6.1.2 说的地址/数据复用。“中间插入
个 ” 也对。慢设备通过 READY 线告诉 CPU”我还没准备好”,CPU 就在 T3 与 T4 之间插入等待状态:
插几个由 READY 何时变为有效决定——插入的个数是运行时才知道的,但每个
都是整数个总线时钟。 这里有一件必须澄清的事:插了
之后,它仍然是同步框架。 等待周期是按公共时钟计数的,双方仍然在数同一组拍子,只是拍数变了。“能插等待”不等于”变成异步” —— 这条判据下面还要用两次。 408 的边界:会考”给定基本周期数和插入的
个数,算一次事务的时间与带宽”;不会考 8086 的引脚名、ALE 的电平宽度、ns 级的建立保持时间。ALE、READY 这些名字知道它们干什么就够,不必背。
半同步定时
有公共时钟 + 允许用整数个时钟周期延长。 也就是上面那个带
| 同步 | 半同步 | 异步 | |
|---|---|---|---|
| 公共时钟 | 有 | 有 | 无 |
| 拍数 | 固定 | 可变(整数个时钟) | 无”拍”的概念 |
| 慢设备怎么办 | 按最慢的定拍数 | 插入 | 按实际完成时间应答 |
两种口径都要会答:
- 题目给「同步、半同步、异步」三类 → 按三类定义作答,含
的归半同步 - 题目只给「同步、异步」两类 → 含
的归同步(因为公共时钟还在)
这两种口径不冲突,因为半同步本来就在同步这一侧——它和异步之间隔着”有没有公共时钟”这条真正的分界线,和同步之间只隔着”拍数固不固定”。遇到口径不一致的题,先看题干列了几类。
异步定时
没有统一时钟规定每个动作在第几拍发生,全靠**请求(REQ)与回答(ACK)**的握手推进。
“异步”不等于没有时间约束——信号传播延迟、建立/保持时间、亚稳态、超时重试这些约束一个都不少。它只是不以公共周期作为推进基准,改用事件的因果关系。
按撤销信号是否受对方约束,分为三种:
| 请求 REQ 什么时候撤 | 回答 ACK 什么时候撤 | 受约束的信号数 | |
|---|---|---|---|
| 不互锁 | 固定时间后自动撤,不等 ACK | 固定时间后自动撤,不等 REQ 撤 | 0 |
| 半互锁 | 等到 ACK 有效才撤 | 固定时间后自动撤,不等 REQ 撤 | 1 |
| 全互锁 | 等到 ACK 有效才撤 | 等到 REQ 撤销后才撤 | 2 |
全互锁就是标准的四相握手:
- 主设备置 REQ 有效
- 从设备看到 REQ,置 ACK 有效
- 主设备看到 ACK,撤销 REQ
- 从设备看到 REQ 撤销,撤销 ACK
每一次信号变化都由对方的状态闭环确认,可靠性最高;代价是四个往返阶段,最慢。
速度与可靠性正好相反排序:不互锁最快最不可靠,全互锁最慢最可靠,半互锁居中。
疑问点:我记得还有撤销地址信息、数据信息的时机,这是个具体的芯片吧?408 计组会考这么细吗?
这个问题在 5 月 1 日中午问过一次,第二天晚上又以「异步还涉及到一个撤销信号的时机?」问了一遍。同一件事隔一天再问,说明第一次的答案没有落地。这次只给一条能一句话背下来的判据。
先答”是不是具体芯片”:不是。撤销时机是协议规则,不是芯片参数。 上面那张三行表适用于任何遵循该协议的器件;换一片芯片,规则不变。
判据只有一句:谁的撤销要等对方。
- 不互锁:谁也不等谁 → 0 个约束
- 半互锁:只有 REQ 的撤销要等 ACK → 1 个约束
- 全互锁:REQ 等 ACK,ACK 等 REQ 撤 → 2 个约束
“半”指的是两个信号里只有一个受约束(1/2),不是”各等一半时间”。 这是这三个词最容易被记反的地方。
顺带一提,“主等从,从不等主”这句常见口诀说的正是半互锁,而且它说的是撤销条件——不是说从设备从来不等请求出现(从设备当然要等 REQ 才能应答)。
再答”408 会考这么细吗”——这个边界要划清楚:
会考 不会考 三种互锁的撤销条件对比(选择题最高频) 具体芯片的引脚名 全互锁的四步顺序 ns 级的建立/保持时间参数 可靠性与速度的排序 超时重试、亚稳态的电路实现 判断某段描述属于哪一种 总线驱动器的电气参数 换句话说:要记的是”谁等谁”这三行,不是任何一片芯片的手册。 你在微机接口里学到的那些具体参数,在这里是背景知识而不是考点——它帮你理解为什么要规定撤销时机,但考试只问规则本身。
分离式通信
主设备发出请求后立即释放总线,从设备准备好再发起一次新事务把数据送回。有些教材把它作为第四种定时方式列出。
但它与前三种不在同一个维度上:同步/半同步/异步问的是”一步与下一步之间怎么衔接”,分离式问的是”等待期间总线要不要让出来”。一条分离式通信的总线,内部每一步仍然是同步或异步的。 内容见 6.2.1。
三种定时方式的对照

| 维度 | 同步 | 半同步 | 异步 |
|---|---|---|---|
| 公共时钟 | 有 | 有 | 无 |
| 推进依据 | 固定周期/边沿 | 固定周期 + | REQ/ACK 因果 |
| 慢设备适配 | 按最慢者定拍数 | 插入整数个 | 按实际完成时间 |
| 控制复杂度 | 低 | 中 | 高 |
| 灵活性 | 低 | 中 | 高 |
| 适用场合 | 速度接近、距离短 | 速度差异中等 | 速度差异大、距离长 |
“异步一定更慢”不严谨。 握手确实有往返开销,但快设备可以立刻应答立刻结束,不必陪着最慢的设备等满固定拍数。实际快慢取决于设备速度分布:设备速度接近时同步更快,速度差异大时异步更快。
关联对照:同一组概念在 CPU 内部也出现过
5.4.2 讲控制器的同步控制 / 异步控制 / 联合控制,判据与这一节完全相同:
控制器(5.4.2) 总线(本节) 同步控制:统一节拍 同步定时:公共时钟 异步控制:应答方式 异步定时:REQ/ACK 握手 联合控制:主体同步 + 慢操作异步 半同步定时:公共时钟 + 两处都是同一个折中获胜:纯同步太浪费,纯异步太复杂,实际系统普遍采用中间那一种。差别只在讨论对象——那里是 CPU 内部的各部件,这里是总线上的主从设备。
SDRAM 是同步的
疑问点:拓展到 SDRAM
这个拓展提得好,因为 SDRAM 恰好是最容易被误判成异步的例子。
SDRAM 的 S 就是 Synchronous。 ACT、READ、WRITE、PRECHARGE 这些命令都在内存时钟的边沿被采样;从发出 READ 到数据出现的
个周期是固定的、事先已知的(见 3.2.1)。控制器按时序参数表调度,不需要 DRAM 回一个”我好了”。 那为什么容易误判成异步?因为它要等——等
、等 、等刷新让路。 而”要等”根本不是异步的标志。 反例就在这一节里:8086 插
也要等,没人说它异步。 判据回到那唯一的一句:有没有公共时钟。
有公共时钟 拍数 结论 8086 基本周期 ✅ 固定 4 拍 同步 8086 + ✅ 可变(整数拍) 半同步 SDRAM ✅ 可变(整数拍,参数表规定) 同步接口(在半同步这一侧) REQ/ACK 握手总线 ❌ 无拍 异步 再澄清两个常见的混淆:
- DDR 的 DQS 不是 ACK。 它是数据选通信号,作用是给接收方提供与数据同源的采样时钟,属于同步接口内部的时钟分发手段。ACK 是从设备说”我完成了”,DQS 是”数据在这个边沿有效”,两者语义完全不同。
- 多周期延迟 ≠ 异步。 延迟长短和定时方式是两个正交的属性。
顺带回答一个更实际的问题:从 CPU 发出访存请求到 DRAM 命令真正发出,时间并不固定——中间还有 Cache 层次、内存控制器的排队、bank 冲突、刷新让路。但这些不确定性来自控制器的调度,不是来自 DRAM 接口的定时方式。 判断同步/异步之前,必须先说清在讨论哪一层接口。
CPU 在等待时能不能干别的
疑问点:应答联络方式?是 CPU 去适应总线周期,还是 CPU 发出读命令后做别的事,只要在下一个总线周期时发出地址就行?
这里其实是两个问题,它们属于不同的层次,答案互不相干。
问题一(协议层):谁等谁? 这才是”应答联络”要回答的。
应答联络就是异步定时:主设备发出请求后一直等从设备的 ACK,收到才进入下一步。所以答案是”CPU 等从设备,等多久由从设备决定”。
但你问句里”下一个总线周期”这个说法本身要修正——异步定时里没有公共时钟,也就没有”周期”这个编号。“在下一个周期发出地址”是同步定时的思维方式。在异步总线上,正确的问法是”在收到 ACK 之后”。
问题二(微体系结构层):CPU 等待时能不能干别的? 这一问的答案是:和总线是同步还是异步完全无关。
决定它的是 CPU 那一侧的三件事:
机制 让 CPU 在访存等待时做什么 出处 非阻塞 Cache 继续处理后续的命中请求,并发多个缺失 3.5.2 乱序执行 先执行不依赖这次访存的指令 5.6.5 硬件多线程 直接切到另一个线程——长延迟访存正是粗粒度多线程的切换触发条件 5.7.2 所以下面两句话都是错的:
- ❌ “同步总线,所以 CPU 必须原地干等” —— 一个乱序核接在同步总线上,照样能执行别的指令
- ❌ “异步总线,所以 CPU 可以去做别的” —— 一个五级顺序流水线接在异步总线上,照样原地停
两者混在一起,是因为”等待”这个词在两层里都出现了。 但总线协议管的是两块芯片之间的交接规则,微体系结构管的是 CPU 内部要不要停——一个是接口,一个是实现,互不决定。
边界
判断同步还是异步,只问”有没有公共时钟”。 不要问”要不要等”(同步里有
插入
“半互锁”的半,指受约束的信号数是一半,不是等待时间是一半。
异步不等于无时间约束。 传播延迟、建立保持、超时机制都还在。
分离式通信与同步/异步不是同一维度。 它管的是”等待时要不要让出总线”。
同步与异步的快慢取决于设备速度分布,没有绝对结论。
SDRAM 的”同步”与总线定时的”同步”是同一个词同一个意思——都指”按公共时钟推进”。这不是巧合,也不是术语撞车。
做时序计算题一律以题图为准。 T1~T4 是 8086 的具体实现,不是所有同步总线都恰好四拍。
对照速查
| 问题 | 判据 |
|---|---|
| 同步还是异步 | 有没有公共时钟 |
| 插了 | 算(两类口径下归同步,三类口径下归半同步) |
| 半同步与同步差在哪 | 拍数固不固定 |
| 半同步与异步差在哪 | 有没有公共时钟(这条才是真分界) |
| 三种互锁怎么分 | 撤销时谁要等对方:0 / 1 / 2 个约束 |
| ”半互锁”的半 | 受约束的信号数,不是时间 |
| 全互锁四步 | REQ↑ → ACK↑ → REQ↓ → ACK↓ |
| 可靠性排序 | 全互锁 > 半互锁 > 不互锁 |
| 速度排序 | 不互锁 > 半互锁 > 全互锁 |
| SDRAM 是同步还是异步 | 同步(S = Synchronous) |
| DQS 是不是 ACK | 不是,是数据选通 |
| CPU 等待时能否干别的 | 由 CPU 微结构决定,与总线定时无关 |
考点
- 定时方式判定:给一段时序描述,判断属于同步/半同步/异步。先找公共时钟,再看拍数固不固定。
- 互锁方式判定:给出 REQ/ACK 的撤销条件,判断是三种中的哪一种;或反过来问某种方式下 ACK 何时撤销。这是本节最高频的选择题。
- 时序计算:给基本周期数与
个数,求一次事务时间、传输率、有效带宽——接 6.1.5 的模板。 - 概念陷阱:「异步总线一定比同步总线慢」错;「有应答信号就是异步」错;「SDRAM 用异步握手」错;「插入等待周期的是异步总线」错。
- 跨章辨析:与 5.4.2 控制器的同步/异步/联合控制对照出题。
链接
- 🏠 返回总览:计算机组成原理第 6 章:总线总览
- ⬅️ 上一节:6.2.1 总线事务
- ➡️ 下一章:第 7 章 输入/输出系统
- 🔗 控制器的同步/异步/联合控制:5.4.2 硬布线控制器
- 🔗 SDRAM 的同步接口与时序参数:3.2.1 SRAM 芯片和 DRAM 芯片
- 🔗 地址/数据复用:6.1.2 总线的分类
- 🔗 乱序执行与非阻塞:5.6.5 高级流水线技术
- 🔗 长延迟触发线程切换:5.7.2 硬件多线程的基本概念
- 🔗 「要整齐就得按最慢的来」第六次:5.6.2 流水线的基本实现