Intel公司的8237A是一片40引脚双列直插式的大规模集成电路。它是一个可编程DMA控制器,现代微机将其集成在南桥芯片组中,并使DMAC逻辑与之兼容。
· 在一个芯片中,有4个独立的DMA通道。
· 每个通道的DMA请求都可以分别允许和禁止。
· 每个通道的DMA请求有不同的优先权。优先权可以是固定的,也可以是循环的,由编程决定。
· 每个通道一次传送的最大长度可达64KB。
· 可以用级联的方法扩展通道数。
· DMA请求可以由外部输入,也可以由软件设置。
· 可以进行从存储器到存储器的数据传输,用于对存储区域进行初始化。
8237A的内部结构和外部连接如图7-4所示。
图7-4 8237A的内部结构和外部连接
8237A的内部结构分成两部分:4个DMA通道和1个公共控制部分。其中公共控制部分由读/写逻辑和控制逻辑组成。
(1)DMA通道。
8237A有4个独立的通道(CH0~CH3),每个通道包括两组16位寄存器:地址寄存器和字节计数器,还包括一个8位的方式寄存器和一个1位的DMA请求触发器及一个1位的屏蔽触发器。4个通道共用1个控制寄存器和1个状态寄存器。在DMA通道工作之前,必须对相应的寄存器进行初始化设置,如表7-1所示。
表7-1 8237A的内部寄存器
A3 |
A2 |
A1 |
A0 |
IOR |
IOW |
DMAC1(DMAC2)地址 |
通道寄存器 |
0 |
0 |
0 |
0 |
1 |
0 |
00H(C0H) |
写通道0基地址和当前地址寄存器 |
0 |
1 |
00H(C0H) |
读通道0当前地址寄存器 | ||||
0 |
0 |
0 |
1 |
1 |
0 |
01H(C2H) |
写通道0基字节和当前字节计数器 |
0 |
1 |
01H(C2H) |
读通道0当前字节计数器 | ||||
0 |
0 |
1 |
0 |
1 |
0 |
02H(C4H) |
写通道1基地址和当前地址寄存器 |
0 |
1 |
02H(C4H) |
读通道1当前地址寄存器 | ||||
0 |
0 |
1 |
1 |
1 |
0 |
03H(C6H) |
写通道1基字节和当前字节计数器 |
0 |
1 |
03H(C6H) |
读通道1当前字节计数器 | ||||
0 |
1 |
0 |
0 |
1 |
0 |
04H(C8H) |
写通道2基地址和当前地址寄存器 |
0 |
1 |
04H(C8H) |
读通道2当前地址寄存器 | ||||
0 |
1 |
0 |
1 |
1 |
0 |
05H(CAH) |
写通道2基字节和当前字节计数器 |
0 |
1 |
05H(CAH) |
读通道2当前字节计数器 | ||||
0 |
1 |
1 |
0 |
1 |
0 |
06H(CCH) |
写通道3基地址和当前地址寄存器 |
0 |
1 |
06H(CCH) |
读通道3当前地址寄存器 | ||||
0 |
1 |
1 |
1 |
1 |
0 |
07H(CEH) |
写通道3基字节和当前字节计数器 |
0 |
1 |
07H(CEH) |
读通道3当前字节计数器 | ||||
1 |
0 |
0 |
0 |
1 |
0 |
08H(D0H) |
读状态寄存器 |
0 |
1 |
08H(D0H) |
写命令寄存器 | ||||
1 |
0 |
0 |
1 |
1 |
0 |
09H(D2H) |
写请求寄存器 |
1 |
0 |
1 |
0 |
1 |
0 |
0AH(D4H) |
写单通道屏蔽寄存器 |
1 |
0 |
1 |
1 |
1 |
0 |
0BH(D6H) |
写方式寄存器 |
1 |
1 |
0 |
0 |
1 |
0 |
0CH(D8H) |
清除高/低触发器命令 |
|
|
|
|
1 |
0 |
0DH(DAH) |
发复位命令 |
1 |
1 |
0 |
1 |
0 |
1 |
0DH(DAH) |
读暂存器 |
1 |
1 |
1 |
0 |
1 |
0 |
0EH(DCH) |
清除综合屏蔽寄存器命令 |
1 |
1 |
1 |
1 |
1 |
0 |
0FH(DEH) |
写综合屏蔽寄存器 |
地址寄存器由基地址寄存器和当前地址寄存器组成。CPU编程时,把本通道DMA传输的地址初值写入基地址寄存器,再由8237A传送到当前地址寄存器。当前地址寄存器的值在每次DMA传输后自动加1或减1。CPU可以通过两次输入指令读出当前地址寄存器的值(每次读8位),但基地址寄存器不能被读出,且一直保持初值。数据块传送完成后,可以把当前地址寄存器的内容恢复为基地址寄存器保存的初值(需要在编程时设置自动预置方式)。
字节计数器由基本字节计数器和当前字节计数器组成。与地址寄存器一样,编程时,由指令把DMA传输的字节数写入基本字节计数器(初值要比实际传输的字节数少1),继而传送到当前字节计数器。每进行一次DMA传输,当前字节计数器自动减1。它的值由0减到FFFFH(-1)时,产生计数结束信号EOP。同样,只有当前计数器的值可以由CPU通过输入指令分两次读出。
(2)读/写逻辑。
CPU对8237A编程或读8237A寄存器时,由CPU控制总线,8237A在系统总线中作为从模块。读/写逻辑电路接收CPU的读(IOR)、写(IOW)以及由地址译码电路产生的CS信号,对地址总线的低4位(A0~A8)译码。在IOW有效时,把数据总线的内容写入所寻址的寄存器,在IOR有效时,把被选择寄存器的内容送到数据总线上。
DMA周期期间,由8237A控制总线,用作主模块。如果是DMA写周期,读/写逻辑产生IOR,控制逻辑产生存储器写(MEMW),数据从外设接口传送到存储器单元;如果是DMA读周期,读/写逻辑产生IOW,控制逻辑产生存储器读(MEMR),数据从存储器单元传送到外设接口。
(3)控制逻辑。
初始化时,CPU通过对方式寄存器的设置确定控制逻辑的操作方式。在DMA周期中,控制逻辑通过发出控制信号和16位要存取的存储单元地址来控制DMA过程。
(4)锁存缓冲器(外接)。
使用8237A工作时需要外接一个8位的地址锁存缓冲器。DMA传送之前,8237A从DB0~DB7把存储器地址的A8~A15送入这个锁存器。在DMA周期中,8237A从A0~A7引脚发送存储器地址的低8位,同时将锁存器中的地址通过三态门送至系统地址总线的A8~A15。
(5)页面地址寄存器(外接)。
从上面的叙述可以看到,8237A控制了地址总线的16位,所以最多只能连续传送64KB的数据。为了控制8086系统20位的物理地址,需要外接一个4位的页面地址寄存器,它的值由CPU写入。8237A发送低16位地址时,高4位的地址从页面地址寄存器发至地址总线的A16~A19。
(1)与CPU相连的引脚。
· D7~D0:数据线,双向、三态。有两种不同的使用情况。第一种是在8237A空闲(从态),即CPU控制总线时,提供CPU访问8237A寄存器的数据通道;第二种是在进行DMA操作时,即DMAC控制总线时,提供访问存储器高8位地址A15~A8,并由ADSTB信号将这些地址信息锁存入地址锁存器。
· A3~A0:低8位地址线的低4位,双向、三态。有两种不同的使用情况。第一种是在CPU控制总线时,8237A作为一般I/O接口,此时为输入,作为选中8237A内部寄存器的地址选择线;第二种是8237A进行DMA操作时,A3~A0为输出,作为选中存储器的低4位地址。
· A7~A4:低8位地址线的高4位,三态、输出。A7~A4仅用在8237A进行DMA操作时,提供访问存储器低字节的高4位地址。
· CS:片选信号,输入、低电平有效。当8237A为从态,其作为CPU一般I/O接口时,为片选信号。当该信号有效时,CPU才能读/写内部寄存器。
· MEMR:存储器读信号,输出、三态、低电平有效。在DMA操作时作为读存储器数据的控制信号。
· MEMW:存储器写信号,输出、三态、低电平有效。在DMA操作时作为写存储器数据的控制信号。
· IOR:I/O读信号,双向、三态、低电平有效。在8237为从态时,它为输入控制信号,CPU利用它读出8237A内部寄存器。在DMA为主态时,为输出控制信号,与MEMW配合实现DMA写操作。
· IOW:I/O写信号,双向、三态、低电平有效。在DMA为从态时,它为输入控制信号,CPU利用它把数据写入8237A内部寄存器。在DMA为主态时,为输出控制信号,与MEMR配合实现DMA读操作。
· HRQ:请求占用总线信号,输出、高电平有效。该信号是DMA控制器接到某通道的DMA请求信号后,且当该通道请求未被屏蔽的情况下,DMA控制器向CPU发出请求占用总线的信号。
· HLDA:同意占用总线信号,输入、高电平有效。是CPU发给DMA控制器,同意DMAC占用总线请求的回答信号。8237A接收到HLDA后,即可进行DMA传送。
(2)与外设相连的引脚。
· DREQ3~DREQ0:DMA请求信号,输入、有效电平可由工作方式命令字确定。它们分别可为4个外设提供DMA服务的请求信号。该信号要保持有效电平,直到DMAC做出DMA响应的回答信号DACK。
· DACK3~DACK0:DMA响应信号,输出、有效电平可由工作方式命令字确定。该信号由8237A发给4个通道,是对申请DMA服务请求的回答信号。一般利用该信号选中某端口,实现I/O—存储器的传送。
(3)其他引脚。
· CLK:时钟信号,输入。用于控制芯片内部定时和数据传送速率。
· RESET:复位信号,输入、高电平有效。当芯片被复位时,屏蔽寄存器被置1,其余寄存器清零,8237A处于从态,仅作为一个I/O接口。
· READY:准备好信号,输入、高电平有效。当进行DMA操作时,存储器或外部设备的速度较慢,来不及接收或发送数据时,DMA控制器在总线传送周期自动插入等待周期,直到READY变成高电平时才恢复正常。
· AEN:地址允许信号,输出、高电平有效。它将锁存的高8位地址送入地址总线,与芯片输出的低8位地址组成16位偏移地址。在进行DMA操作时,AEN=1;CPU控制总线时,AEN=0。
· ADSTB:地址选通信号,输出、高电平有效。它将芯片内数据缓冲器送来的高8位地址锁存到外部地址锁存器。
8237A芯片的地址线仅8位,但外设和存储器或存储器和存储器交换数据时访问存储器地址至少需16位,如何用8位地址线产生16位地址呢?8237A芯片预先通过ADSTB信号把高8位地址通过数据线先送到外部地址锁存器进行锁存,再由AEN信号启动地址锁存器,把由地址锁存器锁存的地址信息送到高8位地址总线,和由8237A的A7~A0输出的低8位地址信息共同组成16位地址信息。
· EOP:过程结束信号,双向、低电平有效。作为输出,在DMA传送期间,当字节数计数器减至0时,使EOP引脚变为低电平,表示DMA传送结束;作为输入,当EOP端输入一个低电平时,强迫DMA操作停止,并使内部寄存器复位。为使DMA操作可靠进行,不因EOP端误引入了低电平信号而使DMA结束,一般地,EOP引脚通过上拉电阻外接一个高电平。
· Vcc、GND:电源和接地引脚。
8237A使用独立的时钟,时钟的每一个周期分为两类:空闲周期和有效周期。周期也称为状态(status)。
(1)空闲周期S1。
8237A复位后就处于空闲周期,在此周期,CPU可对8237A进行初始化编程,虽然已经初始化,但还未有DMA请求输入。空闲周期中,8237A要检查DREQ的状态,以确定是否有通道请求DMA服务。同时也对CS端采样,判定CPU是否要对8237A进行读/写操作,CS为低电平时,芯片进入编程工作状态。
(2)有效周期。
由S0~S4这5种周期组成。
①S0是等待周期。它是8237A接到外设的DREQ请求,并向CPU发出了HRQ后进入的一个周期,在此期间等待CPU让出总线控制权。在得到来自CPU的HLDA响应后,结束S0状态,准备进入DMA操作过程。在S0期间,8237A仍可以接收来自CPU的读/写操作。
一个完整的DMA传输(完成1个字节传输)应包括4个时钟周期,即S1~S4。对于速度稍慢的外设,也可以用READY信号在S3与S4之间产生等待周期Sw。
②S1周期中8237A用DB0~DB7送出高8位地址A8~A15,同时使ADSTB有效,将高8位地址送入锁存器。由于S1是CPU已经释放总线后进入的状态,所以8237A还使AEN有效。在传输一段连续的数据时,存储器地址是相邻的,它们的高8位地址往往是不变的。在进行下一个字节的传输时,就没有必要把高位地址再锁存一次。这种情况下,S1可以省略。
③S2期间8237A首先向外设送出DACK信号,启动外设开始工作。同时开始送出读出数据的控制信号。如果是DMA读操作,就送出MEMR到存储器;反之,就把IOR送到外设。S3期间送出写操作所需的控制信号。如DMA读,就将IOW送外设;反之则将MEMW送存储器。S3状态结束前检测READY端的状态,若为低电平,就在S3之后产生一个Sw周期,延续S3的各种状态。在S3或Sw结束处若检测到READY端为高电平,就进入S4周期。
④S4周期结束本次的1个字节传输。如果整个DMA传输结束,后面紧接的是S1周期;如果还要继续进行下一个字节传输,再次重复进行S1~S4的过程。
如果进行存储器之间的数据传输,1个字节的传输要经过两个阶段:第一阶段是从源地址中读出1个字节,存入8237A的暂存寄存器;第二阶段将这个字节写入目的地址中。每个阶段的完成都要经过4个周期时间。
此外,由于READY的作用,还使8237A增加了一个Sw周期,使全部周期分为7种。
(3)扩展写与压缩时序。
① 扩展写。
通常写控制信号在S3才变得有效,如采用了扩展写方式,写信号在S2就开始有效,可以使一些需要较长时间写入的设备获取足够的写入时间。
② 压缩时序。
正常时序中,S1用于锁定高8位地址,在高8位地址不变时,S1是可以省略的。S3是一个延长周期,用来保证可靠的读/写操作。在追求高速传输,且器件的读/写速度又可以保证时,S3也是可以省略的。于是1个字节的传输只要两个时钟周期(S2、S4)就可以完成,这就是压缩时序的工作方式。
8237A可编程寄存器的说明如下。
(1)方式字。
8237A每个通道都有一个方式字,其格式如图7-5所示。
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 | ||||
传送方式 |
地址递减选择 |
预置选择 |
传送类型 |
通道选择 | |||||||
00:请求方式 01:单字节方式 10:块字节方式 11:级联方式 |
0:递增 1:递减 |
0:禁止自动预置 1:允许自动预置 |
00:校验传送 01:写传送 10:读传送 11:无意义 |
00:通道0 01:通道1 10:通道2 11:通道3 | |||||||
图7-5 8237A方式控制字
D1D0:通道选择位。
D3D2:传送类型选择位。
· DMA读传送:把存储器的数据读出传送至外设。操作时由MEMR从存储器读出数据,由IOW把数据写入外设。
· DMA写传送:把外设输入的数据写至存储器中。操作时由IOR信号从外设输入数据,由MEMW把数据写入存储器。
· DAM校验传送:这种方式实际不进行数据传送,只是完成某种校验过程。当一个8237A通道处于DMA校验方式时,它会像上述的传送操作一样,保持着它对系统总线的控制权,并且每个DMA周期都将响应外部设备的DMA请求,只是不产生存储器或I/O设备的控制信号,这就阻止了数据的传送。但I/O设备可以使用DACK响应信号,在I/O设备内部对一个指定的数据块的每一个字节进行存取,以便校验。
D4:自动预置功能选择位。当D4=1时,允许自动预置,每当DMA传送结束,基地址寄存器自动将保存的存储器数据区首地址传送给当前地址寄存器,基字节计数器自动将保存的传送数据字节数传送给当前字节寄存器,进入下一轮数据传输过程。当D4=0时,禁止自动预置。
D5:地址增减选择位。D5=1,每传送一个字节,当前地址寄存器的内容减1;D5=0,当前地址寄存器的内容加1。
D7D6:传送方式选择位。
· 单字节传送方式:8237A控制器每响应一次DMA请求,只传输一个字节的数据,过程如下,每传送一个字节后,当前地址寄存器的数加1(或减1),当前字节计数器的值减1,8237A释放系统总线,总线控制权交给CPU。8237A释放控制权后,马上对DMA请求DREQ进行测试。若DREQ有效,再次发总线请求信号,进入下一个字节的传送。如此循环下去,直至计数值为0,结束DMA传送。由此可看出,在单字节传送方式中,每传送一个字节,8237A要让出一次总线控制权,因而传送两个字节之间至少要经过一个总线周期。
· 块字节传送方式:在块字节传送方式下,8237A每响应一次DMA请求,按照当前字节计数器的设定值完成字节传送的个数,直到计数器由0减到FFFFH,结束DMA传送,让出总线控制权。
· 请求传送方式:请求传送方式与块字节传送方式相同,按照字节计数器的设定值进行传送。只是在这种传送方式下,要求DREQ在整个传送期间一直保持有效,每传送一个字节数都对DREQ进行测试。如果检测到DREQ端变为无效电平,暂停传送,让出总线控制权,但仍对DREQ端进行检测。当DREQ恢复有效电平,又重新申请CPU让出总线,CPU让出总线后,就在原来基础上继续传送。当计数值变为0,或外界输入EOP有效信号时,结束DMA的传送。
· 级联传送方式:级联传送方式不应定为一种传送方式,实际上是扩充通道数,若干片8237A构成主从式DMA系统。
(2)命令字。
命令字在初始化时写入8位命令寄存器,4个通道共用,各位定义如图7-6所示。
D0:允许或禁止存储器至存储器的传送操作。D0=1时允许存储器至存储器的传送;D0=0时禁止存储器至存储器的传送。
D1:设定在存储器至存储器的传送过程中,源地址保持不变或改变。当Dt=0时,传送过程中源地址是变化的。反之,当D1=1时,在整个传送过程中源地址保持不变。当D0=0时,不允许存储器至存储器传送,此时D1位无意义。
D2:允许或禁止8237A工作的控制位。
D3:时序类型选择位。D3=0时为正常时序,每进行一次DMA传送一般用3个时钟周期;D3=1时为压缩时序,在大多数情况下仅用2个时钟周期完成一次DMA传送,仅当A15~A8发生变化时需用3个时钟周期。
D4:优先权方式选择位。D4=0时采用固定优先级;D4=1时采用循环优先级。
D5:扩展写信号选择位。D5=1时为扩展写信号时序,它使IOW或MEMW的负脉冲加宽,提前一个时钟周期有效,即与读控制信号同时有效;D5=0时为滞后写时序,IOW或MEMW比IOR或MEMR滞后一个时钟周期有效。
D6:用于选择DMA请求信号DREQ的有效电平。
D7:用于选择DMA响应信号DACK的有效电平。
D0 |
传输对象 |
|
0:禁止存储器到存储器的传输 1:允许存储器到存储器的传输 |
D1 |
地址状态 |
D0=1 |
0:通道0地址不保持 1:通道0地址保持不变 |
D0=0 |
此位无意义 | ||
D2 |
工作状态 |
|
0:启动8237A工作 1:停止8237A工作 |
D3 |
|
D0=1 |
此位无意义 |
D0=0 |
0:正常时序 1:压缩时序 | ||
D4 |
|
|
0:固定优先级 1:循环优先级 |
D5 |
|
D3=1 |
此位无意义 |
D3=0 |
0:滞后写入选择 1:扩展写入选择 | ||
D6 |
|
|
0:DREQ信号高电平有效,1:DREQ信号低电平有效 |
D7 |
|
|
0:DACK信号低电平有效,1:DACK信号高电平有效 |
图7-6 8237A操作命令字的格式
(3)请求字。
DMA请求可以由I/O设备产生DREQ信号,也可以由软件产生。请求寄存器就是用于由软件来产生DMA请求的。存储器到存储器的传送一般利用软件产生DMA请求。软件请求是不可屏蔽的,其格式如图7-7所示。
|
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
|
× |
× |
× |
× |
× |
DMA请求 |
通道选择 | |
|
|
|
|
|
|
0:撤销请求 1:设置请求 |
00:通道0 01:通道1 10:通道2 11:通道3 |
图7-7 8237A请求寄存器格式
(4)屏蔽字。
屏蔽字记录了各通道的DMA请求是否被允许,各位的定义如图7-8所示。
单通道 屏蔽字 |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 | |||
× |
× |
× |
× |
× |
屏蔽设置 |
通道选择 | |||||
|
|
|
|
|
0:撤销屏蔽 1:设置屏蔽 |
00:通道0 01:通道1 10:通道2 11:通道3 | |||||
综合 屏蔽字 |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 | |||
× |
× |
× |
× |
通道3 |
通道2 |
通道1 |
通道0 | ||||
|
|
|
|
0:撤销屏蔽 1:设置屏蔽 |
0:撤销屏蔽 1:设置屏蔽 |
0:撤销屏蔽 1:设置屏蔽 |
0:撤销屏蔽 1:设置屏蔽 | ||||
图7-8 8237A屏蔽字的格式
屏蔽字的格式有两种,第一种屏蔽字只能完成对单个通道的屏蔽设置,称为单通道屏蔽字。第二种屏蔽字可以同时完成对4条通道的屏蔽设置,称为综合屏蔽字。
(5)状态字。
8237A中有一个可供CPU读取的状态寄存器,其状态字反映了8237A当前4条通道DMA操作是否结束,是否有DMA请求。它的低4位反映读命令这个瞬间每条通道是否计数结束,高4位反映每条通道有无DMA请求。8237A状态字的格式如图7-9所示。
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
通道3 |
通道2 |
通道1 |
通道0 |
通道3 |
通道2 |
通道1 |
通道0 |
0:有DMA请求 1:无DMA请求 |
0:计数结束 1:计数未结束 |
图7-9 8237A状态字的格式
对8237A编程的一般过程如下。
(1)发复位命令。
(2)写控制字,设置8237A各通道的信号极性、使用的时序等。
(3)写方式字,设置使用的通道工作方式。
(4)清除先/后触发器。
(5)写入内存储器起始地址(先写低位,后写高位)。
(6)写入数值(等于传送的字节数-1)。
(7)清除该通道的屏蔽位。
(8)启动外部设备,如果是内存到输出设备,用指令设置第一次DMA请求。
对于IBM-PC系列,它的8237A通道0、2、3已分配使用,而且在开机时已对8237A进行了初始化。在这种情况下,不允许再对它重新初始化和重新设置控制字,上述编程过程的(1)步和(2)两步可改为:将所需使用的通道置屏蔽状态(这样做是为了在其他设置未完成时避免误操作)。
在PC中有两个8237ADMA控制器,采用主从结构形式相连,后来集成到南桥芯片中,其性能更高,但仍与8237A.5保持兼容,共有7条通道,其中通道0~3为8位传输,通道5~7为16位传输。其使用定义如图7-10所示,其在16位机系统中的结构简图如图7-11所示。
控制器 |
DMA1 |
DMA2 | ||||||
通道 |
CH0 |
CH1 |
CH2 |
CH3 |
CH4 |
CH5 |
CH6 |
CH7 |
定义 |
动态存储器的刷新控制 |
用户预留 |
软盘 |
硬盘 |
连接DMA1 |
未用 |
未用 |
未用 |
图7-10 PC中DMA通道的定义
图7-11 AT的DMA控制器电路
其中,通道1留给用户,通道2用于软盘驱动器与内存之间的快速数据传输;因为PC/AT有专门的DRAM刷新电路,硬盘采用高速PIO传输,所以余下的DMA通道均保留备用。PC/AT地址线宽24位,因此在主板上还安排了一组8位DMA页面寄存器,为每个通道提供(24位地址中的)高8位地址,实现在16MB存储空间进行DMA传输。AT的DMA页面寄存器的I/O端口地址分配在81H~8FH,如表7-2所示。
表7-2 AT的DMA页面寄存器的I/O端口地址
DMA通道 |
I/O地址 |
DMA通道 |
I/O地址 |
CH0 |
87H |
CH5 |
8BH |
CH1 |
83H |
CH6 |
89H |
CH2 |
81H |
CH7 |
8AH |
CH3 |
82H |
|
|