9.3 复用、锁存器与三态缓冲器
第 9.2 节让同一组 AD15…AD0 引脚在 T1 传送地址,随后又传送数据。这种做法称为分时复用(time multiplexing):同一条物理通路在不同时间区间承载不同信息。复用可以节省封装引脚,但系统必须在通路换职前保留第一份信息。
ALE 与锁存器把短暂地址变成稳定地址
在 T1 中,8086 把地址位 A15…A0 放到 AD15…AD0 上;高位地址则出现在 A19/S6…A16/S3 上,这些引脚稍后还会承载状态信息。ALE 是地址锁存允许信号(Address Latch Enable),用于标记地址有效区间。
锁存器(latch)是一种存储电路。允许有效时,它可以观察输入;允许关闭后,它把已经捕获的位模式保持在输出端。外部锁存器利用 ALE,使系统在处理器引脚改送数据或状态后仍然保留地址。
对于地址 3A55AH:
- A19…A16 提供 3H;
- AD15…AD0 在 T1 中提供 A55AH;
- 解复用后的完整地址是二者拼接得到的 3A55AH。
如果 AD15…AD0 随后改送数据 C0DEH,锁存器输出仍保持 A55AH。因此,设备可以在看到稳定地址 3A55AH 的同时看到数据 C0DEH。
捕获得太晚会造成结构性错误,而不只是多一点延迟。如果锁存器在引脚已经换职后捕获 C0DEH,外部逻辑就会把错误低位与地址高位拼接,并选择另一个位置。
三态输出可以驱动 0、驱动 1 或主动断开
普通逻辑说明往往只讨论 0 与 1。共享总线还需要第三种输出状态:高阻态(high impedance),记为 Z。输出为 Z 时,它在电气上近似断开,其他部件便可以控制同一导线。
Z 不是 CPU 存储的第三种数据值,也不等于逻辑 0:
- 输出 0 会主动把电压驱动为低电平。
- 输出 1 会主动把电压驱动为高电平。
- 输出 Z 会停止定义导线电压。
如果所有输出都是 Z,总线就会浮空(floating),没有可靠数据值。如果两个输出同时使能并试图给出不同值,就会发生总线争用(bus contention)。争用可能破坏数据、产生过大电流并使硬件承受压力。
双向总线收发器(bidirectional bus transceiver)把方向控制与三态输出控制组合起来。在 8086 的最小模式(minimum mode)系统中,DT/R 选择发送或接收方向,/DEN 使能外部数据通路。写周期中 CPU 侧发送,读周期中收发器反向,让 CPU 接收;换向或空闲时关闭收发器,就会形成有意安排的 Z 区间。
接收器可以监听而不成为驱动者。许多设备都能观察地址总线和控制总线,但只有被选数据源可以使能数据输出。因此,选择逻辑、方向控制和输出使能必须保持一致。
“两个输出现在恰好相同”不能作为安全例外。传播延迟或后续位可能让它们产生分歧,这种设计也没有真正保证所有权。正确接线应证明每个阶段都满足单一驱动规则,而不是只看某一个已观察到的位模式。
锁存器保留目标,三态控制保留电气所有权。第 9.4 节将处理另外两种共享问题:慢速设备需要更多时间,以及另一个总线主设备需要暂时取得所有权。