第 8 章 DMA 控制器
530 likes | 806 Views
第 8 章 DMA 控制器. 内容 DMA 控制器的编程结构; DMA 控制器的作为主模块和从模块时的差别 8237A 的工作模式; 8237A 的时序; 结合例子了解 8237A 的编程方法。. DMAC 在系统中. CPU. 系统总线. DMAC. 存储器. 设备 接口. DMAC 在系统中(主). CPU. 系统总线. 存储器. 设备 接口. DMAC. DMAC 在系统中(从). DMA 控制器一般结构. 8237 A 原理. 4 个通道 控制寄存器 状态寄存器 每个通道 模式寄存器 16 位地址寄存器
第 8 章 DMA 控制器
E N D
Presentation Transcript
第8章 DMA控制器 内容 • DMA控制器的编程结构; • DMA控制器的作为主模块和从模块时的差别 • 8237A的工作模式; • 8237A的时序; • 结合例子了解8237A的编程方法。
DMAC在系统中 CPU 系统总线 DMAC 存储器 设备 接口
DMAC在系统中(主) CPU 系统总线 存储器 设备 接口 DMAC
8237A原理 • 4个通道 • 控制寄存器 • 状态寄存器 • 每个通道 • 模式寄存器 • 16位地址寄存器 • 16位数据字节计数器 引脚?
DMA工作时(输入) DMAC AB(A0-3, A4-7,DB0-7) MEMORY MEMW* DB IOR* 外设接口 每次传输一个字节 字节计数器-1 地址寄存器+1/-1 直到计数器减到0,DMA结束 设备 (磁盘驱动器)
DMA工作时(输出) DMAC AB(A0-3, A4-7,DB0-7) MEMORY MEMR* DB IOW* 外设接口 每次传输一个字节 字节计数器-1 地址寄存器+1/-1 直到计数器减到0,DMA结束 设备 (磁盘驱动器)
8237A工作 • 从模块 • A3-A0:内部寄存器 • CS* • IOR*, IOW* • AEN=0 • DB7~0:数据总线 • 主模块 • 输出地址 • 低位:A7-A0 • 高位:DB7-DB0 • AEN=1 • IOR*, IOW*, MEMR*, MEMW*(输出)
工作模式字 • 单字节传输模式 • 块传输模式 • 请求传输模式 • 级联传输模式
1/4 单字节传输模式 特点 • 传输一个字节 • 字节计数器-1 • 地址寄存器+1/-1 • 8237A放弃总线,CPU得到总线
2/4 块传输模式 • 连续多个字节传输 • 计数器减到0,EOP*输出0 • 8237A放弃总线
3/4 请求传输模式 • 与块传输类似 • 每传输一个字节,测试DREQ • 如果DREQ无效,停止传输,测试继续进行
级联的说明 • 最多5个8237级联 • 最多16个DMA通道 • 一个主8237,4个从8237
关于地址增减选择 memory • 地址增 每传输一个字节,地址计数器+1,指向存储器的下一个地址 • 地址减 每传输一个字节,地址计数器-1,指向下一个存储器地址 DMA 缓冲区
SI(空闲状态) • 8237作为从模块 • 测试DREQ • 测试CS*
S0:总线请求状态 • DREQ有效 • HREQ有效 • CPU还未响应DMA请求 • S0重复多次,直到CPU响应总线请求
S1:CPU响应总线请求,(DMAC)锁存高8位地址 • ADSTB • DB0~7输出A8~A15 • 注意:需要修改A15~A8时,才有S1状态,否则直接进入S2状态
S2:CPU响应总线请求,DMAC修改存储器的低16位地址S2:CPU响应总线请求,DMAC修改存储器的低16位地址 • DMAC送出16位地址 • DB0~7输出A8~A15 • A0~A7输出低8位地址 • Sw,如果外设速度慢 • 传输数据?
S3:CPU响应总线请求,(DMAC)更新地址 • 普通时序用到S3(送A15..8) • 压缩时序直接进入S4(送A7..0) 普通时序 S2,S3,S4 压缩时序 S2,S4
S4:CPU响应总线请求 模式测试,如 不是块传输模式,且不是请求传输模式, 进入S2
Sw:等待状态 • 如果外部设备比较慢,在S2之后插入等待状态
8.5控制寄存器-内容 1.控制储存器->
(1)存储器到存储器的传输 • 通道0的地址寄存器存放源地址 • 通道1,地址寄存器,计数器
存储器中进行数据块的拷贝 源 • 方法 • 1 程序实现:节省硬件,思考:如何实现? • 2 DMA方式:速度快 • 源数据->暂存寄存器 • 暂存寄存器->目的存储器 • 每传输一个字节需要两个总线周期 • 暂存器的地址 传输 目的
(4)关于扩展写信号的功能 • 外部设备快-压缩时序,S2,S4 • 外部设备慢-普通时序,S2,S3,S4 • 外部设备更慢-通过ready信号插入Sw状态 • 有些设备,加宽IOW*, IOR*信号,并使其提前到来
请求标志 • DMA请求产生的方式 • 硬件方式 • DREQ • 软件方式 • 设置请求标志:DMA请求寄存器
3.DMA请求寄存器和屏蔽寄存器 请求寄存器
DMA的屏蔽 • 使用屏蔽寄存器 • 屏蔽标志:屏蔽单个通道 • 综合屏蔽命令:一次可屏蔽多个通道
复位命令 • 复位 • 硬件复位 • 软件复位:向复位端口写0 • MOV AL,0 • MOV DX, BASE+0DH ;复位端口地址 • OUT DX,AL
6. 8237A各寄存器对应的端口地址 可写的寄存器:8个,每个寄存器对应一个唯一的地址 可读的寄存器:2个,每个寄存器对应一个唯一的地址
访问地址寄存器和 字节计数器时A3=0
先后触发器(即字节指针) • 先后触发器(字节指针)的用途 • 8237A数据线8位, • 地址寄存器和字节计数器16位 • 方法 • 先后触发器(字节指针)=0 • CPU先设置寄存器低8位,先后触发器变成1 • CPU设置寄存器高8位,先后触发器变成0 • 为了确保正确操作,设置地址寄存器和字节计数器时,先清除先后触发器。
例子:设置字节计数器步骤 • 清除先后触发器(字节指针) • 设置计数器低8位 • 设置计数器高8位 • ;下面的程序段设置通道0的字节计数器 • MOV AL,0 • MOV DX,BASE+0CH ;先后触发器(字节指针)的地址 • OUT DX,AL • MOV AX, 2000 • MOV DX, BASE+1;字节计数器(通道0) • OUT DX,AL • OUT DX,AH 思考:设置通道0的基址寄存器
8237寻址小结 • 寻址内部寄存器的地址线A0~A3 • BASE+0~7:基址寄存器和字节计数器 • BASE+8~15:控制/命令寄存器和状态/暂存器
8.7 8237的编程和使用 • 使8237停止工作(控制寄存器) • 总清(复位寄存器) • 写地址寄存器(总清时,已清除先后触发器) • 设置工作模式(模式寄存器) • 发控制命令(控制寄存器) • 清除屏蔽(屏蔽标志寄存器) 到此,8237开始工作
例1:8237A的编程和使用 • IBM PC 8237A的用法 • CH0: DRAM REFRESH(系统板) • CH2: FDISK-RAM(扩展) • CH3: HDISK-RAM(扩展) • CH1: OTHER, SUCH AS NETWORK(扩展) • 固定优先级ch0>ch1>ch2>ch3 • 初始化程序
页面寄存器 • 74LS670 • 页面寄存器的作用 • 20位地址线 • 8237只能输出16位地址线 • 页面寄存器输出高4位地址A16~A19 • 8086系统一共有16个页面,每个页面64Kbyte
PC/XT中的8237 • 端口地址:0000H~000FH • 页面寄存器:74LS670,地址0083H • 阅读程序P269
MOV AL,42H OUT DX,AL MOV AL,43H OUT DX,AL MOV DX,DMA+8 MOV AL,0 OUT DX,AL MOV DX,DMA+0AH OUT DX,AL MOV AL,01 OUT DX,AL MOV AL,02 OUT DX,AL MOV AL,03 OUT DX,AL ;对1-3地址寄存器的值进行测试 MOV DX,DMA+2 MOV CX,0003 READ: IN AL,DX MOV AH,AL IN AL,DX CMP AX,0FFFFH JNZ HHH INC DX INC DX LOOP READ HHH: HLT ;初始化 MOV AL,04 MOV DX,DMA+8 OUT DX,AL MOV AL,00 MOV DX,DMA+0DH OUT DX,AL MOV DX,DMA MOV CX,0004 WRITE: MOV AL,0FFH OUT DX,AL OUT DX,AL INC DX INC DX LOOP WRITE MOV DX,DMA+0BH MOV AL,58H OUT DX,AL MOV AL,41H OUT DX,AL
例2:利用DMA进行网络通信 MEMORY CPU NIC (网卡) DMAC 以太网
NIC的结构 发送 缓冲区 接收 缓冲区 与系统总线 的接口 ISA总线 控制逻辑 并串转换 串并转换 物理层收发器 网线
NIC与内存数据传输 Memory NIC发 送buffer NIC接收 Buffer
NIC接收工作 • NIC收到数据包(如1500字节) • NIC向DMAC发出DMA请求 • DMAC向CPU发总线请求 • CPU响应DMA请求 • 开始传输(把收到的数据包传输到内存缓冲区中) • DMA结束 • CPU处理收到的数据包
NIC发送工作 • CPU把需要发送的数据放到内存缓冲区中 • 设置DMAC,使之工作 • 把内存缓冲区的数据传输到NIC的缓冲区中(通过DMA方式) • 一旦NIC得到许可,即可以把NIC缓冲区中的数据发送出去