




免费预览已结束,剩余60页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 第9章DMA传输 9 1DMA传输原理9 2DMA控制器8237A9 38237A的编程使用习题9 2 所谓直接存储器传送 DirectMemoryAccess DMA 是指将外设的数据不经过CPU直接送入内存储器 或者 从内存储器不经过CPU直接送往外部设备 一次DMA传送只需要执行一个DMA周期 相当于一个总线读 写周期 因而能够满足高速外设数据传输的需要 本章介绍DMA传输的原理 实施DMA传输所需要的DMA控制器8237A以及它的编程使用 3 9 1DMA传输原理 1 DMA控制器使用DMA方式传输时 需要一个专门的器件来协调外设接口和内存储器的数据传输 这个专门的器件称为DMA控制器 简称DMAC 1 在DMAC的内部 有若干个寄存器 地址寄存器 存放DMA传输时存放IO数据的存储单元地址 字节计数器 存放DMA传输的字节数 控制寄存器 存放由CPU设定的DMA传输方式 控制命令等 状态寄存器 存放DMAC当前的状态 包括有无DMA请求 是否结束等 4 图9 1 5 2 在系统中 DMAC有二种不同的作用 总线从模块 CPU对DMAC进行预置操作 也就是向DMAC写入内存传送区的首地址 传送字节数和控制字时 DMAC相当于一个外设接口 称为总线从模块 总线主模块 进行DMA传输时 CPU暂停对系统总线的控制 DMAC取得了对总线的控制权 这时的DMAC称为总线主模块 2 DMA传输过程一次DMA传输的过程由以下步骤组成 当外设准备就绪 需要进行DMA操作时 向DMA控制器发出 DMA请求信号 DMA控制器接到此信号后 向CPU发 总线请求信号 6 CPU接到总线请求信号后 如果允许 会在当前总线周期结束后 发出 DMA响应信号 同时放弃对总线的控制 这时DMA控制器开始实行对总线的控制 DMAC将内部地址寄存器的内容通过地址总线送往内存储器 对于数据输入过程 向外部设备发出 外设读 控制信号 同时向存储器发出 存储器写 信号 在这二个信号的作用下 一字节的数据从外设接口送往数据总线 而存储器从数据总线接收这个数据 写入由地址总线上的地址指定的内存单元 对于数据输出过程 情况正好相反 DMAC向存储器发读命令 向外设接口发写命令 一字节数据从存储器传送到外设接口 完成一次输出的操作 传送1个字节之后 DMAC自动对地址寄存器的内容进行修改 指向下一个要传送的字节 同时 将字节计数器减1 记录尚未完成的传输次数 7 一个数据传输结束 DMA控制器向CPU撤销 总线请求信号 CPU于是也撤销允许使用总线的 总线应答 信号 CPU收回对总线的控制权 以上的过程完全由硬件电路实现 速度很快 用DMA方式进行一次数据传输所经历的时间称为 DMA周期 大体上相当于一次总线读写周期的时间 例如 要将串行通信口接收到的200字节的数据包用DMA方式存入以BUFFER为首地址内存区域 需要的操作为 对DMAC进行预置 向DMAC写入内存首地址 BUFFER 传输字节数 200 传输方向 外设接口 内存 控制命令 允许DMA传输 等 对串行通信接口进行初始化 设置串行通信的参数 允许串行输入等 8 最后一个数据的DMA传输结束后 DMAC内字节计数器内容为0 DMAC内部状态寄存器 传输完成 状态位为1 同时它还发出传输结束信号EOP CPU可以通过查询知道传输已经结束 也可以利用EOP信号申请中断 在中断服务程序里进行结束处理 所以 DMA方式传输200字节过程为 1次对DMAC初始化 200次DMA周期 3 8086系统中的DMA信号 P50图2 30总线请求和总线响应时序 在8086最小系统中 CPU通过HOLD引脚接收DMA控制器的总线请求 在HLDA引脚上发出对总线请求的允许信号 通常 CPU接收到总线请求信号并完成当前总线操作以后 就会使HLDA出现高电平而响应总线请求 DMA控制器于是就成了主宰总线的部件 此后 DMA控制器将HOLD信号变为低电平时 便放弃对总线的控制 8086检测到HOLD信号变为低电平后 也将HLDA信号变为低电平 于是 CPU又控制了系统总线 9 8086CPU工作于最大模式时 通过RQ GT0和RQ GT1引脚接收DMA控制器的总线请求 发送对总线请求的允许信号 RQ GT0引脚有较高的优先权 10 9 2DMA控制器8237A 9 2 18237A的基本功能1 8237A芯片的主要特点 1 有4个完全独立的DMA通道 可分别进行编程控制 2 每个通道的DMA请求均可分别允许和禁止 并对各通道进行优先级排队 4 数据块最大为64KB 每传送一个字节后使地址自动加1或减1 5 DMA请求可以由外部输入 也可以由软件设置 6 可以用级联的方法扩展DMA通道数 7 可以进行从存储器到存储器的数据传输 用于对存储区域进行初始化 11 2 8237A的工作方式8237A的每个通道可以有4种工作方式的选择 1 单字节传输方式 在这种方式下 8237A完成1个字节传输后 8237A释放系统总线 一次DMA传输结束 如果收到新的一个DMA请求 则重新申请总线 重复上述过程 这种方式下 CPU可以在每个DMA周期结束后控制总线 进行数据传输 所以不会对系统的运行产生大的影响 2 块传输方式 在这种方式下 DMA控制器获得总线控制权后 可以连续进入多个DMA周期 进行多个字节的传输 最多64K字节 当字节计数器减为0 或者收到外部输入的强制停止命令 从EOP引脚输入一个低电平信号 时 8237A才释放总线而结束传输 显然 这种方式可以获得最高的数据传输速度 在数据传输期间 CPU不能访问总线 包括取指令 如果一次传输的数据较多 这种方式会对系统工作产生一定的影响 12 3 请求传输方式 这种方式与块传输类似 申请一次总线可以连续进行多个数据的传输 但是 在每传输1个字节后 8237A都对外设接口的DMA请求信号线DREQ进行测试 如果检测到DREQ端变为无效电平 则马上暂停传输 当DREQ又变为有效电平时 就接着进行下一个数据的传输 这种方式允许外设由于某种原因发生的数据不连续 按照外设的最高速度进行数据传输 使用比较灵活 4 级联传输方式 几个8237A可以进行级联 一片8237A用作主片 其余用作从片 构成主从式DMA系统 所谓级联 就是从片收到外设接口的DMA请求信号后 不是向CPU申请总线 而是向DMA控制器主片申请 再由主片向CPU申请 一片主片最多可以连接四片从片 这样 五片8237A构成的二级DMA系统 可以得到16个DMA通道 级联时 主片通过软件在方式寄存器中设置为级联传输方式 从片设置成上面的三种方式之一 13 3 8237A的传输类型8237A提供四种类型的传输 1 DMA写传输 I O 存储器 2 DMA读传输 存储器 I O 3 DMA检验 完成某种校验过程 测试DMA控制器的状态 4 存储器到存储器传输 9 2 28237A的内部结构和外部连接8237A的内部结构和外部连接如图6 2所示 8237A的内部结构分成二部分 四个DMA通道和一个公共控制部分 其中公共控制部分由读 写逻辑和控制逻辑组成 14 图9 2 15 1 DMA通道8237A有四个独立的通道 CH0一CH3 每个通道包括两组16位寄存器 地址寄存器和字节计数器 还包括一个8位的方式寄存器和一个1位的DMA请求触发器及一个1位的屏蔽触发器 四个通道公用一个控制寄存器和一个状态寄存器 在DMA通道工作之前 必须对相应的寄存器进行初始化设置 地址寄存器由基地址寄存器和当前地址寄存器组成 在CPU编程时 把本通道DMA传输的地址初值写入基地址寄存器 再由8237A传送到当前地址寄存器 当前地址寄存器的值在每次DMA传输后自动加1或减1 CPU可以通过两次输入指令读出当前地址寄存器值 每次读8位 但基地址寄存器不能被读出 且一直保持初值 数据块传送完成后 可以把当前地址寄存器的内容恢复为基地址寄存器保存的初值 需要在编程时设置 自动预置 方式 16 字节计数器由基本字节计数器和当前字节计数器组成 与地址寄存器一样 编程时 由指令把DMA传输的字节数写入基本字节计数器 继而传送到当前字节计数器 初值要比实际传输的字节数少1 每进行一次DMA传输 当前字节计数器自动减1 它的值由0减到FFFFH 1 时 产生计数结束信号EOP 同样 只有当前计数器的值可以由CPU通过输入指令分两次读出 2 读 写逻辑CPU对8237A编程或读8237A寄存器时 CPU控制总线 8237A在系统总线中作为 从模块 读 写逻辑电路接收CPU对I O接口的读 IOR 写 IOW 信号 对地址总线的低4位 A0 A3 译码 在有效时 把数据总线的内容写入所寻址的寄存器 在IOR有效时 把选择的寄存器内容送到数据总线上 17 DMA周期期间 8237A控制总线 用作 主模块 如果是DMA写周期 读 写逻辑产生IOR 控制逻辑产生存储器写 MEMW 数据从外设接口传送到存储器单元 如果是DMA读周期 读 写逻辑产生 控制逻辑产生存储器读 MEMW 数据从存储器单元传送到外设接口 3 控制逻辑在所有DMA周期内 控制逻辑通过产生控制信号和16位要存取的存储单元地址来控制DMA操作步骤 初始化时 通过对方式寄存器编程 使控制逻辑可以对各个通道的操作进行控制 18 4 锁存缓冲器 外接 使用8237A工作时 需要外接一个八位的地址锁存缓冲电路 它能够储存八位的地址信号 通过可控的三态门连接系统地址总线 在DMA传送之前 8237A从DB0 DB7的把存储器地址的A8 A15送入这个锁存器 在DMA周期里 锁存器将锁存的地址送往系统地址总线的A8 A15 同时从A0 A7引脚发送地址的低八位 5 页面地址寄存器 外接 从上面的叙述可以看到 8237A控制了地址总线的16位 所以最多只能连续传送64K字节的数据 为了控制8086系统20位的物理地址 需要外接一个四位的 页面地址寄存器 寄存器的值由CPU写入 8237A发送低16位地址时 高四位的地址从页面地址寄存器发往地址总线的A16 A19 19 9 2 38237A的对外连接信号1 8237A作为从模块时的引脚信号RESET 复位输入端 高电平有效 复位时 屏蔽寄存器被置1 其他寄存器均清0 CS 片选输入端 低电平有效 由A4 A15译码得到 为低电平时 8237A被选中 CPU可以对8237A进行读写 进行预置或读取工作状态 A3 A0 最低的4位地址线 它们是双向信号引脚 DMA控制器作为从模块时 A3 A0作为输入端 用来选择DMAC内部的16个端口地址 IOR 输入 输出设备读信号 双向 三态 低电平有效 在DMA控制器作为从模块时 IOR为输入控制信号 此信号有效时 CPU读取DMA控制器中内部寄存器的值 20 IOW 输入 输出设备写信号 和IOR类似 在DMA控制器作为从模块时 是输入信号 此信号有效时 CPU向DMA控制器的内部寄存器中写入信息 即进行编程 DB7 DB0 8位双向三态数据线 在DMA控制器作为从模块时 CPU通过DB7 DB0对8237A进行读写 2 8237A作为总线主模块时的引脚信号 1 地址信号A3 A0 DMAC为主模块时 这4个信号端工作于输出状态 提供存储器的最低4位地址 A7 A4 这4位地址线始终工作于输出状态或者浮空状态 它们在DMA传输时提供存储器的中间4位地址 DB7 DB0 DMAC为主模块时 DB7 DB0输出当前地址寄存器中的高8位地址 并通过信号ADSTB打入外部锁存器 这样 和A7 A0输出的低8位地址一起构成16位地址 21 ADSTB 地址选通信号 输出 高电平有效 此信号有效时 将DMA控制器的当前地址寄存器中的高8位地址经DB7 DB0送到外部锁存器 AEN 地址允许信号 输出 高电平有效 AEN使地址锁存器中锁存的高8位地址以及页面地址寄存器的4位地址一起送到地址总线上 与芯片直接输出的低8位地址共同构成内存单元地址的20位地址 AEN信号也使与CPU相连的地址锁存器无效 这样 就保证了地址总线上的信号是来自DMA控制器 而不是来自CPU 2 对存储器 外设接口的读写控制信号IOR DMAC作为主模块时 IOR输出外设接口的读控制信号 此信号有效时 I O接口部件中的数据被读出送往数据总线 22 IOW DMAC作为主模块时 IOW输出外设接口的写控制信号 此信号有效时 存储器中读出的数据被写入I O接口中 READY 准备就绪信号输入端 高电平有效 当所用的存储器或I O接口的速度比较慢 需要延长传输时间时 使READY端处于低电位 8237A会自动插入等待周期 数据准备就绪时 READY端为高电平 表示可以进行数据传输 MEMR 存储器读信号 低电平有效 此信号有效时 所选中的存储器单元的内容被读到数据总线 MEMW 存储器写信号 低电平有效 此信号有效时 数据总线上的内容被写入选中的存储单元 3 DMA联络信号DREQ 通道DMA请求信号 输入 每个通道对应一个DREQ信号端 DREQ的极性可以通过编程来选择 当外设接口要求DMA传输时 便使DREQ处于有效电平 直到DMAC控制器送来DMA响应信号DACK以后 I O接口才撤除DREQ的有效电平 23 HRQ 总线请求信号 输出 8237A收到外设接口发来DREQ信号后 如果该通道的DMA请求没有被屏蔽 则DMA控制器的HRQ端输出有效电平 向CPU发出总线请求 HLDA 总线响应信号 输入 DMAC向CPU发总线请求信号HRQ以后 CPU发回的总线响应信号 8237A收到该信号后 便获得了总线控制权 HLDA也称为总线保持回答信号 DACK 通道DMA应答信号 输出 这是DMAC送给I O接口的回答信号 每个通道对应一个DACK信号端 DMAC获得CPU送来的总线允许信号HLDA以后 便产生DACK信号送到相应的外设接口 DACK信号的极性可以通过编程选择 在进行DMA传输时 系统地址总线上传送的是存储器地址 该信号相当于IO接口的地址选择信号 24 EOP DMA传输过程结束信号 双向 从外部往DMAC送一个EOP信号时 DMA传输过程被强制性地结束 另一方面 当DMAC的任一通道中计数结束时 会从EOP输出一个有效电平 作为DMA传输结束信号 不论是从外部终止DMA过程 还是内部计数结束终止DMA过程 都会使DMA控制器的内部寄存器复位 可以使用EOP信号向CPU申请中断 以便及时处理这一事件 3 其他引脚信号CLK 时钟输入端 8237A的时钟频率为3MHz 8237A 4的时钟频率为4MHz 8237A 5的时钟频率为5MHz 后面两种DMA控制器是8237A的改进型 工作速度比较高 但工作原理及使用方法和8237A完全一样 电源 地 提供8237A工作所需要的 5V电源 25 4 小结现将8237A有关信号在从模块工作和主模块工作时的作用小结如下 1 作为从模块工作时CPU对8237A进行预置或读取状态时 8237A相当于一个I O接口 这时 CPU发来的高12位地址经过地址译码器产生片选信号 使得CS为低电平 表示本芯片片被选中 CPU发来的低4位地址送到8237A的相应引脚 选择内部寄存器 此时 IOR和IOW作为输入信号 用作对8237A的读写控制 当IOR为低电平时 CPU可以读取8237A内部寄存器的值 当IOW为低电平时 CPU可以将数据写入8237A的内部寄存器中 2 作为主模块工作时8237A作为主模块工作时 它应该向总线提供要访问的内存地址 这个操作分二步实现 首先 16位地址的高八位在ADSTB信号的配合下 通过DB7 DB0输出到外部连接的地址锁存缓冲器 26 第二步 16位地址的低八位通过A7 A0输出 同时 AEN输出高电平 此信号有两个用处 一是使外部锁存器的输出三态门处于选通状态 见图8 2 这样 使得由DB7 DB0送到锁存器的地址高位字节送往地址线A15 A8 二是使与CPU相连的三个地址锁存器停止工作 在DMA传输之前 用指令将最高4位地址送到一个4位的 页面地址寄存器 中 DMA传输时 该寄存器在地址允许信号AEN作用下向A16 A19输出恒定的4位地址 在整个数据块的传输过程中 这4位地址保持不变 因此DMA传输的字节数限制在216以下 作为主模块工作时 IOR和IOW是输出信号 用来控制外设接口的数据传输方向 8237A还必须输出MEMR和MEMW来控制存储器的读写 27 9 2 48237A的工作时序8237A使用独立的时钟 时钟的每一个周期分为两大类 空闲周期和有效周期 这个周期也称为状态 STATUS 1 空闲周期SI8237A复位后就处于空闲周期 在此周期 CPU可对8237A作初始化编程 或者虽然已经初始化 但还未有DMA请求输入 空闲周期中 8237A要检查DREQ的状态 以确定是否有通道请求DMA服务 同时也对CS端采样 判定CPU是否要对8237A进行读写操作 如CS为低电平 且HLDA也为低电平 就使芯片进入编程工作状态 2 有效周期由S0 S4五种周期组成 28 29 S0是等待周期 它是8237A接到外设的DREQ请求 并向CPU发出了HRQ后进入的一个周期 在此期间等待CPU让出总线控制权 在得到来自CPU的HLDA响应后 结束S0状态 准备进入DMA操作过程 在S0期间 8237A仍可以接受来自CPU的读写操作 一个完整的DMA传输 完成一个字节传输 应包括4个时钟周期 即S1 S4 对于速度稍慢的外设 也可以用READY信号在S3与S4之间产生等待周期Sw S1周期中8237用DB0 DB7送出高8位地址A8 A15 同时使ADSTB有效 将高8位地址送入锁存器 在S2的下降沿信号被锁存 由于S1是CPU已经释放总线后进入的状态 所以8237A还使AEN有效 但是 在传输一段连续的数据时 存储器地址总是相邻的 它们的高8位地址往往是不变的 这样在进行下一个字节的传输时 就没有必要再把高位地址锁存一次 这种情况下S1可以省略 30 S2期间8237A首先向外设送出DACK信号 启动外设开始工作 通知请求DMA服务的设备数据传送即将开始 S3期间送出读出数据的控制信号 如果是DMA读操作 就发出存储器读命令MEMR 如果是DMA写操作 就发出I O读命令 把IOR 送到外设 S3状态结束时 在下降沿检测READY端的状态 若为低电平 就在S3后产生一个SW周期 延续S3的各种状态 在S3或Sw结束处若检测到高电平 就进入S4周期 S4周期送出写操作所需的控制信号 把读出的数据写入指定的地方 如果是DMA读操作 就发出I O写命令 把IOW 送到外设 反之则将MEMW 送存储器 S4中结束本次一个字节传输 如果整个DMA传输结束 后面紧接的是SI周期 如果还要继续进行下一个字节传输 再次重复进行S1 S4的过程 31 如果进行存储器之间数据传输 一个字节的传输要经过两个阶段 第一阶段是从源地址中读出一个字节 存入8237A的暂存寄存器 第二阶段将这个字节写入目的地址中 每个阶段的完成都要经过4个周期时间 此外由于READY的作用 还使8237A增加了一个SW周期 使全部周期分为7种 3 扩展写与压缩时序 1 扩展写通常写控制信号在S3才变得有效 如采用了扩展写方式 写信号在S2就开始变得有效 这种做法可以使一些需要较长时间写入的设备能得到足够的写入时间 2 压缩时序在正常时序中 S1用于锁定高8位地址 在高8位地址不变时 S1是可以省略的 S3是一个延长周期 以保证可靠的读写操作 在追求高速传输 且器件的读写速度又可以跟得上时 S3也是可以省略的 于是一个字节的传输只要两个时钟周期 S2 S4 就可完成 这就是压缩时序工作方式 32 9 38237A的编程使用 8237A是一个可编程的集成电路 占有16个端口地址 其中每个通道有2个专用的地址 其余8个地址由各通道共用 IBM PC微型计算机8237A的端口分配列于表9 1中 与之配合工作的还有地址锁存器 用来锁存数据线DB7 DB0上分时送出的地址信号A15 A8 还有页面寄存器 端口地址为83H 用来产生地址信号A19 A16 与8237A发出的16位地址组合得到20位地址信号 9 3 18237A通道专用寄存器每一通道内包含四个16位的寄存器 即基地址寄存器 基字节数寄存器 现行地址寄存器和现行字节数计数器 它们存放DMA访问的存储器地址及传输数据的字节数 每个通道内还有一个8位的模式寄存器 用于初始化时选定通道的工作方式 33 下面介绍各个寄存器的作用 1 基地址寄存器和基字节数寄存器基地址寄存器存放DMA传送的内存起始地址 基字节数寄存器存放DMA传送的字节数减1 寄存器的内容在初始化时由程序写入 先写低字节 后写高字节 其内容在整个数据块的DMA传输过程中保持不变 这二个寄存器的内容只能写入 不能读出 写入后 其内容还同时传送到现行地址寄存器和现行字节数寄存器 2 现行地址寄存器存放DMA传送的当前地址值 每次DMA传送后 该寄存器的值自动增量或减量 该寄存器的值可由CPU读出 先低位 后高位 若设置为自动预置 则在每次计数结束后 自动恢复为它的初始值 即保存在基地址寄存器中的初值 34 3 现行字节数寄存器存放DMA传送过程中没有传送完的字节数减1 每次传送后 该寄存器的值自动减1 该寄存器的值减为FFFFH 1 时 数据块传送结束 EOP引脚变为低电平 该寄存器的值可由CPU读出 若设置为自动预置 则在每次计数结束后 自动恢复为它的初始值 即保存在基字节数寄存器中的初值 4 方式寄存器8237A每个通道都有一个方式寄存器 控制着本通道的工作方式 方式寄存器的格式如图9 3所示 方式寄存器的最高2位用来设置工作方式 D7D6 00时 为请求传输方式 D7D6 01时 为单字节传输方式 D7D6 l0时 为块传输方式 D7D6 11时为级联传输方式 方式寄存器的D5位指出每次传输后地址寄存器的内容是增1还是减l 这样就决定了在内存中存储数据或读取数据的顺序 35 图9 3 36 D4位为1时 可以使DMA控制器进行自动预置 如果8237A被设置为具有自动预置功能 那么 在计数值到达 1时 当前地址寄存器和当前字节计数器会从基本地址寄存器和基本字节计数器中重新取得初值 从而为进入下一个数据传输过程做好了准备 要注意的是 如果一个通道被设置为具有自动预置功能 那么 本通道的对应屏蔽位必须为0 方式寄存器的D3 D2位用来设置数据传输类型 数据传输类型有三种 即写传输 读传输和校验传输 写传输由I O接口向内存写入数据 读传输将数据从存储器读出送到I O接口 校验传输用来对读传输功能或写传输功能进行检验 这是一种虚拟传输 此时 8237A也会产生地址信号和EOP信号 但并不产生对存储器和I O接口的读 写信号 检验传输功能一般用于器件测试 方式寄存器的最低2位D1 D0用来指出通道号 各通道有各自独立的方式寄存器 但是使用同一个端口地址写入 37 9 3 28237A通道公用寄存器1 控制寄存器 命令寄存器 8237A控制寄存器的格式如图9 4所示 现在结合8237A的工作说明控制寄存器主要的控制功能 1 内存到内存的传输 D0 1 多数情况下 8237A进行的是外设接口和内存之间的传输 除此以外 8237A还可以实现内存区域到内存区域的传输 实现这种传输 就要把源区的数据先送到8237A的暂存器中 然后再将它送到目的区 这就是说 每次内存到内存的传输要用到两个DMA周期 在进行内存到内存的传输时 固定用通道0的地址寄存器存放源地址 用通道1的地址寄存器和字节计数器存放目的地址和计数值 传输时 目的地址寄存器的值象通常一样进行加1或减1操作 但是 源地址寄存器的值可以通过对控制寄存器设置 D1 1 而保持不变 这样 可以使同一个数据传输到整个选定的内存区域 38 图9 4 39 2 8237A的启动和停止控制寄存器的D2位用来启动和停止8237A的工作 D2位为0时启动8237A工作 D2为1时 停止8237A的工作 这一位影响所有通道 一般情况下应使它为0 启动工作 3 时序类型8237A用控制寄存器的D3位表示采用的时序类型 使用普通时序时 每传输一个字节一般需要3个时钟周期 为了满足高速外设的需要 8237A还设置了压缩时序的工作方式 这时 传输一个字节的时间可以压缩到2个时钟周期 但是 使用压缩时序时 8237A只改变低8位地址 因此传输的字节数限制在256个字节以内 4 滞后写与扩展写在普通时序时 滞后写表示写脉冲滞后读脉冲一个时钟 扩展写表示读 写脉冲同时产生 扩展写增加了写命令的宽度 使用压缩时序时 这一位无意义 40 2 状态寄存器如图9 5所示 状态寄存器的低4位用来指出四个通道的计数结束状态 比如D3 1表示通道3计数到达 1 因而计数结束 余者类推 状态寄存器的高4位表示四个通道当前有无DMA请求 比如D6 1 表示通道1当前有DMA请求需要处理 3 请求标志和屏蔽标志的设置8237A的每个通道都配备1个DMA请求触发器和1个DMA屏蔽触发器 它们分别用来设置DMA请求标志和屏蔽标志 一般的情况下 DMA请求由硬件发出 通过DREQ引脚引入DMA请求 但是 它也可以由软件发出 由软件来启动DMA传输 如图6 6所示 DMA请求寄存器中的D1 D0位用来指出通道号 D2位用来表示是否对相应通道设置DMA请求 如D2为1 则使相应通道的DMA请求触发器置1 于是产生DMA请求 如D2为0 则无请求 41 图9 5 42 图9 6 43 整个8237芯片的启动和停止由控制寄存器D2设置 每个通道的启动和停止可以由屏蔽寄存器分别控制 当一个通道的DMA屏蔽标志为1时 这个通道就不能接收DMA请求了 这时 不管是硬件的DMA请求 还是软件的DMA请求 都不会被受理 如图9 7所示 8237A的屏蔽寄存器的D1 D0位用来指出通道号 D2位为1 则对相应的通道设置DMA屏蔽 D2位为0 则清除屏蔽 此外 8237A还允许使用综合屏蔽命令来设置通道的屏蔽触发器 图9 8 综合屏蔽字节的第n位对应第n个通道 D3 D0位中某一位为1 就可以使对应的通道设置屏蔽位 这样 用综合屏蔽命令可以一次完成对4个通道的屏蔽设置 44 图9 7 45 图9 8 46 4 复位命令和清除先 后触发器命令复位命令的功能和RESET功能相同 也就是说 复位命令使控制寄存器 状态寄存器 DMA请求寄存器 暂存器以及先 后触发器都清0 而使屏蔽寄存器置位 对端口地址为起始地址 13 0DH 的端口实施一次写操作 也就是对该端口执行一条输出指令 就可以实现对8237A的复位操作 8237A内部有一个 先 后触发器 当这个触发器为0时 访问16位寄存器的低字节 为1时 访问高字节 该触发器在8237A复位时清0 每访问一次16位寄存器后 能自动翻转 0变1或1变0 在写入内存储器起始地址或字节计数器初值之前 将这个触发器清0 就可以按照先低位字节 后高位字节的顺序写入初值 47 9 3 38237A端口地址及通道分配在IBMPC XT微型机中 8237A占据00H 0FH共16个端口地址 对8237A控制器的4个通道安排如下 CH0 用作动态存储器的刷新控制 CH1 为用户预留 CH2 软盘驱动器数据传输用的DMA控制 CH3 硬盘驱动器数据传输用的DMA控制 8237内部寄存器及软件命令对应端口地址见实验指导书P54 48 当CPU访问8237A时 8088CPU可直接把CPU的地址线低4位与8237A的A3 A0相连 当16位8086CPU与8位的8237A相连接时 又存在奇地址偶地址的问题 为了保证CPU对8237A的访问 数据流在低8位数据总线上有效的约定 地址总线的A4 A3 A2 A1分别连接8237A的地址引脚A3 A2 A1 A0 因此 对于16位的地址 用高11位地址产生对8237A的片选信号 用低5位地址的高4位来选择内部寄存器 A0 0 从而保证CPU访问8237A的端口地址是连续的偶地址 9 3 48237A的编程和使用在进行DMA操作时 必须对8237A进行初始化编程 初始化编程有以下内容 49 1 关闭8237A 以保证对8237A初始化编程结束后才响应DMA操作请求 2 发送清除命令 清除命令有三个 第一个是总清命令 即用软件方法进行复位 通过它可清除8237DMA控制器中所有寄存器的内容 该命令用在重新对8237A初始化前 此命令寄存器的低4位地址为0DH 第二个是使先 后触发器清0命令 8237A的数据位只有8位 访问16位寄存器需进行两次操作 每一次操作称为字节操作 16位数据分高字节和低字节 是访问高字节还是低字节 通过字节指针触发器来控制 字节指针触发器又称为先 后触发器 若先 后触发器为1 则访问高字节 若先 后触发器为0 则访问低字节 50 每对16位寄存器进行一次操作 先 后触发器改变一次状态 因而在读写寄存器低8位时 应使先 后触发器置0 此命令寄存器的低4位地址为0CH 第三个是清除屏蔽寄存器命令 此命令寄存器的低4位端口地址为0EH 对这三个命令寄存器写入任意数据便可完成各自的功能 3 输出16位地址值给相应通道的地址寄存器 4 设置传送的字节数给基字节计数器和当前字节计数器 5 输出工作方式控制字 以确定8237A的工作方式和传递类型 6 将屏蔽控制字写入屏蔽寄存器 去除屏蔽 7 启动8237A 并将操作方式控制字写入控制寄存器 控制8237A工作 51 8 启动DMA操作 可用软件方法将请求DMA操作控制字写入请求寄存器 或用硬件方法 等待DREQ引线端发出DMA操作申请 例9 1 从某外设通过通道1传送100个字节的数 到起始地址为8000H的内存区域 8237A芯片的片选地址是0200H CPU为8086 编写初始化程序 MOVAL 04H 关闭8237A 令操作方式控制字D2 1MOVDX 0210H 命令寄存器的端口地址送DXOUTDX ALMOVDX 021AH 发复位命令 52 OUTDX AL 只要地址正确 与传送数据无关MOVDX 0204H 通道1的地址寄存器端口地址送DXMOVAL 00H 写入存储区首地址低8位OUTDX ALMOVAL 80H 写入存储区首地址高8位OUTDX ALMOVDX 0206H 设置通道1字节计数器的端口地址MOVAL 64H 传送字节数的低8位OUTDX ALMOVAL 00H 设置传送字节数的高8位OUTDX AL 53 MOVDX 0216H 设置工作方式寄存器端口地址MOVAL 55H 设置通道1工作方式控制字 单字节传送 地址加1OUTDX AL 自动预置MOVDX 021EH 设置屏蔽控制字的地址MOVAL 02H 只允许通道1进行DMA传送OUTDX ALMOVDX 0210H 设置控制寄存器端口地址MOVAL 00H 设置DACK低电平有效 DREQ高电平有效OUTDX AL 固定优先级 启动8237A工作 54 例9 2 利用8237A编写从源存储器传送1000个字节数据到目标存储器的程序 把一个数据块从存储器一个区传送到另一个区是通过通道0和通道1完成的 MOVAL 04H 关闭8237A 操作方式控制字D2 1MOVDX DMA 08H 设置命令寄存器的端口地址OUTDX AL MOVDX DMA 0DH 设置总清命令寄存器的地址OUTDX AL 总清MOVDX DMA 00H 设置通道0地址寄存器端口地址MOVAX SOURCE 设置源数据块首地址 55 OUTDX AL 设置地址寄存器低字节MOVAL AH 将源数据块首地址高字节送ALOUTDX AL 设置地址寄存器高字节MOVDX DMA 02H 设置通道1地址寄存器端口地址MOVAX DST 设置目标数据块的首地址OUTDX AL 目标数据块首地址送通道1的地址寄存器MOVAL AHOUTDX AL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 食品快检知识培训班课件
- 土木识图考试题及答案
- 2025年普高数学必修题目及答案
- 2025年趣味单词题库及答案
- 2025年天津高考数学试卷及答案
- 食品安全知识培训反馈课件
- 围棋教师考试题库及答案
- 临床思维考试题库及答案
- 2025年绝对值题库及答案
- 洗手选择试题及答案
- 2025至2030年中国有源相控阵雷达行业市场发展态势及前景战略研判报告
- 口岸防控埃博拉出血热操作指南
- JG/T 264-2010混凝土裂缝修复灌浆树脂
- 2023年10月高等教育自学考试《13683管理学原理(中级)》试题
- 学校供菜合同协议书
- 2025届江苏省淮安市实验初级中学七下数学期末检测模拟试题含解析
- 北师大计算机试卷及答案
- 2025年新会计法培训课件
- 环保机构舆情处理机制流程
- 皮划艇旅游线路行业深度调研及发展战略咨询报告
- 品质客诉培训
评论
0/150
提交评论