微型计算机原理及应用
第 7 章 输入和输出 §7.1 概述 §7.2 CPU与外设数据传送的方式 §7.3 DMA控制器
7.1 概述 输入和输出设备是计算机系统的重要组成部分。程序、原始数据和各种现场采集到的资料和信息,都要通过输入设备输入至计算机。计算结果或各种控制信号要输出给各种输出设备,以便显示、打印和实现各种控制动作。常用的输入设备有键盘(Key Board)、鼠标、扫描仪,或者经过A/D(模/数)转换的现场信息等。 常用的输出设备有CRT、各种行打印机(Line Printer)、绘图仪,以及经过D/A(数/模)转换的各种控制信号。近年来,多媒体技术有了很大发展,声音和图像的输入和输出也是重要的I/O设备。CPU与外部设备(Peripheral)交换信息也是计算机系统中十分重要和十分频繁的操作。
外部设备的种类繁多,可以是机械式、电动式、电子式以及其他形式。输入的信息也不相同,可以是数字量、模拟量(模拟的电压、电流),也可以是开关量(两个状态的信息)。而且输入信息的速度也有很大区别,可以是手动的键盘输入(每个字符输入的速度为秒级),也可以是磁盘输入(它能以1Mb/s的速率传送)。所以CPU与外设之间的连接与信息交换是比较复杂的。
7.1.1 输入输出的寻址方式 CPU寻址外设可以有两种方式: 存储器对应输入输出方式和端口寻址的输入输出方式。 1.存储器对应输入输出方式 7.1.1 输入输出的寻址方式 CPU寻址外设可以有两种方式: 存储器对应输入输出方式和端口寻址的输入输出方式。 1.存储器对应输入输出方式 在这种方式中,把一个外设端口作为存储器的一个单元来对待,故每一个外设端口占有存储器的一个地址。从外部设备输入一个数据,作为一次存储器读的操作;而向外部设备输出一个数据,则作为一次存储器写的操作。
这种方式的优点是: (1) CPU对外设的操作可使用全部的存储器操作指令,故指令多,使用方便。如可对外设中的数据(存于外设的寄存器中)进行算术和逻辑运算,进行循环或移位等。 (2) 内存和外设的地址分布图是同一个。 (3) 不需要专门的输入输出指令以及区分是存储器还是I/O操作的控制信号。 这种方式的缺点是: (1) 外设占用了内存单元,使内存容量减小。 (2) 要寻址的外设的端口地址,显然比内存单元的地址要少得多。所以,在用直接寻址方式寻址外设时,它的地址字节,通常总是要比寻址内存单元的地址少一个字节,因而节省了指令的存储空间,缩短了指令的执行时间。
2.端口寻址的输入输出方式 在这种工作方式中,CPU有专门的I/O指令,用地址来区分不同的外设。但要注意,实际上是以端口(Port)作为地址的单元,因为一个外设不仅有数据寄存器还有状态寄存器和控制命令寄存器,它们各需要一个端口才能加以区分,故一个外设往往需要多个端口地址。CPU用地址来选择外设。通常专用的I/O指令,只用一个字节作为端口地址,故最多可寻址256个端口。 在IA-32结构微处理器中,例如在Intel 8088和8086中,若用直接寻址方式寻址外设,则仍用一个字节的地址,可寻址256个端口;而用DX间接寻址外设时,则端口地址是16位的,可寻址216=64K个端口地址。 在用端口寻址方式寻址外设的CPU中,必须要有控制线来区分是寻址内存还是寻址外设。
7.1.2 CPU与I/O设备之间的接口信息 CPU与一个外设之间交换的信息,如图7-1所示。 传送的信息 1. 数据(Data) 在微型计算机中,数据通常为8位、16位或32位。它大致可以分为三种基本类型: (1) 数字量 由键盘等输入的信息是以二进制形式表示的数或以ASCII码表示的数或字符。
(2) 模拟量 当计算机用于控制时,大量的现场信息经过传感器把非电量(例如温度、压力、流量、位移等)转换为电量,并经放大即得到模拟电压或电流。这些模拟量必须先经过A/D转换才能输入计算机;计算机的控制输出也必须先经过D/A转换才能去控制执行机构。 (3) 开关量 开关量是两个状态的量,如电机的运转与停止,开关的闭合与断开,阀门的打开和关闭等。这些量只要用一位二进制数即可表示,故字长8位的机器一次输入或输出可以控制8个这样的开关量。
2.状态信息(Status) 在输入时,有输入设备的状态信息是否准备好(Ready);在输出时,有输出设备的状态信息是否有空(Empty),若输出设备正在输出信息,则以忙(Busy)指示等。 3.控制信息(Control) 例如控制输入输出设备启动或停止等信息。 状态信息和控制信息与数据是不同性质的信息,必须要分别传送。但在大部分微型计算机中(8086也如此),只有通用的输入IN和输出OUT指令,因此,外设的状态也必须作为一种数据输入;而CPU的控制命令,也必须作为一种数据输出。为了使它们之间相互能够区分开,它们必须有自己不同的端口地址,如图7-2所示。
数据需要一个端口;外设的状态需要一个端口,CPU才能把它读入,了解外设的运行情况;CPU的控制信号往往也需要一个端口,以控制外设的正常工作。所以,一个外设往往要几个端口地址,CPU寻址的是端口,而不是笼统的外设。一个端口的寄存器往往是8位的,通常一个外设的数据端口是8位的,而状态与控制端口只用其中的1位或2位,故不同的外设的状态或控制信息可以共用一个端口。
7.1.3 CPU的输入输出时序 在最大组态下,8086的基本输入输出总线周期的时序与存储器读写的时序是类似的。但是,通常I/O接口电路的工作速度较慢,往往需要插入等待状态。所以,基本I/O操作由T1、T2、T3、TW、T4组成,占用5个时钟周期,如图7-3所示。
7.1.4 CPU与接口电路之间数据传送的形式 CPU与外设的信息交换称为通信(Communication)。基本的通信方式有两种: 并行通信——数据的各位同时传送; 串行通信——数据一位一位顺序传送。 并行通信与串行通信方式,如图7-4所示。
7.2 CPU与外设数据传送的方式 当CPU与外设进行信息(数据、状态信号和控制命令)传送时,为了保证传送的可靠性和提高工作效率,有几种不同的传送方式。
7.2.1 查询传送方式 1.查询式输入 CPU与I/O设备的工作往往是异步的,很难保证,当CPU执行输入操作时,外设已把要输入的信息准备好了;而当CPU执行输出时,外设的寄存器(用于存放CPU输出数据的寄存器)一定是空的。所以,通常在程序控制下的传送方式,在传送前,必须要查询外设的状态,当外设准备就绪了才传送;若未准备好,则CPU等待。 所以,接口部分除了数据传送的端口以外,还必须有传送状态信号的端口,其方框图如图7-9所示。
当输入设备的数据已经准备好后便发出一个选通信号,一方面把数据送入锁存器,另一方面使D触发器为“1”,给出“准备好”(Ready)的状态信号。而数据信号与状态信号必须由不同的端口输至CPU数据总线。当CPU要由外设输入信息时,先输入状态信息,检查数据是否已经准备好,当数据已经准备好后,才输入数据。读入数据的命令,使状态信息清“0”。 读入的数据是8位或16位的,而读入的状态信息往往是1位的,如图7-10所示。所以,不同外设的状态信息,可以使用同一个端口,而只要使用不同的位就行。 这种查询输入方式的程序流程图如图7-11所示。
查询部分的程序如下: POLL: IN AL,STATUS_PORT;从状态端口输入状态信息 TEST AL,80H;检查READY是否为1 JE POLL;未READY,循环 IN AL,DATA_PORT;READY,从数据端口输入数据 这种CPU与外设的状态信息的交换方式,称为应答式,状态信息称为“联络”或“握手”(Handshake)信息。
2.查询式输出 在输出时,CPU也必须了解外设的状态,看外设是否有空(即外设不正处在输出状态,或外设的数据寄存器是空的,可以接收CPU输出的信息),若有空,则CPU执行输出指令,否则就等待。因此,接口电路中也必须要有状态信息的端口,其方框图如图7-12所示。
当输出设备把CPU要输出的数据输出以后,发出一个ACK(Acknowledge)信号,使D触发器置“0”,即使“Busy”线为0(Empty=Busy),当CPU输入这个状态信息后,知道外设为“空”,于是就执行输出指令。输出指令执行后,由地址信号和IO/M#及WR#相“与”后,发出选通信号,把在数据线上输出的数据送至锁存器。同时,令D触发器置“1”,它一方面通知外设输出数据已经准备好,可以执行输出操作;另一方面在数据由输出设备输出以前,一直为“1”,告诉CPU(CPU通过读状态端口而知道)外设“Busy”,阻止CPU输出新的数据。 接口电路的端口信息为: 数据端口为8位或16位;状态信息为1位,如图7-13所示,查询式输出的程序流程图如图7-14所示。
查询部分的程序为: POLL:IN AL,STATUS_PORT;从状态端口输入状态信息 TEST AL,80H;检查BUSY位 JNE POLL;BUSY则循环等待 MOV AL,STORE;否则,从缓冲区取数据 OUT DATA_PORT,AL;从数据端口输出 其中,STATUS_PORT是状态端口的符号地址;DATA_PORT是数据端口的符号地址;STORE是存放数据单元的地址偏移量。
3.一个采用查询方式的数据采集系统 一个有8个模拟量输入的数据采集系统,用查询的方式与CPU传送信息,其电路如图7-15所示。 8个输入模拟量,经过多路开关——它由端口4输出的3位二进制码(D0、D1、D2)控制(000——相应于A0输入),每次送出一个模拟量至A/D转换器;同时A/D转换器由端口4输出的D4位控制启动与停止。
A/D转换器的READY信号由端口2的D0输送至CPU数据总线,经A/D转换后的数据由端口3传送至数据总线。所以,这样的一个数据采集系统,需要用到3个端口,它们有各自的地址。 实现这样的数据采集过程的程序为:
START:MOV DL,0F8H;设置启动A/D 转换的信号 LEA DI,DSTOR;存放输入数据缓冲区的地址偏移量→DI AGAIN:MOV AL,DL AND AL,0EFH;使D4=0 OUT 4,AL;停止A/D转换 CALL DELAY;等待停止A/D操作的完成 MOV AL,DL OUT 4,AL;启动A/D,且选择模拟量A0
POLL:IN AL,2;输入状态信息 SHR AL,1 JNC POLL;若未READY,程序循环等待 IN AL,3;否则,输入数据 STOSB ; 存至内存 INC DL;修改多路开关控制信号,指向下一个模拟量 JNE AGAIN;8个模拟量未输入完,循环已完,执行别的程序段
7.2.2 中断传送方式 在上述的查询传送方式中,CPU要不断地询问外设,当外设没有准备好时,CPU要等待,不能干别的操作,这样就浪费了CPU的时间。而且许多外设的速度是较低的,如键盘、打印机等,它们输入或输出一个数据的速度是很慢的,在这个过程中,CPU可以执行大量的指令。为了提高CPU的效率,可采用中断的传送方式。 即当CPU需要输入或输出时,若外设的输入数据已存入寄存器;在输出时,若外设已把上一个数据输出,输出寄存器已空,这时由外设向CPU发出中断申请,CPU就暂停原来执行的程序(即实现中断),转去执行输入或输出操作(中断服务),待输入输出操作完成后即返回,CPU再继续执行原来的程序。这样就可以大大地提高CPU的效率,而且有了中断的概念,允许CPU与外设(甚至多个外设)同时工作。
在中断传送方式时的接口电路,其方框图如图7-16所示。 当输入设备输入一数据,发出选通信号,把数据存入锁存器,又使D触发器置“1”,发出中断请求,若中断是开放的,CPU接受了中断请求信号后,在现行指令执行完后,暂停正在执行的程序,发出中断响应信号INTA,于是外设把一个中断矢量放到数据总线上,CPU就转入中断服务程序——即读入或者输出数据,同时清除中断请求标志。当中断处理完后,CPU返回被中断的程序继续执行。
7.2.3 直接数据通道传送(DMA)方式 利用中断进行数据传送,可以大大提高CPU的利用率。例如某一个外设1秒钟能传送100个字节。若用查询方式输入,则在这1秒钟内CPU全部用于查询和传送;若用中断方式,CPU每传送一个字节的服务程序若需100μs,则传送100个字节,CPU只需用10ms,即只占1秒的1/100的时间,这样99/100的时间CPU可用于执行主程序。 但是中断传送仍然是由CPU通过程序来传送的,每次要保护断点、保护现场需用多条指令,每条指令要有取指和执行时间。这对于一个高速I/O设备,以及成组交换数据的情况,例如磁盘与内存间的信息交换,就显得速度太慢了。
所以希望用硬件在外设与内存之间直接进行数据交换(DMA)而不通过CPU,这样数据传送的速度的上限就取决于存储器的工作速度。但是,通常系统的地址和数据总线以及一些控制信号线(例如IO/M#、RD#、WR#等)是由CPU管理的。在DMA方式时,就希望CPU把这些总线让出来(即CPU连到这些总线上的线处于第三态——高阻状态),而由DMA控制器接管,控制传送的字节数,判断DMA是否结束,以及发出DMA结束等信号。这些都是由硬件实现的。
DMA控制器必须有以下功能: (1) 能向CPU发出HOLD信号; (2) 当CPU发出HLDA信号后,接管和控制总线,进入DMA方式; (3) 发出地址信息,能对存储器寻址以及能修改地址指针; (4) 能发出读或写等控制信号; (5) 能决定传送的字节数,判断DMA传送是否结束; (6) 发出DMA结束信号,使CPU恢复正常工作状态。 通常DMA的工作流程如图7-17所示。
能实现上述操作的DMA控制器的硬件方框图如图7-18所示。 当外设把数据准备好以后,发出一个选通脉冲使DMA请求触发器置“1”,它一方面向控制/状态端口发出准备就绪信号,另一方面向DMA控制器发出DMA请求。于是DMA控制器向CPU发出HOLD信号,当CPU在现行的机器周期结束后响应发出HLDA信号,于是DMA控制器就接管总线。
向地址总线发出地址信号,在数据总线上给出数据,并给出存储器写的命令,就可把由外设输入的数据写入存储器。然后修改地址指针,修改计数器,检查传送是否结束,若未结束则循环直至整个数据传送完毕。DMA工作过程波形图如图7-19所示。
在整个数据传送完后,DMA控制器撤除总线请求信号(HOLD变低),在下一个T周期的上升沿,就使HLDA变低。 当CPU需要运行别的周期时,又取得对总线的控制。 随着大规模集成电路技术的发展,DMA传送已不局限于存储器与外设间的信息交换,而可以扩展为在存储器的两个区域之间,或两种高速的外设之间进行DMA传送,如图7-20所示。
1.DMA控制器的基本功能 DMAC是控制存储器和外部设备之间直接高速地传送数据的硬件电路,它应能取代CPU,用硬件完成图7-17所示的各项功能。具体地说,DMAC应具有如下功能: (1) 能接收外设的请求,向CPU发出DMA请求信号; (2) 当CPU发出DMA响应信号之后,接管对总线的控制,进入DMA方式; (3) 能寻址存储器,即能输出地址信息和修改地址; (4) 能向存储器和外设发出相应的读/写控制信号; (5) 能控制传送的字节数,判断DMA传送是否结束; (6) 在DMA传送结束以后,能结束DMA请求信号,释放总线,使CPU恢复正常工作。
2.DMA传送方式 DMAC一般都有两种基本的DMA传送方式: (1) 单字节方式: 每次DMA请求只传送一个字节数据,每传送完一个字节,都撤除DMA请求信号释放总线; (2) 字节(字符)组方式: 每次DMA请求连续传送一个数据块,待规定长度的数据块传送完了以后才撤除DMA请求释放总线。 在DMA传送中,为了使源和目的之间的数据传送取得同步,不同的DMAC在操作时都受到外设的请求信号或准备就绪信号——READY信号的限制。
7.3 DMA 控 制 器 下面以Intel 8237 DMAC为例介绍DMA控制器(DMAC)的工作原理和使用。 Intel 8237/8237A-5是一种高功能的可编程的DMA控制器,采用5MHz的8237-2传送速度可以达到1.6兆字节/秒。
7.3.1 DMA控制器的主要功能 DMA控制器有以下主要功能:
(4)每一个通道一次传送的最大长度可达64KB,可以在存储器与外设间进行数据传送,也可以在存储器的两个区域之间进行传送。 (5)8237的DMA传送有以下四种方式: ① 单字节传送方式; ② 数据块传送方式; ③ 请求传送方式; ④ 级连方式。 在每一种方式下,都能接收外设的请求信号DREQ,向外设发出响应信号DACK,向CPU发出DMA请求信号HRQ,当接收到CPU的响应信号HLDA后就可以接管总线,进行DMA传送。每传送一个数据,修改地址指针(可以编程规定为增量修改或减量修改),字节数减1,当规定的传送长度(字节数)减到零时,会发出TC信号结束DMA传送或重新初始化。
(6) 有一个结束处理的输入信号EOP,允许外界用此输入端来结束DMA传送或重新初始化。 (7) 8237可以级连,任意扩展通道数。
7.3.2 8237的结构 Intel 8237的方框图如图7-21所示。图中的通道部分只画出了一个通道的情况,即每个通道都有一个基地址寄存器(16位),基字节数计数器(16位),现行地址寄存器(16位)和现行字节数计数器(16位),每一个通道都有一个6位的模式寄存器以控制不同的工作模式,所以,8237的内部寄存器的类型和数量如表7-1所示。
8237的结构中包含了三个基本的控制逻辑块: (1) 时序控制逻辑块 根据编程规定的DMAC的工作模式,产生包括DMA请求,DMA传送以及DMA结束所需要的内部时序和外部信号。 (2) 程序命令控制块 对在DMA请求服务之前CPU编程时所给定的命令字和模式控制字进行译码,以确定DMA服务的类型。 (3) 优先权编码逻辑 对同时有请求的通道进行优先权编码,确定哪个通道的优先权最高。在 8237中,通道的优先权可以是固定的,也可以是旋转的。 另外还有缓冲器。8237的数据引线、地址引线都有三态缓冲器,因而可以接管和释放总线。
7.3.3 8237的工作周期 8237在设计时规定它有两种主要的工作周期,即空闲周期和有效周期。每一个周期又由若干个时钟周期组成。 7.3.3 8237的工作周期 8237在设计时规定它有两种主要的工作周期,即空闲周期和有效周期。每一个周期又由若干个时钟周期组成。 1.空闲周期 当8237的任一通道都无请求时就进入空闲周期(Idle Cycle)。在空闲周期,8237始终执行SI状态,在每一个时钟周期都采样通道的请求输入线DREQ。只要无请求就始终停留在SI状态。 在SI状态,可由CPU对8237编程或从8237读取状态。8237在SI状态也始终采样选片信号CS#,只要CS#信号变为有效,则CPU要对8237进行读/写操作。 当8237采样到CS#为低(有效)而HRQ也为低(无效),则进入程序状态,CPU就可以对8237的内部寄存器进行写入操作,以实现对8237的编程或者改变8237的工作状态。
在这种情况下,由控制信号IOR#和IOW#、地址信号A3~A0来选择8237内部不同的寄存器。 由于8237内部的地址寄存器和字节数计数器都是16位的,而数据线却是8位的,所以,在8237的内部有一个触发器称为高/低触发器,由它来控制写入16位寄存器的高8位还是低 8位。8237还具有一些软件命令,这些命令是通过对地址线A3~A0和IOW#、CS#信号的译码来决定的,不使用数据总线。 2.有效周期(Active Cycles) 当8237在SI状态采样到外设有请求,就脱离SI而进入S0状态,S0状态是DMA服务的第一个状态,在这个状态8237已经接收了外设的请求,向CPU发出了DMA请求信号HRQ,但尚未收到CPU的 DMA响应信号HLDA。当接收到HLDA就使8237进入工作状态,开始DMA传送。
工作状态是由S1、 S2、S3、S4组成以完成数据传送,若外设的数据传送速度较慢,不能在S4之前完成,则可由Ready信号线在S2或S3与S4之间插入SW状态。 在存储器与存储器之间的传送,需要完成从存储器读和存储器写的操作,所以每一次传送需要8个时钟周期,在前4个周期S11、S12、S13、S14完成从存储器读的操作,后4个周期S21、S22、S23、S24完成存储器写操作。
7.3.5 8237的工作模式 8237在DMA传送时有四种工作模式。 1.单字节传送模式 7.3.5 8237的工作模式 8237在DMA传送时有四种工作模式。 1.单字节传送模式 这种模式是编程为一次只传送一个字节。数据传送后字节计数器减量,地址要相应修改(增量或减量取决于编程)。HRQ变为无效,释放系统总线。若数据传送使字节数减为0,TC发生,或者终结DMA传送或者重新初始化。 在这种方式下,DREQ信号必须保持有效,直至DACK信号变为有效。但是若DREQ有效的时间覆盖了单字节传送所需要的时间,则8237在传送完一个字节后,先释放总线,然后再产生下一个 DREQ,完成下一个字节的传送。在8080/8085系统中,这样的方式在两次DMA传送之间,CPU至少执行一个机器周期。
2.块传送方式 在这种传送方式下,8237由DREQ启动就连续地传送数据,直至字节数计数器减到零产生TC(Terminal Count),或者由外部输入有效的EOP#信号来终结DMA传送。 在这种方式下,DREQ信号只需要维持到DACK有效。在数据块传送完了或是终结操作,或是重新初始化。
3.请求传送方式 在这种工作方式下,8237可以进行连续的数据传送。当出现以下三种情况之一时停止传送: ① 字节数计数器减到0,发生TC; ② 由外界送来一个有效的EOP信号; ③ 外界的DREQ信号变为无效(外设的数据已传送完)。 当由于出现第三种情况使传送停下来时,8237释放总线,CPU可以继续操作。而8237的地址和字节数的中间值,可以保持在相应通道的现行地址和字节数寄存器中。只要外设准备好了要传送的新的数据,由DREQ再次有效就可以使传送继续下去。
4.级连方式 这种方式用于通过级连以扩展通道。第二级的HRQ和HLDA信号连到第一级的DREQ和DACK上,如图7-23所示。 第二级各个芯片的优先权等级与所连的通道相对应。在这种工作情况下,第一级只起优先权网络的作用,除了由某一个二级的请求向CPU输出HRQ信号外,并不输出任何其他信号。实际的操作是由第二级的芯片完成的。若有需要还可由第二级扩展到第三级等。
在前三种工作方式下,DMA传送有三种类型: DMA读、DMA写和校验。 DMA读传送是把数据由存储器传送至外设,操作时由MEMR#有效从存储器读出数据,IOW#有效把数据传送给外设。 DMA写传送是把由外设输入的数据写至存储器中。操作时由IOR#信号有效从外设输入数据,由MEMW#有效把数据写入内存。 校验操作是一种空操作,8237本身并不进行任何校验,而只是像DMA读或DMA写传送一样地产生时序,产生地址信号,但是存储器和I/O控制线保持无效,所以并不进行传送。而外设可以利用这样的时序进行校验。
8237可以编程工作在存储器到存储器传送方式,这时就要用到两个通道,通道0的地址寄存器编程为源区地址;通道1的地址寄存器编程为目的区地址,字节数寄存器编程为传送的字节数。传送由设置一个通道0的软件DREQ启动,8237按正常方式向CPU发出DMA请求信号HRQ,待CPU用HLDA信号响应后传送就可以开始。 每传送一个字节要用8个时钟周期,4个时钟周期以通道0为地址从源区读数据送入8237的临时寄存器;另外4个时钟周期以通道1为地址把临时寄存器中的数据写入目的区。每传送一个字节,源地址和目的地址都要修改(可以增量也可以减量修改),字节数减量。传送一直进行到通道1的字节数计数器减到零,产生TC,引起在EOP#端输出一个脉冲,结束DMA传送。
在存储器到存储器的传送中,也允许外部送来一个EOP#信号停止DMA传送。这种方式可用于数据块搜索,当发现匹配时,发出EOP#信号停止传送。
7.3.6 8237的寄存器组和编程 1.现行地址寄存器 每一个通道有一个16位的现行地址寄存器。在这个寄存器中保持用于DMA传送的地址值,在每次传送后这个寄存器的值自动增量或减量。在传送过程中地址的中间值就保存在这个寄存器中。这个寄存器的值可由CPU写入或读出(分两次连续操作)。若编程为自动初始化,则在每次EOP#后,初始化为它的初始值(即保存在基地址寄存器中的值)。 2.现行字节数寄存器 每个通道有一个16位的现行字节数寄存器,保存要传送的字节数,在每次传送后此寄存器减量。在传送过程中字节数的中间值保存在这个寄存器中。其值减为零,TC将产生。该寄存器的值在程序状态可由CPU读出和写入。在自动初始化情况下,当EOP#产生时,它的值可初始化到起始状态。
3.基地址和基字节数寄存器 每一个通道有一对16位的基地址和基字节数寄存器,它们存放着与现行寄存器相联系的初始值。在自动初始化情况下,这两个寄存器中的值用来恢复相应的现行寄存器中的初始值。在程序状态,基寄存器与它们相应的现行寄存器是同时由CPU写入的。这些寄存器的内容不能读出。
4.命令寄存器 这是一个8位寄存器,用以控制8237的工作。命令字的格式如图7-24所示。 D0位用来规定是否工作在存储器到存储器传送方式。 D4位用来选择是固定优先权还是优先权旋转。8237有两种优先权方式可供选择,一种是固定优先权,在这种方式下通道的优先权是固定的,通道0的优先权最高,通道3的优先权最低;另一种方式是优先权旋转,在这种方式下刚服务过的通道的优先权变为最低的,其他通道的优先权也作相应的旋转,如图7-25所示。 命令寄存器可由CPU写入进行编程,复位信号使其清零。
5.模式寄存器 每一个通道有一个6位的模式寄存器以规定通道的工作模式,如图7-26所示。 在编程时用最低两位来选择写入哪个通道的模式寄存器。 最高两位(D7、D6)规定了四种工作模式的某一种,D3、D2两位规定是DMA读还是DMA写或是校验操作。 D5这一位用于规定地址是增量修改还是减量修改。
D4这一位规定是否允许自动初始化。若工作在自动初始化方式,则每当产生EOP#信号时(不论是由内部的TC产生或是由外界产生)都用基地址寄存器和基字节数寄存器的内容,使相应的现行寄存器恢复初始值。而现行寄存器和基寄存器的内容,是由CPU编程时同时写入的,但在DMA传送过程中,现行寄存器的内容是不断修改的,而基寄存器的内容维持不变(除非重新编程)。在自动初始化以后通道就作好了进行另一次DMA传送的准备。
6.请求寄存器 8237的每个通道有一条硬件的DREQ请求线,当工作在数据块传送方式时也可以由软件发出DREQ请求。所以,在8237中有一种请求寄存器,如图7-27所示。 每个通道的软件请求可以分别设置。软件请求是非屏蔽的,它们的优先权同样受优先权逻辑的控制。 软件请求的位由TC或外部的EOP#复位。RESET信号使整个寄存器的内容清除。 只有在数据块传送方式,才允许使用软件请求,若用于存储器到存储器传送,则0通道必须用软件请求,以启动传送过程。
7.屏蔽寄存器 每个通道外设通过DREQ线发出的请求,可以单独地屏蔽或允许。所以,在8237中有一个屏蔽寄存器,如图7-28所示。 在RESET信号作用后,四个通道全置于屏蔽状态,因此在编程时,必须根据需要复位屏蔽位。当某一个通道进行DMA传送后,产生EOP#信号,如果不是工作在自动初始化方式,则这一通道的屏蔽位置位,必须再次编程为允许,才能进行下一次的DMA传送。 也可以用图7-28(b)所示的格式,在一个命令字中对四个通道的屏蔽情况进行编程。
8.状态寄存器 8237中有一个可由CPU读取的状态寄存器,如图7-29所示。 状态寄存器中的低4位,反映了在读命令瞬间每个通道的字节数是否已减到零。高4位反映每个通道的请求情况。
9.临时寄存器 在存储器到存储器的传送方式下,临时寄存器保存从源单元读出的数据,又由它写入目的单元。在传送完成时,它保留传送的最后一个字节,此字节可由CPU读出。READY信号使其复位。 如上所述,8237内部寄存器可以分成两大类,一类是通道寄存器,即每个通道都有的现行地址寄存器、现行字节数寄存器和基地址及基字节数寄存器;另一类是控制和状态寄存器。这些寄存器是由最低4位地址A3~A0以及读写命令来区分的。通道寄存器的寻址如表7-2所示。
10.软件命令 8237在编程状态还有两种软件命令,软件命令不需要通过数据总线写入控制字,而由8237直接对地址和控制信号进行译码。有两种软件命令: (1) 清除高/低触发器 8237内部的高/低触发器用以控制写入或读出16位寄存器的高字节还是低字节。如表7-2中所示,若触发器为零,则操作的为低字节;为“1”,则操作的为高字节。在复位以后,此触发器被清零,每当对16位寄存器进行一次操作,则此触发器改变状态。我们也可以用此命令使它清零,以改变下面要进行的读/写操作的顺序。软件命令的格式如表7-4所示。 (2) 主清除命令 这个命令与硬件的RESET信号有相同的功能,即它使命令、状态、请求、临时寄存器以及内部的高/低触发器清零;使屏蔽寄存器各位全置为“1”(即屏蔽状态);使8237进入空闲周期,以便进行编程。其命令格式示于表7-4中。
11.8237的编程步骤 (1) 输出主清除命令; (2) 写入基与现行地址寄存器; (3) 写入基与现行字节数寄存器; (4) 写入模式寄存器; (5) 写入屏蔽寄存器; (6) 写入命令寄存器; (7) 写入请求寄存器。 若有软件请求,就写入至指定通道,就可以开始DMA传送的过程;若无软件请求,则在完成了(1)~(7)的编程后,由通道的DREQ启动DMA传送过程。
12.编程举例 若要利用通道0,由外设(磁盘)输入32KB的一个数据块,传送至内存8000H开始的区域(增量传送),采用块连续传送的方式,传送完不自动初始化,外设的DREQ和DACK都为高电平有效。 要编程首先要确定端口地址。地址的低4位用以区分8237的内部寄存器,高4位地址A7~A4经译码后,连至选片端CS,假定选中时高4位为5。 按上述要求,可确定如下控制字: ① 模式控制字:84H ② 屏蔽字:00H ③ 命令字:A0H 初始化程序如下:
OUT 5DH,AL;输出主清除命令 MOV AL,00H OUT 50H,AL;输出基和现行地址的低8位 MOV AL,80H OUT 50H,AL;输出基和现行地址的高8位 OUT 51H,AL OUT 51H,AL;给基和现行字节数赋值 MOV AL,84H OUT 5BH,AL;输出模式字 OUT 5AH,AL;输出屏蔽字 MOV AL,0A0H OUT 58H,AL;输出命令字
7.3.7 8237的时序 8237 DMA传送的时序,如图7-30所示。 8237在复位以后就处在空闲周期即SI周期,在此周期CPU可以对8237编程。8237在SI周期采样通道的DREQ线,只要尚未有请求,则8237就始终处在SI周期。当检测到(在SI的脉冲下降沿)某一通道(或几个通道同时)有DREQ请求,则在下一个周期就进入S0周期;而且在SI脉冲的上升沿使向CPU发DMA请求的HRQ信号变为有效。在S0周期,8237等待CPU对总线请求的响应,只要未收到有效的HLDA信号,8237始终处在S0周期,当在S0周期的上升沿,采样到HLDA信号有效,则下一周期就进入DMA传送状态即S1周期。
通道的DMA传送是由S1、S2、S3、S4四个周期组成。在S1周期使地址允许信号AEN有效,自S1周期起一方面把要访问的存储单元的高8位地址通过数据总线DB0~DB7输出,另一方面发出一个有效的地址选通信号ADSTB,利用ADSTB的下降沿把在DB0~DB7上的高8位地址锁存至外部的地址锁存器中。同时地址的低8位由A0~A7输出,且在整个DMA传送期间保持住。 在S2状态,8237 DMA控制器向外设输出DMA响应信号DACK。在通常情况下,外设的DREQ信号必须保持到DACK有效。自S2状态开始DMA控制器也使读或写信号有效,利用这两组控制命令完成外设与存储器之间的数据传送(但数据不进入8237内部),到S4状态数据传送完成。
在块传送方式下,S4以后应接着传送下一个字节,通常情况下,地址的高8位不变,只是低8位经过增量或减量。所以,输出和锁存高8位地址的S1周期不需要了,直接进入S2周期,由输出地址的低8位开始,由新的读和写命令完成数据的传送。这种过程一直继续到把规定的字节数传送完,发出TC信号(产生内部的EOP#信号),则一个DMA传送过程结束,8237又进入SI周期,等待着新的请求。 若存储器和外设不能在S4周期前完成数据传送,则只要设法使READY信号线变低,就可以在S3和S4周期间插入SW周期,在此周期所有控制信号维持不变,从而加宽DMA传送的周期。 8237可以完成从存储器到存储器的传送,其时序如图7-31所示。
传送过程由8个时钟周期组成。前4个周期S11、S12、S13、S14用于从源区读出数据。从S11周期开始,通道0现行地址的高8位通过DB0~DB7输出,由ADSTB锁存至外部锁存器中,地址的低8位由A0~A7输出,自S12周期开始使MEMR#信号有效,在S14周期的时钟上升沿把从源区读出的数据,通过DB0~DB7送至8237的临时寄存器中。接着的4个周期S21、S22、S23、S24用于把数据写入至目的区。先在S21周期把通道1地址的高8位通过DB0~DB7输出,由ADSTB锁存至外部锁存器,地址的低8位由A0~A7输出,使MEMW#信号有效,同时把在8237的临时寄存器中的数据由DB0~DB7输出,由MEMW#信号将其写入至目的区,待整个数据块传送完了发出EOP#信号,结束DMA传送。