微型计算机DMA传送实验

微型计算机DMA传送实验


一、实验目的
1.掌握PC机工作环境下进行DMA方式数据传送方法。
2.掌握DMA控制器8237的编程方法。

二、实验设备与环境
TPC-2003A通用微机接口实验箱,windows XP运行环境

三、实验内容、程序清单及运行结果

  1. 实验内容
    1)用通用插座按图15内存至外设传送电路连接好(74LS273插通用插座,74LS74利用实验台上的D触发器)。在内存6000H:0开始单元存放10个数据,对DMA控制器8237进行初始化,使每一次DMA请求从内存向外设传送一字节数据。

图 15

2)用通用插座按图16外设至内存电路连接好(74LS244插通用插座,74LS74利用实验台上的D触发器)。 编程在内存6000H:00开辟一个8字节数据缓冲区, 对DMA控制器8237进行初始化, 每一次DMA请求从外设向内存传送一个字符(ASCII码),存入数据缓冲区,编程不断读取显示缓冲区的数据(ASCII码)在屏幕上显示。

图 16

  1. 编程提示
    1)DMA实验应将实验台上跳线开关JP1的2、3短接。
    2)DMA请求是由单脉冲输入到D触发器,由触发器的Q端向DRQ1发出的。CPU响应后发出,将触发器Q置成低电平以撤消请求。

  2. 流程图

在这里插入图片描述

  1. 程序清单
    1)参考程序1:
    data segment
    out_data db 01,02,04,08,10h,20h,40h,80h,0ffh,00h
    data ends
    extra segment at 6000h
    ext db 10 dup (?)
    extra ends
    code segment
    assume cs:code,ds:data,es:extra
    start: mov ax,data
    mov ds,ax
    mov ax,extra
    mov es,ax
    lea si,out_data
    lea di,ext
    cld
    mov cx,10
    rep movsb;CPU执行字符串传送指令,按字节传送,前缀rep表示重复执行该指令,重复的次数由cx寄存器中的数据决定,共重复10次。执行字符串传送指令,是将数据段中源变址寄存器si所指定的数据,也就是变量out_data中的数据,传送到附加段目的变址寄存器di所指定的内存中,也就是变量ext中。每传送完一个字节,si和di寄存器根据方向标志位df为0,会自动增1,分别指向下一个单元,共传送10次,这样就将数据段中变量out_data中的10个数据,传送到段地址为6000h开始的附加段中的变量ext中。
    out 0ch,al ;CPU执行IO的写指令,由于写指令中提供的端口地址为0ch,执行该指令会产生清字节指针的软命令,结果字节指针为0,表示访问DMA控制器内的16位寄存器的低8位。若字节指针为1,表示访问DMA控制器内的16位寄存器的高8位。
    mov al,49h ;写方式字49H=01001001
    out 0bh,al;CPU执行IO的写指令,根据提供的端口地址为0bh,将al寄存器中的数据49h写到方式寄存器中,设置DMA控制器某一通道的工作方式,根据方式字的格式D1D0为01,选择的是通道1,D3D2为10,设置通道1为读传输,D4为0,自动预置功能禁止,D5为0,产生地址是递增的,D7D6为01,设置通道1单字节传输方式。 **
    49H=01001001
    在这里插入图片描述
    mov al,06 ;置地址页面寄存器
    out 83h,al;CPU执行IO的写指令,根据提供的页面寄存器的端口地址83h,将al寄存器中的数据06写到页面寄存器中,这是由于附加段的段地址6000h,那么20位地址的高4位是由页面寄存器提供的。
    mov al,0
    out 02,al;CPU执行IO的写指令,根据提供的端口地址02h,也就是通道1的地址寄存器的端口地址,这是由于DMA控制器的片选信号CS连接的是00h,DMA控制器的地址引脚A1A0为10,访问的是通道1的地址寄存器。通过端口地址02h,将al寄存器的数据0,写到基地址寄存器的低8位,字节指针取反变为1。
    out 02,al;CPU执行IO的写指令,通过端口地址02h,将al寄存器的数据0写到基地址寄存器的高8位,字节指针取反变为0,这样基地址寄存器的16位数据初始化为0000h。
    mov ax,0ah ;写入传送的字节数10 ah寄存器为00h,al寄存器为0ah。
    out 03,al ;先写低字节
    CPU执行IO的写指令,根据提供的端口地址03h,也就是通道1的字节数寄存器的端口地址,这是由于DMA控制器的片选信号CS连接的是00h,DMA控制器的地址引脚A1A0为11,访问的是通道1的字节寄存器。通过端口地址03h,将al寄存器的数据0ah写到基字节数寄存器的低8位,字节指针取反变为1。**
    mov al,ah
    out 03,al ;后写高字节CPU执行IO的写指令,通过端口地址03h,将al寄存器的数据00h写到基字节寄存器的高8位,字节指针取反变为0。这样基字节数寄存器的16位数初始化为000ah,也就是传送数据的次数。
    mov al,01 ;清通道屏蔽,启动DMA
    out 0ah,al;CPU执行IO的写指令,根据提供的端口地址0ah,将al寄存器的数据01写到单通道屏蔽寄存器中,根据单通道屏蔽字的格式,D1D0为01,选择是是通道1,D2为0,清除屏蔽,也就是对通道1清除屏蔽,开放通道1。
    在这里插入图片描述
    mov ah,4ch ;返回DOS

​ int 21h CPU执行中断指令,根据提供的类型号为21h,CPU执行dos功能调用的中断服务子程序,CPU在执行dos功能调用的中断服务子程序时,根据入口参数ah所提供的功能号为4ch,转到返回dos的子模块,结果返回到操作系统。
code ends
end

