实验四 DMA传送实验实验目的:
掌握DMA方式的工作原理和8237的编程使用方法。
二.实验要求:
1,按照实验指导第61页的实验接线图连接硬件线路
2,对照【例3.6.1】的程序清单键入源程序,经汇编和连接后运行程序
实验电路

实验程序:
DISP MACRO VAR ;宏定义
MOV AH,09H ;将形参中所存的以结尾的字符串显示在屏幕上
MOV DX,OFFSET VAR
INT 21H
ENDM
SCANKEY MACRO ;宏定义
LOCAL LLL ;为标号LLL建立唯一的从0001H到FFFFH的符号
LLL,MOV AH,01H ;等待是否有键按下
INT 16H
JZ LLL ;无则继续等待
MOV AH,0 ;否则读出键值
INT 16H
ENDM
DATA SEGMENT
TEXT DB 'THE QUICK BROWN FOX JUMPS OVER LAZY DOG'
DB 0DH,0AH
DB 'THE QUICK BROWN FOX JUMPS OVER LAZY DOG'
DB 0DH,0AH
DB 'THE QUICK BROWN FOX JUMPS OVER LAZY DOG'
DB 0DH,0AH,'$'
COUNT EQU $-TEXT ;TEXT的总长度
BUF DB COUNT DUP(?)
MESG DB 'TO MAKE A DMA REQUEST!'
DB 'THEN STRIKE ANY KEY!',0DH,0AH,'$'
DATA ENDS
STACK SEGMENT STACK 'STACK'
DB 256 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
BEG,MOV AX,DATA ;主程序部分
MOV DS,AX ;装入数据段
CALL I8237R ;DMA通道1读出初始化
DISP MESG ;显示操作提示
SCANKEY ;等待直到有键按下,读出键值
LAST1,IN AL,08H ;读DMA状态寄存器
AND AL,02H ;传送是否结束
JZ LAST1 ;否则继续等待传送结束
CALL I8237W ;DMA通道1写入初始化
DISP MESG ;显示操作提示
SCANKEY ;等待直到有键按下,读出键值
LAST2,IN AL,08H ;读DMA状态寄存器
AND AL,02H ;传送是否结束
JZ LAST2 ;否则继续等待传送结束
DISP BUF ;显示BUF中DMA读写传送的最后结果
MOV AH,4CH
INT 21H ;结束程序并返回DOS
I8237R PROC ;DMA通道1读出初始化
MOV AL,05H
OUT 0AH,AL ;通道1屏蔽触发器置1
MOV AL,01001001B ;通道1方式字,单字节写传送
OUT 0BH,AL ;自动加1变址,不自动预置
MOV AL,0
OUT 0CH,AL ;先/后触发器置0
MOV AX,DATA ;AX为TEXT的段基址
MOV BX,OFFSET TEXT ;BX为TEXT的有效地址
CALL ADDRMOV ;计算输出TEXT单元的20位物理地址
RET
I8237R ENDP
I8237W PROC ;DMA通道1写入初始化
MOV AL,05H
OUT 0AH,AL ;通道1屏蔽触发器置1
MOV AL,01000101B ;通道1方式字,单字节写传送
OUT 0BH,AL ;自动加1变址,不自动预置
MOV AL,0
OUT 0CH,AL ;先/后触发器置0
MOV AX,DATA ;AX为BUF的段基址
MOV BX,OFFSET BUF ;BX为BUF的有效地址
CALL ADDRMOV ;计算并输出BUF单元的20位物理地址
RET
I8237W ENDP
ADDRMOV PROC ;计算并输出某地址
MOV CX,0004H ;计算用AX:BX表示的物理地址
LL,SAL AX,1
RCL CH,1 ;将移位时的溢出计入CH
DEC CL
JNZ LL
ADD AX,BX ;AX<=AX*4+BX
JNC NEXT11
INC CH
NEXT11,OUT 02H,AL ;低8位存入通道1基本地址寄存器
MOV AL,AH
OUT 02H,AL ;中8位存入通道1基本地址寄存器
MOV AL,CH
OUT 83H,AL ;高4位存入通道1页面寄存器
MOV AX,COUNT-1 ;要传送的字节数减1传给基本字节寄存器
OUT 03H,AL
MOV AL,AH
OUT 03H,AL
MOV AL,01
OUT 0AH,AL ;解除通道1屏蔽
RET
ADDRMOV ENDP
CODE ENDS
END BEG
实验分析:
分析DMA时序。
1.读过程按下 DMA按键,通过端子向DMA通道1发硬件DMA请求,系统DMA控制器向CPU发总线请求信号,CPU在执行完当前总线周期后向系统DMA控制器发总线响应信号,随即把总线控制权交给DMA控制器,此时/DACK1有效。然后DMA控制器将通道1的页面地址寄存器及当前地址寄存器中的内容放到地址总线上去,并发出存储器读命令,读出内存单元中的text内容送往数据总线。由于/DACK1有效,通过J4短路线选中6116和双向总线驱动器74LS245,/IOW有效,通过J3短路线,使6116的/WE有效,从而把数据总线上的数据通过74LS245写入到6116的0号单元,完成一次DMA读传送。此时通道1当前地址寄存器自动加1,当前字节寄存器自动减1。另外通过U38和JS引线向分频器输入一个进位脉冲,使分频器计数一次,Q10~Q0输出选择6116的下一个单元。再反复上述读过程直到当前字节寄存器为FFFFH为止,读过程结束。
2.写过程按下 DMA按键,通过端子向DMA通道1发硬件DMA请求,系统DMA控制器向CPU发总线请求信号,CPU在执行完当前总线周期后向系统DMA控制器发总线响应信号,随即把总线控制权交给DMA控制器,此时/DACK1有效。然后DMA控制器将通道1的页面地址寄存器及当前地址寄存器中的内容放到地址总线上去,并发出存储器读命令,读出内存单元中的text内容送往数据总线。由于/DACK1有效,通过J4短路线选中6116和双向总线驱动器74LS245,/IOR有效,通过J2短路线,使6116的/RD有效,从而读出6116当前单元的内容,通过74LS245写入到系统数据总线,完成一次DMA写传送。此时通道1当前地址寄存器自动加1,当前字节寄存器自动减1。另外通过U38和JS引线向分频器输入一个进位脉冲,使分频器计数一次,Q10~Q0输出选择6116的下一个单元。再反复上述读过程直到当前字节寄存器为FFFFH为止,写过程结束。
4LS393在本实验中的作用作为一个分频器,在本实验中起到了选定存储器6116地址的作用。这是通过输入译码后的进位时钟实现的。
5.DMA传送过程及特点
DMA传送方式是在内存与外设之间开辟专用的数据通道,这个数据通道在DMA控制器的控制下直接进行数据交换而不通过CPU,不用I/O指令。这样,数据传送的速度上限取决于存储器的存储速度。因而DMA方式主要用于速度要求比较高的场合。
实验小结:
这次实验其实要让我们自己来考虑设计实现的话是非常困难的,好在书上已经给了我们实验电路和原程序代码,所以我们只要将书上的例子看明白的就可以做了,不过,这样一来,也可能有些人连书上的程序都不看而直接敲入代码运行通过,这样就什么都没有学到,没有达到实验的效果了。
我做这个实验时到了最后一周了,许多实验板已经坏了,有时候即使实验步骤完全正确由于板子的原因也做不出来。我就被害的够惨的了,插了几次线,还是不出来,最后到别人的板子上去一试就成了。但我觉得,通过做这个实验,我对DMA的读写时序有了更深的理解,原来学的时候好多不明白的地方都有的新的认识,比如总线的传送,DACK、IO/W的有效和复位等等,是比较清楚的了。
我决的做硬件实验其实并不是说要做的快或实验出结果就好,关键在于通过实验使我们对硬件和软件的原理更加认识深入,在以后的工作学习中能够学以致用,这才真正达到我们做实验的目的。