6. DMA技术(8237A)


1.DMA概述

  • 原理

    • DMA方式通过专用接口,能让存储器与高速外设之间直接交换数据,不需要CPU干预
    • 内存地址的修改、传送开始和结束控制都由硬件电路实现,大大提高了传输速度。
  • 特点

    • 硬件控制代替软件控制。由DMA控制器来实现,是DMA传输的核心
  • 工作状态

    • 被动工作状态:CPU对DMAC进行控制和指挥。如:向DMAC写入内存传送区的首地址、传送字节数和控制字。此时DMAC相当于一个外设,称为总线从模块受控器
    • 主动工作状态:DMAC取代CPU,获得总线控制权,向存储器和外设发信号,称为总线主模块总控器
  • DMA传送过程

    1. 申请阶段
      1. 外设向DMAC发出DREQ(DMA请求信号)
      2. DMAC通过CPU的HOLD引脚向CPU发出HRQ(总线请求信号)
    2. 响应阶段
      1. 当前总线周期结束后,CPU释放总线控制权,向DMAC发出HLDA(总DMA响应信号)
      2. DMAC向外设发出DACK(应答信号),通知可以开始进行DMA传输
    3. 数据传送阶段
      1. DMAC送出地址和控制信号,进行外设与内存间的数据传输
    4. 传送结束阶段
      1. DMAC产生结束信号给外设,外设撤销DREQ信号,引起HRQ信号无效。
      2. CPU收到HRQ无效信号,使HLDA无效,收回对总线的控制权
  • DMA传送方式

    1. 单字节传送方式:每传送一个字节数据,DMAC放弃总线控制权
      1. 特点:DMAC不会长时间占用总线。CPU与DMAC轮流控制总线,不会对系统运行产生较大影响
      2. 缺点:DMA传输效率低
    2. 数据块传输方式:连续传输多个字节。全部传送完毕,或被外部强制停止,才释放总线控制权
      1. 优点:传输效率高
      2. CPU长时间不能控制总线,传输数据较多会对系统产生影响
    3. 请求传输方式:每传输一个字节后,DMAC检测外设的DREQ信号,DREQ无效则停止DMA传输,归还总线控制权
      1. 优点:实现灵活,外设可用DREQ信号控制DMA传输过程
    4. 级联传输方式:从片向主片申请总线,再由主片向CPU申请
  • DMA操作类型

    • DMA读读存储器,把数据由存储器传送到外设
    • DMA写写存储器,把数据从外设写入存储器
    • 存储器到存储器:内存区域到内存区域的读写
    • DMA校验:不进行数据传送,对数据块内部的每个字节进行校验

2.DMA控制器8237A

8237是一款可编程的通用DMAC,可实现内存/外存内存/内存最高达1.6MB/s的传输速率。其拥有4个独立通道,最多可拓展4个从片共16个通道。每个通道一次最多传输64KB数据

  1. 内部结构:

  2. 外部引脚

    1. 请求与应答信号
      1. DREQ0~DREQ3:0优先级最高
      2. HRQ:使用总线请求信号
      3. HLDA
      4. DACK0~DACK3,同一时刻,一个有效
    2. 被动状态下的信号线
      1. A0~A3:访问内部寄存器
      2. DB0~DB7:双向,传送命令或状态
      3. /CS :片选信号
      4. /IOR:CPU读取8237内部状态寄存器
      5. /IOW:CPU向8237写命令及初始化参数
      6. CLK
      7. RESET
    3. 主动状态下的信号线
      1. A0~A7:输出低8为存储器地址
      2. DB0~DB7:数据线/高8位地址线分时复用
      3. ADSTB:将高8位地址锁存在外部锁存器
      4. AEN:有效时,将锁存的高8为地址送入系统总线
      5. /MEMR:从存储器读数据
      6. /MEMW:将数据写入存储器
      7. /IOR:从外设读取数据
      8. /OW:将数据写入外设
      9. READY:控制总线周期长度;DMA传送期间,若READY无效,则插入等待周期
      10. /EOP:结束信号
  3. 工作时序(时钟独立于CPU)

    1. S0—过渡周期

      1. 外设发出DREQ请求,8237A向CPU发出HRQ请求,等待CPU让出总线控制权
      2. 得到CPU的HLDA响应后,结束S0状态
    2. S1—地址周期

      1. 使AEN有效,8237用DB0~DB7送出高8位地址A8~A15到地址总线
      2. 用ADSTB将高8位地址送入锁存器
    3. S2—地址输出周期

      1. 向外设送出DACK信号,寻址IO外设
      2. 送出16位RAM地址,用ADSTB下降沿锁存
    4. S3—数据读出周期

      1. 送出数据读控制信号,数据放到数据线上
    5. S4—数据写入周期

      1. 送出写操作所需的控制信号

      2. S3状态结束时:

        Ready无效,插入Sw周期

        Ready有效,进入S4周期

    6. 存储器之间数据传输

      1. 暂存8237A暂存寄存器,需要4*2个周期
    7. 拓展写

      1. 使写信号在S3开始有效,增加写操作时间
    8. 压缩时序

      1. 条件:追求告诉传输,期间的读写速度又跟得上时
      2. 将S3省略,一个字节传输最少只要2个时钟周期(S2,S4)

