2.2 指令执行周期与总线时序


2.2 指令执行周期与总线时序

本节摘要:一条指令的一生在硬件上表现为一组精确咬合的总线周期——读周期四个时钟状态里,地址、ALE、读信号、数据各自的生效窗口都是硬性约定;看懂这些窗口,就拿到了与任何外设对话的语法书。

上一节备好了寄存器这张写字台,本节处理主线中最关键的一站:指令与数据如何在时间轴上被搬运。这是全册承重墙——第 4 章的仲裁、第 5 章的中断响应、第 6 章的端口读写,全部建立在本节时序概念之上。

把一条指令放上示波器

先分清三个时间尺度。时钟周期是节拍本身,8086 的 5MHz 版本每拍 200 纳秒;总线周期是 CPU 完成一次完整访存事务的时间,标准长度四个时钟周期,记作 T1 到 T4;指令周期是一条指令从取指到执行完毕的全过程,短则一个总线周期(寄存器间传送),长则多个(乘法要取指、取数、执行、写回)。

读周期的四个状态各有分工。T1 拍:BIU 把 20 位地址放上地址总线,同时 ALE 信号给出一个正脉冲,通知外部"地址有效,快锁存"。T2 拍:地址总线切换为分时复用状态,地址信息撤下、高位地址继续保持,CPU 把数据线置为高阻,读信号 RD 拉低。T3 拍:数据在总线上稳定,CPU 采样。T4 拍:事务收尾,读信号撤销。写周期结构相似,差别在于 CPU 是主动方——数据在 T2 就被放上总线,写信号在 T3 保持有效,给存储器留足写入时间。

图 2-1:8086 读总线周期的时序关系

图 2-1:8086 读总线周期的时序关系

三个容易被忽视的细节

分时复用是理解 8086 总线的钥匙。 地址与数据共用低 16 根引脚,T1 拍跑地址、之后跑数据——引脚少、成本低,代价是外部必须用 ALE 脉冲把地址先锁存进 74LS373 这类锁存器。这就是为什么任何 8086 最小系统图上,CPU 与存储器之间永远横着几片锁存芯片:不是装饰,是复用协议的物理代价。

READY 是慢速世界的和事佬。 如果被访问的存储器或外设赶不上 T3 拍的数据窗口,它的硬件逻辑在 T2 结束前把 READY 拉低,CPU 就在 T3 与 T4 之间插入等待状态 Tw——时序完全重复 T3,直到 READY 恢复高电平。等待以整个时钟周期为粒度,这就是"至少多等一拍"的物理含义。

采样窗口决定数据质量。 CPU 在时钟上升沿附近的固定窗口采样数据线。数据必须在该窗口之前稳定并保持到窗口之后——提前量叫建立时间,延后量叫保持时间。工程上大量"偶发读错数"的问题,最终都归因到窗口边缘的数据抖动。

案例展开:给慢速 EPROM 插等待

背景:实验板用了片访问时间 450 纳秒的旧 EPROM,而 5MHz 的 8086 读周期从地址有效到数据采样只有约 660 纳秒,看似够用——但地址经锁存器与译码器各延迟一截后余量告急,实测偶发读错。操作:先精算:地址锁存延迟 30 纳秒,译码延迟 45 纳秒,EPROM 从地址稳定到数据输出需 450 纳秒,合计 525 纳秒,而采样点前只有约 470 纳秒余量,缺口约一拍。于是把译码输出与 READY 逻辑相接,让该地址空间的每次读访问自动插入一个 Tw。结果:插入等待后读周期延长约 200 纳秒,连续跑内存测试上万遍无错。解读:等待周期把访问时间拉到器件真实能力之内,代价是这段地址空间的吞吐降了三成——对只放固件的区域完全可接受。变式:若缺口超过一拍,就用计数式等待状态发生器按需插入多拍;若整个系统换用更快的存储器,则摘除等待逻辑,把延迟还给性能。时序设计的本质是算账:把每一级的延迟加总,与窗口比较,缺多少补多少。

时序图的三遍读法

时序图是本册的通用语言,值得交代一套读图的方法。第一遍看骨架:先找出地址、数据、控制三类信号各自的横轴区间,把一个总线周期的四个状态框出来。第二遍看因果:从 ALE 的上升沿出发,问"它触发了什么";从读信号的下降沿出发,问"谁必须在它有效期间就位"——把每个信号边沿的前后义务连成箭头。第三遍看余量:把手册里每个器件的建立时间、保持时间标进图里,量一量窗口的富余。三遍读完,这张图就从装饰画变成了工程图——5.4 的排查、6.1 的译码、8.1 的集成,用的都是同一套读法。

写周期的账与最小系统预算

写周期另有一本账。T1 拍照旧送地址发 ALE;T2 拍数据就位、写信号拉低——注意写操作里数据是 CPU 主动送出的,不必等对方;写信号保持有效到 T4 前段,给存储器留出写入脉冲宽度;T4 拍撤销信号。读是"等客上门",写是"亲自送货",两者对数据的责任方不同,时序关系也不同。

把账本连起来看一个最小系统的预算。设时钟五兆赫兹,一拍两百纳秒:一个标准读周期八百纳秒,插一个 Tw 就是一千纳秒。若一段程序循环读取慢速端口一万次,仅此一项就吃掉十毫秒——这在实时系统里是一笔巨款。所以接口设计时的正确姿势是先把每个地址空间的访问次数与时序参数列成表,再决定哪些区段要插等待、哪些器件必须换更快的型号。等系统偶发出错再回头补等待,代价是数周的单子排查。

高频追问两则

问:为什么 T1 送了地址还要 ALE 锁存,不能让地址一直保持吗? 因为地址线与数据线分时复用同一组引脚。T2 之后这组引脚要改行去跑数据,地址必须有人"接住"——锁存器就是那个接住的人。这是引脚经济学(4.1 节会展开)在时序上的直接体现。

问:等待周期插多了会怎样? 两个后果:一是吞吐按拍数线性下降,前面算过账;二是有些对时序敏感的外设(比如需要固定采样间隔的采集场景)会被打乱节拍。等待状态是止痛药,不是保健品——能靠换快器件解决的,别靠插等待迁就。

本节要点回顾

  • 三层时间尺度:时钟周期是节拍,总线周期是一次访存,指令周期由若干总线周期拼成。
  • 读周期口诀:T1 给地址并锁存,T2 发命令撤地址,T3 等数据稳,T4 收尾。
  • ALE 与锁存器:地址数据分时复用,ALE 是锁存的发令枪。
  • READY 与 Tw:慢速器件以整拍为单位申请延时,插等待是兼容性的通用手段。
  • 建立与保持时间:一切"偶发错数"先查采样窗口边缘。

下一节解决时序之外另一半悬念:那个 20 位的物理地址是怎么从两个 16 位数变出来的。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U