图 15
在这里插入图片描述
程序结束,实验还没结束
此时,当按下单脉冲按钮,通过D触发器的Q端,产生一个DMA请求信号DRQ1,给PC机内部的DMA控制器, DMA控制器收到请求信号后,通过HOLD引脚向CPU发出总线请求信号HRQ,那么CPU若允许DMA传输时,在完成当前总线操作后,则释放总线控制权,并发出总线响应信号HLDA给DMA控制器,DMA控制器收到总线响应信号HLDA,获得了总线控制权,那么就向外设发出DMA响应信号DACK1,这样D触发器的CD引脚变为0,使D触发器的Q端清0,这样就撤销DMA请求信号。DMA控制器获得总线控制权后,DMA控制器根据设置的工作方式,那么通道1开始按字节进行DMA的读传输工作。
在这里插入图片描述
根据DMA读传输的工作时序,在S1状态,DMA控制器由通道1的当前地址寄存器产生20位地址的低16位地址,初值由基地址寄存器提供0000h,通过A0~ A7引脚输出低8位地址,d0~d7引脚输出高8位地址,20位地址的高4位由页面寄存器提供(6h),产生的20位地址输出到地址锁存器的输入端。同时,DMA控制器产生ADSTB地址选通信号的下降沿提供给地址锁存器STB引脚,将地址锁存器输入端的20位地址6000H锁存到地址总线上,然后通过地址总线输出到存储器的地址引脚来指定某存储单元。
在S2状态,DMA控制器根据设定的工作方式为DMA读传输产生低电平有效的MEMR存储器读控制信号给存储器,存储器得到MEMR存储器读控制信号,根据地址总线提供的20位地址60000H,确定存储单元,将该单元的数据,也就是附加段变量ext的第一个数据读取出来放到数据总线上。
然后进入S3状态,DMA控制器产生低电平有效的I/O写控制信号IOW给外设,那么,DMA读传输原理图中的或门的输入端两端均为低电平,或门输出低电平提供给8D触发器的CLK引脚,此时8D触发器不工作。
当进入S4状态,I/O写控制信号变为无效的高电平,同时,DMA响应信号DACK1也变为无效的高电平,那么或门输出高电平,这样8D触发器的CLK引脚由低到高产生上升沿,8D触发器开始工作,将数据总线上的数据,锁存到8D触发器的输出端,通过输出引脚输出到LED发光二极管L0~L7,点亮对应的灯。DMA控制器完成一个字节数据后,通道1当前地址寄存器会自动增1指向下一个单元,当前字节寄存器减1,当DMA控制器传输完1个字节数据后,DMA控制器的HRQ引脚撤销总线的请求,CPU的HOLD引脚收到请求信号后,就使总线响应HLDA变为无效,CPU同时收回总线控制权。当再次按下单脉冲按钮,DMA控制器又获得总线控制权,通过DMA控制器又传输完下一字节的数据,当前地址寄存器又自动增1指向到下一单元,当前字节寄存器减1,这样连续地按下单脉冲按钮,直到当前字节寄存器减1到FFFFH,DMA读全部传输完成。

2)参考程序2:
data segment
in_data1 db 8 dup(20h),0dh,0ah,24h
data ends
extra segment at 6000h
in_data2 db 11 dup (?)
extra ends
code segment
assume cs:code,ds:data,es:extra
start: mov ax,data
mov ds,ax
mov ax,extra
mov es,ax
lea si,in_data1
lea di,in_data2
cld
mov cx,11
rep movsb
mov ds,ax
out 0ch,al ;清字节指针
mov al,45h ;写方式字
out 0bh,al
mov al,6 ;置地址页面寄存器
out 83h,al
mov al,00 ;写入基地址的低十六位
out 02,al
out 02,al
mov ax,7 ;写入传送8个字节数
out 03,al ;先写低字节
mov al,ah
out 03,al ;后写高字节
mov al,01 ;清通道屏蔽
out 0ah,al ;启动DMA
sss: lea dx,in_data2
lll: mov ah,09
int 21h
mov ah,1
int 16h
je sss
exit: mov ah,4ch
int 21h
code ends
end start
在S2状态,DMA控制器根据设定的工作方式为DMA写传输产生低电平有效的IO读控制信号IOR给外设,那么DMA写原理图中的或门的输入端均为低电平,或门输出低电平提供给8缓冲器的G端引脚,此时,8缓冲器开始工作,将输入端的逻辑电平开关状态值锁定到8缓冲器的输出端,然后通过输出端的引脚输出到数据总线上。

然后进入S3状态,DMA控制器产生低电平有效的MEMW存储器写控制信号提供给存储器,存储器得到MEMW存储器写控制信号,根据地址总线提供的20位地址60000H,确定存储单元,将来自于数据总线上的数据,也就是开关状态的值写到该单元中,也就是附加段变量in_data2的第一个单元,DMA控制器传送完一个字节的数据后,通道1的当前地址寄存器会自动增1,指向下一个单元,当前字节寄存器减1,当DMA控制器传送完1个字节数据后,DMA控制器的HRQ引脚撤销总线的请求,CPU的HOLD引脚收到撤销总线请求信号后,就使总线响应HLDA变为无效,CPU同时收回总线控制权,当再次按下单脉冲按钮,DMA控制器又获得总线控制权,通过DMA控制器又传输完下一字节的数据,当前地址寄存器又自动增1指向下一单元,当前字节寄存器减1,这样连续地按下单脉冲按钮8次,通过DMA控制器和8缓冲器获取开关状态值分别写到内存缓冲器变量in_data2的8个单元中,并显示缓冲器的字符串直到当前字节寄存器减1到FFFFH,DMA写传输完成。
5. 运行结果

四、实验结论、实验体会

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值