第9章可编程DMA控制器8237A.docx
《第9章可编程DMA控制器8237A.docx》由会员分享,可在线阅读,更多相关《第9章可编程DMA控制器8237A.docx(41页珍藏版)》请在冰豆网上搜索。
第9章可编程DMA控制器8237A
目录
第9章可编程DMA控制器8237A
9.18237A的引脚与内部结构
9.1.1项目1:
利用8237进行存贮器到存贮器数据传送
9.1.2知识讲解
9.28237A的控制字及应用
9.2.1项目2:
用8237A从接口向RAM输入数据并显示
9.2.2知识讲解
9.3项目扩展与工程应用
9.3.1项目3:
DMA进行存贮器到存贮器传送数据
9.3.2项目4:
DMA进行存贮器到I/O数据传送
思考题与练习题
第9章可编程DMA控制器8237A
9.18237A的引脚与内部结构
9.1.1项目1:
利用8237进行存贮器到存贮器数据传送
1.项目要求与目的
(1)项目要求:
利用8086CPU控制8237A可编程DMA控制器,实现存贮器
之间的DMA数据传送。
(2)项目目的:
●了解8237ADMA控制器基本原理。
●掌握8237ADMA控制器的使用方法。
●学习用DMA进行存贮器到存贮器传送数据的编程方法。
2.项目电路连接与说明
(1)项目电路连接:
做MEM=>MEM数据传送时无需用户联线,系统自动做总线切换,本程序将RAM中的一段数据用DMA方式复制到另一地址。
(2)项目说明:
实验过程中不用联线,程序运行状态通过查看存贮器、寄存器内容来观察。
要传送存储器的起始地址为8100H:
0000H,传送字节数2000,8237的端口地址为00H~0FH,8237通道1的页面寄存器端口地址为83H,则利用8237通道1进行存储器的数据传送。
对程序进行编译连接后,使光标指向最后一条MOV指令处,点击菜单栏"调试"下拉菜单的"执行到光标所在行",使程序执行到此处。
查看运行后8237寄存器值、存贮器的内容,点击菜单栏"查看"的"数据区窗口"中的"代码段数据窗口",查看8100:
0000到8100:
0800中数据与8100:
0100到8100:
0900中数据一致(要注意各实验系统为用户提供的RAM区间)。
3.项目电路原理框图
DMA进行存贮器到存贮器传送数据电路框图如图9-1所示。
电路由8086CPU芯片、8237A芯片、RAM等组成。
图9-1DMA进行存贮器到存贮器传送数据电路框图
4.项目程序设计
(1)程序流程图
DMA进行存贮器到存贮器传送数据程序流程图如图9-2所示。
图9-2DMA进行存贮器到存贮器传送数据程序流程图
(2)程序清单
DMA进行存贮器到存贮器传送数据程序清单如下所示。
DMAEQU00H
DATASEGMENT
PBDB?
DATAENDS
STACKSEGMENTSTACK
STADW50DUP(0)
TOPEQULENGTHSTA
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAL,04H
OUTDMA+0DH,AL;复位命令,使先后触发器清0
MOVAL,08H
OUT83H,AL;置通道1页面寄存器
MOVAL,00H
OUTDMA+02H,AL;写地址低8位
MOVAL,00H
OUTDMA+02H,AL;写地址高8位
MOVAX,2000;置传送字节数
OUTDMA+03H,AL;先写入低8位
MOVAL,AH;
OUTDMA+03H,AL;后写入高8位
MOVAL,88H
OUTDMA+0BH,AL;后通道0模式字
MOVAL,85H
OUTDMA+0BH,AL;后通道1模式字
MOVAL,83H
OUTDMA+08H,AL;写命令字,允许通道0地址保持
MOVAL,0EH
OUTDMA+0FH,AL;通道0解除屏蔽
MOVAL,04H
OUTDMA+09H,AL;通道0软件请求,启动DMA传送
MOVAH,4CH;返回DOS
INT21H
CODEENDS
ENDSTART
9.1.2知识讲解
1.DMA传送的基本概念
直接存储器存取DMA是一种外设与存储器或者存储器与存储器之间直接传送数据的方法,适用于需要大量数据高速传送的场合,通常在微机系统中,图像显示、磁盘存取、磁盘间的数据传送和高速的数据采集系统均可采用DMA数据交换技术。
DMA传送示意图如图9-3所示,在数据传送过程中,DMA控制器可以获得总线控制权,控制高速I/O设备(如磁盘)和存储器之间直接进行数据传送,不需要CPU直接参与。
用来控制DMA传送的硬件控制电路就是DMA控制器(简称DMAC)。
图9-3DMA传送示意图
图9-3DMA数据传送过程如下:
①I/O接口向DMAC发出DMA请求。
②如果DMAC未被屏蔽,则在接到DMA请求后,向CPU发出总线请求,希望CPU让出数据总线、地址总线和控制总线的控制权,由DMAC控制。
③CPU执行完现行的总线周期,如果CPU同意让出总线控制权,向DMAC发出响应请求的回答信号,并且脱离三总线处于等待状态。
④DMAC在收到总线响应信号后,向I/O接口发DMA响应信号,并由DMAC接管三总线控制权。
⑤进行DMA传送。
DMAC给出传送数据的内存地址,传送的字节数,及发出
/
信号;在DMA控制下,每传送一个字节,地址寄存器加1,字节计数器减1,如此循环,直至计数器之值为0。
DMA读操作:
读存储器写外设。
DMA写操作:
读外设写存储器。
⑥DMA传送结束,DMAC撤除总线请求信号,CPU重新控制总线,恢复CPU的工作。
Intel8237A是一种高性能的可编程DMA控制器,可以用软件对芯片进行编程,使它能在多种方式下工作。
●一个芯片中有4个独立的DMA通道。
●每个通道的DMA请求都可以允许和禁止。
●每个通道的DMA请求有不同的优先权。
优先权可以是固定的,也可以是循环的,由初始化编程决定。
●每个通道一次传送的最大长度不能超过64KB。
●可以用级联的方法来扩展通道数。
8237ADMAC有四个通道,每个通道都可用于DMA数据传送。
PC机系统占用了8237A通道0、通道2、通道3,分别用于刷新动态存储器、软盘控制器与存储器间交换数据、硬盘控制器与存储器交换数据,只有通道1未使用,供用户使用。
2.8237A引脚与内部结构
(1)8237A引脚
8237A为40个引脚的双列直插式封装的芯片如图9-4(a)所示,引脚功能如下。
●BD7~BD0(21脚~23脚、26脚~30脚)):
8位数据线,双向,三态。
作用有三:
第一是当8237A空闲,即CPU控制总线时,BD7~BD0作为双向数据线,由CPU读/写8237A内部寄存器;第二是当8237A控制总线时,BD7~BD0输出被访问存储器单元的高8位地址信号A15~A8,并由ADSTB信号将这些地址信息存入地址锁存器。
第三是在进行DMA操作时,读周期经DB7~DB0线把源存储器的数据送入数据缓冲器保存,在写周期再把数据缓冲器保存的数据经DB7~DB0传送到目的存储器。
●A3~A0(35脚~32脚):
低8位地址线的低4位,双向,三态。
当CPU控制总线时,8237作为一般I/O接口,A3~A0为输入,作为选中8237A内部寄存器的地址选择线。
当8237A控制总线时,A3~A0为输出,作为选中存储器的低4位地址。
●A7~A4(40脚~37脚):
低8位地址线的高4位,输出,三态。
当8237A控制总线时,A7~A4作为被访问存储器单元的地址信号A7~A4。
●
(11脚):
片选信号,输入,低电平有效。
当8237A空闲时,仅作为一个I/O设备时,为8237A的片选信号。
当该信号有效时,CPU向8237A写入工作方式控制字、操作方式控制字,或读入状态寄存器中的内容。
●
(1脚):
I/O读信号,双向,三态,低电平有效。
当CPU控制总线时,为输入信号,CPU读8237A内部寄存器的状态信息;当8237A控制总线时,为输出信号,与
配合实现DMA写操作。
●
(2脚):
I/O写信号,双向,三态,低电平有效。
当CPU控制总线时,为输入信号,CPU利用它把数据写入8237A内部寄存器;当8237A控制总线时,为输出信号,与
配合实现DMA读操作。
●CLK(12脚):
时钟信号,输入。
8237A的时钟频率为3MHz,用于控制芯片内部定时和数据传送速率。
●RESET(2脚):
复位信号,输入,高电平有效。
当芯片被复位时,屏蔽寄存器被置1,其余寄存器置0,8237A处于空闲状态,即4个通道的DMA请求被禁止,仅作为一般I/O设备。
●READY(6脚):
准备好信号,输入,高电平有效。
当进行DMA操作,存储器或外部设备的速度较慢,来不及接收或发送数据时,外部电路使READY为低电平,这时DMA控制器会在总线传送周期,自动插入等待周期,直到READY变成高电平。
●AEN(9脚):
地址允许信号,输出,高电平有效。
访问DMA时AEN=1,访问外设时AEN=0。
当AEN=1时,它把外部地址锁存器中的高8位地址送入地址总线,与8237A芯片输出的低8位地址组成16位地址。
●ADSTB(8脚):
地址选通信号,输出,高电平有效。
当ADSTB=1时,将保存在8237A缓冲器的高8位地址信号传送到片外地址锁存器。
图9-48237A引脚与内部结构图
●
(3脚):
存储器读信号,输出,三态,低电平有效。
在DMA操作时,作为从选定的存储单元读出数据的控制信号。
●
(4脚):
存储器写信号,输出,三态,低电平有效。
在DMA操作时,作为向选定的存储单元写入数据的控制信号。
●
(36脚):
DMA传送结束信号,双向,低电平有效。
任一通道DMA传送结束时,从此端子发出有效信号,此外,当外部从
端输入有效信号时,也能强迫DMAC终止传送过程。
●DREQ3~DREQ0(16脚~19脚):
DMA请求信号,输入,有效电平可由工作方式控制字确定。
他们分别是连接到四个通道的外设,向DMA控制器请求DMA操作的请求信号。
该信号要保持有效电平一直到8237A控制器作出DMA应答信号DACK。
当8237A被复位时,他们被初始化为高电平有效。
●HRQ(10脚):
请求占用总线信号,输出,高电平有效。
该信号是DMAC接到某个通道的DMA请求信号后,且该通道请求未被屏蔽情况下,DMAC向CPU发出请求占用总线的信号。
●HLDA(7脚):
同意占用总线信号,输入,高电平有效。
此信号是CPU发给DMAC,同意DMAC器占用总线控制权请求的应答信号。
8237A接收到HLDA后,即可进行DMA操作。
●DACK3~DACK0(15脚、14脚、24脚、25脚):
DMA响应信号,输出,它的有效电平可由工作方式控制字确定。
该信号是由8237A控制器发给四个通道中申请DMA操作的通道的应答信号。
●VCC(31脚):
电源+5V。
●GND(20脚):
接地。
●NC(5脚):
空(没有用)。
(2)内部结构
8237A的内部结构如图9-4(b)所示,图中通道部分只画出了一个通道的情况。
8237A的内部结构由控制逻辑单元、优先级编码单元、缓冲器和内部寄存器四个基本部分组成,功能介绍如下。
①控制逻辑单元
控制逻辑单元的主要功能是根据CPU传送来的有关DMAC的工作方式控制字和操作方式控制字,在定时控制下,产生DMA请求信号、DMA传送以及发出DMA结束的信号。
②优先级编码单元
它用来裁决各通道的优先级顺序,解决多个通道同时请求DMA服务时可能出现的优先级竞争问题。
优先级顺序是指通道0优先级最高,其次是通道1,通道3的优先级最低。
循环四个通道的优先级不断变化,即本次循环执行DMA操作的通道,到下一次循环为优先级最低。
不论优先级别高还是低,只要某个通道正在进行DMA操作,其他通道无论级别高低,均不能打断当前的操作。
当前操作结束后,再根据级别的高低,响应下一个通道的DMA操作申请。
③缓冲器组
包括两个I/O缓冲器1、I/O缓冲器2和一个输出缓冲器,通过这三个缓冲器把8237A的数据线、地址线和CPU的系统总线相连。
●I/O缓冲器1:
8位、双向、三态地址/数据缓冲器,作为8位数据BD7~BD0输入/输出和高8位地址A15~A8输出缓冲。
●I/O缓冲器2:
4位地址缓冲器,作为地址A3~A0输出缓冲。
●输出缓冲器:
4位地址缓冲器,作为地址A7~A4输出缓冲。
④内部寄存器
8237A内部寄存器共有12个,如表9-1所示。
分为两大类:
一类是控制寄存器或状态寄存器;另一类是地址寄存器和字节计数器。
CPU对8237A内部寄存器的访问是在8237A作为一般的I/O设备时,通过A3~A0的地址译码选择相应的寄存器。
具体操作是:
用A3区分上述两类寄存器,A3=1选择第一类寄存器,A3=0选择第二类寄存器。
对于第一类寄存器,有两个寄存器共用一个端口地址,这种情况,用
和
来区分。
表9-18237A的内部寄存器
寄存器名称
位数
数量
CPU访问方式
基地址寄存器
16
4
只写
基字节计数寄存器
16
4
只写
当前地址寄存器
16
4
可读可写
当前字节计数寄存器
16
4
可读可写
地址暂存器
16
1
不能访问
字节计数暂存器
16
1
不能访问
命令寄存器
8
1
只写
工作方式寄存器
6
4
只写
屏蔽寄存器
4
1
只写
请求寄存器
4
1
只写
状态寄存器
8
1
只读
暂存寄存器
8
1
只读
表9-28237A内部寄存器寻址及软件命令
从8237A内部寄存器寻址及软件命令表9-2可以看出,A3=1选择第一类寄存器,A3=0选择第二类寄存器。
对于第一类寄存器A2~A0用来指明选择哪一个寄存器,若有两个寄存器共用一个端口,用读/写信号区分。
对于第二类寄存器用A2、A1来区分选择哪一个通道,用A0来区别是选择地址寄存器还是字节计数器。
现只对基地址寄存器、当前地址寄存器、基字节数寄存器和当前字节计数器的作用进行阐述,其他寄存器的作用将在控制字设置中讲解。
●基地址寄存器、当前地址寄存器
这两个寄存器都用来存放DMA操作时将要访问的存储器的地址,是16位的寄存器,每个通道都有。
基地址寄存器的内容是初始化编程时由CPU写入,整个DMA操作期间不再变化。
若在工作方式控制字中设置D4位等于1,采用自动预置方式,那么DMA操作结束,自动将基地址寄存器的内容写入当前地址寄存器。
该寄存器的内容只能写入,不能读出。
当前地址寄存器的作用是在DMA操作期间,通过加1或减1的方法不断修改访问存储器的地址指针,指出当前正访问的存储器地址。
当前地址寄存器地址值的输入方法,可在初始化时写入,也可在DMA操作结束,由基地址寄存器写入。
该寄存器的内容可通过执行两次输入指令读入CPU中。
●基字节数寄存器、当前字节计数器
这两个寄存器都用来存放进行DMA操作时传送的字节数,是16位寄存器,每个通道都有。
基字节数寄存器的数据是在初始化时写入的,整个DMA操作中不变,若将工作方式控制字中的D4位置1,采用自动预置方式,那么DMA操作结束,自动将基字节数寄存器的内容写入当前字节计数器。
该寄存器的内容只能写入,不能读出。
当前字节计数器的作用是在DMA传送操作期间,每传送一个字节,字节计数器减1,当由0减到FFFFH时,产生DMA操作结束信号。
当前字节计数器的内容可在初始化命令写入,也可通过在DMA传送结束时由基字节计数寄存器写入。
该寄存器的内容既能写入也能通过执行两次输入指令读入CPU。
9.28237A的控制字及应用
9.2.1项目2:
用8237A从接口向RAM输入数据并显示
1.项目要求与目的
(1)项目要求:
利用8086CPU控制8237A可编程DMA控制器,实现从接口向存贮器
输入数据。
要求每发生一次DMA请求,就从接口电路(74LS244)向内存传送一个字节数据,存入从6000H:
0H开始的10个字节的缓冲区,然后将该缓冲区的内容送PC机屏幕上显示。
(2)项目目的:
●掌握8237ADMA控制器的使用方法。
●学习用DMA控制器实现从接口向存贮器输入数据的编程方法。
2.项目电路连接与说明
(1)项目电路连接:
做I/O=>MEM数据传送时用户可以根据如图9-5所示联线,电路需要增加一个74LS244芯片。
(2)项目说明:
本程序将I/O口中的数据用DMA方式读到内存,然后将该内存的内容送PC机屏幕上显示。
因此需要编写8237的初始化程序及有关控制程序。
8237的端口地址为00H~0FH,通道1页面寄存器的端口地址为83H.
3.项目电路原理框图
用8237从接口向RAM输入数据并显示电路框图如图9-5所示。
电路由8086CPU芯片、8237A芯片、RAM、74LS244芯片和开关K0~K7等组成。
图9-5用8237从接口向RAM输入数据并显示电路框图
4.项目程序设计
(1)程序流程图
用8237从接口向RAM输入数据并显示程序流程图如图9-6所示。
图9-6DMA进行存贮器到I/O间传送数据程序流程图
(2)程序清单
DMA进行存贮器到I/O间传送数据程序清单如下所示。
DMAEQU00H
DATASEGMENT
IN-dataDB10DUP(20H),0DH,0AH,24H
DATAENDS
EXTRASEGMENTAT6000H
BUF-dataDB13DUP(?
)
EXTRAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
EXTRA
START:
MOVAX,DATA
MOVDS,AX
MOVAX,EXTRA
MOVES,AX
LEASI,IN-data
LEADI,BUF-data
CLD;方向标志DF=0
MOVCX,13
REPMOVSB;清缓冲区
OUTDMA+0DH,AL;复位命令,使先后触发器清0
MOVAL,06H;置通道1页面寄存器
OUT83H,AL
MOVAL,00H
OUTDMA+02H,AL;写入地址低8位
MOVAL,00H
OUTDMA+02H,AL;写入地址高8位
MOVAX,10;置传送字节数
OUTDMA+03H,AL;先写入低8位
MOVAL,AH;置传送字节数
OUTDMA+03H,AL;后写入高8位
MOVAL,55H
OUTDMA+0BH,AL;输出模式字
MOVAL,00H
OUTDMA+08H,AL;输出命令字
MOVAL,01H
OUTDMA+0AH,AL;清除通道1屏蔽位,启动DMA传送
DISP:
LEADX,BUF-data
MOVAH,09H
INT21H;显示字符串
MOVAH,01H
INT16H
JZDISP;无键按下继续显示
MOVAH,4CH
INT21H;有键按下,返回DOS
CODEENDS
ENDSTART
_
9.2.2知识讲解
1.8237A的的控制字
(1)工作方式控制字
8237A每个通道都有一个工作方式控制字,工作方式控制字为8位,通过编程的方法写入模式寄存器。
模式寄存器为6位,共4个,每个通道1个。
工作方式控制字的格式及定义如图9-7所示,各位的说明如下。
①D1、D0:
通道选择位。
根据D1、D0位的值决定工作方式控制字写入到哪一个通道的模式寄存器中。
由于每个通道内的模式寄存器为6位,所以8位的方式控制字写入6位的模式寄存器时,只将D7~D2位写入,D1、D0位不写入。
②D3、D2:
传送类型选择位。
8237A有三种传送类型,分别是DMA读传送、DMA写传送和DMA校验传送。
三种传送类型是根据数据传送的方向定义的,由D3、D2两位决定。
●DMA读传送:
把存储器的数据读出传送至外设,操作时若
有效则从存储器读出数据,若
有效则把数据写入外设。
●DMA写传送:
把外设输入的数据写至存储器中,操作时若
有效则从外设读出数据,若
有效,则把数据写入存储器。
●DMA校验传送:
这种传送方式实际上不传送数据,主要用来对DMA读传送或DMA写传送功能进行校验。
在校验传送时8237A保留对系统总线的控制权,但不产生对I/O接口和存储器的读写信号,只产生地址信号,计数器进行减1计数,响应
信号。
图9-78237A工作方式控制字的格式
③D4:
自动预置功能选择位。
当D4=1时,允许自动预置,每当DMA传送结束,基地址寄存器自动将保存的存储器数据区首地址传送给当前地址寄存器,基字节计数器自动将保存的传送数据字节传送给当前字节寄存器,进入下一轮数据传输过程。
当D4=0时,禁止自动预置。
需要注意的是,如果一个通道被设置为自动预置方式,那么这个通道的对应屏蔽位应置0。
④D5:
地址增减选择位。
当D5=1时,每传送一个字节,当前地址寄存器的内容减1;当D5=0时,每传送一个字节,当前地址寄存器的内容加1。
⑤D7、D6:
传送方式选择位。
8237A的每个通道有4种传送方式,即单字节传送方式、数据块传送方式、请求传送方式和多片级联方式。
工作方式由工作方式字中的D7、D6位决定。
●单字节传送方式:
8237A控制器每响应一次DMA申请,只传输一个字节的数据,传送一个字节之后,当前字节计数器的值减1,当前地址寄存器的数加1(或减1),8237A释放系统总线,总线控制权交给CPU。
8237A释放控制权后,马上对DMA请求DREQ进行测试,若DREQ有效,则再次发出总线请求信号,进入下一个字节的传送,如此循环,直至计数值为0,结束DMA传送。
单字节传送方式的特点是:
一次传送一个字节,效率较低,但它会保证在两次DMA传送之间,CPU有机会获得总线控制权,执行一次CPU总线周期。
●数据块传送方式:
在这种传送方式下,8237A一旦获得总线控制权,就会连续地传送数据块,直到计数器由0减到FFFFH,结束DMA传送,让出总线控制权。
数据块传送方式的特点:
一次请求传送一个数据块,效率高,但在整个DMA传送期间,CPU长时间无法控制总线(无法响应其他DMA请求,无法处理其他中断等)。
●请求传送方式:
请求传送方式与数据块传送方式类似,也是一种连续传送数据的方式。
只是在请求传送方式下,每传送一个字节就要检测一次DREQ信号是否有效,若有效,则继续传送下一个字节;若无效,则停止数据传送,结束DMA过程,让出总线控制权。
但DMA的传送现场全部保持(当前地址寄存器和当前字节计数器的值),待请求信号DREQ再次有效时,再次申请总线控制权,申请成功后,8237A接着原来的计数值和地址继续进行数据传送,直到当前字节计数器减到0或由外设产生
信号时,终止DMA传送,释放总线控制权。
请求传送方式的特点是:
DMA操作可由外设利用DREQ信号控制数据传送的过程。
●级联传送方式:
当一片8237A通道不够用时,可通过多片级联的方式增加DMA通道,第二级的HRQ和HLDA信号连到第一级某个通道的DREQ和DACK上;第二级芯片的优先权等级与所连通道的优先权相对应;第一级只起优先权网络的作用,实际的操作由第二级芯片完成;还可由第二级扩展到第三级等。
级联方式的特点是:
可扩展多个DMA通道。
例如