[1]译码电路的输入信号

每当CPU执行IN或者OUT指令时,就进入了I/O端口读写周期,此时首先是端口地址有效,然后是I/O读写控制信号^IOR和^IOW有效,把对端口地址译码而产生的译码信号同^IOR和^IOW结合起来一同控制对I/O端口的读写操作。
    但是,PC微机所支持的端口地址数目很多,每次端口操作是针对哪个端口呢?这就要根据对端口地址译码产生的地址选择信号来选中制定的端口,然后由^IOR和^IOW控制其读或者写操作,没有被选中的端口不产生任何动作。
     所以说,I/O地址译码电路不仅仅与地址信号有关,而且与控制信号有关。因此,I/O端口地址译码电路的作用是把地址和控制信号进行逻辑组合,从而产生对接口芯片的选择信号。
     由于I/O地址译码除了地址范围受上述地址分配的限制之外,还要满足其他一些控制条件,所以,译码电路的输入端除了地址信号线之外,还要引入一些控制信号。例如,用SBHE信号控制端口奇偶地址;用^I/OCS16信号控制8位或16位I/O 端口;用AEN信号控制非DMA传送以及用^IOR和^IOW信号控制对端口的读/写等。为此,在设计地址译码电路时,除了根据2.2节选用I/O端口地址的原则,精心选择地址范围之外,还要根据CPU与I/O端口交换数据时的流向(读/写)、数据宽度(8位/1 6位)以及是否采用奇偶地址和DMA传送方式的要求来引入相应的控制信号,参加地址译码。

[2]译码电路的输出信号

译码电路把输入的地址线和控制线经过逻辑组合后,所产生的输出信号线就是1根选中线,低电平有效。即若译码电路的输出线为低,则表示译码有效;若输出线为高,则译码无效。当I//O地址译码有效,选中一个接口芯片时,这个芯片内部的数据线打开,并与系统总线相连,从而打通了接口电路与系统总线的通路。而其他接口芯片的选中线无效,于是芯片内部呈高阻抗,自然就与系统总线隔离开来,从而关闭了接口电路与系统总线的通路。CPU就是这样利用译码电路来选 择与之交换信息的接口电路的。

I/O用地址译码方法
    I/O端口地址译码的方法灵活多样,可按地址和控制信号不同的组合去进行译码。一般原则是把地址线分为两部分:一部分是高位地址线与CPU的控制信号进行组合,经译码电路产生 I/O接口芯片的片选CS信号,实现系统中的片间寻址;另一部分是低位地址线不参加译码,直接连到I/O接口芯片,进行I/O接口芯片的片内端口寻址,即寄存器寻址。所以,低位地址线,又称接口电路中的寄存器寻址线。低位地址线的根数决定于接口中寄存器的个数。例如,并行接口芯片8255A内部有4个寄存器,就需要2根低位地址线。串行接口芯片825 1A内部只有2个寄存器,就只需1根低位地址线。若从系统的角度来考虑,则低位地址线的根数应由系统中含有寄存器数目最多的接口芯片来决定。

    在上表中分配给每个接口芯片的I/O端口地址,在实际使用中,并未全部用完。例如,中断控制器8259A只使用了前面2个端口地址,20H、21H(主片)和A0H、A1H(从片)。并行接口芯片8255A,只使用了前面4个端口地址,60H-63H。使用端口地址最多的DMA控制器芯片8237A,也只用了前面的16个地址(0-FH)。从表中,可以看到允许用户使用的端口地址是300H-31FH。这一段地址是留给用户在开发IBM-PC系列机功能模块(插板)时,使用的端口地址,系统是不会占用它的。除在表中已经分配了的I/O地址之外,其余的地址均由厂商保留使用
I/O端口地址译码电路设计
    译码电路的形式可分为固定式译码和可选式译码,固定式又可分为门电路译码和译码器译码,可选式又可分为比较器和地址开关译码及跳线式可选译码。

[1]固定式端口地址译码

所谓固定式是指接口中用到的端口地址不能更改。目前,接口卡中一般是采用固定式译码。在固定式译码电路中,又分单个端口地址译码和多个端口地址译码两种情况。若仅需一个端口地址,则采用门电路构成译码电路。

