3.4 8086微型计算机系统的总线时序
3.4.1 基本概念
微型计算机系统的所有操作都按统一的时钟节拍进行。CPU执行指令时涉及3种周期:时钟周期、总线周期和指令周期。
1.时钟周期
计算机的“时钟”是由振荡源产生的、幅度和周期不变的节拍脉冲,每个脉冲周期称为时钟周期,又称为T状态或T周期。计算机是在时钟脉冲的统一控制下,一个节拍一个节拍地工作的。时钟周期是微机系统工作的最小时间单元,它取决于系统的主频率,系统完成任何操作所需要的时间,均是时钟周期的整数倍。例如,在IBM PC中,CLK时钟频率为4.77MHz时,一个T状态约为210ns。
2.总线周期
当CPU访问存储器或输入/输出端口时,需要通过总线进行读或写操作,这个过程称为总线周期(Bus Cycle)。总线周期是利用总线完成一次读/写所需要的时间。与CPU内部操作相比,通过总线进行的操作需要较长的时间。根据总线操作功能的不同,总线周期可以分为存储器读周期、存储器写周期、I/O读周期和I/O写周期等。
如图3-10所示,8086的一个基本的总线周期由4个时钟周期(T1、T2、T3和T4)组成。
图3-10 一个基本的总线周期时序图
在T1状态,有效,指示CPU访问的是存储器还是外设,之后CPU往多路复用总线上发出地址信息,以指出要寻址的存储单元或外设端口的地址。在T1状态,CPU还必须在ALE引脚上输出一个正脉冲作为地址锁存信号。在ALE的下降沿,锁存器对地址进行锁存。信号也在T1状态送出,它用来表示数据传送的字宽。
在T2状态,CPU从总线上撤销地址,使总线的低16位浮空,置成高阻状态,为传输数据作准备。总线的最高4位(A19~A16)用来输出本总线周期的状态信息。这些状态信息用来表示中断允许状态或当前正在使用的段寄存器名等。读信号或写信号在T2状态变为有效,指示CPU将对被选中的存储单元或I/O端口进行哪种操作(读或写)。
在T3状态,多路总线的高4位继续提供状态信息,而多路总线的低16位上出现由CPU读出的数据或者CPU从存储器或端口写入的数据。
在有些情况下,外设或存储器速度较慢,不能及时地配合CPU传送数据。这时,外设或存储器会通过“READY”信号线在T3状态启动之前向CPU发一个“数据未准备好”信号,于是CPU会在T3之后插入1个或多个附加的时钟周期TW,如图3-11所示。TW也叫等待状态,在TW状态,总线上的信息情况和T3状态的信息情况一样。当指定的存储器或外设完成数据传送时,便在“READY”线上发出“准备好”信号,CPU接收到这一信号后,会自动脱离TW状态而进入T4状态。
在T4状态和前一个状态(T3或TW)的交界处,CPU对数据总线进行采样,获得数据,总线周期结束。
图3-11 8086CPU的总线周期
需要指出,只有在CPU和内存或I/O接口之间传输数据,以及填充指令队列时,CPU才执行总线周期。如果在一个总线周期之后,不立即执行下一个总线周期,那么,系统总线就处于空闲状态,此时,执行空闲周期Ti。
空闲状态,可以包含一个时钟周期或多个时钟周期。这期间,在高4位上,CPU仍然驱动前一个总线周期的状态信息,而且,如果前一个总线周期为写周期,那么,CPU会在总线低16位上继续驱动数据信息;如果前一个总线周期为读周期,则在空闲周期,总线低16位处于高阻状态。
3.指令周期
每条指令的执行包括:取指令(Fetch)、译码(Decode)和执行(Execute)3个阶段。执行一条指令所需要的时间称为指令周期(Instruction Cycle)。指令周期由1个或多个总线周期组成。
由于8086指令码的长度从一个字节到多个字节不等,导致指令执行需要的总线周期也不同。因此,8086中不同指令的指令周期是不等长的。
对于8086CPU来说,在EU执行指令时,BIU可以取下一条指令。由于EU和BIU可以并行工作,8086指令的最短执行时间只需要两个时钟周期,而一般的加、减、比较、逻辑操作需要几十个时钟周期,最长的16位乘除法指令执行约需要200个时钟周期。
3.4.2 最小模式下的总线周期时序
1.最小模式下的读周期时序
读操作周期(读周期)是指CPU从存储器或I/O端口读取数据的总线周期,其时序如图3-12所示。
CPU可以从存储器和I/O端口读取数据,而地址都由地址总线送出,因而CPU首先要判断是从存储器读取数据,还是从I/O端口读取数据,所以在T1状态开始时就首先变为有效,并保持到整个总线周期的结束,即保持到T4状态。其次,要给出所读取的存储器或I/O端口的地址。8086有20根地址线,前面已经指出,由于受封装引线数目的限制,其中最高4根地址线A19/S6~A16/S3和最低16根地址线AD15~AD0是复用的。但在T1状态的开始,对存储器来说,这20根引线上出现的全是地址信息;对I/O端口来说,其最大寻址范围为0000~FFFFH,故送往I/O端口的是低16位地址信息,最高4位地址线A19~A16全为低电平。地址信息需要被锁存起来,以便复用线在总线周期的其他状态传输数据和状态信息。所以在T1状态CPU还必须在ALE引脚上输出一个正脉冲作为地址锁存信号。在ALE的下降沿,锁存器8282对地址进行锁存。信号也在T1状态送出,它用来指示数据传送的字宽。若系统中接有数据收发器8286时,要用信号来控制数据的传输方向,用信号来控制数据的选通。为此,在T1状态应输出低电平,即表示为读周期。
图3-12 最小模式下读周期时序
在T2状态,及A19/S6~A17/S3引脚上输出状态信息S7~S3;AD15~AD0转为高阻态,为下面读出数据做准备。读信号在T2状态变为有效,允许将被地址信息选中的存储单元或I/O端口中的数据读出。在接有数据收发器8286的系统中,在T2状态,变为低电平,以选通8286,允许数据开始传送。
在T3状态,被选中存储单元或I/O端口把数据送到数据总线上,准备供CPU读取。
当系统中所用的存储器或外设的工作速度较慢,不能用最基本的总线周期执行读操作时,系统中会用一个电路来产生READY信号。READY信号通过时钟发生器8284传递给CPU。CPU在T3状态的下降沿对READY信号进行采样。如果CPU在T3状态的一开始没有采样到有效的READY信号(高电平)(当然,在这种情况下,在T3状态,数据总线上不会有数据),那么,就会在T3和T4之间插入等待状态TW。TW可以为一个,也可以为多个。以后,CPU在每个TW的下降沿对READY信号进行采样,直到CPU接收到高电平的READY信号。此后,在当前TW状态执行完后便脱离TW进入T4。在最后一个TW状态,数据肯定已经出现在数据总线上。
在T4状态的前一个状态(T3或TW)的下降沿处,CPU对数据总线进行采样,写入数据。
2.最小模式下的写周期时序
写操作周期(写周期)是指CPU往存储器或外设端口写入数据的总线周期,其时序如图3-13所示。
和读周期时序一样,最基本的写周期也由4个T状态组成。当存储器或外设端口的工作速度较慢时,也会在T3与T4状态之间插入一个或几个TW状态。与读周期不一样的是T1和T2状态。
① 在T1状态,应输出高电平,即表示为读周期。
② 在T2状态,读信号变为无效,而写信号变为有效;AD15~AD0不变为高阻态,而是在地址撤销之后立即送出要写入存储器或外设端口的数据。
图3-13 最小模式下写周期时序
3.中断响应周期时序
中断是指CPU中止当前程序的执行,转去执行一个中断服务程序的过程。8086可以处理256种不同的中断,分为硬件中断和软件中断。硬件中断是由外部设备引发的,分为非屏蔽中断和可屏蔽中断两类。
非屏蔽中断是通过CPU的NMI引脚引入的,其请求信号为一上升沿触发信号,并要求维持两个时钟周期的高电平。当有非屏蔽中断请求时,不管CPU正在做什么事情,都会响应,优先级别很高。
一般外部设备的中断是通过INTR引脚向CPU发出中断请求的,这个可屏蔽中断请求信号的有效电平(高电平)必须维持到CPU响应中断为止。若标志IF=1,表示CPU允许中断,此时CPU在执行完当前指令后响应中断。最小模式下可屏蔽中断响应周期时序如图3-14所示。
图3-14 最小模式下可屏蔽中断响应周期时序
分析图3-14可知:
① 中断响应周期由两个连续响应周期组成,在每一个响应周期的T2状态至T3状态结束,CPU通过引脚向外设接口发出一个负脉冲。
② 在第一个响应周期,AD7~AD0浮空;在第二个响应周期,外设接口收到后,立即往数据总线AD7~AD0上送出一个中断类型码,CPU读入该类型码后,即可在中断向量表中找到该设备的处理程序的入口地址,转入中断处理。
③ 当8086工作于最小模式时,由发送中断响应信号。如果8086工作于最大模式,则由8288根据、和的值给出中断响应信号。
④ 在每个中断响应周期,ALE都会输出一个高电平脉冲,作为地址锁存信号。
⑤ 在两个连续的中断响应周期之间,一般插入2个或3个空闲周期Ti,这是8086中断响应过程的典型情况。
4.8086的复位时序
RESET引脚是用来启动或重新启动系统的。外部来的复位信号RST经8284同步为内部RESET信号。8086两种工作模式下的复位时序相同,如图3-15所示。
8086要求RESET信号起码维持4个时钟周期的高电平。在内部RESET信号有效后,经过半个时钟周期,即用时钟脉冲下降沿驱动所有的三态引脚输出信号为不作用状态,这个不作用状态的时间为半个时钟周期(时钟周期的低电平期间),等到时钟脉冲由低变高时,三态输出线浮空为高阻状态,直到RESET信号回到低电平时为止。非三态引脚如ALE、、、QS0、QS1等,在复位后处于无效状态,但不浮空。
图3-15 8086复位时序
5.总线保持请求与响应周期时序
当系统中除CPU之外的总线主设备需要占用总线时,可向CPU发出一个有效的总线保持请求信号HOLD,这个HOLD信号可能与时钟信号不同步。CPU在每个时钟周期的上升沿进行检测,当检测到该信号时,在当前总线周期的T4后或下一个总线周期的T1后,CPU将发出一个有效的保持响应信号HLDA,并让出总线,此时,进入DMA传送过程。当DMA传送结束后,发出总线保持请求的设备将HOLD恢复为低电平,CPU才收回总线控制权。这个过程称为总线保持请求与响应周期,时序如图3-16所示。
图3-16 最小模式下总线保持请求与响应周期时序
8086一旦让出总线控制权,所有具有三态的输出线AD15~AD0,A19/S6~A16/S3,,,,,及都浮空,被置于高阻状态,即CPU暂时与总线断开。注意:非三态引脚,如ALE等不浮空。
关于总线保持请求/保持响应操作时序,需说明以下几点。
① 当某一总线主模块向CPU发来的HOLD信号变为高电平(有效)后,CPU将在下一个时钟周期的上升沿检测到。若随后的时钟周期正好为T4或为T1,则在其下降沿处将HLDA变为高电平;若CPU检测到HOLD后不是T4或T1,则可能会延迟几个时钟周期,等到下一个T4或T1出现时,才发出HLDA信号。
② 在总线保持请求与响应周期中,因三态输出线处于高阻状态,这将直接影响8086的BIU部件的工作,但是执行部件EU将继续执行指令队列中的指令,直到遇到一条需要使用总线的指令时,EU才停止工作,或者把指令队列中指令执行完,才会停止工作。由此可见,CPU和获得总线控制权的其他主模块之间,在操作上有一段时间上的重叠。
③ 当HOLD变为无效后,CPU也接着将HLDA变为低电平。但是,不会马上驱动已变为高阻的输出引脚,只有等到CPU执行一个新的总线周期操作时,才结束这些引脚的高阻状态。因此,就可能出现一小段时间内总线没有任何总线主模块的驱动。这种情况很可能导致这些线上的控制电平漂移到最小有效电平以下,为此,在控制线HOLD和电源之间需要连接一个上拉电阻。
3.4.3 最大模式下的总线周期时序
与最小模式下的读/写操作时序一样,最大模式下的基本总线周期也是由4个T状态组成的。当存储器或外设端口的工作速度较慢时,需要在T3状态后插入一个或几个等待周期TW。与最小模式总线周期时序相比,最大模式总线周期时序需要考虑总线控制器8288所产生的有关控制信号和命令信号。
1.最大模式下的读周期时序
最大模式下的读周期时序如图3-17所示。在最大模式下,总线控制器8288根据,,状态信号产生和命令信号。另外,ALE和、DEN也是由8288发出的。注意:8288发出的DEN信号的极性与CPU在最小模式下发出的信号正好相反。
图3-17 最大模式下读周期时序
2.最大模式下的写周期时序
最大模式下写周期时序如图3-18所示。在最大模式下,总线控制器8288根据,和状态信号产生和。另外,还有一组和(比和提前一个T状态有效),ALE、、DEN也是由8288发出的。
图3-18 最大模式下写周期时序
3.最大模式下的总线请求/允许/释放操作
8086在最大模式下提供的总线控制联络信号不再是HOLD和HLDA,而是把这两个引脚变成功能更加完善的、具有双向传输信号的引脚和,称为总线请求/总线允许/总线释放信号。它们可以分别连接到两个其他的总线主模块。在最大模式下,可发出总线请求的总线主模块包括:协处理器和DMA控制器等。
8086最大模式下的总线请求/总线允许/总线释放的操作时序如图3-19所示。
图3-19 最大模式下总线请求/允许/释放时序
由图3-19可见,CPU在每个时钟周期的上升沿处对引脚进行检测,当检测到外部向CPU送来一个“请求”负脉冲(宽度为一个时钟周期)时,则在下一个T4状态或T1状态从同一引脚上由CPU向请求总线使用权的主模块回发一个“允许”负脉冲(宽度为一个时钟周期)。这时所有三态输出线:AD15~AD0,A19/S6~A16/S3,,,,,和都进入高阻状态,CPU让出总线控制权(即暂时与总线断开)。
外部主模块得到总线控制权后,可以对总线占用一个或几个总线周期。当外部主模块准备释放总线时,又通过向CPU发一个“释放”负脉冲(其宽度仍为一个时钟周期)。CPU检测到释放脉冲后,在下一个时钟周期收回对总线的控制权。