1、十二章8237A DMA控制器,中断的缺点:CPU响应中断请求类似于子程序的调用,需要保护现场及恢复这一套例程序。当数据以批量的方式进行转送时,频繁地中断CPU正在执行的程序,频繁地保护现场和恢复现场,这使得CPU的使用效率大大降低,甚至可能造成数据丢失。 DMA优点:DMA(Direct Memory Access)是一种不需要CPU干预也不需要软件介入的高速数据传送方式。由于CPU只启动而不干预这一传送过程,同时只由硬件完成而不需软件介入,所以其数据传送速率可以很高。,DMA控制器(DMAC) 的功能 接收CPU发出的读写信号初始化; 接收外设发来的DMA请求; 向CPU发出总线请求信号;
2、 接收CPU发出的总线请求允许信号; 向外设发出DMA请求允许信号; 发出地址信息,能对存储器寻址及修改地址指针; 能发出读/写等控制信号; 能提供数据的传输数量; 能撤销总线请求信号,使CPU恢复正常工作。 8237是一种高性能的可编程控制器,有4个独立通道,每个通道都有64K地址和字节计数的能力,有4种不同的传送方式:单字节、数据块、请求和级连方式。 8237可以处在两种不同工作状态:主态,从态,12-1 8237的组成和工作原理,一 8237的内部结构,1。内部结构与管脚,(1) 与CPU及外设的联络“握手”信号 A与CPU联络信号HRQ和HLDAHRQ:是DMAC向CPU发出的取得总线
3、控制权的请求信号,高电平有效。 HLDA:是CPU向DMAC发出的,响应DMAC请求,准备让出总线使用权的回答信号。 B与I/O外设之间的联络信号 DREQ0DREQ3:外设向DMAC发出的中断请求信号,高电平有效。 DACK0DACK3:DMAC取得总线使用权,通知外设准备发送数据的回答信号,低电平有效。,管脚信号分析:,(2) 地址线A0A7A0A7分为两组:A0A3和A4A7。A0A3为双向三态信号线,当8237A作为一个I/O芯片接受CPU编程时,A0A3用内部寄存器的选择;当8237A行使DMAC功能时,作为20位地址线的低4位输出,A4A7为三态输出,用于产生A4A7地址。,(3)
4、 数据线:DB0DB7DB0DB7数据线是双向三态信号线,有双重功能,当8237A被编程时,作为数据线进行输入或输出数据的传送;当8237A作为DMAC时,输出20位地址的A8A15高8位。,(4) 地址选通信号ADSTB和地址允许信号AEN当8237A行使DMAC功能时,DB0DB7输出高8位地址A8A15,同时ADSTB有效,将A8A15锁存在外部锁存器中,AEN是高电平有效信号,它可以作为DMA传送时禁止其它的总线驱动器工作。PC/XT中8237A的AEN 没用而由DMAAEN信号代替,这是由系统总线仲裁器送出的信号。,(5) 读写控制信号IOR、IOW、MEMR、MEMWIOR与IOW
5、是双向的,在8237A被编程时,输入,接收CPU发来的信号,在DMA传送期间,输出,用作对外设的读/写选通信号。MEMR与MEMW是输出信号,在DMA传送期间,向存储器接口发读写控制信号。,(6) EOP信号(END OF PROCERS),传送结束信号,输出或输入低电平。这个引端可以双向应用。如果外加一个低电平,将强迫DMA传送结束。作为输出端,当四个通道中任何一个通道在传送字节数达到预定值时,将产生一个脉冲,形成一个EOP信号输出。无论是外加的还是内部产生的EOP信号,都将停止DMA操作。,(7) 其它信号:CLR时钟输入端,RESET复位信号,READY准备好信号,同CPU READY信
6、号含义一样,此外有电源和地端。,由8237A DMAC管脚功能可以看出,在某种含义上,8237A相当于一个没有运算功能的CPU。,三 8237的内部寄存器,1).当前地址寄存器: 16位、4个(每通道一个)保存DMA传送期间的地址值,每次传送后,地址自动加 1 或减 1。2).当前字计数寄存器器: 16位、4个(每通道一个)保存当前字节数,每传送一个字节后自动减 1。3).基地址寄存器: 16位、4个(每通道一个)保存数据传送的初始地址, 8237初始化时由CPU写入4).基字计数寄存器:16位、4个(每通道一个)保存需传送数据的原始字节数,8237初始化时由CPU写入。 5). 命令寄存器:
7、 8位,1个,6)工作方式寄存器,8237的传送类型,在单字节传送、数据块字节传送、请求传送中,均有三种不同的传送类型读、写、校验。读传送通过有效的MEMR和IOW,将数据从存储器传送到I/O设备;写传送通过有效的MEMW和IOR,将数据从I/O设备传送到存储器;校验传送伪传送。实际上用来校验8237芯片内部的读写功能。 在这种传送中,8237芯片的操作如同读、写传送一样,产生地址及对EOP的响应等,但所有的存储器和I/O设备的控制信号均为无效。,I/O设备,存储器,I/O设备,写传送,读传送,8237在DMA传送时有四种工作方式: 单字节传送模式每次只传送一个字节,传送后,字节数寄存器减 1
8、,地址寄存器加 1或减 1,并释放总线,将控制权交还 CPU。 数据块传送方式可多字节传输,直至字节数计数器由 0 减到 FFFFH时,产生一个终止计数信号T/C,或由外界输入一个过程结束信号 EOP 为止。在PC机中,此方式不能采用,因为在这种方式下,在传送期间 8088 不能占用总线,因而别的DMA请求被禁止,这样系统动态存储器刷新等无法进行。 请求传送方式只要没有计数结束信号T/C ,或外界过程结束信号EOP,或者DREQ信号一直有效,DMA传送可一直进行,直到外部设备传送完全部字节。 级连方式连接多个8237芯片,用于系统扩展。,7)请求寄存器: 4位,1个,它们可以用硬件方法由外部送
9、到DREQ线上的请求信号使相应位置1,产生DMA请求。当8237A工作于数据块传送时,也可以用软件方法使请求位置1或清0,初始化时由CPU写入,以便在软件控制下产生一个DMA请求,如同外部设备产生DREQ请求一样。,8). 屏蔽寄存器:4位,1个 (通道屏蔽字 ):用于选择允许或禁止各通道接受DMA请求信号DREQ。,(主屏蔽字):也可使用其对各通道同时操作,9). 状态寄存器:8位,1个高4位表示某通道还有未处理的DMA请求,低4位表示某通道已收到终 止计数信号。,10)暂存寄存器:在存储器到存储器传送时,暂存器用来保存所传送的数据。当传送完成时,暂存器中始终保存着最后一个传送的数据字节,除
10、非用RESET信号将其清除,在编程状态下,这个数据字节可以仪由CPU读出。 11)软件命令:8237在编程状态还有两种软件命令,软件命令不需要通过数据总线写入控制字,而由8237直接控制。 清除先/后触发器 高/低 触发器用于控制读出或写入16位寄存器的是高字节还是低字节。触发器为0,则为低字节; 为1,则为高字节。复位后,触发器清零,每当对16位寄存器进行一次操作,则触发器改变一次状态。, 主清命令 该命令与 RESET 信号有同样的功能。该命令使 命令、状态、请求、临时寄存器及内部高/低触发器清零;使 屏蔽寄存器全部置 1;使 8237 进入空闲周期,以便进行编程。 清除屏蔽寄存器 该命令
11、能清除4个通道的全部屏蔽位,允许各通道接受DMA请求 12)各寄存器对应的端口地址,A3 A2 A1 A0,端口地址,寄存器(IOR),寄存器(IOW),0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1 0 1 1 0 0 1 1 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1,00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F,通道0当前地址寄存器 通道0当前字数寄存器 通道1当前地址寄存器 通道1当前字数寄存器 通道2
12、当前地址寄存器 通道2当前字数寄存器 通道3当前地址寄存器 通道3当前字数寄存器状态寄存器 临时寄存器 ,通道0基址与当前地址寄存器 通道0基字数与当前字数寄存器 通道1基址与当前地址寄存器 通道1基字数与当前字数寄存器 通道2基址与当前地址寄存器 通道2基字数与当前字数寄存器 通道3基址与当前地址寄存器 通道3基字数与当前字数寄存器命令寄存器请求寄存器写屏蔽寄存器单个屏蔽位 工作模式寄存器 清除先后触发器 主清除命令清屏蔽寄存器 写屏蔽寄存器全部位,12-2 8237的时序,8237有两种主要的工作周期 空闲周期和有效周期。(1) 空闲周期:当没有I/O设备或软件请求DMA传送时,8237处
13、于空闲周期。在空闲周期内,芯片在每个时钟周期内都要进行两种检测: CS 是否被选中。以判断CPU是否要对8237内部寄存器进行读写操作(对8237进行初始化)。若CS被选中,则8237 变为CPU的一个外部设备,CPU可对其进行初始化,控制其工作方式。 有无DMA 请求信号:若测出 DREQ 请求,则8237进入有效周期。(2) 有效周期:8237向CPU发出总线请求信号 HRQ, 只要 CPU 还没有送来有效的 HLDA 信号,8237仍处于初始化状态; 当 CPU 回答有效的 HLDA 信号以后,便开始 DMA 传送操作;传送结束后,8237进入空闲状态,等待下一个 DMA 传送请求或接受
14、 CPU 的读写操作。,空闲周期,S0周期,DMA传送周期,6. 8237的时序,地址允许信号, DMAC发出,该信号有效时,表示DMAC已经控制总线,SI周期 空闲周期: 8237 在复位以后,即进入空闲周期,在此周期内: CPU 可对 8237 编程,进行初始化。 8237 采样 DREQ 线。S0周期 在 SI 周期只要检测到有 DREQ 信号,即进入S0 周期。在 S0 周期 8237 等待 CPU 的响应信号,只要未收到 HLDA 信号,则8237 一直处在S0 周期。S1S2S3S4 DMA传送周期。 在块传送方式下,S4 以后应传送下一个字节。在通常情况下,地址的高 8 位不变,
15、只是低 8 位增量或减量,所以输出和锁存高 8 位地址的 S1 周期不需要了,直接进入 S2 周期。,在S4状态,8237对传输模式进行测试。如果是块传输模式,立即进入S2。如果是请求传输模式,测试DREQ,当DREQ无效时,8237暂停传输,当DREQ有效时,进入S2。如果是单字节传输模式,则释放总线,进入SI空转状态。如果当前字节计数器的值为0,表明本次传输结束,则释放总线,发出EOP信号,进入SI空转状态。 8237有两种传输时序:普通时序和压缩时序。 普通时序:使用S2、S3、S4; 压缩时序:使用S2、S4。 (5)扩展写周期:如果外设的速度比较慢,正常的时序不能仍然不能满足要求,以
16、至于不能在指定的时间内完成存取操作,那么就要在硬件上通过READY信号使8237A插入等待状态SW 12-3 8237A的编程和应用举例 一。PC/XT机中的DMA控制逻辑,第三节 IBM PC/XT中的 DMA 控制逻辑,IBM PC/XT中 DMA 控制逻辑由DMA控制电路和DMA应答电路组成。 1. DMA 控制电路,(1) 8237有4个DMA通道, CH0 动态RAM刷新 (在系统板上)CH1 为用户保留的DMA通道CH2 软磁盘 (在扩展选件上)CH3 硬磁盘 系统地址总线20根,寻址1M字节空间,而DMA只能发出16位地址,怎样寻址20位地址空间呢? 使用页面寄存器 ,由系统提供
17、高4位地址。页面寄存器采用4个4位的寄存器堆,存放4个DMA通道的高4位地址A19A16. 将地址写入页面寄存器:在对8237进行初始化时,由CPU写入。端口地址为:,例:MOV AL, 0FHOUT 83H, AL, 从页面寄存器读出地址:在DMA操作期间,8237从页面寄存器中读出数据,与它输出的16位地址一起组成20位物理地址。,工作通道 页面寄存器读出条件 RA(DACK3) RB(DACK2) 寄存器组CH2 DMAAEN DACK2 0 1 1组寄存器CH3 DMAAEN DACK3 1 0 2组寄存器CH1 DMAAEN (DACK3 DACK2) 1 1 3组寄存器 CH0 ,
18、二。 8237A的一般编程方法 8237初始化编程步骤:1. 输出主清除命令;使8237A复位。2. 将传送数据的地址写入基与现行地址寄存器;3. 将传送数据的字节数写入基与现行字节数寄存器;4. 将传送模式写入模式寄存器;5. 写入屏蔽寄存器;6. 写入命令寄存器;7. 写入请求寄存器。,8237 编程举例,例:利用通道 0 ,由外设(磁盘)输入 32K字节的一个数据块,送至内存 8000H开始的区域,采用块连续传送的方式,传送完不自动初始化,外设的DREQ 和 DACK 均为高电平有效。 首先确定端口的地址:高位地址 A7-A4 由系统确定,用于选中芯片(CS),在此设为50H;低位地址
19、A3-A0 用于8237内部寄存器的选址。 设定各模式、命令字,初始化程序如下:OUT 5DH, AL ; 输出主清命令MOV AL, 00H OUT 50H, AL ;基和当前地址的低8位MOV AL, 80HOUT 50H, AL ;基和当前地址的高8位MOV AL, 00HOUT 51H, AL;基和当前字节的低8位MOV AL, 80HOUT 50H, AL ;基和当前字节数高8位,MOV AL, 84H OUT 5BH, AL 输出模式字 MOV AL, 00H OUT 5AH, AL 输出屏蔽字 MOV AL, 0A0H OUT 58H, AL 输出命令字,(1) 模式控制字,1 0 0 0 0 1 0 0,数据块传送,地址 增量,非自动 初始化,写传送,传送通道0,(2) 屏蔽字,0 0 0 0 0 0 0 0,通道 0 屏蔽位复位,1 0 1 0 0 0 0 0,DACK高电平有效,固定 优先权,非存储器至 存储器传送,(3) 命令字,DREQ高电平有效,