Skip to main content
Featured image for post: MCP-Chapter-05

MCP-Chapter-05

5 min 980 words

总线概述

微处理器(CPU)、主存(ROM、RAM)以及I/O接口是通过一组共享的、并行的电子通路连接的。这种将所有功能部件连接到一组公共信息传输线上的结构,就是总线拓扑结构 (Bus Topology)

在这种结构中,CPU通常作为总线主控设备,而内存和I/O接口作为总线从属设备。(方便以后判断数据方向,主语方向一般是CPU)

总线分类

按功能划分

地址总线 (Address Bus, AB)

当CPU需要从内存读取数据或向I/O端口写入数据时,首先需要指明它要操作的具体单元。CPU将该单元的地址放置到地址总线上。

地址总线是单向的(通常是74LS373锁存器)。CPU是地址的唯一发起者,它始终是向外输出地址信号。存储器和I/O设备始终是地址的接收者,当发现总线上的地址与自身地址匹配时,才会响应后续的数据或控制信号。

地址总线的位数决定了寻址范围,关系是 N=2WN = 2^W。(: Intel 8086 CPU有20位地址信号。因此,其物理寻址范围为 2202^{20} 个字节,即 1,048,576 字节,也就是 1MB 物理地址空间。)

数据总线 (Data Bus, DB)

在CPU、存储器和I/O设备之间传送数据信息的通道。双向传输

  • 写操作: CPU作为主设备,将数据输出到数据总线上,目标设备从总线读取该数据。

  • 读操作: 目标设备作为响应,将数据输出到数据总线上,CPU从总线读取数据。

三态逻辑 (Tri-state Logic)

双向传输时通常采用双向三态形式

由于多个设备(CPU, RAM, I/O)都可能需要向数据总线输出数据,为防止总线冲突(即多个设备同时驱动总线导致信号线之间短路),所有连接到数据总线的设备都必须具备三态输出能力(即高电平、低电平、高阻态 HZ)。

当设备未被选中时,其数据总线接口处于高阻态,相当于在电气上与总线断开。

数据总线宽度通常与微处理器的字长一致,表示在一个总线周期内可以传送的数据位数(比如16位处理器、32位处理器)。

控制总线 (Control Bus, CB)

CPU用于协调和同步所有总线操作的信号集合。控制总线是一组异质化的控制信号线的统称。

传送方向由具体控制信号来定,其位数也由系统的实际控制需要来定。

例如:

信号名称方向描述
RD#/ WR#单向CPU -> 设备 (读、写使能)
INTR/ READY单向设备 -> CPU (中断、就绪)
HOLD/ HLDA双向交互CPU 与设备之间的总线握手信号

按位置划分

片内总线

IC内部的信息通路,用于连接该芯片内部的各个功能单元(如寄存器寄存器之间、寄存器ALU之间的连接)

封装在芯片,内部不可见。设计、宽度和协议由芯片制造商(如Intel, ARM)在设计芯片时固定。

片总线 (Chip Bus / Component-level Bus)

连接同一块插件板(电路板,PCB)上各个芯片的总线。

常见片总线协议:

总线标准全称特点与用途
**I²C **​Inter-IC低速、用于连接微控制器和外围芯片(如EEPROM、传感器)的串行总线。
**SPI **​Serial Peripheral Interface短距离、高速的芯片间串行通信的总线。
**UART **​Universal Asynchronous Receiver/Transmitter异步串行通信的逻辑标准

内总线 (Internal Bus / System Bus)

连接微机系统中各个插件板(显卡、声卡、网卡)与系统板(主板) 之间的总线。

是微机系统中最总要的总线,通常所说的总线就是这种总线。CPU插件板、内存插件板、I/O插件板通过一个共享的内总线(如主板插槽)进行互连。

外总线 (External Bus / Communication Bus)

微机系统和外部设备之间进行互连的总线。

与外部的、独立的硬件设备进行通信(传输距离更长、环境更复杂,速率通常远低于内总线)。

