§第七节 8086的总线请求和保持
本节内容:
总线主设备的概念
最小模式下的总线请求与保持
最大模式下的总线请求与保持
§2.7.1 总线主设备的概念
总线是一组能为多个部件分时共享的公共信息传送线路,可以分时地接受与发送各部件的信息。简单地说,它是一组由多个部件分时共享的传送线路。
由于在计算机系统中的各级硬件中都广泛应用总线的概念,可按其任务分为四种。
(1)CPU内部总线。这是一组数据总线,用来连接CPU内的各个寄存器与算术逻辑运算部件。在微型计算机系统中,CPU内部总线也就是芯片内的总线。
(2)部件内总线。在计算机中按功能模块制作成插件,在插件上也常采用总线结构连接有关芯片。这一级是芯片的总线。
(3)系统总线。用来在系统内连接各大组成部件,如CPU、主存,通过各接口连接各I/O设备,因此它是连接整机系统的基础。系统总线包含地址线、数据线和控制信号线。
(4)外总线。这是系统与其它设备间或系统间的通讯总线。
总线本身的实体是一组传送线,但系统总线还派生出一系列相关逻辑,如总线控制权的申请、批准与转移,总线状态信号的产生,总线传送操作的时序控制,读/写操作控制等。这些逻辑或在CPU中,或设置专门的总线控制器。因此,不少人在分析设计计算机系统时,倾向于将总线看成一种独立的功能模块。
总线在传送数据格式上可采用串行传送或并行传送,能一次并行传送的数据位数被定义为总线的数据通路宽度,而单位时间能传送的数据量被定义为总线的数据传输率。
根据总线可能的传送方向,总线可分为单向总线与双向总线两种。单向总线能使挂在总线上的一些部件将信息有选择地传向另一些部件,而双向总线则能使挂在总线上的任何部件或设备,都可以从总线上有选择地接收其他设备的信息,或通过总线有选择地将信息发送给其他设备。
§2.7.2 最小模式下的总线请求和保持
当一个系统具有多个总线主模块时,CPU以外的其他总线主模块为了获得对总线的控制,需要向CPU发出使用总线的请求信号;而CPU得到请求之后,如果同意让出总线,就要向请求使用总线的主模块发出应答信号。8086/8088为此提供了一对专用于最小模式下的总线控制联络信号HOLD和HLDA。
HOLD叫总线保持请求信号,是由其他总线主模块发给CPU的。当某个总线主模块企图使用系统总线时,便发出高电平的HOLD信号,然后等待CPU发来总线保持回答信号HLDA。
在每个时钟脉冲的上升沿处,CPU会对HOLD引脚上的信号进行检测。如果检测到HOLD处于高电平状态,并且允许让出总线,那么在总线周期的T4状态或者空闲状态T1之后的下一个时钟周期,CPU会发出HLDA信号,从而CPU便将总线让给发出总线保持请求的设备,知道此后这个发出总线保持请求的设备又将HOLD信号变为低电平,CPU才又收回总线控制权。
8086/8088CPU一旦让出总线控制权,便使地址/数据引脚、地址/状态引脚以及控制信号引脚RD、WR、INTA、M/IO、DEN及DT/R都处于浮空状态,这样,CPU和数据总线、地址总线以及上述控制信号之间就暂时没有关系了,不过,ALE信号引脚不浮空。
图2-32表示总线保持请求和保持响应操作的时序图。
在考虑总线保持请求和保持响应操作过程时,有三个问题需要注意:
一是外部的总线主模块将HOLD信号变为低电平后,CPU要在下一个时钟周期的上升沿时才检测到,随后CPU在此时钟周期(假定正好时钟周期为T4或者T1)的下降沿处将HLDA信号升为高电平。CPU在测得HOLD信号时,假如并不是处在T4或者T1状态,那么可能会延迟几个时钟周期,等到T4状态或者T1状态时才发出HLDA信号。
二是HLOD请求信号直接影响8086/8088总线接口部件(BIU)的工作,但是对执行部件(EU)的影响只是间接的。当CPU使HLDA升为高电平时,尽管CPU所有的三态引脚进入浮空状态,但是执行部件将继续执行已经进入CPU指令队列中的指令,直到遇到一条需要使用总线的指令时,执行部件才不得不停下来,当然,指令队列中的指令执行完后,执行部件也会停下来。由此可见,CPU和其他获得总线控制权的主模块之间在操作上有一段小小的重叠。
三是当发出总线保持请求的设备将HOLD信号变为低电平时,CPU也将HLDA信号降为低电平,但是,CPU不会马上重新驱动地址总线、数据总线和控制线,而是使这些引脚继续浮空,直到CPU需要执行一个总线操作时,才结束这些引脚的浮空状态。这样一来,就可能出现这样的情况,在某一小段时间中,没有任何一个模块在驱动总线。为了防止在总线控制的切换期间,由于没有任何模块的驱动而造成控制线电平漂移到最小电平以下,所以,在控制线和电源之间需要连接一个提拉电阻。
§2.7.3 最大模式下的总线请求和保持
在最大模式下,8086/8088也提供了总线主模块之间传递总线控制权的手段。CPU以外的其他总线主模块包括协处理器、DMA控制器,它们可以连接在局部总线上,去共享CPU和系统总线之间的接口,即共享地址锁存器、数据总线收发器、总线控制器,当然也共享系统总线。与最小模式下不同的是,在最大模式下,总线控制信号不再是HOLD和HLDA,而是将这两个信号引脚变成能更加完善的两个双向信号引脚RQ/GT0和RQ/GT1,它们都称为总线请求/总线允许信号端,可以分别连接两个其他的总线主模块。
RQ/GT0和RQ/GT1有着完全相同的功能,但是RQ/GT0比RQ/GT1的优先级要高。也就是说,如果RQ/GT0和RQ/GT1都连接了其他总线主模块,当两条引脚上同时出现总线请求时,CPU会在RQ/GT0先发出允许信号,等到CPU再次得到总线控制权时,才响应RQ/GT1引脚上的请求。不过,如果CPU已经把总线控制权让给连接RQ/GT1的主模块,此时又在RQ/GT0引脚上收到另一个主模块的总线请求,那么,要等前一个主模块释放总线后,CPU收回了总线控制权,才会去响应RQ/GT0引脚上的总线请求。可见CPU对总线请求的处理并不是像对中断请求的处理那样允许“嵌套”。
图2-33表示了8086、8087和8089通过RQ/GT0、RQ/GT1的连接关系。
图2-34表示了最大模式中,CPU以外的其他总线主模块请求总线使用权和8086/8088允许其他主模块获得总线使用权的时序。
对最大模式下的总线请求/允许/释放时序,我们作如下说明:
①当CPU以外的一个总线主模块要求使用系统总线时,从RQ/GT(即RQ/GT0或者RQ/GT1,以下类同)线上往CPU发一个负脉冲,宽度为一个时钟周期。
②CPU在每个时钟周期的上升沿处对RQ/GT引脚进行检测,如果测得外部有一个负脉冲,则在下个T4状态或T1状态从同一引脚RQ/GT上往请求总线使用权的主模块发一个允许脉冲,这个允许脉冲的宽度也相当于一个时钟周期。不过要注意,总线请求负脉冲是外部发给CPU的,而总线允许脉冲是由CPU发给其他外部主模块的。CPU一旦发出了响应脉冲,各地址/数据引脚、地址/状态引脚以及RD、LOCK、S2、S1、S0、BHE/S7便处于高阻状态,于是在逻辑上暂时和总线断开。
③协处理器或其他总线主模块收到CPU发出的脉冲后,便得到了总线控制权,于是它可以对总线占用一个或几个总线周期。
④当外部主模块准备释放总线时,便在RQ/GT线上往CPU发一个释放脉冲,释放脉冲的宽度也为一个时钟周期。CPU检测到释放脉冲后,在下一个时钟周期便收回了总线控制权。
从时序说明中,可以见到,每次总线控制权的切换都是通过三个环节来实现的,即协处理器或其他主模块发请求脉冲,CPU发允许脉冲,外部主模块用完成总线后发释放脉冲。这些脉冲都是负脉冲,但并不在一个方向上传输。
另外,在每次总线控制权改变后,总线上必须有一个空闲周期。即在一个时钟周期中,没有任何一个主模块使用总线。
实际上,在外部总线主模块发出总线请求时,还有一些附带条件对CPU响应总线请求作出限制,这就是:
①如果CPU正在访问存储器或外设端口,那么,总线请求脉冲必须在T2之前到达才有效,否则,外部主模块必须重发请求脉冲。
②如果CPU正在用低8位数据线传送数据,则总线请求脉冲将无效。等到数据传送结束,外部主模块重发请求脉冲时,CPU才响应。
③如果CPU正在执行中断响应的第一个总线周期,则总线请求无效。
④如果CPU正在执行总线封锁指令,则总线请求无效。
所以,只有在总线空闲时遇到总线请求的情况下,CPU才会在下一个时钟周期发出允许信号。
与最小模式下执行总线保持请求/保持响应操作时的情况一样,8086/8088通过RQ/GT线发出响应负脉冲,并且释放总线后,CPU仍然可以执行已经进入指令队列中的指令,直到需要请求一个总线周期为止。另外CPU收到其他主模块发出的释放脉冲后,也并不是立即驱动总线。
在CPU内部,RQ/GT0和RQ/GT1都配备了提拉电阻和电源相连,如果系统中未用这两个引脚,便可浮空。
§2.8 8088与8086的比较
兼容性
|
软件完全兼容
|
|
应用
|
Intel MultiBus多总线微机 | IBM PC、PC/XT;长城0520 |
主
要 差 异 |
16位CPU 16位内部结构 16位外部数据总线 |
准16位CPU 16位内部结构 8位外部数据总线 |
硬
件 接 口 差 异 |
A15~A8与数据总线复用 | A15~A8不与数据总线复用 |
M/IO指出存储器或I/O访问 | M/IO指出存储器或I/O访问 | |
BHE/S7(34脚)分时复用引脚。 BHE表示使用高8位总线。 S7未赋予任何意义 |
BHE无意义。34脚重新定义为SS0。 DT/R、IO/M、SS0共同决定最小组态下的总线操作类型。 |
|
——
|
在最小组态时,如果进入HLT,ALE信号推迟一个时钟周期,以便锁存状态信息。 | |
内
部 结 构 差 异 |
指令队列为6字节 | 指令队列为4字节 |
指令队列中有2个或以上空字节时,可以预取指令。 | 指令队列中有1个或以上空字节时,可以预取指令 | |
从偶地址开始的16位存储器操作只需一个总线周期。从奇地址开始的16位存储器读写操作需要两个连续的总线周期。 | 16位存储器读写操作需要两个连续的总线周期。 |
IO/M | DT/R | SS0 | 总线操作类型 |
1 | 0 | 0 | 发中断响应信号INTR |
1 | 0 | 1 | 读I/O端口 |
1 | 1 | 0 | 写I/O端口 |
1 | 1 | 1 | 暂停 |
0 | 0 | 0 | 取指令 |
0 | 0 | 1 | 读内存 |
0 | 1 | 0 | 写内存 |
0 | 1 | 1 | 无源状态(上次操作结束,新操作未开始) |