微处理器与总线
Goal:
- 了解微处理器的一般结构和功能
- 理解 8088CPU的外部引脚以及主要引线功能
- 深入理解 8088CPU的结构特点, 内部寄存器功能以及工作时序
- 理解 80386和Pentium4 CPU的3种工作模式
- 了解80386和Pentium4 CPU的结构特点 (没看)
- 了解流水线技术的一般概念 (没看)
- 理解 总线的一般概念, 分类方法 及 主要功能
- 了解现代微机系统的总线结构
- 了解常用的系统总线和外设总线标准
- 了解多核技术的一般概念
2.1 微处理器概述 - 了解
CPU是计算机系统的核心部件, 总体上由运算器, 控制器 和 寄存器组组成. 同时, 寄存器组又可视为运算器的一部分. 主要具有一下几项基本功能:
- 能够进行算术运算和逻辑运算
- 能对指令进行译码, 寄存并执行指令所规定的操作
- 具有与存储器和IO接口进行数据通信的能力
- 少量数据的暂存
- 能够提供该系统所需的定时和中断信号
- 能够响应输入输出设备发出的中断请求
评价CPU性能的指标(这里只说一项) -> 字长Byte
字长 - 指CPU在单位时间内能够依次处理二进制数的尾数, 通常是CPU内部寄存器的位数及内部数据总线的位数 -> 可同时操作的Bin码的位数
2.1.1 运算器
由 算术逻辑单元(ALU), 通用/专用寄存器组及内部总线 3 个部分组成.
ALU内部包括负责四则运算的加法器和逻辑运算的逻辑运算功能部件.
一位ALU的结构示意图:
除了作为核心部件的ALU外, 运算器种还有提供操作数和暂存中界运算结果及特征的寄存器及数据传送通道
CPU内部用于传送数据和指令的传送通道称为CPU内部总线. 运算器的结果根据其内部总线数量的不同分为3种, 示意图:
- 单总线结构运算器 :
所有部件都通过一条内部总线传递信息, 任何时刻都只有 一组 数据从源部件传送到目标部件. 如图, 当要进行一次双操作数的运算时, 要先后通过 BUS 将两个操作数分别放入 A, B 锁存器中, 再进入ALU执行运算, 然后在合适的时候送入总线.
=> 控制简单, 但速度较慢
- 双总线结构运算器 :
用两条总线来传送操作数. 参加运算的两个操作数可同时通过两条BUS送入ALU中执行运算, 运算结果经缓冲器送入任意一条BUS传送到通用寄存器.
- 三总线结构运算器
速度最快, 用两条BUS来传送操作数入ALU, 一条BUS来传送运算结果.
2.1.2 控制器
控制器的作用是控制程序的执行, 必须具备:
-
指令控制 - 控制器要能根据指令所在的地址按顺序或在遇到转移指令时按照转移地址去除指令, 分析指令, 传送必要的操作数, 并在指令执行结束后存放运算结果.
-
时序控制 - 用于计算机的工作基准, 由控制器产生, 使系统按一定的时序关系进行工作.
-
操作控制 - 根据指令流程, 确定在指令周期的各个节拍中要产生的微控制操作信号,
控制器的内部主要由一下几个部分组成:
-
程序计数器 - PC / Programming Counter : 存放下一条应执行指令在存储器中的地址. 在程序执行之前, 应将程序的首地址置入程序计数器.
-
指令寄存器 - IR / Instruction Register : 用于存放从存储器中取出的待执行的指令.
-
指令译码器 - ID / Instruction Decoder : 指令译码 -> 在微处理器中要具体执行的的操作.
-
时序控制部件 : 产生时序
-
微操作控制部件 : 控制器的主体, 实际执行微操作和微指令的部件.
2.2 8088/8086微处理器 (深入理解)
硬件结构上, 8088与Memory和IO interface 进行数据传输的外部数据总线宽度为8位, 而8086的DB宽度为16位.
8088/8086都具有40根外部引线, 可以在单一5V供电下运行.
2.2.1 8088/8086 CPU的特点 (深入理解)
1 - 8088/8086的指令流水线(Pipeline)
1.1.2节已知, 程序执行过程中, CPU总书由归路的重复执行一下步骤:
- 首先将第一条指令由内存中取出(这是个)
- 将去除的指令送入指令译码器译码,以确定要进行的操作
- 读取相应的操作数(执行的对象)
- 执行指令
- 存放执行结果
- 指令执行完毕,转入下一条指令的取指令阶段,不断重复直到meet暂停指令方才停止
在8088/8086之前, 微处理器是按顺序串行完成以上个操作的. 其微处理器指令执行流程如下:
-> 8088/8086 采取并行执行指令操作(流水线). 分配给CPU内两个独立的部件: *执行单元 和 总线接口单元.
-
执行单元 - EU / Execution Unit : 负责分析指令(指令译码) 和 执行指令.
-
总线执行单元 - BIU / Bus Interface Unit : 取指令, 取操作数 和 写结果
取指令操作与执行指令操作都可重叠地进行. 因为BIU已经从存储器中将EU要执行的指令"预取"了出来.
指令执行效率大幅提高. 如图所示:
2 - 内存的分段管理技术
8088/8086 CPU 的内部结构都是16位(内部 Reg 字长为16位)的. 16位Bin码最多只具有 2 16 = 64 K 2^{16} = 64K 216=64K 中组合 -> 只能产生64K给地址 -> 管理最多64个内存单元.
8088/8086采用了分段管理(Segment Management)的方法, 将内存地址框架分为多个逻辑段(Logic Segment), 每个逻辑段最大为64K个单元, 段内每个单元的**地址码(偏移地址/Offset Address 或 相对地址)**长度为16位(CPU字长).
为了区分不同的逻辑段 -> 再为每个段设置段地址(段基地址/Segment Base Address).
3. 支持多处理器系统
-> 最小模式 和 最大模式 两种工作模式 以及内置的多任务处理能力
-
最小模式 - 单处理器模式 : 系统CB的信号由8088CPU直接产生, 且系统不能进行DMA传送.
-
最大模式 - 多处理器模式 : CPU 能支持系统总线上的多个处理器, 由总线控制器提供所有BUS控制信号和命令信号.
2.2.2 8088CPU的外部引脚及其功能 (理解)
8088/8086CPU都具有40条引出线, 采用双列直插式封装(DIP封装).
为减少芯片的引线, 许多引脚具有双重功能, 采用分时复用方式(不同时刻引线的信号不相同)
8088处理器芯片引脚图:
8088的工作模式由 M N / M X ‾ MN/\overline{MX} MN/MX 引脚电平控制:
-
当 M N / M X ‾ = 1 MN/\overline{MX} = 1 MN/MX=1 -> 最小模式, 微机中只包括8088一个微处理器, 系统BUS由8088直接引出
-
当 M N / M X ‾ = 0 MN/\overline{MX} = 0 MN/MX=0 -> 最大模式, 构成的微机还可以接入另外的处理器(如8087数字协处理器).
1 - 最小模式下的引脚
-
A 16 ˜ A 19 / S 3 ˜ S 6 A_{16} \~~ A_{19} / S_{3} \~~ S_{6} A16 ˜A19/S3 ˜S6 : 高4位地址, 状态复用的引脚, 三态输出. 8088执行指令过程中, 从 A 16 ˜ A 19 A_{16} \~~ A_{19} A16 ˜A19中送出地址的最高4位; 在另外时刻, 这4个引脚送出状态信号 S 3 ˜ S 6 S_{3} \~~ S_{6} S3 ˜S6, 其中:
- S 6 ≡ 0 S_6 \equiv 0 S6≡0
- S 5 S_5 S5 指示中断允许标志位IF的状态
- S 4 , S 3 S_4, S_3 S4,S3 指示CPU当前正在使用的寄存器, 其编码如表:
-
A 8 ˜ A 15 A_8\~~ A_{15} A8 ˜A15 : 中8位地址信号, 三态输出.
-
A D 0 ˜ A D 7 AD_0 \~~ AD_7 AD0 ˜AD7 : 地址, 数据分时复用的双向信号线, 三态.
- 当 A L E = 1 ALE = 1 ALE=1 -> 输出地址信号
- 当 D E N ‾ = 0 \overline{DEN} = 0 DEN=0 -> 传输数据信号
-
I O / M ‾ IO/\overline{M} IO/M : 输入输出/存储器控制信号, 三态. 用来区分当前操作是 访问存储器 还是访问I/O端口 .
- I O / M ‾ = 0 IO/\overline{M} = 0 IO/M=0 -> 访问存储器
- I O / M ‾ = 1 IO/\overline{M} = 1 IO/M=1 -> 访问IO端口
-
W R ‾ \overline{WR} WR : 写信号输出, 三态. 表示CPU正在对存储器 或 IO端口 进行写操作.
-
D T / R ‾ DT/\overline{R} DT/R : 数据传送方向控制信号, 三态. 用于确定数据传送的方向.
- D T / R ‾ = 0 DT/\overline{R} = 0 DT/R=0 -> CPU从存储器或IO接口接收数据.
- D T / R ‾ = 1 DT/\overline{R} = 1 DT/R=1 -> CPU向存储器或IO端口发送数据.
-
D E N ‾ \overline{DEN} DEN : 数据运行信号, 三态. 信号有效 -> 表示数据总线上具有有效数据. 它在每次访问内存或IO接口以及在中断响应期间有效, 常用作DB驱动器的片选CS/SS信号.
-
A L E ALE ALE : 地址锁存信号. 三态输出, 高电平有效. -> 表明CPU地址线上有有校地址. 常作为锁存控制信号将 A 0 ˜ A 19 A_0 \~~ A_{19} A0 ˜A19 锁存到地址锁存.
-
R D ‾ \overline{RD} RD : 读选通信号, 三态输出, 低电平有效. -> 表示CPU正在对存储器或IO接口进行读操作.
-
R E A D Y READY READY : 外部同步控制输入信号, 高电平有效. 是由被访问的内存或IO设备所发出的响应信号. 有效时 -> 表示存储器或IO设备已准备好, CPU可以进行数据传送.*
若存储器或IO设备没准备好, 则置 R E A D Y READY READY为低电平. CPU在 T 3 T_3 T3 周期对 R E A D Y READY READY信号进行采样, 若为低, CPU自动插入等待周期 T w T_w Tw(一个或多个), 直到 R E A D Y READY READY 变为高电平, CPU脱离等待状态,完成数据传送过程.
-
T E S T ‾ \overline{TEST} TEST : 测试信号输入引脚, 低电平有效. 当CPU执行WAIT指令时, 每隔5个时钟周期对此引脚进行一次测试,
- 当 T E S T ‾ = 1 \overline{TEST} = 1 TEST=1, CPU处于空转状态进行等待.
- 当 T E S T ‾ = 0 \overline{TEST} = 0 TEST=0, CPU结束等待状态, 继续执行下一条指令.
Interrupt request and response signal:
-
I N T R INTR INTR : 可屏蔽中断请求出任信号, 高电平有效. CPU在 每条指令的最后一个周确采样该信号, 决定是否进入中断响应周期. 可软件屏蔽.
-
I N T A ‾ \overline{INTA} INTA Interrupt Acquire: 中断响应信号, 低电平有效. CPU对 I N T R INTR INTR的响应
-
N M I NMI NMI - Not Mask Interrupt Request : 非屏蔽中断请求输入信号, 上升沿触发. 该信号不能用软件屏蔽, 检测到NMI上升沿 -> CPU在当前指令执行结束后就进入中断过程.
-
R E S E T RESET RESET : 系统复位输入信号, 高电平触发. CPU执行内部复位.
DMA Interface Signal :
-
H O L D HOLD HOLD : 总线保持请求信号输入, 高电平有效. 指示某一总线主控设备 请求 占用系统总线.
-
H L D A HLDA HLDA : 总线保持响应信号, 高电平有效. CPU对 H O L D HOLD HOLD 请求的响应. 当CPU收到有效的 H O L D HOLD HOLD信号后, 就会对其做出响应: 拉高(高阻态)所有地址信号, 数据信号, 同时输出 H L D A = 1 HLDA = 1 HLDA=1.
2 - 最大模式下的引脚
略.
2.2.3 8088/8086 CPU 的功能结构 (深入理解)
8088/8086 CPU 的内部结构 (深入理解)
由执行单元EU和总线接口单元BIU两大部分构成:
8088微处理器的内部结构示意图:
- 执行单元 - EU / Execution Unit : 执行指令, 分析指令, 暂存中间运算结果并保留结果的特征. 由算术逻辑单元ALU, 通用寄存器, 标志寄存器FLAGS 和 EU控制电路组成.
EU在工作时不断地从指令队列中 取出指令代码, 对其译码后产生完成指令所需要的控制信息. 数据在ALU中进行运算, 运算结果的特征保留在标志寄存器 F L A G S FLAGS FLAGS中.
- 总线接口单元 - BIU / Bus Interface Unit : 负责 CPU与存储器, IO接口之间的信息传送, 由 段寄存器, 指令寄存器 Instruction Register, 指令队列 Instruction Queue, 地址加法器 Address Adder 以及 总线控制逻辑电路 组成. 8088 的 IQ长度为 4 字节, 8086为 6 字节.
当EU从指令队列IQ中取走指令, IQ中出现空字节时, BIU就自动执行一次取指令周期, 从内存中取出后续的指令代码放入IQ.
当EU需要数据时, BIU根据 EU 给出的地址, 从指定的内存单元或外设中取出数据供EU使用.
在运算结束时, BIU将运算结果送入指定的内存单元或外设
当IQ为空时, EU就等待, 直到有指令为止.
若BIU正在取指令, EU发出访问总线的请求, 则必须等BIU取指令完毕后该请求才能得到响应. 一般情况下, 程序顺序执行, 当遇到跳转指令时, BIU就使IQ复位, 从新地址取出指令, 并立即传给 EU 去执行.
BIU 中的地址加法器Addr Adder 用来 产生20位的物理地址(Physical Address). 8088/8086的寄存器都是16位, 无法装在20位的物理地址 -> 为了解决这个问题, 8088/8086 采用了将地址空间分段的方法, 即 将 2 20 2^{20} 220 的地址空间分为若干个64KB的段, 然后用段基址加上段内偏移来访问物理存储器. 8088/8086规定, 分段总是从16字节的边界开始, 所以段的起始地址最低4位总是0 => XXXX0H, 这样每个段的基地址只用16位就可以表示.
物理地址的生成方式:
段空间会出现重叠
注意!! 8088/8086中, 是 存在段间空间重叠的!!! . 每个段之间相隔4位bin码 => 1位hex码 => $2^4 = 16 $个地址编码. 而确定段内偏移量的偏移地址有16位 => 可以偏移访问 4位hex码 => 16位bin码 => 2 16 = 655536 = 64 K 2^{16} = 655536 = 64K 216=655536=64K 个地址空间.
2 - 8088/8086 CPU的内部寄存器
共 14 个16位寄存器. 按功能可分为三大类 => 通用寄存器(8个), 段寄存器(4个), 控制寄存器(2个). 如下图所示:
-
通用寄存器 - General-purpose Registers : 包括数据寄存器, 地址指针寄存器 和 变址寄存器.
- 数据寄存器 - DR / Data Register : AX, BX, CX, DX
每一个 DR 都是16位寄存器, 但又可将高, 低8位作为两个独立的8位寄存器. 它们的高8位记作 AH, BH, CH, DH, 低8位记作 AL, BL, CL, DL.
DR 除了作为通用寄存器, 还有一些习惯的用法:
-
AX(Accumulator) - 累加器 : 常用于存放 算术逻辑运算中的操作数. 另外所有IO指令都使用累加器与外设接口传送信息
-
BX(Base) - 基址寄存器 : 常用来存放访问内存时的基地址.
-
CX(Count) - 计数寄存器 : 在循环和串操作指令中用作计数器.
-
DX(Data) - 数据寄存器 : 在寄存器间接寻址的IO指令中存放IO端口的地址.
- 地址指针寄存器SP, BP
- 堆栈指针寄存器 - SP / Stack Pointer : 在堆栈操作中, 用来存放栈顶偏移地址, 永远指向堆栈的栈顶.
- 变址寄存器SI, DI: 常在变址寻址方式中作为索引指针
-
SI(Source Index) - 源变址寄存器
-
DI(Destination Index) - 目的变址寄存器
-
段寄存器 CS, SS, DS, ES :
-
CS(Code Segment) - 代码段寄存器
-
SS(Stack Segment) - 堆栈段寄存器
-
DS(Data Segment) - 数据寄存器
-
ES(Extra Segment) - 附加数据寄存器
-
-
控制寄存器 IP, FLAGS :
IP(Instruction Pointer) - 指令指针寄存器 : 存放预取指令的偏移地址Offset Address.
CPU取指令时, 总是以 CS 为段基址(Segment Base Address), 以 IP 为段内偏移地址(Offset Address). => 当CPU从CS段中偏移地址为(IP)的内存单元中取出指令代码的一个字节后, IP自动+1, 指向指令代码的下一个字节. 用户程序不可直接访问IP.
FLAGS - 标志寄存器 或 程序状态字(PSW/Programme Status Word) : 16位寄存器, 但只使用其中的9位 => 包括6个状态标志和3个控制标志. 如图所示:
- 状态标志位 - Control Flag : 记录了算术和逻辑运算结果的一些特征.
-
CF - 进位标志位 : 当进行加/减法运算时, 若 MSB向前有进/借位 -> C F = 1 CF = 1 CF=1; 否则 -> C F = 0 CF = 0 CF=0
-
PF - 奇偶标志位 : 当运算结果的低8位中 1 的个数为偶数 -> P F = 1 PF = 1 PF=1; 为奇数 -> P F = 0 PF = 0 PF=0
-
AF - 辅助进位标志位 : 在加/减法操作中, D 3 D_3 D3向 D 4 D_4 D4有进位/借位发生 -> A F = 1 AF = 1 AF=1 ; 否则, A F = 0 AF = 0 AF=0. DAA 和 DAS 指令测试这个标志位, 以便在BCD加法或减法之后调整AL 中的值.
-
ZF - 零标志位 : 当运算结果为零 -> Z F = 1 ZF = 1 ZF=1; 否则, Z F = 0 ZF = 0 ZF=0
-
SF - 符号标志位 : 当运算结果的MSB为1 -> S F = 1 SF = 1 SF=1; 否则 S F = 0 SF = 0 SF=0.
-
OF - 溢出标志位 : 当算术运算的结果溢出 -> O F = 1 OF = 1 OF=1; 否则 O F = 0 OF = 0 OF=0.
- 控制标志位 : 用于设置控制条件.
-
TF - 陷阱标志位 : 当 T F = 1 TF = 1 TF=1 激活处理器的调试特性, 使CPU处于单笔执行指令的工作方式. 每执行一条指令后, 自动产生一次单步中断, 从而使用户能逐条指令的debugging.
-
IF - 中断允许标志位 : I F = 1 IF = 1 IF=1 -> 允许CPU响应可屏蔽中断请求. T F = 0 TF = 0 TF=0 则禁止.
-
DF - 方向标志位 : 执行串操作指令时控制操作的方向. D F = 1 DF = 1 DF=1 -> 按减地址方式进行, 即从高地址开始, 每进行一次操作, 地址指针IP自动-1 或 -2.
2.2.4 8088/8086 CPU的存储器组织 (深入理解)
1 - 物理地址与逻辑地址
8088/8086有20条地址线, 可寻址的最大物理内存容量为1MB( 2 20 2^{20} 220), 其中任意内存单元都有一个20位的地址, 称为内存单元的物理地址Physical Address.
但8088/8086内部寄存器都只有16位, 而访问内存单元在多数情况下都要通过寄存器间接寻址 -> 采用将地址空间分段的方法 -> 将1MB的地址空间分为若干个64KB的段, 使用段基地址+段内偏移地址来访问物理存储器.
段基地址和段内偏移地址 又称为 逻辑地址Logic Address. 通常写作 => X X X X H : Y Y Y Y H XXXXH:YYYYH XXXXH:YYYYH
逻辑地址 和 物理地址 关系如下:
物理地址 = 段基址 × 16 + 段内偏移 = 段基址 < < 4 + 段内偏移 E . g . 3 A 00 H : 12 F B H = 3 A 000 H + 12 F B H = 3 B 2 F B H \begin{aligned} 物理地址 & = 段基址 \times 16 + 段内偏移 \\ & = 段基址 << 4 + 段内偏移 \\ E.g. \\ \quad 3A00H:12FBH & = 3A000H + 12FBH \\ & = 3B2FBH \end{aligned} 物理地址E.g.3A00H:12FBH=段基址×16+段内偏移=段基址<<4+段内偏移=3A000H+12FBH=3B2FBH
8088/8086可同时访问4个存储器段(4个段寄存器SR), 段与段间可重合, 重叠, 紧密连接或分开.
分段(段+偏移)寻址的好处是 允许程序在存储器内重定位(浮动), 并且允许实模式下辨析额的程序在保护模式下允许.
可重定位程序是一个不加修改就可以在任何存储区域中运行的程序. 因为段内偏移总是相对段起始地址(段首地址)而言, 所以 只要在程序中不使用绝对地址访问存储器, 就可以把整个程序作为一个整体移到一个新的区域.
在DOS中, 程序载入到内存时由操作系统指定段寄存器SR的内容, 以实现程序的重定位.
2 - 段寄存器的使用
存储器中, 信息按特征可分类为 -> 程序代码, 数据, 堆栈等.
存储器可相应地划分为 ->
- CS - 程序段 : 存放程序的指令代码
- DS, ES - 数据段 及附加数据段 : 存放数据和运算结果.
- SS - 堆栈段 : 传递参数, 报错数据和状态信息.
8088/8086 对访问不同内存段所使用的段寄存器SR和相应的偏移地址的来源有规定:
根据上表, 访问存储器时, 其段地址由"默认"的SR提供, 当指令中显式地"指定"使用某一个SR时, 即由对应SR提供.
表中, 3, 5, 6这三种访问存储器操作允许在指令中指定另外的寄存器来寻址内存. 1, 2, 4这只能使用默认的段寄存器.
DS, EX, SS 要用传送指令来进行设置, CS 则不允许用户程序设置, 一般由OS进行设置. 宏汇编语言中的伪指令ASSUME及JUMP, CALL, RET, INT 和 IRET等指令可以改变和影响CS中的内容. 更改SR的内容意味着内存段的移动 -> 即可以改变逻辑段在内存中的位置.
如果一个数据段的段基址由DS来指明, 就可称为DS段; 同理, 若段基地址 同时在 DS 和 ES 中, 该段既可称为DS段, 又可称为ES段.
2.2.5 8088/8086 CPU的工作时序 (深入理解)
表征微处理器各引脚在时间上的工作关系.
时序可分为两种不同的粒度 -> 时钟周期 和 总线周期. 时钟周期就是主频的那个周期, 略.
总线周期(Bus Period) : 通过总线进行一次读/写的过程. 典型的总线周期如图:
下面介绍 8088 CPU 在最小模式下的时序信号过程 :
8088 读-总线周期:
8088 写-总线周期:
正常的8088总线周期, 不管是读或写, 都由至少4个时钟周期( T 1 ˜ T 4 T_1 \~~ T_4 T1 ˜T4)组成.
T 1 T_1 T1期间: 地址信号线 A 15 ˜ A 8 A_{15} \~~ A_{8} A15 ˜A8, 地址/状态复用线 A 19 / S 6 ˜ A 8 / S 3 A_{19}/S_6 \~~ A_{8}/S_3 A19/S6 ˜A8/S3 和地址/数据复用线 A D 7 ˜ A D 0 AD_{7} \~~ AD_{0} AD7 ˜AD0三个部分 分别输出 => 地址的中8位 A 15 ˜ A 8 A_{15} \~~ A_{8} A15 ˜A8, 高4位 A 19 ˜ A 16 A_{19} \~~ A_{16} A19 ˜A16 和 低八位 A 7 ˜ A 0 A_{7} \~~ A_{0} A7 ˜A0; 同时输出地址锁存允许信号ALE
ALE驱动外部电路将地址信号所存到地址锁存器中, 即在锁存器输出端得到了完整的20位地址信号.
之后, 就可利用其他控制信号完成对内存或外设的读写操作.
在写总线周期中, CPU从 T 2 T_2 T2开始把数据送到总线上 并维持到 T 4 T_4 T4. 在读总线周期中, CPU在 T 4 T_4 T4开始读入总线上的数据.
如果内存或接口的速度较慢, 没能在4个周期内完成读写操作, 通过时钟产生器(8284)产生低电平拉低8088的READY端. 8088在每个总线周期的 T 3 , T w T_3, T_w T3,Tw, 开始检查 R E A D Y READY READY, 若 R E A D Y = 0 READY = 0 READY=0, 在 T 3 T_3 T3 后插入等待时钟周期 T w T_w Tw, 直到 R E A D Y = 1 READY = 1 READY=1 再进入 T 4 T_4 T4.
注意, R D ‾ \overline{RD} RD 和 W R ‾ \overline{WR} WR 在 T 4 T_4 T4 开始时刻, 数据线上的数据稳定后进行的.
2.5 总线 (理解)
2.5.1 概述
1 - 总线的概念
是一组信号线的集合, 是计算机系统个部件之间传输地址, 数据和控制信息的公共通路.
总线上任何一个部件发送的信息都可被连接到总线上的其他所有设备接受到, 但某一时刻只能有一个设备进行信息传送.
2 - 总线的分类 (理解)
按传送信息的类型划分
分为 数据总线, 地址总线, 及控制总线
- 数据总线 - DB / Data Bus : 双向, 计算机系统内各部件之间进行数据传送的路径.
数据总线的宽度决定每一次同时传送的bin位. 如果数据总线宽度 = 8, 指令长 = 16, 则取一条指令需要访问两次存储器. 表现系统性能的关键之一.
- 地址总线 - AB / Address Bus : 由系统产生地址信号, 单向. 用于传送地址信息, 即这类总线上所传送的一组bin码 表示的是某一个内存单元地址 or IO 端口地址. 规定了DB上的数据来自于何处 or 被送往何处 -> 当 CPU 要从存储器中读取一个数据时, 需要先形成存放该数据的地址, 并将地址放到AB上, 然后才能从指定的存储器单元中取出数据.
地址总线的宽度决定了能够产生的地址码的个数 -> 决定了计算机系统能够管理的最大存储器容量; 进行IO操作时, 地址总线还要传送IO端口的地址, 一般寻址IO时, 只使用AB中的低端几位, 寻址内存时才使用AB的所有位.(由于寻址IO端口的容量一般远小于内存); 8086系统中: 寻址端口使用**低16位 A 15 ˜ A 0 A_{15} \~~ A_{0} A15 ˜A0, 高4位 A 19 ˜ A 16 A_{19} \~~ A_{16} A19 ˜A16**置0.
-
控制总线 - CB / Control Bus : 用于传送各种控制信号, 以实现对DB, AB 的访问及使用情况进行控制. 通常包括:
-
写存储器命令 : 在其控制下, DB上的数据被写入指定的存储器单元.
-
读存储器命令 : 在其控制下, 将指定存储器单元的数据放到DB上.
-
IO写命令 : 在其控制下, 将DB上的数据data写入指定的IO端口
-
IO读命令 : 在其控制下, 将指定IO端口的数据放到DB上.
-
传送响应 : 传送响应用于表示DB上的数据已经被接收 or 已经将数据放上DB 的应答信号.
-
总线请求 : 用于表示系统内的某一部件 想要BUS控制权 的信号.
-
总线响应 : 表示 获准系统内某部件控制总线.
-
中断请求 : 系统内某中断源发出欲中断的请求信号.
-
中断响应 : 系统内某中断源发出的中断请求已获准.
-
时钟和复位 : 式中信号用于同步操作时的同步控制. 初始化操作时, 需要用复位命令.
就某一具体的控制信号来讲 其信息的走向都是单向的.
-
按总线的层次类型划分
可分为 前端总线(CPU 总线), 系统总线 和外设总线. 计算机系统内各层的信息传送由各层总线完成.
-
前端总线 - Front-side Bus : 包括 AB, DB 和 CB 一般指从CPU引脚上引出的连接线, 用来实现CPU与主存储器, 与IO接口芯片, 与控制芯片组 等芯片以及系统中多个CPU间之间的信息传输. 根据具体的处理器设计的, 没有统一标准.
-
系统总线 - System Bus : 也称为 I/O通道总线, 同样包括AB, DB 和 CB, 是主机系统与外围设备之间的通信通道.
在主板上, 系统总线表现位 与 IO扩展插槽(IO Expansion Slot) 引线连接的一组逻辑电路和导线. IO插槽上可插入各种扩展办卡, 作为各种外部设备的适配器与外设相连. 系统总线有统一的标准, 常见的有 ISA(Industry Standard Architecture), PCI(Peripheral Component Interconnect), PCIe(Peripheral Component Interconnect Express)等. -
外设总线 - Peripheral Bus : 指计算机主机与外部设备接口的总线, 实际上是一种外设的接口标准. 流行的接口标准有IDE(EIDE), SCSI, USE 和 IEEE 1394.
3 - 总线结构 (了解)
可划分为两种: 单总线结构 和 多总线结构.
单总线结构
计算机的各个部件均挂接在一组总线上, 构成微机的硬件系统, 所有它又称为 面向系统的单总线结构.
Pros : 控制简单, 扩充方便.
Cons : 所有设备部件 均挂接在同意总线下, 运行是必须分时工作. 限制了系统总体数据传输的效率和速度.
多总线结构
- 双总线结构
又分为 面向CPU的双总线结构 和 面向存储器的双总线结构.
面向CPU的双总线结构如图所示:
其中, CPU 通过存储总线与主存储器通信, 通过输入输出(IO)总线与IO设备之间通信.
Pros : CPU与主存, 与 IO设备间分别设置了总线, 提高了微机系统信息传送的效率.
Cons : 外设与主存之间没有直接通路, 必须通过CPU进行中转. 一般来说, 外设工作时要求CPU干预的越少越好, 干预越少 -> 设备的CPU占用率就越低 -> 设备智能化程度越高.
面向存储器的双总线结构:
所有设备和部件均可通过系统总线通信. 又在CPU与主存间专门设置了一条高速总线, 使CPU可以直接通过该总线与主存通信.
Pros : 保留单总线结构的优点, 使信息传送效率提高, 同时减轻了总线负担.
Cons : 硬件造价较高.
- 多总线结构
4 - 总线操作 (理解)
2种工作方式 : 主控方式 和 从属方式 . 由此, 总线上的设备分为 => 主控设备 和 从属设备 .
微机系统中的各种操作(处理器内部寄存器操作, 处理器对存储器/IO接口的读写操作, 中断操作, 直接存储器存取操作等), 本质上都属于 总线操作.
特点 : 任意时刻, 总线上只允许一对设备(主控设备和从属设备)进行通信. 当有多各设备要使用总线时, 只能分时使用, 即将总线时间分为若干段, 每一时间段完成一次设备间的通信 => 称为一个数据传送周期或者总线操作周期.
一个总线周期分为5个步骤 :
-
总线请求 : 由使用总线的主控设备向总线仲裁机构提出使用总线的请求.
-
总线仲裁 : 决定在下一个传送周期 由 哪个请求源使用总线.
-
寻址 : 指取得总线使用权的主控设备, 通过AB发出 本次要传送的数据的地址及相关命令, 通过译码选中使参与本次数据传送的从属设备.
-
数据传送 : 实现 从 主控设备 到 从属设备 的数据传送.
-
传送结束 : 主控设备和从属设备 的相关信息从总线上撤除, 让出总线.
5 - 总线的主要性能指标
-
总线的带宽 : 指单位时间内总线上可传送的数据量 -> 每秒传送多少字节, 单位为 字节/秒(B/s) 或兆字节秒(MB/s)
-
总线的位宽 / 总线宽度: 指的是总线能同时传送的数据位数 -> 16位, 32位…
-
总线的工作频率 / 总线的时钟频率 (MHz) : 指用于协调总线上的各种操作的时钟信号的频率.
三者的关系 :
总线带宽 B W = ( 总线宽度 / 8 ) × 总线时钟频率 ÷ 每个存取周期的时钟数 总线带宽BW = (总线宽度 / 8) \times 总线时钟频率 \div 每个存取周期的时钟数 总线带宽BW=(总线宽度/8)×总线时钟频率÷每个存取周期的时钟数
2.5.2 总线的基本功能
总线传输需要解决以下几个问题:
- 总线传输同步
- 总线仲裁控制
- 出错处理
- 总线驱动
1 - 总线的数据传送
数据在总线上传送时, 为确保传送的可靠性, 传送过程必须由定时信号控制, 定时信号使主控设备 和 从属设备 之间的操作同步. 定时实现的方式有 : 同步定时, 异步定时 和 半同步定时.
同步定时方式 - Synchronous Timing
总线上的数据传送用一个公共的时钟来同步双方的操作, 发送 和 接收信号都在固定的时刻发出.
同步定时下总线写操作时的时序图:
主控设备(源端) 于某一刻在READY信号控制下将数据发出, 从属设备(目的端) 在ACK信号控制下接收数据.
Pros : 相比异步定时方式, 吞吐量大
Con : 延迟时间 t 1 , t 2 t_1, t_2 t1,t2 要由总线上最慢的设备来设定; 源部件无法指定目的部件是否已经收到数据, 目的部件也无从直到源部件的数据是否已真正的送到总线上.
8088系统总线基本上属于同步定时.
异步定时方式 - Asynchronous Timing
异步定时方法中没有固定的时钟, 定时序列中的每一步都要靠信号在 源端 和 目的端 间的来回传送来实现. 这些控制信号的传送**. 为减少信号传送的复杂性, 在异步方式中并非每一步都靠信号传递来实现的, 二十把某几步改用等的爱一段足够长的固定延迟时间来代替对方传送过来的信号. -> 隐含信号 implicit signaling . 根据隐含信号的多少, 可以把异步总线定时分为 -> 非互锁的non-interlocked, 半互锁的semi-interlocked 和 全互锁的interlocked 3种方式.
这里仅对 非互锁异步定时方式 做介绍, 如图所示:
READY信号 和 ACK信号的脉冲宽度设定为固定时间, 即 t 2 , t 4 t_2, t_4 t2,t4 为定值.
数据送到总线上, 经 t 1 t_1 t1后, 源端 拉高 R E A D Y READY READY, 目的端收到 R E A D Y READY READY信号后 -> 接收总线上的数据, **经 t 3 t_3 t3**后, 使 A C K ACK ACK升高以此通知源端 -> 源端接收到 A C K ACK ACK后, 经 t 5 t_5 t5后, 从总线上撤去数据 -> 再用 t 6 t_6 t6时间使总线状态稳定 -> 开启下一个总线周期.
Pros : 任何速度的设备间都能互相通信. Cons : 延迟较大.
半同步定时方式:
略.
2 - 总线仲裁控制 (没看)
3 - 总线驱动及出错处理 (没看)
2.5.4 8088系统总线
1 - 最小模式下的系统总线
最小模式下8088系统总线构成图:
系统总线的20根地址线用 3片 8282(or 74LS373)锁存器构成. CPU本身产生所有的总线控制信号和命令输出信号, 并提供请求访问总线的控制信号