当前位置:文档之家› DMA传输原理

DMA传输原理


15
+5V HOLD HLDA CLK 使微处理器地址锁存信号无效 1 EN 锁存缓冲器 STB 连接数据总线 M/IO A8~A15 HRQ HLDA CLK AEN ADSTB 方式寄存器 DB0~7 基本地址寄存器 基本字节计数器 CS A4~A7 A0~A3 1 2 通道0 DREQ0 DACK0 DREQ1 DACK1 DREQ2 DACK2 DREQ3 DACK3 EOP 16 当前地址寄存器 当前字节计数器 地 控制寄存器 状态寄存器 暂存寄存器 公 共 部 份 电源 IOR IOW MEMR MEMW READY 1:请求触发器 2:屏蔽触发器
24
6.2.3 8237A的对外连接信号
8237A作为从模块时的引脚信号(1)
RESET—复位输入端,高电平有效。复位时,屏蔽寄存器 被置1,其他寄存器均清0。 CS# ——片选输入端,低电平有效,由A4~A15译码得到。 为低电平时,8237A被选中,CPU可以对8237A进 行读写(进行预置或读取工作状态)。 A3~A0—最低的4位地址线,双向信号引脚。DMA控制器 作为从模块时,A3~A0作为输入端,用来选择 DMAC内部的16个端口地址。
在DMA传送之前,8237A从DB0~DB7把存储器地址 的A8~A15送入这个锁存器。
在DMA周期里,锁存器将锁存的地址送往系统地址 总线的A8~A15,同时从A0~A7引脚发送地址的低八位。
23
5. 页面地址寄存器(外接)
8237A控制了地址总线的16位,所以最多只能连续传 送64K字节的数据。 为了控制8086系统20位的物理地址,需要外接一个四位 的“页面地址寄存器”(PC机地址:83H) 页面地址寄存器的值由CPU写入 8237A发送低16位地址时,高四位的地址从页面地址寄 存器发往地址总线的A16~A19
7
[例]:用DMA方式将串行通信口接收到的200字节 的数据存入以BUFFER为首地址内存区域
对DMAC进行预置:向DMAC写入内存首地址,传输字 节数(200),传输方向(外设接口→内存),控制命令 (允许DMA传输)等;
对串行通信接口进行初始化,设置串行通信的参数,允 许串行输入等; 串口每输入一个数据,自动进行DMA传输; 最后一个数据传输结束后,DMAC发出传输结束信号 EOP。CPU可以通过查询知道传输已经结束,也可以利 用EOP信号申请中断,在中断服务程序里进行结束处理。 DMA方式传输200字节过程为:1次对DMAC初始化, 1次对串口初始化, 200次DMA周期,1次结束处理。
第6 章
6.1 DMA传输原理
DMA传输
6.2 DMA控制器8237A
6.3 8237A的编程使用
1
直接存储器传送
(Direct Memory Access—DMA) 将外设的数据不经过CPU直接送入内存储器, 或者,从内存储器不经过CPU直接送往外部设备
M
CPU
I/O
一次DMA传送只需要执行一个DMA周期(相当于 一个总线读/写周期),因而能够满足高速外设数 据传输的需要。
21
3. 控制逻辑


