实验四 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: MOV AH,01H INT 16H
JZ LLL MOV AH,0 INT 16H ENDM
DATA SEGMENT
;宏定义
;将形参中所存的以结尾的字符串显示在屏幕上
;宏定义
;为标号LLL建立唯一的从??0001H到??FFFFH的符号 ;等待是否有键按下 ;无则继续等待 ;否则读出键值
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 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 DISP MESG SCANKEY LAST1: IN AL,08H AND AL,02H JZ LAST1 CALL I8237W DISP MESG SCANKEY LAST2: IN AL,08H AND AL,02H JZ LAST2 DISP BUF MOV AH,4CH
INT 21H I8237R PROC MOV AL,05H
OUT 0AH,AL MOV AL,01001001B OUT 0BH,AL MOV AL,0
OUT 0CH,AL MOV AX,DATA MOV BX,OFFSET TEXT CALL ADDRMOV RET
;TEXT的总长度 ;主程序部分 ;装入数据段
;DMA通道1读出初始化 ;显示操作提示
;等待直到有键按下,读出键值 ;读DMA状态寄存器 ;传送是否结束
;否则继续等待传送结束 ;DMA通道1写入初始化 ;显示操作提示
;等待直到有键按下,读出键值 ;读DMA状态寄存器 ;传送是否结束
;否则继续等待传送结束
;显示BUF中DMA读写传送的最后结果;结束程序并返回DOS ;DMA通道1读出初始化 ;通道1屏蔽触发器置1
;通道1方式字,单字节写传送 ;自动加1变址,不自动预置 ;先/后触发器置0 ;AX为TEXT的段基址 ;BX为TEXT的有效地址
;计算输出TEXT单元的20位物理地址 I8237R ENDP
I8237W PROC MOV AL,05H
OUT 0AH,AL MOV AL,01000101B OUT 0BH,AL MOV AL,0
OUT 0CH,AL MOV AX,DATA MOV BX,OFFSET BUF CALL ADDRMOV RET I8237W ENDP
ADDRMOV PROC MOV CX,0004H LL: SAL AX,1
RCL CH,1 DEC CL JNZ LL
ADD AX,BX JNC NEXT11 INC CH
NEXT11: OUT 02H,AL MOV AL,AH
OUT 02H,AL MOV AL,CH
OUT 83H,AL MOV AX,COUNT-1 OUT 03H,AL MOV AL,AH OUT 03H,AL MOV AL,01
OUT 0AH,AL RET ADDRMOV ENDP CODE ENDS
END BEG
;DMA通道1写入初始化 ;通道1屏蔽触发器置1
;通道1方式字,单字节写传送 ;自动加1变址,不自动预置
;先/后触发器置0 ;AX为BUF的段基址 ;BX为BUF的有效地址
;计算并输出BUF单元的20位物理地址
;计算并输出某地址
;计算用AX:BX表示的物理地址 ;将移位时的溢出计入CH
;AX<=AX*4+BX
;低8位存入通道1基本地址寄存器 ;中8位存入通道1基本地址寄存器 ;高4位存入通道1页面寄存器
;要传送的字节数减1传给基本字节寄存器
;解除通道1屏蔽
五. 实验分析:
分析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为止,写过程结束。
4. 4LS393在本实验中的作用作为一个分频器,在本实验中起到了选定存储器6116
地址的作用。这是通过输入译码后的进位时钟实现的。
5.DMA传送过程及特点
DMA传送方式是在内存与外设之间开辟专用的数据通道,这个数据通道在DMA控制器的控制下直接进行数据交换而不通过CPU,不用I/O指令。这样,数据传送的速度上限取决于存储器的存储速度。因而DMA方式主要用于速度要求比较高的场合。
六.实验小结:
这次实验其实要让我们自己来考虑设计实现的话是非常困难的,好在书上已经给了我们实验电路和原程序代码,所以我们只要将书上的例子看明白的就可以做了,不过,这样一来,也可能有些人连书上的程序都不看而直接敲入代码运行通过,这样就什么都没有学到,没有达到实验的效果了。
我做这个实验时到了最后一周了,许多实验板已经坏了,有时候即使实验步骤完全正确由于板子的原因也做不出来。我就被害的够惨的了,插了几次线,还是不出来,最后到别人的板子上去一试就成了。但我觉得,通过做这个实验,我对DMA的读写时序有了更深的理解,原来学的时候好多不明白的地方都有的新的认识,比如总线的传送,DACK、IO/W的有效和复位等等,是比较清楚的了。
我决的做硬件实验其实并不是说要做的快或实验出结果就好,关键在于通过实验使我们对硬件和软件的原理更加认识深入,在以后的工作学习中能够学以致用,这才真正达到我们做实验的目的。