常见外总线:

总线标准类型描述
IEEE-488并行外总线一种(已过时)用于连接仪器仪表的并行外总线。
RS-232C串行外总线一种经典的串行外总线(通信端口)。
USB串行外总线现代标准的串行外总线。

总线性能与标准

总线性能

总线宽度 (Bus Width)

就是数据总线的位数,决定了在一个总线周期内,能够并行传输的数据位数。

总线频率 (Bus Frequency)

总线的工作时钟频率(单位为Hz),表示每秒总线可以执行多少次数据传输。

传输速率 (Transfer Rate, 也称为总线带宽)**:

衡量总线性能的最终指标,表示单位时间内总线可传输的数据总量(单位为MB/s)。

三种性能总关系:
传输速率=(总线宽度8)×总线频率\text{传输速率} = (\frac{\text{总线宽度}}{8}) × \text{总线频率}

常用芯片

型号功能描述
74LS244单向三态缓冲器/驱动器
74LS245双向三态缓冲器/驱动器(收发器)
74LS373带有三态输出的锁存器

74LS244

该芯片的数据流向是固定的,只能从 A 输入端流向 Y 输出端。(实际上用的挺少)


74LS244

八路驱动器,内部集成了8个三态门,可以一次性处理8位数据。

8路分为两组(Group 1: 1A1-1A4 -> 1Y1-1Y4,通过 1G 控制使能;Group 2: 2A1-2A4 -> 2Y1-2Y4,通过 2G 控制使能),两个使能端是低电平有效(从反相泡可以看出来)。

1其单向特性与地址总线和部分类型的控制总线匹配,同时,作为驱动器可以增强信号的驱动能力(从CPU里面出来的信号波形不是很完整)。

74LS245

也被称为收发器。在两个数据端(A0B0)之间,并联了两个方向相反的单向三态门


74LS245


内部结构,相反三态门

拥有两个控制信号:

  • E (Gate Enable): 全局使能信号。决定整个双向通道是工作,还是处于高阻态,依然是低电平有效。

  • DIR (Direction): 方向控制信号。在通道被E使能时,选择数据是A->B传输,还是B->A传输。

74LS373


74LS373

由两个独立逻辑单元组成:

  1. D型锁存器: 存储/保持数据。(由G控制。使能时,锁存器处于透明 状态,输出1Q跟随输入1D的逻辑电平变化;非使能时,锁存器被关闭,保存上一瞬间1D上的逻辑状态。)

  2. 三态输出门: 负责控制数据是否被驱动到输出总线。(由OE控制使能是传输还是高阻态)

8086 引脚以及工作方式

CPU必须通过物理引脚与外部的逻辑部件完成信息的交换。

总线复用

8086 一共的40个引脚不足以承载20位地址总线和16位数据总线及其他的控制线。


8086两种工作方式及引脚复用说明

8086采用了分时复用 技术:

  • AD0 - AD15 (Pin 2-16, 39): 地址/数据复用总线,

    • 在总线周期的T1,传递地址总线低16位 (A0-A15);

    • 在总线周期的T2-T4,转而用作数据总线 (D0-D15)。

  • A16/S3 - A19/S6 (Pin 35-38): 地址/状态复用总线。

    • 在总线周期的T1,传送地址总线高4位 (A16-A19)(构成20位完整地址);

    • 在总线周期的T2-T4,转而输出CPU的内部状态信号 (S3-S6)。

双工作模式

即使复用了地址和数据总线,剩余的引脚仍不足以同时支持简单系统(CPU自行控制)和复杂系统(多处理器协同工作)所需的两套不同的控制信号。

8086使用 MN/MX#(Pin 33)来切换CPU的工作模式,使Pin 24-31具有双重功能。

最小方式

MN/MX# 连接到高电平(Vcc)时激活。