例1:使用74LS20/30/32和74LS04设计I/O用端口地址为2F8H的只读译码电路。
    分析:若要产生 2F8 H端口地址,则译码电路的输人地址线就应具有如表 2.3所示的值

设计:按照表2.3中地址线的值,采用门电路就可以设计出译码电路,如图2.l(a)所示。
    图中AEN参加译码,它对端口地址译码进行控制,只有当AEN=0时,即不是DMA操作时译码才有效;当AEN=l时,即是DMA操作时,译码无效。图2.l中,要求AEN=0,是为了避免在DMA周期中,由DMA控制器对这些以非DMA方式传送的I/O端口执行DMA方式的传送。同理可设计出能执行读/写操作的2E8H端口地址的译码电路,如图2.(b)所示。
注意:这一过程是通过CPU执行指令 IN AL,DX ;DX=2F8H 来实现。接口电路把CPU执行该指令产生的信号变为选通信号Y,则读出数据经数据总线进入寄存器AL。
 该指令产生的总线信号为: IOR=0,AEN=0(AEN=0表示CPU控制总线,AEN=1表示DMA控制总线), 地址信号A9~A0=2F8H(CPU提供16位地址A15~A0,在微机中,只使用A9~A0,当然也可使用全部16位地址)
    若接口电路中需使用多个端口地址,则采用译码器译码比较方便。译码器的型号很多,如3-8译码器74LSl38;4-16译码器74LSl54;双2-4译码器74LSl39、74LSl55等。
    例2:使用74LSl38设计一个系统板上接口芯片的I/O端口地址译码电路,并已让每个接口芯片内部的端口数目为32个。
    分析:由于系统板上的I/O端口地址分配在000~0FFH范围内,故只使用低8位地址线,这意味着A9和A8两位应赋0值。为了让每个被选中的芯片内部拥有32个端口,只要留出5根低位地址线不参加译码,其余的高位地址线作为74LS138的输人线,参加译码,或作为74LS138的控制线与AEN一起,控制74LSl38的译码是否有效。由上述分析,可以得到译码电路输入地址线的值,如表24所示。

    对于译码器74LSl38的分析有两点:一是它的控制信号线G1、G2A和G2B。只有当满足控制信号线G1=l,G2A=G2B=0时,74LS138才能进行译码。二是译码的逻辑关系,即输人(C,B,A)与输出(Y0~Y7)的对应关系。74LS138输人/输出的逻辑关系,如表2.5所示。
    从表 2.5可知,若满足控制条件,即 G1接高电平,G2A和G2B接低电平,则由输人端 C、B人的编码来决定输出:CBA二000,则Y0=0,其他输出端为高电平;CBA=001,Y1=0,其他输出端为高电平;…;CBA二 111,Y7=0,其他输出端为高电平。由此可分别产生 8个译码输出信号(低电平)。若控制条件不满足,则输出全“l”,不产生译码输出信号,即译码无效。
    设计:采用74LSl38译码器,可设计PC机系统板上的端口地址译码电路,如图2.2所示。图中地址线的高5位参加译码,其中Y05~Y7经译码器,分别产生DMACS(8237)、INTPCS(8259)、T/CCS(8253)、PPLCS(8255A)的片选信号,而地址线的低5位Y0~ Y4作芯片内部寄存器的访问地址。从74LSl38译码器的真值表可知,8237A的端口地址范围是000-01FH,8259A的端口地址范围是020-03FH等等,正好和前面表2.l所列出的端口地址分配表一致。

[2]可选式端口地址译码

