第十二章 DMA控制器 12.1 概述 12.2 8237A DMA控制器 12.3 8237A的应用
12.1 概述 DMA=Direct Memory Access,直接存储器存取 数据通道 数据通道 CPU DMAC 数据通道 内存 外设 12.1 概述 DMA=Direct Memory Access,直接存储器存取 数据通道 数据通道 CPU DMAC 数据通道 内存 外设 内存 外设 非DMA方式 (包括程序控制方式和中断方式) DMA方式
概述 DMAC具有独立的控制三大总线来访问存储器和I/O端口的能力,它能像CPU一样提供数据传送所需的地址信息和读写控制信息 DMAC和CPU都挂在系统总线上,当进入DMA方式时,DMAC成为总线主控。 在总线上,可以控制其他部件的部件称为总线主控或主控(bus master),被控部件称为从控(slave)。任意时刻,总线上只有一个主控。
概述 DMA初始化 DMA操作之前,应先对DMAC编程,把要传送的数据块长度、数据块在存储器中的起始地址,数据传送方向等信息发送给DMAC 传送结束
概述 DMA请求阶段 当外设要求以DMA方式为它服务时,发DMA请求信号DREQ到DMAC DMAC检查该信号是否被屏蔽及其优先权,如确认该信号有效则向CPU发送总线请求信号HRQ(连到CPU的HOLD) 地址总线 CPU 存储器 数据总线 HRQ DREQ DMAC 外设
概述 DMA响应和数据传送阶段 每个总线周期结束时CPU检测HOLD,如为高电平,则响应HOLD请求进入保持态,使三态总线CPU侧呈高阻状态,并以总线保持响应信号HLDA通知DMAC DMAC接管总线,并以DACK信号通知外设,使之成为DMA传送时被选中的设备,同时DMAC给出内存地址以及I/O读写和存储器读写控制信号,在外设和存储器之间完成数据传送 地址总线 CPU 存储器 数据总线 HLDA MEMR/MEMW DACK 外设 DMAC IOR/IOW
概述 传送结束阶段 传送完成后,DMAC放弃总线,撤消总线请求(HRQ为低),CPU检测到HRQ(HOLD)为低后,撤消HLDA,CPU重新获得总线控制权 地址总线 CPU 存储器 数据总线 HRQ EOP DMAC 外设
12.2 8237A DMA控制器 一、内部结构 PC系列微机使用可编程DMA控制器 8237A(简称8237)实现DMA功能 8237有四个通道,每个通道都有独立的与相应外设接口相联系的信号,四个通道共享与CPU相连的控制信号、地址信号、数据信号 PC/AT以上的微机使用两片8237,Pentium微机系统中没有独立的8237芯片,其功能集成在芯片组中
8237的编程结构
12.2 8237A DMA控制器 二、引脚功能
8237的引脚功能 请求/应答信号 外设接口电路向8237的请求信号:DREQ3~DREQ0 8237对外设接口电路的应答信号:DACK3~DACK0 8237向CPU申请总线的信号:HRQ(连至CPU的HOLD) CPU向8237传送的允许使用总线信号:HLDA
8237的引脚功能 地址信号 :CPU初始化8237或读8237状态时所需的片选信号 A7~A0(输出):8237访问存储器的地址信号的低8位。 A3~A0(输入):CPU初始化8237或读8237状态时,用于寻址8237内部寄存器
8237的引脚功能 数据信号(双向): DB7~DB0 CPU为主控时,可以通过I/O读命令查询8237的状态寄存器的内容,或通过I/O写命令对8237的内部寄存器进行编程,数据传送通过DB7~DB0 8237为主控时, DB7~DB0输出要访问的内存地址的高8位,并通过ADSTB锁存到外部地址锁存器中,和A7~A0输出的低8位地址一起构成16位地址
8237的引脚功能 地址允许信号:AEN 8237作为主控时(8237控制总线),输出AEN=1。 8237作为从控时(CPU控制总线),输出AEN=0。 DMA传输结束信号: (双向) 当DMAC内部任一通道传输结束,8237发出 若由外部给DMAC送入有效的 ,则强制DMAC内部 所有通道结束传输。
8237的引脚功能 MEMR/MEMW: 8237发出的存储器读/写信号 IOR/IOW: 8237作为主控时,输出的I/O读/写信号。 8237作为从控时,CPU发出的I/O读/写信号,用于读/写8237
8237的引脚功能 ADSTB:地址选通信号 用于启动地址锁存器 READY:存储器或I/O的就绪信号
三、8237的编程结构
8237的编程结构 控制寄存器 8位,4个通道共用,用于设定8237的信号形式、工作时序、传输方向。 端口地址08H 信号形式:DREQ/DACK信号的有效形式。 工作时序:普通时序(3个时钟周期完成一次传输) 压缩时序(2个时钟周期完成一次传输) 传输方向:内存 I/O(常用) I/O内存(常用) 内存内存(PC系列机未用)
8237的编程结构 D7: 0= DACK低电平有效; 1=DACK高电平有效 D6: 0= DREQ高电平有效; 1=DREQ低电平有效 D5: 1=扩展写信号,IOW/MEMW比正常时序提前一个周期; 0=不扩展写信号 D4: 0=固定优先级,通道0优先级最高,通道3优先级最低; 1=循环优先级 D3: 0=正常时序 1=压缩时序 D2: 0=启动(指允许)8237工作 ;1=停止(指禁止) 8237工作 D1:内存到内存传输时,D1=1使源地址保持不变 D0:0=内存 I/O间的传输; 1=内存内存间的传输
8237的编程结构 控制寄存器 PC系列微型机中,BIOS初始化时将控制寄存器设为 00H—— 禁止内存内存的传送, 允许读/写操作, 使用正常时序 固定优先级 不扩展写信号 DREQ高电平有效 DACK高电平有效
8237的编程结构 状态寄存器 8位,4个通道共用,与控制寄存器共用一个端口地址 端口地址08H 记录每个通道是否有请求、传输是否结束 D3~D0:分别对应通道3~0,指出4个通道的DMA传 送是否结束,结束为1 D7~D4:分别对应通道3~0,表示4个通道是否有 DMA请求,有DMA请求为1
8237的编程结构 暂存寄存器 8位 , 端口地址0DH 在内存内存传输时,暂存数据。 注意:内存 I/O传输时,数据不进入8237内部,只存在于数据总线上
8237的编程结构 模式寄存器 8位,设定DMA的传输模式,4个通道的模式寄存器共用一个端口地址,端口地址0BH 传输模式: 单字节传输模式 数据块传输模式 请求传输模式 级联传输模式
8237的编程结构 模式寄存器 单字节传输模式:每次DMA操作只传送一字节后,接着8237释放总线 块传输模式:8237获得总线控制权后,连续传送多个字节,每传输一个字节,当前字节计数器减1,当前地址寄存器加1或减1,直到所要求的字节数传输完(当前字节计数器减至0),8237在EOP引脚上发出结束信号,然后释放总线。在块传输过程中,若向8237的EOP引脚上输入低电平,可强行结束传输。
8237的编程结构 模式寄存器 请求传输模式: 在传输过程中,8237要检测DREQ信号(询问外设),当DREQ为低时,8237暂停传输(不释放总线),当DREQ再次有效后,继续进行传输。 级联传输模式: 多片8237级联时,可以构成主从式DMA系统。级联的方式是把从片的请求线HRQ连至主片的DREQ引脚,主片的DACK联至从片的HLDA引脚 若主8237的某通道(DREQ)连接从8237的HRQ,主8237的该通道应设置为级联传输模式,但从8237不设置级联传输模式,而是设置其它三种模式之一
8237的编程结构 D7,D6:模式选择 00= 请求传输模式 01=单字节传输模式 10= 块传输模式 11=级联传输模式 自动预置:在当前字节计数器到达0时,当前字节计数器和当前地址寄存器从基本字节计数器和基地址寄存器中自动获得新的初值
8237的编程结构 D3,D2:传输类型选择 01=写传输(I/O内存),10=读传输(内存 I/O) 00=校验传输 ,11=无意义 00=通道0 01=通道1 10=通道2 11=通道3
8237的编程结构 基地址寄存器和当前地址寄存器 每个通道一个基地址寄存器,一个当前地址寄存器,16位 ,占用相同的端口地址 基地址寄存器:DMA传输的内存地址初值,在初始化时由CPU分两次写入。 当前地址寄存器:DMA传输过程中,内存地址的当前值。每传输一字节,该寄存器的值增1或减1。CPU可 分两次读出其值。
8237的编程结构 基本字节计数器和当前字节计数器 每个通道一个基本字节计数器,一个当前字节计数器,16位 ,占用相同的端口地址 基字节计数器:DMA传输的字节数初值,在初始化时由CPU分两次写入。8237规定,初值比实际传输的字节数少1 当前字节计数器:DMA传输过程中,当前的计数值。每传输一字节,该寄存器的值减1。当计数值减到FFFFH时,8237发出结束信号EOP。CPU可分两次读出其值。
8237的编程结构 先/后触发器 端口地址0CH CPU写入基地址寄存器、基本字节计数器时,均分两次写入,先/后触发器用于控制写入的值是低8位还是高8位 写入过程: ①使先/后触发器=0。 ②写入低8位,先/后触发器自动置1。 ③写入高8位,先/后触发器自动置0。
8237的编程结构 请求寄存器 端口地址09H 四个通道的请求触发器构成一个请求寄存器(8位) 一般情况下,DMA请求由硬件信号DREQ发出,也可由软件设置请求触发器来发出DMA请求。 端口地址09H D2=1设置DMA请求 D1~D0:指定软件DMA请求的通道
8237的编程结构 屏蔽寄存器 端口地址0AH 四个通道的屏蔽触发器构成一个屏蔽寄存器(8位) 当屏蔽寄存器的屏蔽标志置1时,将禁止该通道的硬件DMA请求和软件DMA请求。 端口地址0AH D2=1,设置屏蔽; D2 =0,清除屏蔽; D1~D0:选通道
8237的编程结构 综合屏蔽寄存器 端口地址0FH 8237可以一次完成四个通道的屏蔽设置 D3~D0:分别对通道3~0设置屏蔽 1,设置屏蔽; 0,清除屏蔽;
8237的编程结构 清除屏蔽寄存器 端口地址0EH 对端口0EH写入0,可以一次清除四个通道的屏蔽触发器 MOV DX, DMA+0EH MOV AL, 0 OUT DX, AL
8237的编程结构 复位命令寄存器 端口地址0DH 对端口0DH写入0,使8237复位,其功能等同于硬件复位 8237复位后的状态为: 控制寄存器 状态寄存器 请求寄存器 暂存器 先/后触发器 清0 屏蔽寄存器 置1
8237的编程结构 一片8237占用连续16个端口地址,用DMA+00H~DMA+0FH表示。其中,DMA表示该片8237的基地址。 在AT以上的微机中,使用2片8237,其地址为: 第一片8237,基地址DMA=0000H,使用0000H~000F I/O地址。 第二片8237,基地址DMA=00C0H,使用00C0H~00CF I/O地址。
8237的编程结构
8237对内存和I/O的寻址 存储器寻址 在主控模式下,8237可以产生16位存储器地址信号,地址引脚A7~A0输出地址低8位,高8位地址由数据引脚DB7~DB0输 出,经地址锁存器后形成存储器地址的A15~A8。用ADSTB启动地址锁存器。 当系统的存储器地址多于16位时,多余位地址由一个称为DMA页面寄存器的接口电路提供
8237对内存和I/O的寻址 存储器寻址
8237对内存和I/O的寻址 存储器寻址 在PC/AT系统中,需要24位地址,高8位地址A23~A16由DMA页面寄存器电路74LS612提供。在DMA传输之前,用指令将高8位地址送入页面寄存器,在DMA传输过程中,由AEN信号使页面寄存器输出该8位地址。 在Pentium微机中,DMAC和相关页面寄存器的功能由多功能芯片组实现
8237对内存和I/O的寻址 I/O寻址 8237的四个通道,每一个只接一个外设接口电路,不使用I/O地址来区分I/O设备 I/O设备的端口地址只用于CPU对I/O设备的寻址
8237对内存和I/O的寻址 I/O寻址
12.2 8237A 的应用 初始化编程 写入控制寄存器 写入屏蔽寄存器——屏蔽要初始化的通道 写入模式寄存器 先后触发器置0 写入基地址和基本字节寄存器 解除屏蔽 写入请求寄存器
8237的应用 例:ROM-BIOS对通道2初始化编程的代码片段 DMA EQU 0 ;DMA通道起始端口 1) 系统在启动时,对控制寄存器进行初始化 MOV AL, 0 OUT DMA+8, AL 2) 清除先/后寄存器 OUT DMA+12, AL 3) 设置模式寄存器 MOV AL, 46H …… OUT DMA+11, AL
8237的应用 4) 送内存地址 计算内存的物理地址,将20位地址的高4位送页面寄存器,低16位先送低8位,再送高8位 …... OUT DMA+4, AL ;低8位 …… OUT DMA+4, AL ;高8位 OUT 81H, AL ;20位地址的高4位 5) 送传送字节数 6) 送屏蔽位 MOV AL, 2 OUT DMA+10, AL
8237的应用 例:利用主板上的8237通道1,将内存起始地址为80000H的300H字节直接输出给外设 MOV AL, 0 ;写模式寄存器 ;清除先/后触发器 OUT 0DH, AL ;写地址 OUT 02, AL MOV AL, 8 OUT 83H, AL ;传送的字节数 MOV AX, 300H DEC AX MOV 03, AL MOV AL, AH OUT 03, AL ;写模式寄存器 MOV AL, 49H OUT 0BH, AL ;清除通道1屏蔽 MOV AL, 1 OUT 0AH, AL ;读通道1状态 WAIT: IN 08 AND AL, 02 JZ WAIT ;完成后屏蔽通道1 MOV AL, 5 OUT 0AH, AL
作业 1. 试述8237的DMA请求/响应握手过程