3.寄存器及地址

1.通道专用寄存器

  1. 基本地址寄存器(只写
    • 存放DMA传送的内存起始地址
  2. 当前地址寄存器
    • 存放DMA传送的当前内存地址,每次DMA传输后,其值自动加1或减1
    • 初值与基址寄存器相同,CPU一并写入
    • 自动预置时,从基址寄存器装入初值
  3. 基本字节寄存器
    • DMA传送的总字节数。传送N字节,则写入N-1
  4. 当前字节寄存器
    • DMA传送中未传完的字节数
    • 每传送一个字节,其值减1。减为**-1**时,传送结束,EOP信号有效
    • 其余同当前地址寄存器

2.通道公用寄存器

  1. 工作方式寄存器
    • D7D6
      • 00:请求传输
      • 01:单字节
      • 10:块传输
      • 11:级联方式
    • D50,地址1;1,地址1
    • D40非自动预置;1,自动预置
    • D3D2
      • 00:校验
      • 01:DMA写
      • 10:DMA读
      • 11:无效
    • D1D0:4个通道
  2. 命令寄存器
    • D70,DACK低有效
    • D60,DREQ高有效
    • D5:0,滞后写;1拓展写
    • D4:0,固定优先级;1循环优先级
    • D3:0,普通时序;1压缩时序
    • D20启动;1,停止
    • D1:0,通道0地址不保持;1通道0地址保持
      • D0=1时生效,通道0寄存器存放源地址,通道1寄存器存放目标地址
      • 通道0地址保持,可使同一数据传输到整个目标内存区域
    • D0:0,禁止M→M;1允许M→M
  3. 状态寄存器(只读)
    • D7~D41表示对应位有DMA请求
    • D3~D01表示对应通道传输结束
  4. 屏蔽寄存器
    1. 单通道屏蔽
      1. D21屏蔽;0,开通
      2. D1D0:通道选择
    2. 四通道屏蔽
      1. D3~D01表示对应通道屏蔽DMA请求
  5. 请求寄存器
    1. 作用
      1. 块传输方式下用软件启动DMA请求
    2. 方式
      1. D21有请求;0,无请求
      2. D1D0:通道选择
  6. 暂存寄存器

    • M→M传输中,暂存从源地址读出的数据,复位时清空

3.地址

  • 00H~07H,4个通道各占两个地址,00H为地址寄存器01H字节计数器
  • 08H,状态寄存器命令寄存器
  • 09H,请求寄存器
  • 0AH,单通道屏蔽寄存器
  • 0BH,工作方式寄存器
  • 0CH,清除先/后触发器命令
    • 触发器用于依次读入低、高字节;0低,1高
    • 初始化时使用
  • 0DH,读,暂存器寄存;写,总清命令
    • 屏蔽寄存器置1,清0其他寄存器
  • 0EH,四通道屏蔽寄存器
    • 四通道屏蔽位均清0,允许DMA请求
  • 0FH,四通道屏蔽寄存器

4.编程

  1. 发送总清命令(复位)
  2. 写基本地址和当前地址寄存器
  3. 写基本字节和当前字节寄存器
  4. 写工作方式寄存器
  5. 写命令寄存器
  6. 写屏蔽寄存器
  7. 写请求寄存器(可选)

例题


  • 利用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
    45
    OUT 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