总线定时

总线定时只回答一个问题:

主设备和从设备是两块独立的芯片,它们怎么知道「这一步完成了,可以进入下一步」?

答案只有两类:

  • 看表——事先约定”第几拍做什么”,双方各自数拍子。这是同步定时。
  • 打招呼——你做完了告诉我一声,我收到才继续。这是异步定时。

判据只有一句话:有没有公共时钟。 这一节所有的辨析题,追到底都是这一句。特别注意不要用”要不要等”来判断——同步定时里也有等(等待周期 ),“等”不是异步的标志。

机制

同步定时

所有动作都参照一个公共时钟,在约定的周期或边沿发生。双方不需要互相确认,各自数拍子就行。

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 个时钟” 说的就是上表的 T1T4——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

全互锁就是标准的四相握手:

  1. 主设备置 REQ 有效
  2. 从设备看到 REQ,置 ACK 有效
  3. 主设备看到 ACK,撤销 REQ
  4. 从设备看到 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 内部要不要停——一个是接口,一个是实现,互不决定。

边界

判断同步还是异步,只问”有没有公共时钟”。 不要问”要不要等”(同步里有 )、不要问”有没有 READY/ACK 信号”(同步接口也可以有 VALID/READY 流控,只要它在公共时钟边沿采样,就仍是同步)。

插入 不改变同步的本质。 等待周期仍按公共时钟计数。

“半互锁”的半,指受约束的信号数是一半,不是等待时间是一半。

异步不等于无时间约束。 传播延迟、建立保持、超时机制都还在。

分离式通信与同步/异步不是同一维度。 它管的是”等待时要不要让出总线”。

同步与异步的快慢取决于设备速度分布,没有绝对结论。

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 控制器的同步/异步/联合控制对照出题。

链接