由于DMA方式是使用独立于CPU之外的硬件控制数据的传送过程,DMA传送必然要依赖于DMA控制器。在基于X86微处理器的微型计算机系统之中,Intel公司的8237A是一种被广泛使用的通用DMA控制器,它具有4个独立的传送通道,DMA传送速率为最高1.6MB/s(5 MHz下)。虽然8237A的性能指标已经落伍,目前的微机系统中也已经将DMA控制的功能集成到了芯片组之中而不再使用8237A,但是其中的DMA传送原理和编程方法和8237A仍然保持一致。
1.8237A的结构
8237A使用40个引脚的双列直插封装,具有四个可以独立工作的传送通道,每个传送通道具有一组寄存器,包括方式寄存器(6位)、请求触发器(1位)、屏蔽触发器(1位)、基地址寄存器(16位)、当前地址寄存器(16位)、基本字节寄存器(16位)、当前字节寄存器(16位)。四个通道共享一组8位寄存器,包括控制寄存器、状态寄存器和暂存寄存器。除此之外,8237A还可以通过一组软命令寄存器来向8237A发出3条软命令。这些用户可访问的寄存器共计17个,其中控制寄存器(只写)和状态寄存器(只读)复用同一个端口,共占用16个连续的I/O端口。
1)控制寄存器
控制寄存器又称命令寄存器,是8237A中四个通道共用的寄存器,初始化时对控制寄存器编程写入的控制命令将影响8237A所有四个通道。8237A控制寄存器的格式如图6-18所示。
图6-18 控制寄存器
●D0位:存储器-存储器传送控制。D0位控制8237A是否允许存储器-存储器传送,当D0位为1时,通道0和通道1被用于存储器-存储器传送,通道0的地址寄存器存放源地址,通道1的地址寄存器存放目的地址,通道1的字节寄存器存放计数值。这时,8237A使用一个DMA读周期将源地址存储单元中的一个字节读入到暂存器,再用一个DMA写周期将暂存器中的数据写入到目的地址存储单元之中。
●D1位:存储器-存储器传送源地址控制。当D1位为0时,代表存储器-存储器传送的源地址需要增量或减量变化,这时存储器-存储器传送实现的是将一个存储器区域中的内容复制到另一个存储器区域之中。当D1位为1时,存储器-存储器传送中的源地址保持不变,这时存储器-存储器传送实现的是将一个存储器单元中的内容填充到一段存储器区域之中。
●D2位:8237A是否正常工作的启动/停止位。当对8237A进行初始化时,该位必须置1,以防止正在进行的初始化过程被意外的DREQ信号打断从而进行了错误的DMA传送。当8237A初始化完成后,D2位被清0,DMA控制器正常工作。
●D3位:时序选择。8237A支持两种不同的传送时序,分别称为正常时序和压缩时序。压缩时序用于存储器和I/O接口速度都比较快的情况下,每一次传送比正常时序下的传送少用一个总线周期。
●D4位:优先级选择。在固定优先级选择的情况下,各通道之间的优先级次序是从通道0到通道3依次降低。在循环优先级选择的情况下,刚刚被服务的通道优先级最低,以保证各通道之间在获得服务机会上的均等。
●D5位:写信号扩展选择,如果D5位为1,则表示DMA控制器采用扩展写信号,这时W/MW信号提前一个时钟周期出现。
●D6位:用来控制DMA请求信号的极性。
●D7位:用来控制DMA应答信号的极性。DREQ极性设置和DACK极性设置的控制信号是相反的,在对8237初始化编程时一定要注意。
对控制寄存器的写入是通过对地址偏移08H的I/O端口进行写操作实现的,该端口为控制寄存器和状态寄存器的复用端口,写入该端口的数据将被写入控制寄存器,从该端口读出的是状态寄存器中的数据。
2)状态寄存器
状态寄存器用来显示4个DMA通道的工作状态,每个通道的工作状态用两位表示,其中一位表示通道的字计数器是否终止(即通道的传输是否已经完毕),另一位表示通道是否有需要处理的DMA请求。状态寄存器的格式如图6-19所示。
图6-19 状态寄存器
用户可以通过查询状态寄存器中的状态位来获得DMA控制器的状态。对状态寄存器的读出是通过对地址偏移08H的I/O端口进行读操作实现的,该端口为控制寄存器和状态寄存器的复用端口,写入该端口的数据将被写入控制寄存器,从该端口读出的是状态寄存器中的数据。
3)方式寄存器
方式寄存器又称模式寄存器,每个通道具有一个独立的6位方式寄存器,这些方式寄存器统一通过偏移为0BH的I/O端口进行设置。方式寄存器的结构与设置方式如图6-20所示。
图6-20 方式寄存器及设置方式
每个通道的方式寄存器由6个位组成,在对方式寄存器进行设置时,需要将要设置的通道的通道号和方式寄存器的内容组织成一个字节写入到偏移为0BH的I/O端口。其中:
●D1~D0位:通道选择,选择对哪个通道的方式寄存器进行设置。
●D3~D2位:通道的传送类型,可以是校验传送、写传送或读传送。
●D4位:是否使用通道的自动重装功能。如果D4位为1,对应通道当前字计数器到达0的时候,在结束一次数据块传送结束的同时将当前地址寄存器和当前字计数寄存器的内容重置为基本地址寄存器和基本字计数寄存器的内容,从而达到反复传送同一个数据块的目的。
●D5位:当D5=0时,传送过程中的地址自动增量,即加1;当D5=1时,地址自动减量,即减1。
●D7~D6位:选择该通道使用哪种传送方式,8237A共支持四种不同的传送方式。
块传送方式:当D7D6=10时,对应通道使用块传送方式。在该方式下,8237A一旦进入DMA周期就连续地传送若干字节,直到预订的字节数传送完毕或接收到外部传送来的P低电平有效信号输入才结束DMA传送并释放总线。在DMA传送开始后,DREQ是否有效不影响数据传送。块传送方式的效率最高,但传送过程中一直占用总线,加上DMA传送的优先权要高于中断请求的优先权,使得CPU无法响应这一期间发生的各种中断请求。
单字节传送方式:当D7D6=01时,对应通道使用单字节传送方式。此种传送方式和块传送不同之处在于每一个字节传送后DMA控制器要释放总线至少一个周期。在一个字节传送结束后,通道的当前字节寄存器自动减1,当前地址寄存器自动加1或减1(根据D5位的设置),然后8237A释放总线并继续监测DREQ,如果DMA请求仍然有效,则8237A再次向CPU发出总线请求……直到预定的字节数传送完毕。
请求传送方式:当D7D6=00时,对应通道使用请求传送方式。请求传送方式和块传送方式类似,不同之处在于每个字节传送完成后8237A都要检测DREQ,如果DREQ无效,则暂停传送,但不释放总线,直到DREQ变为有效才继续传送。
级联传送方式:当D7D6=11时,对应通道使用级联传送方式。级联传送方式使用在多片8237A级联的系统之中。当微机系统需要的DMA通道数多于4个的时候,可以通过多片8237A的级联来实现,第二级8237A的HRQ和HLDA连接到第一级8237A的DREQi和DACKi端,其优先级与所连接的通道的优先级相对应。这种情况下,第一级的连接通道只起两个作用:一是优先权连接的作用,即将第二级的4个DMA通道纳入到第一级的优先权管理机制;二是向CPU输出HRQ和传递HLDA。该连接通道并不输出任何其他信号,实际的DMA操作由第二级芯片完成,所以该通道必须被设置为级联传送方式。
级联方式用于扩充DMA的通道数,它并不进行DMA传送,DMA传送由下一级8237A控制其传送过程。级联的级数可根据需要确定。
4)基地址寄存器、当前地址寄存器、基本字节寄存器、当前字节寄存器
每个通道具有一组16位的基地址寄存器、当前地址寄存器、基本字节寄存器和当前字节寄存器,它们共用两个I/O端口。对于DMA端口i,基地址寄存器和当前地址寄存器共用偏移为2i的I/O端口,基本字节计数器和当前字节计数器共用偏移为2i+1的I/O端口。在初始化编程时,基地址寄存器和当前地址寄存器中被写入DMA传送所涉及的存储区首地址或末地址的低16位,基本字节寄存器和当前字节寄存器中被写入计数初值,即欲传送的字节数减1。在传送过程中,当前地址寄存器为DMA传送提供存储器地址,在一个字节传送结束后,当前字节计数器减1,当前地址寄存器加1或减1,为下一个字节的传送做准备。当前字节计数器从0减到-1(0FFFFH)代表要传送的字节数已经全部传送完毕,DMA传送结束。如果通道允许自动重装,则传送结束后基地址寄存器的内容被重装到当前地址寄存器中,基本字节寄存器中的内容被重装到当前字节寄存器中。
5)请求寄存器
8237A的每个通道有一个1位的请求触发器,请求触发器的置1将使相应通道提出“软件DMA请求”。用户可以通过偏移为09H的请求寄存器I/O端口设置或清除这些请求触发器,请求寄存器的格式如图6-21a所示。
图6-21 请求寄存器和屏蔽寄存器
a)请求寄存器 b)屏蔽寄存器
6)屏蔽寄存器
8237A的每个通道有一个1位的屏蔽触发器,屏蔽触发器的置1将屏蔽该通道上的DMA请求。用户可以通过偏移为0AH的屏蔽寄存器I/O端口设置或清除这些屏蔽触发器,屏蔽寄存器的格式如图6-21b所示。
7)多通道屏蔽寄存器
除了使用屏蔽寄存器对各通道的屏蔽位进行逐个设定之外,8237A还支持通过多通道屏蔽寄存器对这些屏蔽位进行一次性设定,用户可以通过对偏移为0FH的多通道屏蔽寄存器的写入一次性设置四个通道的屏蔽状态(见图6-22)。
图6-22 多通道屏蔽寄存器
8)软件命令
8237A有三条软件命令可以用来控制其操作,这三条软件命令只要向特定端口写入任何数据(即发出写信号)即可执行。这三条软件命令包括清除先/后触发器命令、总清除(复位)命令和清除屏蔽寄存器命令。(www.xing528.com)
清除先/后触发器命令:由于8237A各通道的地址寄存器和字节寄存器均为16位,而8237A只有8位数据线,因此在初始化编程时需要分两次将16位的地址值和字节计数值写入。先/后触发器的功能是控制高/低8位的写入次序,当该触发器的内容为0时,数据线上的8位数据被写入16位地址寄存器或字节寄存器的低8位,相反亦然。每次写入都伴随着一次先/后触发器的翻转。当用户向偏移0CH的I/O端口执行一次写入命令时,即向8237A发出一个清除先/后触发器命令,将先/后触发器清0。在8237A初始化过程中设置基地址寄存器和基本字节寄存器之前,必须先执行一次清除先/后触发器软件命令,然后再初始化基地址寄存器和基本字节寄存器,这时的写入次序应当是:基地址寄存器的低8位(先/后触发器为0)→高8位(先/后触发器翻转为1)→基本字节寄存器的低8位(先/后触发器翻转为0)→高8位(先/后触发器翻转为1)。
总清除(复位)命令:该命令使控制寄存器、状态寄存器、暂存器、先/后触发器清0,并使4个通道的屏蔽触发器置1,禁止各通道的DMA请求。该命令的作用等同于8237A芯片的RESET信号。
清除屏蔽寄存器命令:该命令将4个通道的屏蔽触发器均清0,允许各通道的DMA请求。
总的来讲,8237A使用的16个端口地址分配如表6-1所示。
表6-1 8237A使用的16个端口地址分配
2.初始化8237A
初始化8237A的步骤。
1)向控制寄存器中写入命令字,以确定8237A的工作时序、优先级方式、有效电平极性等。
2)写入屏蔽寄存器,以屏蔽要初始化的通道。
3)向方式寄存器写入方式字,为通道规定传送类型及工作方式。
4)用清除先/后触发器命令清除先/后触发器。
5)把DMA操作所涉及的存储区首地址或尾地址写入基本地址寄存器,再把要传送的字节数减1,写入基本字节寄存器。写入的次序是先写入低8位,再写入高8位。
6)向屏蔽寄存器写入D2~0为0xx的命令字,使相应通道的屏蔽触发器清0,准备响应该通道上的DMA请求,初始化到此结束。
经过上述步骤初始化8237A之后,DMA控制器就可以接受来自设备的DMA请求,并控制设备和存储器之间的DMA传送了。如果用户需要发出软件DMA请求,则可以在程序的适当位置通过写入请求寄存器的方式将DMA控制器某个通道的请求触发器置位,在该通道提出软件DMA请求。
3.8237A的引脚
8237A采用40引脚的双列直插封装,其40个引脚的功能如下。
●CLK:时钟信号输入,8237A的时钟信号频率为3 MHz,8237A-5(8237A芯片的一
种改进型,其引脚和功能与8237A一致)的时钟频率为5 MHz,在此频率下8237A-
5以1.6 MB/s的速度进行DMA传送。
●:片选信号输入,低电平有效。
●RESET:复位信号输入,当RESET为高电平的时候复位8237A,相当于执行总清除(复位)命令。
●DREQ0~3:DMA请求输入,有效电平由控制寄存器中的命令决定。
●DACK0~3:DMA响应输出,有效电平由控制寄存器中的命令决定。
●HRQ:输出给CPU的总线请求信号。
●HLDA:接受CPU总线响应信号的输入端。
●DB7~0:双向数据线,连接到数据总线上。
●A7~0:地址线。在DMA传送时用来输出低8位地址,在CPU控制总线时其中的A3~0为输入线,接收4位地址码,完成对8237A内部寄存器的寻址。
●ADSTB:地址选通输出信号,该信号使外部地址锁存器锁存本次DMA传送所涉及的内存单元的A15~8地址码。
●AEN:地址允许输出信号,高电平有效。它把外部地址锁存器中存放的8位地址输出到地址总线上,与8237A芯片输出的低8位地址共同组成内存单元的低16位地址。
●、W:存储器读命令、存储器写命令,用来在DMA传送过程中控制存储器的读操作和写操作。在DMA读周期中,有效,在DMA写周期中,有效。
●、:I/O读写命令,双向信号。在8237A控制总线时,这两个引脚是输出线,分别与、配合实现DMA写操作和DMA读操作。在CPU控制总线时,这两个引脚是输入线,用来接收CPU的I/O读写命令。
●READY:就绪信号,用来在传送速度较慢的时候插入等待周期。READY引脚上的低电平将导致8237A自动加宽存储器读写脉冲的宽度。
●P:传送结束,双向信号。在DMA通道传送结束时,有效;同时外部输入的有效信号也能强迫8237A中止传送过程。
4.基于X86的微机系统中的8237A
在PC/XT微机系统中,由1片8237A-5(8237A芯片的一种改进型,其引脚和功能与8237A一致)为微机系统提供4个通道的DMA传送能力。其中通道0被用于通过定期DMA读实现DRAM的刷新,通道2用于主存储器与软盘驱动器之间的数据传送,通道3用于主存储器与硬盘驱动器之间的数据传送,通道1保留给用户使用(见图6-23)。
图6-23 PC/XT中的8237A
在PC/XT微机系统中设置一个页面地址寄存器74LS670,用来提供20位地址中的最高4位A19~16,这部分地址内容在8237A初始化的时候被写入寄存器。系统中使用一片74LS373作为地址锁存器锁存来自8237A的20位地址中的A15~8,在DMA传送第一个字节的第一个周期,8237A在其数据线上送出当前地址寄存器16位地址中的高8位并驱动ADSTB信号有效,将这高8位地址锁存在地址锁存器74LS373中。从第二个周期开始,8237A驱动AEN信号为有效,页面寄存器将写入的页面地址送到地址总线的A19~16,地址锁存器将锁存的8位地址送到地址总线的A15~8,地址驱动器74LS244将8237A提供的低8位地址(也就是当前地址寄存器16位地址中的低8位)驱动到地址总线的A7~0,从而形成完整的20位存储器地址。
在PC/XT中,8237A的控制寄存器在初始化时被写入一个字节0,这意味着禁止存储器-存储器的DMA传送,允许DMA读写传送,使用正常时序(非压缩时序),固定优先级,不扩展写信号,DREQ高电平有效,DACK低电平有效。用户使用PC/XT中的通道1进行数据传送时也必须遵循上述约定。
在80286微机系统(PC/AT)中,2片8237A通过级联来提供7个DMA通道,即片0所提供的通道0~3和片1所提供的通道5~7,片0级联到片1的通道4上。在这7个通道中,由于连接上的不同(请注意两片8237A输出的低8位地址通过地址驱动器之后连接到地址总线上的不同连接方式),通道0~3提供支持8位I/O设备与8位或16位系统存储器之间的8位数据传送,每个通道能够传送的数据量最大为64 KB。通道5~7支持16位I/O设备与16位系统存储器之间的16位数据传送,每个通道能够传送的数据量最大为128 KB。80286微机系统中DRAM刷新和硬盘驱动器的数据传送都不再占用DMA通道,所以除了通道2被用于软盘驱动器、通道4被用于级联之外,剩余6个通道都可以被用户所使用。PC/AT的两片8237A初始化写入的控制字也都是字节0,其数据传送遵循和PC/XT相同的约定(见图6-24)。
图6-24 80286微机系统中的8237A
在PC/AT系统中,由于地址总线连接方式上的不同,片0和片1在端口地址分配上也有不同。片0所使用的端口地址是连续的(00H~0FH),而片1使用的端口地址则是断续的(0C0H~0DEH)。两片8237A和页面寄存器的端口分配如表6-2、表6-3所示。
表6-2 DMA控制器端口地址分配
表6-3 PC/AT机页面寄存器端口地址
80386及以上的微机系统中不再使用8237A作为DMA控制器,而是使用更加强大的DMA控制器芯片(如82258)或将DMA控制器集成到集成I/O芯片(如82380)之中。其后的微机系统中基本上不再有独立的DMA控制器芯片,而是集成在系统的芯片组之中。但是DMA控制器的访问方法依旧和80286微机系统保持向下兼容。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。