DMA技术(8237A)
6. DMA技术(8237A)
1.DMA概述
-
原理
- DMA方式通过专用接口,能让存储器与高速外设之间直接交换数据,不需要CPU干预
- 内存地址的修改、传送开始和结束控制都由硬件电路实现,大大提高了传输速度。
-
特点
- 硬件控制代替软件控制。由DMA控制器来实现,是DMA传输的核心
-
工作状态
- 被动工作状态:CPU对DMAC进行控制和指挥。如:向DMAC写入内存传送区的首地址、传送字节数和控制字。此时DMAC相当于一个外设,称为总线从模块或受控器
- 主动工作状态:DMAC取代CPU,获得总线控制权,向存储器和外设发信号,称为总线主模块或总控器
-
DMA传送过程
-
申请阶段
- 外设向DMAC发出DREQ(DMA请求信号)
- DMAC通过CPU的HOLD引脚向CPU发出HRQ(总线请求信号)
-
响应阶段
- 当前总线周期结束后,CPU释放总线控制权,向DMAC发出HLDA(总DMA响应信号)
- DMAC向外设发出DACK(应答信号),通知可以开始进行DMA传输
-
数据传送阶段
- DMAC送出地址和控制信号,进行外设与内存间的数据传输
-
传送结束阶段
- DMAC产生结束信号给外设,外设撤销DREQ信号,引起HRQ信号无效。
- CPU收到HRQ无效信号,使HLDA无效,收回对总线的控制权
-
-
DMA传送方式
- 单字节传送方式:每传送一个字节数据,DMAC放弃总线控制权
- 特点:DMAC不会长时间占用总线。CPU与DMAC轮流控制总线,不会对系统运行产生较大影响
- 缺点:DMA传输效率低
- 数据块传输方式:连续传输多个字节。全部传送完毕,或被外部强制停止,才释放总线控制权
- 优点:传输效率高
- CPU长时间不能控制总线,传输数据较多会对系统产生影响
- 请求传输方式:每传输一个字节后,DMAC检测外设的DREQ信号,DREQ无效则停止DMA传输,归还总线控制权
- 优点:实现灵活,外设可用DREQ信号控制DMA传输过程
- 级联传输方式:从片向主片申请总线,再由主片向CPU申请
- 单字节传送方式:每传送一个字节数据,DMAC放弃总线控制权
-
DMA操作类型
- DMA读:读存储器,把数据由存储器传送到外设
- DMA写:写存储器,把数据从外设写入存储器
- 存储器到存储器:内存区域到内存区域的读写
- DMA校验:不进行数据传送,对数据块内部的每个字节进行校验
2.DMA控制器8237A
8237是一款可编程的通用DMAC,可实现内存/外存,内存/内存最高达1.6MB/s的传输速率。其拥有4个独立通道,最多可拓展4个从片共16个通道。每个通道一次最多传输64KB数据
-
内部结构:
-
外部引脚
- 请求与应答信号
- DREQ0~DREQ3:0优先级最高
- HRQ:使用总线请求信号
- HLDA
- DACK0~DACK3,同一时刻,一个有效
- 被动状态下的信号线
- A0~A3:访问内部寄存器
- DB0~DB7:双向,传送命令或状态
- /CS :片选信号
- /IOR:CPU读取8237内部状态寄存器
- /IOW:CPU向8237写命令及初始化参数
- CLK
- RESET
- 主动状态下的信号线
- A0~A7:输出低8为存储器地址
- DB0~DB7:数据线/高8位地址线分时复用
- ADSTB:将高8位地址锁存在外部锁存器
- AEN:有效时,将锁存的高8为地址送入系统总线
- /MEMR:从存储器读数据
- /MEMW:将数据写入存储器
- /IOR:从外设读取数据
- /OW:将数据写入外设
- READY:控制总线周期长度;DMA传送期间,若READY无效,则插入等待周期
- /EOP:结束信号
- 请求与应答信号
-
工作时序(时钟独立于CPU)
-
S0—过渡周期
- 外设发出DREQ请求,8237A向CPU发出HRQ请求,等待CPU让出总线控制权
- 得到CPU的HLDA响应后,结束S0状态
-
S1—地址周期
- 使AEN有效,8237用DB0~DB7送出高8位地址A8~A15到地址总线
- 用ADSTB将高8位地址送入锁存器
-
S2—地址输出周期
- 向外设送出DACK信号,寻址IO外设
- 送出16位RAM地址,用ADSTB下降沿锁存
-
S3—数据读出周期
- 送出数据读控制信号,数据放到数据线上
-
S4—数据写入周期
-
送出写操作所需的控制信号
-
S3状态结束时:
Ready无效,插入Sw周期
Ready有效,进入S4周期
-
-
存储器之间数据传输
- 暂存8237A暂存寄存器,需要4*2个周期
-
拓展写
- 使写信号在S3开始有效,增加写操作时间
-
压缩时序
- 条件:追求告诉传输,期间的读写速度又跟得上时
- 将S3省略,一个字节传输最少只要2个时钟周期(S2,S4)
3.寄存器及地址
1.通道专用寄存器
-
基本地址寄存器(只写)
- 存放DMA传送的内存起始地址
-
当前地址寄存器
- 存放DMA传送的当前内存地址,每次DMA传输后,其值自动加1或减1
- 初值与基址寄存器相同,CPU一并写入
- 自动预置时,从基址寄存器装入初值
-
基本字节寄存器
- DMA传送的总字节数。传送N字节,则写入N-1
-
当前字节寄存器
- DMA传送中未传完的字节数
- 每传送一个字节,其值减1。减为**-1**时,传送结束,EOP信号有效
- 其余同当前地址寄存器
2.通道公用寄存器
-
工作方式寄存器
- D7D6
- 00:请求传输
- 01:单字节
- 10:块传输
- 11:级联方式
- D5:0,地址加1;1,地址减1
- D4:0,非自动预置;1,自动预置
- D3D2
- 00:校验
- 01:DMA写
- 10:DMA读
- 11:无效
- D1D0:4个通道
- D7D6
-
命令寄存器
- D7:0,DACK低有效
- D6:0,DREQ高有效
- D5:0,滞后写;1,拓展写
- D4:0,固定优先级;1,循环优先级
- D3:0,普通时序;1,压缩时序
- D2:0,启动;1,停止
- D1:0,通道0地址不保持;1,通道0地址保持
- 当D0=1时生效,通道0寄存器存放源地址,通道1寄存器存放目标地址
- 通道0地址保持,可使同一数据传输到整个目标内存区域
- D0:0,禁止M→M;1,允许M→M
-
状态寄存器(只读)
- D7~D4:1表示对应位有DMA请求
- D3~D0:1表示对应通道传输结束
-
屏蔽寄存器
-
单通道屏蔽
- D2:1,屏蔽;0,开通
- D1D0:通道选择
-
四通道屏蔽
- D3~D0:1表示对应通道屏蔽DMA请求
-
-
请求寄存器
-
作用
- 块传输方式下用软件启动DMA请求
-
方式
- D2:1,有请求;0,无请求
- D1D0:通道选择
-
-
暂存寄存器
- M→M传输中,暂存从源地址读出的数据,复位时清空
3.地址
- 00H~07H,4个通道各占两个地址,00H为地址寄存器,01H为字节计数器
- 08H,读为状态寄存器;写为命令寄存器
- 09H,请求寄存器
- 0AH,单通道屏蔽寄存器
- 0BH,工作方式寄存器
- 0CH,清除先/后触发器命令
- 触发器用于依次读入低、高字节;0低,1高
- 初始化时使用
- 0DH,读,暂存器寄存;写,总清命令
- 屏蔽寄存器置1,清0其他寄存器
- 0EH,清四通道屏蔽寄存器
- 四通道屏蔽位均清0,允许DMA请求
- 0FH,四通道屏蔽寄存器
4.编程
- 发送总清命令(复位)
- 写基本地址和当前地址寄存器
- 写基本字节和当前字节寄存器
- 写工作方式寄存器
- 写命令寄存器
- 写屏蔽寄存器
- 写请求寄存器(可选)
例题
-
利用DMA方式实现内存到内存的数据传送。内存源地址:从2000H开始,1000H个字节。内存目标地址:从4000H开始。假设8237A的I/O端口地址位70H~7FH。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45OUT 7DH,AL
MOV AL,00H //通道0基本地址寄存器
OUT 70H,AL
MOV AL,20H
OUT 70H,AL
MOV AX,1000H //通道0基本字节寄存器
DEC AX
OUT 71H,AL
MOV AL,AH
OUT 71H,AL
MOV AL,00H //通道1基本地址寄存器
OUT 72H,AL
MOV AL,40H
OUT 72H,AL
MOV AX,1000H //通道1基本字节寄存器
DEC AX
OUT 73H,AL
MOV AL,AH
OUT 73H,AL
MOV AL,88H//通道0,块传送,自动加1,非自动预置,读
OUT 7BH,AL
MOV AL,85H //通道1
OUT 7BH,AL
MOV AL,81H //命令寄存器
OUT 78H,AL
MOV AL,00H //屏蔽寄存器
OUT 7FH,AL
MOV AL,04H //请求寄存器
OUT 79H,AL
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 喵喵虎冲呀!
评论