如果用户要求接口卡的端口地址能适应不同的地址分配场合,或为系统以后扩充留有余地,则采用开关式端口地址译码。这种译码方式可以通过开关使接口卡的I/O端口地址根据要求加以改变而无需改动线路,其电路可由地址开关、译码器、比较器或异或门几种元器件组成。
这种译码方式可通过开关使接口卡的I/O端口地址根据要求加以改变而无需改动线路,其电路结构形式有:
 (1)使用地址开关加比较器
 (2)使用“异或门”+地址开关
 (3)使用跳接开关
    例3:设计扩展板上的I/O端口地址译码电路,要求让扩展板上每个接口芯片的内部端口数目为4个,并且,端口地址可选。例如,选择地址范围为300H-31 FH。
    分析:先讨论构成可选式端口地址译码电路的地址开关、比较器和译码器3个元器件的工作原理,然后根据题目要求进行电路设计。
    对于DIP开关,有两种状态:合(ON)和断(OFF)。所以,要对这两种状态进行设定,我们设置 DIP开关状态为:ON=0,OFF=l。
    对于比较器有两点要考虑,一是比较的对象,二是比较的结果。我们采用74LS54位比较器.把它的A组4根线与地址线连接,B组4根线与DIP开关相连,这样就把比较器A组与B组的比较,转换成了地址线的值与DIP开关状态的比较。74LS85比较器比较的结果有3种:A>B,A<B,A=B。我们采用A=B的结果,并令当A=B时,比较器输出高电平。这意味看,当4位地址线的值与4个DIP开关的状态相等时,。比较器输出高电平,否则,输出低电平。
    我们又把比较器的 A=B输出线连到译码器 74LS138的控制线G1上,因此,只有当 4 位(A6~A9)地址线的值与4个(S0~S3)DIP开关的状态逐位相等时,才能使74LSl38的控制线G1=1,才能译码,否则,译码器不能工作。所以,如果改变DIP开关的状态,则迫使地址线的值发生改变,才能使两者相等,从而达到利用DIP开关来改变地址的目的。
    设计:根据上述分析可设计扩展板上I/O 端口地址译码电路,如图2.3所示。从图中可以看到,高位地址线中,A9A8 A7A6的值由DIP开关的S3S2S1S0状态决定。由于S3和S2断开S1和S0合上,故使A9=A8=l,A7=A6=0,A5连在74LSl38的G2A上,故A5=0。A4A3 A2三根地址线作为74LSl38的输人线,经译码后可产生8个低有效的选择信号.作为扩展板上的接口芯片选择。最后剩下2根低位地址线A1和A0未参加译码,作接口芯片的寄存器选择,以实现每个接口芯片内部拥有4个端口。

    例4:采用异或门设计I/O 端口地址译码电路。
    分析与设计:如果用异或门代替比较器,则可得到图2.4所示的可选式译码电路,它由3片异或门74LSl36,9位DIP开关和译码器74thl38组成。74LSl36芯片内部有4个异或门,其内部逻辑如图2.5所示。在译码电路图2.4中,每个异或门的两个输入端,一个接地址线或控制线,另一个接地址开关。并且将所有异或门的输出端连在一起,再接到74LS138的控制端G1上。要使控制信端G1为“l”,则必须使每个异或门的输出端都为“l"。
    这意味着每个异或门的两个输入信号必须相异,例如图2.4中的AEN接在74LS136的4端,而74LS136的5端接高电平,所以4 羰必须为低电平,也就是说AEN应为低电平,即非DMA周期,译码才有效。同理可知分别连在74LS136的1和2端上的IOR和IOW两个控制信号只能在分开单独读或单独写时,译码才有可能,同时读写或同时都不读写时封锁译码器74LS138,使译码无效。其余各项异或为“1”的条件,由系统地址总统送来的地址码与DIP开关状态来决定,当地址码和DIP开关状态相异时,结果为“l”。若改变DIP的开关状态,也就改变了地址。按图2.4中所设的开关状态,该译码电路输入地址的值,如表2.6所示。其地址范围是710H-717H。