CPU自行产生总线控制信号(引脚24-31直接输出控制信号,例如 INTA# (中断应答), ALE (地址锁存允许), RD# (读), WR# (写), M/IO# (内存/IO选择) 等)

适用于单处理器 系统,CPU直接控制总线,无需外部总线控制器。

最大方式

MN/MX# 连接到低电平(GND)时激活。

CPU不直接产生控制信号,而是输出编码后的状态信号,用于多处理器系统的总线仲裁。

  • 引脚24-31被重定义:

    • S0#, S1#, S2# (26-28): CPU输出编码的状态。系统必须外接一个8288,由8288来解码状态信号,并生成系统总线控制信号(RD#, WR#, ALE等)。

    • RQ#/GT0#, RQ#/GT1# (30-31): 请求/准许信号。用于总线仲裁的信号,例如允许8087数学协处理器请求并获得总线的控制权。

    • LOCK# (29): 总线锁定信号,用于保证多处理器环境下的原子操作。

8086 最小方式系统总线结构

CLKCLK

对于8086/8088系统,时钟信号是由外部的专用芯片提供的。(8284A 时钟发生器,接收来自晶振的原始频率,经过分频和整形后,向CPU提供稳定的时钟脉冲)

对于8086/8088,时钟信号占空比为33%时是最佳状态

工作频率

  • 标准版: 80868088 的最高标准主频为 5MHz

  • 高速版: 随着半导体工艺的改进,Intel推出了更高频率的版本。

    • 8086-2: 主频 8MHz

    • 8086-1: 主频 10MHz

(与现代CPU命名习惯不同,数字越小代表频率越高或版本越新,8086-1是性能最强的版本)

时序概念

  • 时序: 信息在总线上的出现不仅要有空间顺序,还要有严格的顺序和准确的时间。这种时间和逻辑上的配合关系被称为时序。

  • 时钟: 由时钟发生器产生的具有固定频率和占空比的脉冲序列。是整个微机系统的时间基准,所有部件的动作都必须与此信号同步。

  • 主频: 时钟的频率,衡量CPU处理速度的一个指标。

  • 时钟周期: 主频的倒数(T=1/fT = 1/f)。

  • 总线周期: CPU通过总线对存储器或I/O端口进行一次完整的访问(读或写)所需的时间

    一个基本的总线周期需要至少4个时钟周期(即4个T状态,通常标记为T1, T2, T3, T4)。

状态/周期描述
T1 状态CPU输出地址。
T2 状态CPU输出控制信号,总线切换方向。
T3 状态数据准备/传输。
T4 状态总线周期结束。
**Tw (等待状态)**​实质上是延长了T3状态,给慢速设备提供额外的时间。设备准备好后,拉高 READY,CPU进入T4结束周期。
**Ti (空闲状态)**​执行完一个总线周期,且内部指令队列已满或正在执行一条耗时较长的指令(如乘法),不需要立即访问总线时,总线接口单元会进入空闲状态。

ALEALE


ALE信号工作示意

地址锁存允许信号,高电平表示地址线的地址信息有效。利用它的下降沿控制74LS373锁存器(其实就是低电平开启锁存器的G使能)把地址信号和BHE信号锁存在地址锁存器。


地址总线

BHE\overline{BHE}

低电平有效,表示使用高8位数据线。

操作BHEA₀使用的数据引脚
读或写偶地址的一个字00AD15~AD0
读或写偶地址的一个字节10AD7~AD0
读或写奇地址的一个字节01AD15~AD8
读或写奇地址的一个字01第一个总线周期:AD15~AD8(传输低位数据字节)
第二个总线周期:AD7~AD0(传输高位数据字节)

DT/RDT/\overline{R} & DEN\overline{DEN}

  • DT/RDT/\overline{R} 控制数据传输方向;控制74LS245的传送方向

  • DEN\overline{DEN} 控制数据有效时间;控制74LS245的输出允许


数据总线构成

RD\overline{RD} & WR\overline{WR}

M/IOM/\overline{IO}

8086 的总线时序

复位和启动

  • 内外 RESET 信号RESET输入必须保持高电平至少4个时钟周期,内部RESET信号的触发滞后于外部RESET输入,且依赖于CLK的特定边沿(CPU内部逻辑对外部异步复位信号的采样与同步过程)

  • 总线状态变化:内部RESET信号有效期间,总线处于“浮空”状态。此时,8086的所有三态输出引脚(包括地址总线、数据总线及控制总线)均呈现高阻抗状态

RESET 之后各寄存器的值

寄存器内容说明
IF=1, 其他标志位清除IF 为中断允许标志,意味着复位后 CPU 处于允许可屏蔽中断(INTR)的状态,其余的算术标志位清零
指令指针(IP)0000H复位时,流水线被清空,任何预取但未执行的指令都被丢弃,CPU必须重新从内存取指。
CS寄存器FFFFH为了配合IP寄存器,将CPU的执行流指向内存的高端地址区域
DS寄存器0000H
SS寄存器0000H
ES寄存器0000H
指令队列

复位后启动与执行流

graph LR
    A[CPU复位] --> B[CS:IP 指向 FFFF0H]
    B --> C[CPU从 FFFF0H 处<br/>取出 JMP 指令]
    C --> D[执行JMP指令]
    D --> E[修改 CS 和 IP 的值<br/>转移到内存低地址空间]
    E --> F[CPU开始顺序执行<br/>系统初始化代码(BIOS等)]

8086复位后重新启动时,便从内存的 FFFF0H 处开始执行指令

FFFF:0000H (即 FFFF0H地址)内存单元内,一般存放一条 JMP指令,以便跳转到要执行程序的首地址运行(由于启动地址 FFFF0H 到内存顶端 FFFFFH 只有16个字节的空间,这一狭小的区域无法容纳完整的系统初始化程序)

最小模式总线读写

概述


最小方式总线读操作时序图

当8086 CPU需要与外部存储器或I/O端口交换数据,或者需要填充指令队列时,必须执行一个总线周期(四个或更多时钟周期,考虑到 TWT_W 的存在)。这也就是所谓的总线读/写操作,所有的总线操作均由CPU内部的总线接口单元控制并执行。

最小模式总线读操作

T1 周期(地址输出与控制信号建立)

graph LR
    A[T₁周期开始] --> B[确定访问对象<br/>M/IO信号有效]
    B --> C[输出地址信息]
    C --> D[地址锁存<br/>ALE信号正脉冲]
    D --> E[高位数据库选通<br/>BHE/S7信号有效]
    E --> F[数据流向控制<br/>DT/R置低电平]
    F --> G[T₁周期结束]
  1. 访问空间选择(M/IOM/\overline{IO}

T1T_1 周期伊始,CPU首先要确定是访问内存还是I/O设备,即在 M/IOM/\overline{IO} 引脚上发出有效电平(该信号在整个总线周期内保持稳定

  1. 地址输出:
访问空间地址线使用位数
存储器20 位
I/O 端口16 位
  1. 地址锁存(ALEALE

因为 ADAD 总线是复用的(T1T_1 传地址,T2T_2 之后传数据),地址信息必须在 T1T_1 结束前被保存下来,否则后续传输数据时地址会丢失。

CPU在 T1T_1 状态从 ALE 引脚输出一个正脉冲,该信号直接连接到外部的输出缓冲锁存器芯片(373),该芯片利用 ALE 的下降沿将总线上的地址信息锁存并保持输出,让 CPU 可以干其他的事情。

  1. 高位数据选通(BHE\overline{BHE}可选,仅在此总线周期涉及奇地址寻址时产生):

BHE\overline{BHE} (Bus High Enable) 有效表示允许访问奇地址库,配合 A0A_0 信号,CPU可以区分是读取低8位、高8位还是整个16位字。

  1. 数据流向控制(DT/RDT/\overline{R}

DT/RDT/\overline{R} 信号输出给 245 芯片,控制数据的流向方向。

T2 周期(数据准备)

  1. 总线复用转换:

CPU 撤销在 AD15AD0AD_{15} \sim AD_0 上的地址信号驱动,使这组引脚进入高阻状态

  1. 状态信号输出:

高4位地址/状态复用线(A19/S6A16/S3A_{19}/S_6 \sim A_{16}/S_3)以及高位允许线(BHE/S7\overline{BHE}/S_7)在 T2T_2 期间切换为状态输出线。

状态位描述
S6S_6指示当前总线周期是否由 DMA 控制
S5S_5指示当前中断允许标志(IF)的状态
S4,S3S_4, S_3指示当前使用的段寄存器(CS, DS, ES, SS)
  1. 数据收发使能(DEN\overline{DEN}):

给数据总线缓冲芯片(245)使能,让数据通路打开。

  1. 读写命令发出(RDWR\overline{RD}、\overline{WR}):

直接作用于存储器或者 I/O 端口芯片,让它们准备好其数据总线缓冲芯片。

T3 周期(数据传输)

  1. 外部设备响应:

经过 T1T_1 的地址选通和 T2T_2 的读命令(RD\overline{RD})触发,被选中的存储器单元或 I/O 端口在 T3T_3 期间开始工作,外部设备将请求的数据正式驱动到 地址/数据复用总线 (AD15AD0AD_{15} \sim AD_0) 上。

Tw 周期(异步速度匹配)

READY 信号:由时钟产生器(如8284芯片)发给 CPU 的握手信号。

  • READY = 1:表示外设数据已准备就绪。

  • READY = 0:表示外设尚未就绪,请求等待。

CPU 并不是时刻监测 READY 信号,而是在特定的时间窗口进行采样:在 T3T_3 状态的前沿(即 T2T_2 结束进入 T3T_3 的那个时钟上升沿或下降沿边界) 对 READY 引脚进行采样。

T4 周期(数据采样与周期结束)

CPU 在 T4T_4 状态和前一状态(T3T_3TWT_W)交界的下降沿处,对数据总线 AD15AD0AD_{15} \sim AD_0 上的信号进行采样。在这一瞬间,总线上的电压状态被锁存入 CPU 内部的暂存器或指令队列中,完成了物理上的“读”操作

完成数据读取后,CPU 必须释放总线:

  • RD\overline{RD} 变高:撤销读命令,外部设备随即关闭输出驱动器,停止发送数据。

  • DEN\overline{DEN} 变高:关闭数据缓冲器使能,切断数据通路。

  • DT/RDT/\overline{R} 恢复:数据传输方向控制信号可能会在周期结束后恢复默认状态或保持,等待下一周期的指令。

最小模式总线写操作

T1 周期

  1. 地址与控制信号的输出

    • 地址驱动:与读周期一致,在 T1T_1 期间,CPU 将存储单元或 I/O 端口的地址信息输出到 地址/数据复用总线 (AD15AD0AD_{15} \sim AD_0) 以及地址/状态复用线上。

    • ALE 锁存ALEALE 发出正脉冲,利用下降沿将地址信息锁存,以便后续 ADAD 总线可以腾出来传输数据。

  2. 数据传输方向的建立

    • DT/RDT/\overline{R} 信号:在写操作中,数据发送/接收信号 (DT/RDT/\overline{R}) 被置为 高电平

T2 状态

  1. 写控制信号有效:WR\overline{WR}

CPU 将 写信号 WR\overline{WR} (Write) 置为 低电平(有效)

  1. 数据的直接驱动

T1T_1 的地址信息结束后,==总线没有进入高阻(浮空)状态,而是紧接着输出了有效的 数据==

这是写操作与读操作的重大区别。在读操作中,CPU 必须释放总线让外设驱动数据;而在写操作中,地址和数据均由 CPU 这一侧驱动。因此,CPU 保持对总线的控制权,直接完成从“传地址”到“传数据”的切换。

T3 、Tw 周期

和读操作一样,根据 READY 信号的情况插入 Tw 周期,并进行数据总线的稳定上传。

T4 周期

利用 WR\overline{WR}上升沿,外设将总线上的数据正式写入其内部存储单元。

T3 和 T4 的写入区别

简单来说,T2T_2T3T_3TWT_W 是数据在总线上的“稳定保持期”,而 T4T_4 的开始(即 WR\overline{WR} 信号的上升沿)才是数据真正被“锁存(Latch)”或“写入”进存储芯片的瞬间

电信号在总线上传输存在延迟,且电平达到稳定值需要时间。如果 CPU 一把数据放上去立刻就让存储器保存,可能会因为电平未稳而导致写入错误数据。因此,T3T_3TWT_W 的存在,本质上是CPU 在等待数据在总线上彻底稳定,并让存储器有足够的时间去“感知”这个数据

暂停操作(了解)

应该不考。

中断响应周期

这个第七章会重点讲解,这里简单介绍一下时序流程。

当 CPU 接收到外部中断请求(INTRINTR)且中断允许标志 IF=1 时,CPU 会执行一个中断响应操作。这个操作在总线时序上表现为==两个连续的总线周期==

第一周期(INTA\overline{INTA}信号)

CPU 通过 INTA\overline{INTA} 引脚向外设端口(通常是 8259A 中断控制器)发送第一个负脉冲(低电平有效)。这个脉冲并不涉及数据传输,它的作用是信号握手

为了外设速度向下兼容,在第一个周期结束后,PPT指出会插入3个或2个空闲状态 TIT_I(空闲状态周期)

第二周期

CPU 再次使 INTA\overline{INTA} 引脚变低,发出第二个负脉冲。外部中断控制器(如 8259A)在检测到这第二个脉冲后,会将其内部决定的 中断类型码(即中断向量) 放到数据总线的低8位 AD7AD0AD_7 \sim AD_0 上。

CPU 在该周期的末尾(通常是 T4T_4 前沿)读取数据总线上的这个 8位中断类型码。获得类型码后,CPU 计算中断向量表中的地址,从而跳转到相应的 中断服务程序 去执行。至此,硬件的中断响应周期结束,软件处理流程开始。

DMA 模式(了解即可)

大概率不会考。

课后习题 & 其他习题

5.1简述8086引脚信号中M/IO、DT/R、RD、WR、ALE、DEN和BHE/S7的作用。

解:

  1. M/IO存储器/IO控制信号,用于区分CPU是访问存储器(M/IO=1)还是访问I/O端口(M/IO=0)。

  2. DT/R数据发送/接收信号在 T1 周期用于指示 245 等数据缓冲芯片的传输方向。

  3. RD读控制信号RD信号为低电平时,表示8086CPU执行读操作。在DMA方式时,RD处于高阻态。

(4) WR为写控制信号(输出,三态)。当8086CPU对存储器或I/O端口进行写操作时,WR为低电平。

(5) ALE为地址锁存允许信号(输出)。这是8086CPU在总线周期的第一个时钟周期内发出的正脉冲信号,其下降沿用来把地址/数据总线(AD15AD_{15}AD0AD_{0})以及地址/状态总线(A19/S6A_{19}/S_{6}A16/S3A_{16}/S_{3})中的地址信息锁住存入地址锁存器中。

(6) DEN为数据允许信号(输出、三态)。在CPU访问存储器或I/O端口的总线周期的后一段时间内,该信号有效,用作系统中总线收发器的允许控制信号。

(7) BHE/S7为总线高允许/状态S7S_{7}信号(输出三态)。这也是分时复用的双重总线,在总线周期开始的T1T_{1}周期,作为总线高半部分允许信号,低电平有效。当BHE为低电平时,把读/写的8位数据与AD15AD_{15}~AD8AD_{8}连通。该信号与A0A_{0}(地址信号最低位)结合以决定数据字是高字节工作还是低字节工作。在总线周期的其他TT周期,该引脚输出状态信号S7S_{7}。在DMA方式下,该引脚为高阻态。