第二章 I/O端口地址译码技术
对设备选择功能是接口电路应具备的基本功能之一,因此,作为进行设备端口选择的I/O端口地址译码电路是每个接口电路中不可缺少的部分。为此,本章在讨论I/O端口基本概念和I/O端口译码基本原理、基本方法的基础上,着重讨论译码电路的设计。
第一节 I/O端口的寻址方式
I/O端口
微型计算机系统在过程控制、信息处理、数据通信等方面得到了广泛的应用。对于不同的需求,可选用不同型号的计算机,同时还需要配置不同的外部设备,以扩展系统的功能。
I/O端口:它是处理器与I/O设备直接通信的地址。实际应用中,通常把I/O接口(Interface)电路中能被CPU直接访问的寄存器或某些特定器件称之为端口(Port)。通过端口向接口电路中的寄存器发送命令,读取状态和传送数据,因此,一个接口可以有几个端口,如命令口、状态口和数据口,分别对应于命令寄存器、状态寄存器和数据寄存器。有的接口包括的端口多(如 8255A并行接口芯片有 4个端口,8237A芯片有 16个端口),有的接口包括的端口少(如 825lA、8259A芯片只有两个端口)。对端口的操作也有所不同,有的端口只能写或只能读,有的既可以写也可以读。一般,一个端口只能写入或读出一种信息,但也有几种信息共用一个
端口的,如 8255A的一个命令口可接收两种不同的命令,8259A的一个命令口可接收4种不同的命令。
计算机给接口电路中的每个寄存器分配一个端口,因此,CPU在访问这些寄存器时,只需指明它们的端口,不需指出是什么寄存器。这样,我们在输人/输出程序中,只看到端口,而看不到相应的具体寄存器。也就是说,访问端口就是访问接口电路中的寄存器。
所谓I/O的操作指的是指对I/O端口的操作,而不是对I/O设备的操作,即CPU所访问访问的是与 I/O设备相关的端口,而不是 I/O设备本身。
端口地址编址方式
如何对端口进行访问呢?这就是所谓的接口的寻址问题。 对上述端口有两种编址方式,一种是端口地址和存储器地址统一编址,即存储器映射方式;另一种是I/O端口地址和存储器地址分开独立编址,即I/O映射方式。 [1]统一编址
这种方式,是从存储器空间划出一部分地址空间给I/O设备,把I/O接口中的端口当作存储器单元一样进行访问,不设置专门的I/O指令,有一部分对存储器使用的指令也可用于端口。Motorola系列、Apple系列微型机和一些小型机就是采用这种方式。 这种方式有许多优点:由于对I/O设备的访问是使用访问存储器的指令,所以指令类型多,功能齐全,这不仅使访问I/O端口可实
现输人/输出操作,而且还可对端口内容进行算术逻辑运算,移位等等;另外,能给端口有较大的编址空间,这对大型控制系统和数据通信系统是很有意义的。这种方式的缺点是端口占用了存储器的地址空间,使存储器容量减小,另外指令长度比专门I/O指令要长,因而执行速度较慢。 [2]独立编址
这种方式是接口中的端口地址单独编址而不和存储空间合在一起,大型计算机通常采用这种方式,有些微机,如 IBM-PC系列和Z-80系列机也采用这种方式。
这种方式的主要优点是:I/O端口地址不占用存储器空间;使用专门的I/O指令对端口进行操作,I/O指令短,执行速度快;并且由于专门I/O指令与存储器访问指令有明显的区别,使程序中I/O 操作和存储器操作层次清晰,程序的可读性强。
在独立编址方式中,如何对端口访问呢?
由于使用专门的I/O指令访问端口,并且I/O端口地址和存储器地址是分开的,故I/O端口地址和存储器地址可以重叠,而不会相互混淆。
[1] I/O指令中端口地址的宽度
IBM-PC系列采用1/O(input/output)指令访问端口,实现数据的I/O传送。在I/O指令中可采用单字节地址或双字节地址寻址方式。
若用单字节地址作为端口地址,则最多可访问256个端口。系统主板上接口芯片的端口,采用单字节地址,并且是直接寻址在指令中给出端口地址,其指令格式为 IN AL,PORT;输人 OUT PORT,AL;输出
这里,PORT是一个8位的字节地址。 例如:
IN AL,60H ;60H为系统板 8255A的 PA端口地址 OUT 61H,AL;6lH为系统板 8255A的 PB端口地址若用单字节地址作为端口地址,则最多可访问256个端口。系统主板上接口芯片的端口,采用单字节地址,并且是直接寻址在指令中给出端口地址,其指令格式为 IN AL,PORT;输人 OUT PORT,AL;输出
这里,PORT是一个8位的字节地址。 例如:
MOV DX,300H ;300H为扩展板 8255A的 PA端口 IN AL,DX
MOV DX,30lH;301H为扩展板 8255A的PB端口 OUT DX , AL [2]I/O端口访问
所谓对端口的访问就是CPU对端口的读/写。而通常所说的微
处理器CPU从端口读数据或向端口写数据,仅仅是指I/O端口与CPU的累加器之间的数据传送,并未涉及数据是否传送到存储器(RAM)的问题。若要求输人时,将端口的数据传送到存储器,则除了把数据读入CPU的累加器之外,还要将累加器中的数据再传送到内存。或者相反,输出时,数据从存储器先送到CPU的累加器,再从累加器传送到I/O端口。
例如:输入时
MOV DX,300H ;I/O端口 IN AL,DX ;从端口读数据到AL MOV (DI),AL;将数据从AL→存储器 输出时 MOV DX,301H ;I/O端口
MOV AL,[SI] ;从内存取数到AL OUT DX,AL ;数据从AL→端口
第二节I/O端口地址分配
对于接口设计者来说,搞清楚系统I/O端口地址分配十分重要,因为要把新的I/O设备加入到系统中去就要在I/O地址空间中占一席之地。哪些地址已分配给了别的设备,哪些是计算机制造商为今后的开发而保留的,哪些地址是空闲的,了解了这些信息才能为我所用。下面以IBM-PC系列为例来分析I/O端口地址分配情况。