DMA周期内,控制逻辑通过产生控制信号和16位要存 取的存储单元地址来控制DMA操作步骤。
初始化时,通过对方式寄存器编程,使控制逻辑可以 对各个通道的操作进行控制。
22
4. 锁存缓冲器(外接)
使用8237A工作时,需要外接一个八位的地址锁存缓 冲电路,它能够储存八位的地址信号,通过可控的三 态门连接系统地址总线。
13
3. 8237A的传输类型
(1)DMA写传输(I/O→存储器) (2)DMA读传输(存储器→I/O) (3)DMA检验 (完成校验过程,测试DMA控制器的状态)。 (4)存储器到存储器传输
14
6.2.2 8237A的内部结构和外部连接
8237A的内部结构分成二部分: 四个DMA通道和一个公共控制部分
28
(2)对存储器/外设接口的读写控制信号
IOR#——作为主模块时,IOR#输出外设接口的读控制信 号,信号有效时,I/O接口部件中的数据被读出 送往数据总线。 IOW#——作为主模块时,IOW#输出外设接口的写控制信 号,信号有效时,存储器中读出的数据被写入 I/O接口中。 READY——准备就绪信号,输入,高电平有效。所用的存 储器或I/O接口的速度较慢时,使READY处于 低电位,8237A会自动插入等待周期。数据准备 就绪时,READY端为高电平,表示可以进行数 据传输。 29
8
3.
8086系统中的DMA信号
•最小模式 CPU通过HOLD接收DMA控制器的总线请求; 在HLDA引脚上发出对总线请求的允许信号。 •最大模式 通过RQ/GT0和RQ/GT1引脚接收DMA控制器的 总线请求,发送对总线请求的允许信号。 RQ/GT0引脚有较高的优先权。
9
6.2 DMA控制器8237A
18
DMA通道--字节计数器
• 字节计数器由基本字节计数器和当前字节计数器组成。 • 编程时,由指令把DMA传输的字节数写入基本字节计数器, 继而传送到当前字节计数器(初值要比实际传输的字节数少1) • 每进行一次DMA传输,当前字节计数器自动减1。它的值由0 减到FFFFH(-1)时,产生计数结束信号EOP。 • 当前计数器的值可以由CPU通过输入指令分两次读出。
26
8237A作为总线主模块时的引脚信号
(1)地址信号
A3~A0—— DMAC为主模块时,提供存储器最低4位地址 (输出) 。 A7~A4 —- 提供存储器的中间4位地址(输出) DB7~DB0— 输出当前地址寄存器中的高8位地址,并通过信号 ADSTB打入外部锁存器,和A7~A0输出的低8位 地址一起构成16位地址。
19
2. 读/写逻辑
8237A在系统总线中作为“从模块”时
• 接收CPU对I/O接口的读(IOR#)、写(IOW#)信号; • 对地址总线的低4位 (A0 ~A3) 译码; • 片选和IOW#信号有效时,把数据总线的内容写入所寻 址的寄存器; • 片选和IOR#有效时,把选择的寄存器内容送到数据总 线上。
10
2. 8237A的工作方式
(1)单字节传输方式
8237A每申请一次总线,进行1个字节传输,然后释放系 统总线,一次DMA传输结束。
CPU可以在每个DMA周期结束后控制总线,进行数据传输, 所以不会对系统的运行产生大的影响。
(2)块传输方式
DMA控制器获得总线控制权后,可以连续进入多个DMA周 期,进行多个字节的传输(最多64K字节)。 这种方式可以获得最高的数据传输速度。如果一次传输的数 据较多,对系统工作可能产生一定的影响。
11
(3)请求传输方式
• 申请一次总线可以连续进行多个数据的传输。
• 每传输1个字节后,8237A都对外设接口的请求信号 进行测试:
DREQ端无效,暂停传输;
DREQ有效,接着进行下一个数据的传输。
• 允许数据不连续,按照外设的最高速度进行数据传输, 使用比较灵活。
12
(4)级联传输方式
• 几个8237A进行级联,一片8237A用作主片,其余用 作从片,构成主从式DMA系统。 • 从片收到外设接口的DMA请求信号后,向DMA控制器 主片申请,再由主片向CPU申请。 • 一片主片最多可以连接四片从片。这样,五片8237A 构成的二级DMA系统,可以得到16个DMA通道。 • 级联时,主片通过软件在方式寄存器中设置为级联 传输方式。从片设置成上面的三种方式之一。
(2)对存储器/外设接口的读写控制信号
MEMR#——存储器读信号,低电平有效,输出。信号有效 时,所选中的存储器单元的内容被读到数据 总 线。 MEMW#——存储器写信号,低电平有效,输出。信号有 效时,数据总线上的内容被写入选中的存储单 元。
30
(3) DMA联络信号
DREQ——通道DMA请求信号,输入。 每个通道对应一个DREQ信号端,它的极性可以 通过编程来选择。 外设接口要求DMA传输时,使DREQ处于有效, DMAC控制器送来DMA响应信号DACK以后, 接口撤除DREQ的有效电平。
27
地址信号
ADSTB——地址选通信号,输出,高电平有效。信号有效 时,将DMAC高8位地址经DB7~DB0送到外部 锁存器。 AEN——地址允许信号,输出,高电平有效。 把高12位地址(地址锁存器中高8位、页面地址寄 存器最高4位)一起送到地址总线上,与芯片直接 输出的低8位地址共同构成20位内存地址。 AEN信号也使与CPU相连的地址锁存器无效。保证 地址总线上的信号来自DMA控制器,而不是来自 CPU。
6
2. DMA传输过程
• 总线请求:DMAC向CPU申请使用总线
• 总线控制转移:CPU同意DMAC管理总线
• 数据传输:外设接口和存储器之间传输数据
• 修改地址和计数器:为下一次传输做准备
• 结束处理:DMAC放弃对总线的控制权
• 以上的过程完全由硬件电路实现,速度很快。
• 用DMA方式进行一次数据传输所经历的时间称为 “DMA周期”,大体上相当于一次总线读写周期的时 间。
25
8237A作为从模块时的引脚信号(2)
IOR#——I/O设备读信号,双向、三态、低电平有效。 作为从模块时为输入。有效时,CPU读DMA控 制器内部寄存器的值。 IOW#——I/O设备写信号,双向、三态、低电平有效。 作为从模块时输入。有效时,CPU向DMA控制 器的内部寄存器中写入信息(进行编程)。 DB7~DB0——8位双向三态数据线。DMA控制器作为从 模块时,CPU通过DB
• 由基地址寄存器和当前地址寄存器组成。 • 对8237编程时,把本通道DMA传输的地址初值写入基地址寄 存器,再由8237A传送到当前地址寄存器。 • 当前地址寄存器在每次DMA传输后自动加 1或减1。 • CPU可以通过输入指令读出当前地址寄存器值(每次读8位)。 基地址寄存器不能被读出,且一直保持初值。 • 数据块传送完成后,可以把当前地址寄存器的内容恢复为基 地址寄存器保存的初值。 (需要在编程时设置“自动预置”方式)
相关主题