第十二章 8237DMA控制器为了提高数据传送的速率,人们提出了直接存储器存取 (DMA)
的数据传送控制方式,即在一定时间段内,由 DMA控制器取代
CPU,获得总线控制权,来实现内存与外设或者内存的不同区域之间大量数据的快速传送。
典型的 DMAC的工作电路如右图所示 。
DMA数据传送的工作过程,
( 1) 外设向 DMAC发出 DMA传送请求 。
( 2) DMAC通过连接到 CPU的 HOLD信号向 CPU提出 DMA请求 。
( 3) CPU在完成当前总线操作后会立即对 DMA请求做出响应 。
CPU的响应包括两个方面:一方面,CPU将控制总线,数据总线和地址总线浮空,即放弃对这些总线的控制权;另一方面,CPU将有效的 HLDA信号加到 DMAC上,用此来通知 DMAC,CPU已经放弃了总线的控制权 。
( 4) 待 CPU将总线浮空,即放弃了总线控制权后,由 DMAC接管系统总线的控制权,并向外设送出 DMA的应答信号 。
( 5) 由 DMAC送出地址信号和控制信号,实现外设与内存或内存不同区域之间大量数据的快速传送 。
( 6) DMAC将规定的数据字节传送完之后,通过向 CPU发 HOLD
信号,撤消对 CPU的 DMA请求 。 CPU收到此信号,一方面使
HLDA无效,另一方面又重新开始控制总线,实现正常取指令,分析指令,执行指令的操作 。
注意,在内存与外设之间进行 DMA传送期间,DMAC控制器只是输出地址及控制信号,而数据传送是直接在内存和外设端口之间进行的,并不经过 DMAC;
对于内存不同区域之间的 DMA传送,则应先用一个 DMA存储器读周期将数据从内存的源区域读出,存入到 DMAC的内部数据暂存器中,再利用一个 DMA存储器写周期将该数据写到内存的目的区域中去 。
12.1 8237 的组成和工作原理
12.1.1 DMA控制器芯片 Intel 8237的性能概述
Intel8237是 8086/8088微机系统中常用的 DMAC芯片,有如下性能,
( 1) 含有 4个相互独立的通道,每个通道有独立的地址寄存器和字节数寄存器,而控制寄存器,状态寄存器为四个通道所共用 。
( 2) 每个通道的 DMA请求可以分别被允许 /禁止 。
( 3) 每个通道的 DMA请求有不同的优先权,可以通过程序设置为固定的或者是循环 ( 旋转 ) 的方式 。
( 4) 通道中地址寄存器的长度为 16位,因而一次 DMA传送的最大数据块的长度为 64K字节 。
( 5) 8237有 4种工作方式,分别为:单字节传送,数据块传送,请求传送,级连方式 。
( 6) 允许用输入信号来结束 DMA传送或重新初始化 。
( 7) 8237可以级连以增加通道数 。
DMA方式的适用场合
( 1)硬盘和软盘的输入 / 输出
( 2)快速通信通道输入 / 输出
( 3)多处理机和多程序数据块传送
( 4)扫描操作(图象显示)
( 5)高速数据采集。
特点:
DMA方式适用于成组传送数据的场合,每次传送之前要对
DMAC进行初始化,CPU要对 DMAC写入 20----30个字节的控制字。
缺点,
( 1) DMA期间,CPU不占总线,因而不能做其它工作。
( 2) CPU对 DMAC初始化占有额外时间。
( 3)增加硬件,提高成本,使电路复杂。
因此对于数据块短,需频繁 DMAC初始化的场合,CPU来得及处理的情况,就不必采用 DMA方式。
12.1.2 8237的结构与引脚
8237的方框图如上页所示,主要包含以下几个部分:
1,四个独立的 DMA通道每个通道都有一个 16位的基地址寄存器,一个 16位的基字节数计数器,一个 16位的当前地址寄存器和一个 16位的当前字节数计数器及一个 8位的方式寄存器,方式寄存器接收并保存来自于 CPU的方式控制字,使本通道能够工作于不同的方式下;
2,定时及控制逻辑电路对在 DMA请求服务之前,CPU编程对给定的命令字和方式控制字进行译码,以确定 DMA的工作方式,并控制产生所需要的定时信号;
3,优先级编码逻辑对通道进行优先级编码,确定在同时接收到不同通道的
DMA请求时,能够确定相应的先后次序 。 通道的优先级可以通过编程确定为是固定的或者是循环的 。
4,共用寄存器除了每个通道中的寄存器之外,整个芯片还有一些共用的的寄存器:包括 1个 16位的地址暂存寄存器,1个 16位的字节数暂存寄存器,1个 8位的状态寄存器,1个 8位的命令寄存器,1
个 8位的暂存寄存器,1个 4位的屏蔽寄存器和 1个 4位的请求寄存器等 。
8237内部寄存器的类型和数量如下表所示,其中,凡数量为 4个的寄存器,则每个通道一个,凡数量只有一个的,则为各通道所公用 。
5,8237的数据引线,地址引线 都有三态缓冲器,因而可以接也可以释放总线 。
寄存器名 长度( Bit ) 数量基地址寄存器 16 4
基字节数寄存器 16 4
当前地址寄存器 16 4
当前字节数寄存器 16 4
地址暂存寄存器 16 1
字节数暂存寄存器 16 1
状态寄存器 8 1
命令寄存器 8 1
暂存寄存器 8 1
方式寄存器 6 4
屏蔽寄存器 4 1
请求寄存器 4 1
1 40
8237
20 2 1
I O R
I O W
M EM R
M EM W
NC
R EA D Y
H L D A
A D ST B
A EN
HRQ
CS
C L K
R ESE T
D A C K
2
D A C K
3
D R EQ
3
D R EQ
2
D R EQ
1
D R EQ
0
G N D
A 7
A 6
A 5
A 4
EO P
A 3
A 2
A 1
A 0
V cc
DB 0
DB 1
DB 2
DB 3
DB 4
D A C K 0
D A C K 1
DB 5
DB 6
DB 7
8237( 40DIP ) 的引脚功能如下:
1,CLK,时钟信号输入引脚,对于标准的 8237,其输入时钟频率为 3MHz,对于 8237-2,其输入时钟频率可达 5MHz。
2,CS,芯片选择信号,输入引脚 。
3,RESET,复位信号,输入引脚,用来清除 8237中的命令,状态请求和临时寄存器,且使字节指针触发器复位并置位屏蔽触发器的所有位 ( 即使所有通道工作在屏蔽状态 ),在复位之后,8237工作于空闲状态 。
4,READY,外设向 8237提供的高电平有效的,准备好,信号输入引脚,若 8237在 S3状态以后的时钟下降沿检测到 READY为低电平,则说明外设还未准备好下一次 DMA操作,需要插入 SW状态,
直到 READY引脚出现高电平为止 。
5,DREQ0~DREQ3,外设的 DMA请求信号输入引脚,对应于四个独立的通道,DREQ的有效电平可以通过编程来加以确定,优先级可以固定,也可以循环 。
6,DACK0~DACK3,对相应通道 DREQ请求输入信号,DMAC的应答信号输出引脚 。
7,HRQ,8237向 CPU提出 DMA请求的输出信号引脚,高电平有效 。
8,HLDA,CPU对 HRQ请求信号的应答信号输入引脚,高电平有效 。
9,DB0~DB7,8条双向三态数据总线引脚 。 在 CPU控制系统总线时,
可以通过 DB0~DB7对 8237编程或读出 8237的内部状态寄存器的内容;
在 DMA操作期间,由 DB0~DB7输出高 8位地址信号 A8~A15,并利用
ADSTB信号锁存该地址信号 。 在进行内存不同区域之间的 DMA传送时,除了送出 A8~A15地址信号外,还分时输入从存储器源区域读出的数据,送入 8237的暂存寄存器中,等到存储器写周期时,再将这些数据通过这 8个引脚,由 8237的暂存寄存器送到系统数据总线上,然后写入到规定的存储单元中去 。
10,A3~A0,4条双向三态的低位地址信号引脚 。 在空闲周期,接收来自于 CPU的四位地址信号,用以寻址 8237内部的不同的寄存器
(组 );在 DMA传送时,输出要访问的存储单元或者 I/O端口地址的低 4位 。
11,A7~A4,4条三态地址信号输出引脚 。 在 DMA传送时,输出要访问的存储单元或者 I/O端口地址的中 4位 。
12,IOR,低电平有效的双向三态信号引脚 。 在非 DMA周期,它是一条输入控制信号,CPU利用这个信号读取 8237内部状态寄存器的内容;而在 DMA传送时,它是读端口控制信号输出引脚,与相配合,使数据由外设传送到内存 。
13,IOW,低电平有效的双向三态信号引脚,写信号,其功能与
IOR 相对应 。
14,MEMR,低电平有效的双向三态信号引脚,用于 DMA传送,
控制存储器的读操作 。
15,MEMW,低电平有效的双向三态信号引脚,用于 DMA传送,
控制存储器的写操作 。
16,AEN,高电平有效的输出信号引脚,由它把锁存在外部锁存器中的高 8位地址送入系统的地址总线,同时禁止其它系统驱动器使用系统总线 。
17,ADSTB,高电平有效的输出信号引脚,此信号把 DB7~DB0上输出的高 8位地址信号锁存到外部锁存器中 。
18,EOP,双向,当字节数计数器减为 0时,在上输出一个有效的低电平脉冲,表明 DMA传送已经结束;也可接收外部的信号,强行结束 8237的 DMA操作或者重新进行 8237的初始化 。 当不使用端时,应通过数千 Ω的电阻接到高电平上,以免由它输入干扰信号 。
19,+5V,GND及 N/C引脚
12.1.3 8237的 工作方式
8237的各个通道在进行 DMA传送时,有四种工作方式:
1,单字节传送方式每次 DMA操作仅传送一个字节的数据,完成一个字节的数据传送后,8237将当前地址寄存器的内容加 1(或减 1),并将当前字节数寄存器的内容减 1,每传送完这一个字节,DMAC就将总线控制权交回 CPU。
2,数据块传送在这种传送方式下,DMAC一旦获得总线控制权,便开始连续传送数据 。 每传送一个字节,自动修改当前地址及当前字节数寄存器的内容,直到将所有规定的字节全部传送完,或收到外部信号,
DMAC才结束传送,将总线控制权交给 CPU,一次所传送数据块的最大长度可达 64KB,数据块传送结束后可自动初始化 。
3,请求传送只要 DREQ有效,DMA传送就一直进行,直到连续传送到字节计数器为 0或外部输入使变低或 DREQ变为无效时为止 。
4,级联方式利用这种方式可以把多个 8237连接在一起,以便扩充系统的
DMA通道数 。 下一级的 HRQ接到上一级的某一通道的 DREQ上,而上一级的响应信号 DACK可接下一级的 HLDA上 (P424)。
在级联方式下,当第二级 8237的请求得到响应时,第一级 8237仅应输出 HRQ信号而不能输出地址及控制信号,因为,第二级的 8237才是真正的主控制器,而第一级的 8237仅应起到传递 DREQ请求信号及
DACK应答信号的作用 。
12.1.4 8237的 DMA传输类型
DMA所支持的 DMA传送,可以在 I/O接口到存储器;存储器到
I/O接口及内存的不同区域之间进行,它们具有不同的特点,所需要的控制信号也不相同 。
1,I/O接口到存储器的传送当进行由 I/O接口到存储器的数据传送时,来自 I/O接口的数据利用 DMAC送出的控制信号,将数据输送到系统数据总线 D0~D7上,
同时,DMAC送出存储器单元地址及控制信号,将存在于 D0~D7上的数据写入所选中的存储单元中 。 这样就完成了由 I/O接口到存储器一个字节的传送 。 同时 DMAC修改内部地址及字节数寄存器的内容 。
2,存储器到 I/O接口与前一种情况类似,在进行这种传送时,DMAC送出存储器地址及控制信号,将选中的存储单元的内容读出放在数据总线 D0~D7
上,接着,DMAC送出控制信号,将数据写到规定的 (预选中 )端口中去,而后 MDAC自动修改内部的地址及字节数寄存器的内容 。
3,存储器到存储器
8237具有存储器到存储器的传送功能,利用 8237编程命令寄存器,可以选择通道 0和通道 1两个通道实现由存储器到存储器的传送 。 在进行传送时 。 采用数据块传送方式,由通道 0送出内存源区域的地址和控制信号,将 选中内存单元的的数据读到 8237的暂存寄存器中,通道 0修改地址及字节数寄存器的值;接着由通道 1
输出内存目的区域的地址及控制信号,将存放在 暂存寄存器 中的数据,通过系统数据总线,写入到内存的目的区域中去,然后通道 1修改地址和字节数寄存器的内容,通道 1的字节计数器减到零或外部输入时可结束一次 DMA传输过程 。
12.1.5 8237各个通道的优先级
8237有两种优先级方案可供编程选择:
( 1) 固定优先级:优先级固定,通道 0最高,通道 3最低 。
( 2) 循环优先级:规定刚被服务通道的优先级最低,依次循环 。
这就可以保证 4个通道的优先级是动态变化的,若 3个通道已经被服务则剩下的通道一定是优先级最高的 。
12.1.6 8237的内部寄存器组
8237有 4个独立的 DMA通道,有许多内部寄存器 。 前面表已简单介绍过,下面详细介绍 。
1,基地址寄存器用以存放 16位地址,只可写入而不能读出 。 在编程时,它与当前地址寄存器被同时写入某一起始地址,可用作内存区域的首地址或末地址 。 在 8237进行 DMA数据传送的工作过程中,其内容不发生变化,只是在自动预置时,其内容可被重新写到当前地址寄存器中去 。
2,基字节数寄存器用以存放相应通道需要传送数据的字节数,只可写入而不能读出 。 在编程时它与当前字节数寄存器被同时写入要传送数据的字节数 。 在 8237进行 DMA数据传送的工作过程中,其内容保持不变,
只是在自动预置时,其内容可以被重新写到当前字节数寄存器中去 。
3,当前地址寄存器存放 DMA传送期间的地址值 。 每次传送后自动加 l或减 l。 CPU
可以对其进行读写操作 。 在选择自动预置时,每当字节计数值减为
0或外部有效后,就会自动将基地址寄存器的内容写入当前地址寄存器中,恢复其初始值 。
4,当前字节数寄存器存放当前的字节数 。 每传送一个字节,该寄存器的内容减 1。
当计数值减为 0或接收到来自外部的信号时,会自动将基字节数寄存器的内容写入该寄存器,恢复其初始计数值,即为自动预置 。
5,地址暂存寄存器和字节数暂存寄存器这两个 16位的寄存器和 CPU不直接发生关系,我们也不必要对其进行读 /写操作,因而对如何使用 8237没有影响 。
6,方式寄存器每个通道有一个 8位的方式寄存器,但是它们占用同一个端口地址,用来存放方式字,依靠方式控制字本身的特征位来区分写入不同的通道,用来规定通道的工作方式,各位的作用如下:
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0
00 — 选通道 0
01 — 选通道 1
10 — 选通道 2
11 — 选通道 3
00 — 校验 (或 M → M )
01 — 写传送 I/O → M
10 — 读传送 M → I/O
11 — 无效
D
7
,D
6
都为 1 时 D
3
,D
2
无意义
0 — 禁止自动预置
1 — 允许自动预置
0 — 选择地址加 1
1 — 选择地址减 1
00 — 请求传送方式
01 — 单次传送方式
10 — 成组传送方式
11 — 级联方式自动预置就是当某一通道按要求将数据传送完后,又能自动预置初始地址和传送的字节数,而后重复进行前面已进行过的过程 。
校验传送就是实际并不进行传送,只产生地址并响应信号,不产生读写控制信号,用以校验 8237的功能是否正常 。
0 — 禁止存储器→存储器
1 — 允许存储器→存储器
0 — 通道 0 地址不保持
1 — 通道 0 地址保持不变
× — D
0
= 0 时该位无意义
0 — 允许 8 2 3 7 操作
1 — 禁止 8 2 3 7 操作
0 — 正常时序
1 — 压缩时序
× — D
0
= 0 时该位无意义
0 — 固定优先权
1 — 循环优先权
0 — 滞后写
1 — 扩展写
× — D
3
= 1 时,该位无意义
0 — D R E Q 高电平有效
1 — D R E Q 低电平有效
0 — D A C K 低电平有效
1 — D A C K 高电平有效
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0
7,命令寄存器
8237的命令寄存器存放编程的命令字 。
8,请求寄存器用于在软件控制下产生一个 DMA请求,就如同外部 DREQ请求一样 。 这种软件请求只用于通道工作在数据块传送方式之下 。
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0
00 —选通道 0
01 —选通道 1
10 —选通道 2
11 —选通道 3
0--
复位请求位
1--
置位请求位无效位
9,屏蔽寄存器
8237的屏蔽字有两种形式:
( 1) 单个通道屏蔽字 。 每次只能选择一个通道 。 其中 D1D0的编码指示所选的通道,D2= l表示禁止该通道接收 DREQ请求,当 D2= 0
时允许 DREQ请求 。
( 2)四通道屏蔽字。可以利用这个屏蔽字同时对 8237的 4个通道的屏蔽字进行操作,故又称为主屏蔽字。该屏蔽字的格式如下图所示。
它与单通道屏蔽字占用不同的 I/O接口地址,以此加以区分。
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0
0
通道无效位
1
通道
2
通道
3
通道
0 -- 清除通道屏蔽位
1 -- 通道屏蔽位置位
10,状态寄存器状态寄存器存放各通道的状态,CPU读出其内容后,可得知
8237的工作状况。主要有:哪个通道计数已达到计数终点 —— 对应位为 1;哪个通道的 DMA请求尚未处理 —— 对应位为 1。
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0
1 — 表 示 该 通 道 有
D M A 请求
0
通道
1
通道
2
通道
3
通道
0 — RESET 或 CPU 读状态寄存器后
1 — 表示该通道计数到终点或 E O P 输入
0
通道
1
通道
2
通道
3
通道
11,暂存寄存器用于存储器到存储器传送过程中对数据的暂时存放 。
12,字节指针触发器这是一个特殊的触发器,用于对前述各 16位寄存器的寻址 。 由于前述各 16位寄存器的读或写必须分两次进行,先低字节后高字节 。
为此,要利用字节指针触发器,当此触发器状态为 0时,进行低字节操作 。 一旦低字节读 /写操作完成后,字节指针触发器会自动置 l,
再操作一次又会清零 。 利用这种机制,就可以进行双字节读写操作,
这样 16位寄存器可以仅占用一个外设端口地址,高,低字节共用 。
12.2 8237应用举例
12.2.1 PC机中 8237的 典型连接
12.2.2 8237的内部地址分配
8237内部共占用 16个 I/O端口地址,由地址线 A3----A0控制。见教材 P427表 12- 2。
CS A3 A2 A1 A0 IOR IOW 功 能
0 1 0 0 0 0 1 读状态寄存器
0 1 0 0 0 1 0 写状态寄存器
0 1 0 0 1 0 1 非法
0 1 0 0 1 1 0 写请求寄存器
0 1 0 1 0 0 1 非法
0 1 0 1 0 1 0 写单通道屏蔽寄存器
CS A3 A2 A1 A0 IOR IOW 功 能
0 1 0 1 1 0 1 非法
0 1 0 1 1 1 0 写方式寄存器
0 1 1 0 0 0 1 非法
0 1 1 0 0 1 0 字节指针触发器清 0
0 1 1 0 1 0 1 读暂存寄存器
0 1 1 0 1 1 0 总请
0 1 1 1 0 0 1 非法
0 1 1 1 0 1 0 请屏蔽寄存器
0 1 1 1 1 0 1 非法
0 1 1 1 1 1 0 写 4通道屏蔽寄存器接上页表
82
37
的初始化流程
12.2.3 8237的初始化编程举例通道 0初始化程序如下:
DMA EQU 00H
OUT DMA+0DH,AL ;总清 8237(总清命令寄存器 )
MOV DS,BX
MOV ES,BX ;初始化 DS和 ES
MOV AL,0FFH
OUT DMA+1,AL
OUT DMA+1,AL ;通道 0的传送字节数为 64K,先写低位,后写高位
MOV DL,0BH ;使 DX=000BH(方式字地址 )
MOV AL,58H ; 0101,1000B
OUT DX,AL ;写方式字,单字节传送方式,每次传送行地址
,而后地址自动加 1,允许自动预置
MOV AL,0
OUT DMA+8,AL ;写入命令字
OUT DMA+10,AL ;写入屏蔽字 (单通道屏蔽字)
DMA初始化程序如下:
INITADM:
MOV AL,0
OUT DMA+13,AL ;总清
MOV AL,40H
OUT DMA+2,AL ;送地址低字节到通道 1
MOV AL,74H
OUT DMA+2,AL ; 送地址高字节到通道 1,7440H为通道基地址
MOV AL,64H
OUT DMA+3,AL ;送传送字节数低字节到通道 1
MOV AL,0 ; 0064H表示 100个字节
OUT DMA+3,AL ;送传送字节数高字节到通道 1
MOV AL,59H ;通道 1方式字:读操作,单字节传送;地址递增,自动预置
OUT DMA+11,AL
MOV AL,0 ;命令字:允许工作,固定优先级
OUT DMA+8,AL ; DACK有效
OUT DMA+15,AL ;写入四通道屏蔽寄存器,规定允许 4; 个通道均可请求 DMA传送 。