OUT指令时,就进入了I/O端口读写周期相关推荐

  1. Debug的T命令在执行修改寄存器SS 的指令时,下一条指令也紧接着被执行。

    为什么会这样呢?要想彻底说清楚这里面的来龙去脉,在这里还为时过早,因为这涉及我们在以后的课程中要深入研究的内容:中断机制,它是我们后半部分课程中的一个主题.现在我们只要知道这一点就可以了: Debug ...

  2. 定义指令时“控制器”,“链接”和“编译”函数之间的区别

    本文翻译自:Difference between the 'controller', 'link' and 'compile' functions when defining a directive ...

  3. Python 使用控制台运行带有相对路径的指令时,是以运行文件为基准,还是以控制台当前路径为基准

    答案:以控制台当前路径为基准 如,运行: python scripts/voc_annotation.py --data_path ./VOC 这条指令时,后面的相对路径是以scripts文件夹为基准 ...

  4. fatal error C1010: 在查找预编译头指令时遇到意外的文件结尾

    问题:drawhouse1.cpp(17) : fatal error C1010: 在查找预编译头指令时遇到意外的文件结尾 解决: 方法1.cpp文件添加引用#include "Stdaf ...

  5. 基于Vue实现拖拽效果以及解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突

    本人在开发中遇到实现一个基于vue的悬浮框拖动效果,经过努力研究最终实现了功能,一下是我的方法和部分代码,希望对您有所帮助,如有不对的地方还请指出.谢谢!下面步入正题: 首先展示一下功能的效果图: 要 ...

  6. 当AD服务器置于防火墙内时,所需开放的端口

    当AD服务器置于防火墙内时,所需开放的端口 周日一客户部署AD辅助域控的时候,发现操作系统无法加入域,联系我后,登陆到环境检查后,发现端口没有打开,和客户了解最近网络和系统的调整情况,得知AD域控服务 ...

  7. fikker反向代理服务器做网站缓存加速时链接会转到源端口的问题

    2019独角兽企业重金招聘Python工程师标准>>> fikker反向代理服务器做网站缓存加速时链接会转到源端口的问题 最近在使用fikker反向代理服务器的过程中有人反映访问链接 ...

  8. vos3000.呼叫中心在设置服务器防火墙时需要打开哪些 VOS 应用端口,VOS怎样实现语音通话数据加密

    客户在设置服务器防火墙时需要打开哪些 VOS 应用端口 TCP 端口: VOS 登录: 随机端口 web:随机端口 具体端口可咨询技术人员 UDP 端口: SIP: 5060 5070(RC4) RT ...

  9. 解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突

    功能描述: 如图,右侧悬浮菜单按钮,只支持上下方向拖动,点击时展开或关闭菜单. BUG说明: 鼠标上下方向拖拽,如果松开时鼠标位于悬浮按钮上会默认执行click事件,经验证,click事件与mouse ...

最新文章

  1. evaluate函数使用无效_[Python实战]使用栈实现简易计算器
  2. Python编程基础:第四十节 类变量Class Variables
  3. Linux IP 配置
  4. 【书单】matlab 科学计算、数值分析以及数学物理问题
  5. 单步调试学习WordPress PHP文件的加载顺序
  6. 直观理解深度学习卷积部分
  7. screen状态变Attached连接会话失败
  8. 在maven项目中打开jsp_零基础在intellij中打开一个项目复制粘贴内容即可运行的java拼图...
  9. SQL横表与纵表互转
  10. Java多线程时内存模型
  11. numpy中的argpartition
  12. 前端智勇大闯关-第二季-第三题
  13. 如何在Eclipse上使用SVN,安装、提交、拉取代码、解决冲突等操作
  14. 【C#】CLR内存那点事(string)
  15. Selenium应用代码(常见封装的方法二)
  16. 十三、K8s SVC相关操作
  17. Linux下的LVM
  18. tlo是什么意思_单片机计时器程序里TMOD、THO、TLO都是什么意思?需要编一个计时器来代替delay,让单片机保持状态3秒...
  19. WebFont-前端字体
  20. Mac 下如何解压 bin 文件

热门文章

  1. 大学计算机基础ppt操作题都考什么,大学计算机基础操作题.ppt
  2. AWS EKS 添加IAM用户角色
  3. 【夏虫语冰】Visual Studio工程编译问题汇总
  4. 脚本批量提取文件路径
  5. 笔记本外接显示器掉帧排bug过程
  6. LNK110:无法打开文件“opencv_world410d.lib”
  7. 莫烦---Pytorch学习
  8. 将两页A4 pdf文档合并到一页A4页面上打印的方法
  9. “降维算法”面试知识点总结-PCA+LDA算法-百面机器学习系列4
  10. Shell编程之sed工具