用 DMA
方式传送数据时,传送过程完全由 DMA
控制器(DMAC
)控制。其基本功能:
DMAC
能向CPU的 HOLD
脚发出 DMA
请求信号。DMA
请求后,DMAC
获得总线控制权,由它控制数据的传送,CPU则暂停工作。+1
或-1
),数据长度 -1
。DMA
传送的信号。HOLD
脚上有无 DMA
请求?若有,便转入 DMA
传送周期。8237A
是高性能可编程 DMA
控制器,主要特点:
4
个通道,每通道有 64K
地址(16位)和字节计数能力(16位)。4
种传送方式:单字节传送、数据块传送、请求传送、级联传送。DMA
请求可被允许或禁止。4
个通道的 DMA
请求有不同优先级,优先级可以是固定的,也可以是循环的。EOP
(End of Process
,不常用),结束 DMA
传送;还可从外界输入 EOP
信号,中止正执行的DMA
传送。8237A
的两种工作状态
1)从态方式
开始 DMA
传送前,8237A
是系统总线的从属设备,由CPU对它进行编程,如指定通道、传送方式和类型、内存单元起始地址、地址是递增还是递减以及要传送的总字节数等等;CPU也可读取 DMAC
的状态。
2)主态方式
当 8237A
取得总线控制权后,它就完全控制了系统,使I/O设备和存储器之间或者存储器与存储器之间进行直接的数据传送。
8237A
芯片的内部结构和外部连接与这两种工作状态密切相关。
时序与控制逻辑
从态时,接收系统时钟、复位、片选和读/写等信号,完成相应控制操作;主态时, 向系统发控制信号。
其中与设备相连的是 IOR ‾ , IOW ‾ \overline {\text{IOR}},\overline {\text{IOW}} IOR,IOW ,其他的要么和CPU相连,要么和系统总线相连。
MEMR ‾ , MEMW ‾ \overline {\text {MEMR}},\overline {\text{MEMW}} MEMR,MEMW 是主态时进行内存读写的命令。
优先级编码电路
对同时提出 DMA
请求 HRQ(Hold Request)
的多个通道进行排队判优,决定哪个通道优先级最高,然后进行响应 HLDA(Hold Acknowledge)
。
可选固定或循环优先级。某个优先级高的设备服务时,禁止其它通道请求。
数据和地址缓冲器组
8237A的 A7~A4
(单向输出)、A3~A0
(双向:从态时 A3-A0
输入有4根线,说明占了 16
个端口地址;主态时:A3-A0
、A7-A4
、DB7-DB0
共16根地址线往内存输出,读或写数据) 为地址线;
DB7~DB0
在从态时传输(CPU配置或读取DMA的)数据,主态时传送地址。它们都与三态缓冲器相连,便于接管或释放。
命令控制逻辑
从态时接收CPU送来的寄存器选择信号(A3~A0
),选择寄存器;主态时译码方式字的 D1D0
,以确定操作类型。A3~A0
与 IOR \text{IOR} IOR 、 IOW \text{IOW} IOW 配合组成各种操作命令。
内部寄存器组
每通道有 16
位基址寄存器、基字计数器、当前地址寄存器、当前字计数器以及 6
位工作方式寄存器。
片内还有命令寄存器、屏蔽寄存器、请求寄存器、状态寄存器和暂存寄存器。
不可编程的字数暂存器和地址暂存器。
CLK
时钟信号,输入8237A
时钟频率 3MHz
,8237A-5
为 5MHz
。8237A
,接受CPU对它的编程等。READY
准备好,输入,高电平有效I/O
设备或存储器参与 DMA
传送时,可使 READY
变低,让 8237A
在 DMA
周期中插入等待周期 TW
;当它们准备就绪时 READY
变高。A3~A0
低 4
位地址线8237A
内部寄存器,实现编程;主态时输出要访问内存的低 4
位地址。A7-A4
高 4
位地址线4
位地址信息 A7-A4
。DB7-DB0
8
位数据线,与系统数据总线相连。
8
位地址 A15-A8
,并由 ADSTB
信号将它们锁存到外部的高 8
位地址寄存器中,与 A7-A0
输出的低 8
位地址构成 16
位地址。AEN
地址允许信号,输出,高电平有效8
位地址,与芯片输出的低 8
位地址一起构成 16
位内存偏址。同时使连到CPU的地址锁存器无效,保证地址线上的信号来自 DMAC
。ADSTB
地址选通信号,输出,高电平有效DB7~DB0
上的高 8
位地址送到外部的地址锁存器。I/O
读信号,双向。8237A
内部寄存器。DREQ3~DREQ0
通道 3~0
的 DMA
请求信号,输入DMA
服务时,向这些引脚发请求信号,有效极性由编程确定。固定优先级时,DREQ0
的优先级最高,编程可改变优先级。HRQ
保持请求信号,输出,高电平有效HOLD
端发出的 DMA
请求信号,可从 8237A
任一个未被屏蔽的通道发出。HLDA
保持响应信号,输入,高电平有效HLDA
相连,CPU收到 HRQ
信号后,至少经过1个时钟周期后,使 HLDA
变高,表示已让出总线控制权,8237A
收到 HLDA
信号后,便开始 DMA
传送。DACK3~DACK0
通道 3~0
的 DMA
响应信号,输出DMA
传送后,DACKi
有效,通知外部电路现已进入 DMA
周期。DMA
传送中,任一通道的字计数器减为 0
,再由 0
减为FFFFH
而终止计数时,会在 EOP ‾ \overline {\text{EOP}} EOP 引脚上输出低电平信号,表示 DMA
传输结束。DMA
传送。DMA
传送,出现 EOP ‾ \overline {\text{EOP}} EOP 信号后,又能自动恢复有关寄存器的初值,继续执行另一次 DMA
传送。8237A的内部可编程寄存器主要有 10
种:
当前地址寄存器
16
位,每通道 1
个,存放 DMA
传送的存储器地址值。每传送 1
个数据,地址值自动 +1
或 -1
,指向下个单元。
编程时可写入初值,也可被读出,但每次只能读/写 8
位,所以读/写要两次完成。
自动预置操作方式,在 EOP \text{EOP} EOP 有效时,会重装入基地址值。
当前字计数寄存器
16
位,每通道 1
个,编程时置其初值为实际传送字节数少1。每传送 1
字节,自动 -1
。由 0~FFFFH
时,将产生终止计数信号TC
。
自动预置操作方式,在 EOP \text{EOP} EOP 有效时,会重装入基字计数寄存器的内容。
基地址寄存器
16
位,每通道 1
个,存放通道当前地址寄存器初值,与当前地址寄存器地址一样,编程时写入相同值。
其内容不能读出和修改。用在自动预置操作时,使当前地址寄存器恢复到初值。
基字计数寄存器
16
位,每通道 1
个,存放通道当前字计数器初值,该值也是编程时与当前字计数器一起写入的。
其内容不能读出和修改,用于自动预置操作时,使当前字计数器恢复到初值。
命令寄存器
全局,8
位,控制 8237A
的操作。由CPU编程来设置 8327A
操作方式, 复位时清除。
D0
位:能否进行存储器到存储器传送,D0=1
允许。并规定先用通道 0
从源单元读入 1
字节放入暂存器,然后由通道 1
把该字节写到目的单元,接着两通道的地址分别 +1
或 -1
,通道 1
的字计数器 -1
,它减为 0
时产生终止计数信号 TC
,并输出 EOP \text{EOP} EOP 信号,终止DMA
服务。D1
位:存储器到存储器传送时,通道 0
地址能否保持不变。D1=1
,通道 0
在传送中保持同一地址,从而可把该单元中的数写入一组存储单元。D1=0
禁止。当 D0=0
时这种方法无效。D2
位:允许或禁止 8237A
工作,D2=0
允许,D2=1
则禁止。D4
位 优先权控制。D4=0
为固定优先权,通道 0
优先级最高;D4=1
为循环优先权,刚服务过的通道 i
优先权最低,而通道 i+1
优先权最高。随着 DMA
操作不断进行优先权不断循环,防止某通道长时间占用总线。D6
位:决定 DREQ
的有效电平,0
高电平有效,1
则低电平有效。D7
位:决定 DAC
K的有效电平,1
高电平有效,0
则低电平有效。D3
位和 D5
位:有关时序的操作,见后面时序讨论。工作方式寄存器
6
位,每通道 1
个,选择 DMA
的传送方式和类型等,格式:
D1D0
位:选择通道,并进一步由 D2-D7
指定选定通道的工作方式。这样 4
个通道可合用 1
个方式寄存器。
D3D2
位:决定所选通道的 DMA
操作类型。从 3
种 DMA
传送类型中选定一种:
10
:读传送,存储器->I/O设备, 发 MEMR ‾ , IOW ‾ \overline {\text{MEMR}},\overline {\text{IOW}} MEMR,IOW ,
01
:写传送,存储器<-I/O设备, 发 MEMW ‾ , IOR ‾ \overline {\text{MEMW}},\overline {\text{IOR}} MEMW,IOR ,
00
:校验传送,伪传送,8237A
会产生地址信息和
EOP \text{EOP} EOP 信号,不会发出读写控制信号,用于测试。
D4
位:所选通道是否进行自动预置操作。如果 D4=1
,则选择自动预置。
D5
位:方向控制位。D5=0
数据传送由低址向高址方向进行,每传送 1
字节,地址 +1
。D5=1
时传送方向相反。
D7D6
位:定义所选通道操作方式。有 4
种传送方式:
1) 单字节传送方式(常用于软盘)
每次DMA操作只传送 1
字节。之后字计数器 -1
,地址寄存器 +1
或 -1
,HRQ
无效,释放系统总线。当字计数器由 0
减为 FFFFH
时,产生终止信号 TC
。
此后即使 DREQ
继续有效,8237A
的 HRQ
输出仍进入无效状态并让出总线,由CPU控制至少一个总线周期。
2) 数据块传输方式
进入 DMA
服务后,可连续传输一批数据,直到字计数器由 0
减为 FFFFH
产生 TC
信号,或从外部送来 EOP \text{EOP} EOP 信号时,才释放总线,结束 DMA
传输。
3)请求传送方式
也连续传送数据,直到字计数器由 0
减为 FFFFH
产生 TC
,或外界送来 EOP \text{EOP} EOP 信号。但每传送 1
字节后,都要测试 DREQ
端,一旦发现此信号无效,马上停止。
地址和字计数器的中间值会被保存在通道的现行地址和字计数器中,外设准备好新数据时,可使 DREQ
再变为有效,又从断点处继续进行传输。
4)级联传送方式
连接多个 8237A
以扩充 DMA
通道,连线见图11.5。
主片 DREQ
—从片 HRQ
,主片 DACK
—从片 HLDA
,主片 HRQ
和 HLDA
与CPU的 HOLD
和 HLDA
相连。1
块主片可连 4
块从片。主片置为级联传送,从片设成其它三种方式。主片不输出地址和读写信号。
请求寄存器
相应请求位置 1
时,对应通道可产生 DMA
请求。相应位可由DREQ
信号置1,也可写入通道请求字来置 1
或清 0
。
D1D0
位选通道号,D2
位为请求位。请求位不能屏蔽,其优先权受优先权逻辑控制,TC
或外部的 EOP \text{EOP} EOP 信号能将相应的请求位清 0
,RESET
信号则使整个请求寄存器清 0
。
屏蔽寄存器
4
位,1
个/通道。禁止/允许对应通道的 DREQ
请求进入请求寄存器。有两种屏蔽字,端口地址不同。
1)通道屏蔽字
可对该寄存器写入通道屏蔽字来对单个屏蔽位置 1
/复位。通道屏蔽字格式与通道请求字格式类似:
2)主屏蔽字
还允许用主屏蔽命令设置通道的屏蔽触发器。D3~D0
位对应通道 3~0
的屏蔽位,1
屏蔽,0
清除屏蔽。可写入主屏蔽字,一次完成 4
个通道的屏蔽位设置。可用软件同时清除 4
个通道的屏蔽位。
状态寄存器
8
位状态寄存器存放状态信息,供CPU读出。如 D3~D0
中置 1
的通道,已达计数终点 TC
或外部送来了 EOP \text{EOP} EOP 信号。D7-D4
中置 1
的通道,DMA
请求还未处理。复位或被读出后,相应状态位被清除。状态字格式:
暂存寄存器
在存储器->存储器传送时,保存所传送的数据。其中始终保存着最后 1
个传送的字节,RESET
信号会将其清除。编程状态下,可由CPU读出这个字节。
软件命令
编程状态下,8237A
可执行 3
个附加的特殊软件命令,只要对特定端口进行一次写操作,命令就会生效。
1)清除先/后触发器
8237A
仅 8
根数据线,而地址寄存器和字计数器均为 16
位,CPU要分两次读写。先/后触发器控制高低字节读写次序。清 0
读写低 8
位,随后自动置 1
,读写高 8
位。接着又清 0
,… 。对该触发器所在的寄存器执行一次写操作便清 0
,复位和 EOP \text{EOP} EOP 信号有效也将它清为 0
。
2)主清命令
主清命令也称为复位命令,功能与 RESET
信号同,它可使命令寄存器、状态寄存器、请求寄存器、暂存寄存器和内部先/后触发器均清 0
,而把屏蔽寄存器置 1
。复位后,8237A
进入空闲状态。
3)清除屏蔽寄存器
该命令能清除 4
个通道的全部屏蔽位,允许各通道接受 DMA
请求。
各寄存器的端口地址
对 8237A
内部寄存器读写时, CS ‾ \overline {\text{CS}} CS 端必须为低电平,该信号由高位地址经I/O译码后产生。
A3~A0
线选择不同寄存器,共占 16
个I/O端口地址。常将它们与地址总线低 4
位 A3~A0
相连,选择各寄存器。
例如,PC/XT
机中,地址 A9~A4=000000
时,经I/O译码电路选中 8237A
,使其有效。 地址 A3~A0
与 8237A
的 A3~A
0脚连接实现片内寻址。因此基地址 =00H
,记为 DMA=00H
。由此可得其他寄存器的地址,如DMA+00H
为通道 0
基地址与当前地址寄存器地址,DMA+08H
为状态寄存器地址等:
空闲周期 SI
:未发生 DMA
请求时
CS
:CPU是否对其操作DREQ
:外设是否有请求过渡状态 S0
:DMAC
发出 HRQ
之后,收到 HLDA
之前。
有效周期:DMAC
收到 HLDA
之后,接管总线:
包括 4
个状态周期(S1、S2、S3、S4
),慢速I/O或M还可通过令 READY=0
申请插入 SW
,8237A-5
在 S3
中检测 READY
,SW
中的操作同 S3
:
S1
:更新高8位地址,AEN
、ADSTB
有效,DMAC
将 M
的 A8~15
放到 DB0~7
上;只有当 A8~15
有变化时才出现S2
:选中两个介质,输出 16
位地址选中 M
:低 8
位由 A0~7
直接输出;高 8
位由 DB0~7
经外部锁存器(由 ADSTB
下降沿锁存)输出;发出有效的 DACK
选中I/OS3
:读周期。发出 IOR
(DMA写)或 MEMR
(DMA读),从源读数据到 DB0~7
,等待写周期。S4
:写周期。发出 MEMW
(DMA写)或 IOW
(DMA读),将 DB0~7
上的数据写到目标中。扩展写:写提前到与读同时开始(S3
),与读一样扩展到 2
个时钟周期。
压缩时序:去掉 S3
,读与写同为 1
个时钟周期。
SW
:慢速I/O或M传送时,在 S3
和 S4
间插入 SW
。
PC机的DMA系统:
第一代PC机中的地址是 20
位的,而 8237A
是 16
位的。为此需要一个 74LS670
扩展地址。
74LS670
的 RA,RB
和 DACK2,DACK3
连接,内有 4
个 4
位寄存器。读写分开控制:
WA、WB
:写入寄存器选择;D1~4
:数据输入RA、RB
:读出寄存器选择;Q1~4
:数据输出如何提供存储器的地址:
A16~19
:由 74LS670
提供;A8~15
:由 8237A-5
的 DB0~7
经 74LS373
提供;A0~7
:由 8237A-5
的 A0~7
直接提供;如何对I/O设备寻址,用 DACK
信号取代芯片选择和片内端口选择:
单片 DMAC
的 DMA
系统:4
个通道;8
位传送;1MB
寻址;64KB
计数
双片DMAC的DMA系统:
如果我们打开设备管理器,可以在直接内存访问控制器中看到上图双片DMAC结构中,出现的端口地址。
注意事项:
初始化编程:
① PC机检测芯片(8
个 16
位寄存器全 1
、全 0
的读写)及加载校验方式:
MOV AL, 04H ;0000_0100:前4位默认配置,正常时序,禁止工作,CR0地址不保持,禁止内存到内存
OUT DMA+08H, AL ;写入命令寄存器
OUT DMA+OCH, AL ;清先后触发器
MOV AL, 0FFH ;1111_1111:全1的读写测试
C16: MOV BL, AL ;全1或全0
MOV BH, AL ;全1或全0
...
...
MOV CX, 8 ;对8个寄存器做读写测试
MOV DX, DMA ;从DMA开始测试
C17: OUT DX, AL ;全1或全0写入DX
OUT DX, AL ;再写一次,16位写两次,先写低八位,再写高八位
IN AL, DX ;读出低八位
MOV AH, AL ;
IN AL, DX ;读出高八位,放入AX中
CMP BX, AX ;和之前保存的AL对比
JE C18 ;如果相同,证明该寄存器没有出错
HLT ;不相同则停机
C18: INC DX ;DX端口号+1
LOOP C17 ;再重复循环
...
INC AL ;AL+1=全0
JE C16 ;为0,跳转回C16,做全0测试
...
...
...
...
...
...
SUB AL, AL ;AL清0
OUT DMA+08H, AL ;写入命令寄存器,高4位按照默认配置,低4位正常时序,允许工作,其他位默认;启用芯片
;下面将40H,41H,42H,43H先后写入工作方式寄存器,,即对全部的通道写入同样的工作方式
MOV AL, 40H ;0100_0000针对0号通道
OUT DMA+0BH, AL ;单字节方式,地址递增,禁止地址预置,校验方式
MOV AL, 41H ;0100_0001针对1号通道
OUT DMA+0BH, AL ;单字节方式,地址递增,禁止地址预置,校验方式
MOV AL, 42H ;0100_0010针对2号通道
OUT DMA+0BH, AL ;单字节方式,地址递增,禁止地址预置,校验方式
MOV AL, 43H ;0100_0011针对3号通道
OUT DMA+0BH, AL ;单字节方式,地址递增,禁止地址预置,校验方式
例:利用级联的 IBM PC/AT
的 8237
主片通道 5
,将内存其始地址为 80000H
的280H
字节的内容直接输出到外部设备。
MOV AL, 04H ;命令字, 禁止82C37工作
OUT 0D0H, AL ;写命令寄存器
MOV AL, 0
OUT 0D8H, AL ;清除先/后触发器
OUT 0C4H, AL ;写低位地址
OUT 0C4H, AL ;写高位地址
MOV AL,04H ;页面地址为8
OUT 08BH, AL ;写页面寄存器
MOV AX, 280H ;传输字节数
DEC AX
OUT 0C6H, AL ;写字节数低位
MOV AL, AH
OUT 0C6H, AL ;写字节数高位
MOV AL, 89H ;方式字: 单字节读, 地址加1
OUT 0D6H, AL
MOV AL, 05H ;写请求寄存器
OUT 0D2H, AL
DMA控制器与I/O设备的连接:DMAEN
是 DMA
申请允许信号;软盘接口中的数据输出寄存器(3F2H
)的 D3
位控制,高有效
ROM-BIOS
中软盘 DMA_SETUP
:
AL
——方式字(CH2
,单一传送,非自动预置,地址增量)42H:DMA
校验(软盘校验)46H:DMA
写(读软盘)4AH:DMA
读(写软盘)ES:BX
——内存首址DH
——要传送的扇段数字节数/扇段在磁盘基址区 DISK_BASE
的 3
号单元
0
:128
字节/扇段1
:256
字节/扇段2
:512
字节/扇段3
:1024
字节/扇段DMA_SETUP PROC
PUSH CX ;保护现场
CLI
OUT DMA+12, AL ;清先/后触发器
OUT DMA+11, AL ;设置方式
;形成物理地址
MOV AX, ES
MOV CL, 4
ROL AX, CL
MOV CH, AL
AND AL, 0F0H
ADD AX, BX
JNC J33
INC CH
J33: PUSH AX ;低16位地址入栈
...
;设置地址寄存器及页面地址
OUT DMA+4, AL ;写低16位地址
MOV AL, AH
OUT DMA+4, AL
MOV AL, CH
AND AL, 0FH ;写高4位地址
OUT 81H, AL
;设置字节计数器
MOV BX, 6
CALL GET_PAM ;取DISK_BASE的3号单元作为移位次数
MOV CL, AH
MOV AH, DH
SUB AL, AL
SHR AX, 1
SHL AX, CL
DEC AX
PUSH AX ;N-1入栈保护
...
OUT DMA+5, AL
MOV AL, AH
OUT DMA+5, AL
STI
;判DMA是否超界
POP CX ;用低16位地址与N-1相加设置CF
POP AX
ADD AX, CX
POP CX ;恢复现场
MOV AL, 02H
OUT DMA+10, AL
RET
DMA_SETUP ENDP