DMAC
CPU与8237A通过8位数据总线交换信息
- 每个8237A芯片有4个DMA通道,就是有4个DMA控制器
- 每个DMA通道具有不同的优先权
- 每个DMA通道可以分别允许和禁止
- 每个DMA通道有4种工作方式
- 一次传送的最大长度可达64KB
- 多个8237A芯片可以级连,扩展通道数
内部组成
- 通道寄存器
- 控制和状态寄存器
| DREQ0-3 | HRQ | HLDA | DACK0-3 | ADSTB | AEN |
|---|---|---|---|---|---|
| DMA通道请求 | 总线请求 | 总线响应 | DMA通道响应 | 地址选通 | 地址允许 |
地址选通与地址允许
- ADSTB:地址选通。DMA传送开始时,输出高有效,把在DB0~DB7上输出的高8位地址锁存在外部锁存器中。
- AEN:地址允许。输出高有效,将锁存的高8位地址送入系统总线,与芯片此时输出的低8位地址组成16位存储器地址。
10种内部寄存器
配合3个软件命令操作
“软件命令”
- 不需要通过数据总线写入控制字
- 直接由地址和控制信号译码实现
保存DMA传送的当前地址值
每次传送后递增/减
可由CPU读写
传送N个字节 初始值为N-1
DMA传送剩余字节数
每次传送递减
可由CPU读写
值减为0后 再递减为FFFFH 终止计数
8237A内含一个高/低触发器 控制读写通道寄存器的高低字节
0 低字节
1 高字节
复位后 触发器为0
通道的方式控制字
最低二位选择通道
| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|
| 传送方式 | 地址增量 | 自动初始化 | 传送类型 | 通道 | |||
传送方式:
| 模式 | |
|---|---|
| 00 | 请求 |
| 01 | 单字节 |
| 10 | 数据块 |
| 11 | 级联 |
地址增量
0 自增
1 自减
工作方式
| 传送类型 | |
|---|---|
| 00 | DMA校验 |
| 01 | DMA写 |
| 10 | DMA读 |
| 11 | 非法 |
存放8237A的命令字
影响每个DMA通道
复位清零
D2=1设置8237A为DMAC
| 位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| 标志 | DACK | DREQ | 写 | 优先权 | 时序 | DMAC | 通道0地址改变 | 存储器间传送 |
| 1 | 高有效 | 低有效 | 扩展写 | 循环 | 压缩 | 禁止DMAC工作 | 禁止 | 允许 |
| 0 | 滞后写 | 固定 | 正常 |
存放DMA请求状态
D2 为置位复位
末两位为通道
主屏蔽
Di为通道i的屏蔽位
单通道屏蔽
D2 为屏蔽位
末两位为通道
可由CPU读取
低4位:读命令瞬间每个通道是否产生TC(1表示通道传送结束)
高4位:每个通道的DMA请求情况(1表示通道有请求)
复位或读出后清零
$A_3A_2A_1A_0$
- 清除高/低触发器软件命令
-
$A_3A_2A_1A_0$ =1100,使高/低触发器清零
-
- 主清除命令
-
$A_3A_2A_1A_0$ =1101,使高/低触发器清零 - 还使命令、状态、请求、临时寄存器清零
- 使屏蔽寄存器置为全1(禁止DMA请求)
- 主清除命令与硬件的RESET信号具有相同的功能
-
- 清屏蔽寄存器命令
-
$A_3A_2A_1A_0$ =1110,使4个屏蔽位都清零(允许DMA请求)
-
空闲周期:作为接口电路 受CPU控制的工作状态
有效周期:作为DMAC控制DMA传送的工作状态
DMA传送方式
-
请求传送方式
- DREQ有效就传送 无效就暂时中止
- 直到字节数寄存器为FFFFH或外部信号终结
- 可由外设利用DREQ控制传送过程
-
单字节传送方式
- 每次传送一个字节后 交还系统总线控制权
- 效率低
-
数据块传送方式
- 由DREQ启动就传送数据
- 直到字节数寄存器为FFFFH或外部信号终结
- 效率高
- CPU长时间无法控制总线
-
级联方式
- 第二级的HRQ和HLDA连到第一级某通道的DREQ和DACK上
- 实际操作由第二级芯片完成
- 第二级芯片优先权与所连2通道优先权对应
DMA传送类型
- DMA读
- 存储器
->外设 - MEMR* IOW*
- 存储器
- DMA写
- 外设
->存储器 - IOR* MEMW*
- 外设
- DMA检验:空操作
- 8237A不进行检验
- 外设可以进行DMA检验
- 存储器和IO控制线无效 不传送
DMA通道优先权
- 固定优先权:0 1 2 3
- 循环优先权:最近服务的优先最低
| 状态 | 任务/工作 |
|---|---|
| 输出16位存储器地址 | |
| 输出DMA响应信号和控制信号 | |
|
|
检测数据传送是否能够完成 决定是否插入等待状态$S_w$ |
| 完成数据传送 |
初始化编程
- 写入命令寄存器
- 可先输出主清除命令 进行软件复位
- 然后写入命令字