分类:
2011-01-11 14:33:16
第4章 微机接口及总线技术
4.3 I/O端口地址译码技术
4.3.1 I/O端口的寻址方式
CPU端口的寻址方式一般有两种:一种是I/O地址与存储器地址统一编址,另一种是I/O端口地址与存储器地址分别独立编址。
1. I/O端口和存储器统一编址方式
在这种编址方法中,把一个外设端口作为存储器的一个单元来对待,故每一个外设端口占有存储器的一个地址。从外部设备输入一个数据,作为一次存储器读的操作;而向外部设备输出一个数据,则作为一次存储器的写操作。
这种方式的优点是:
(1) CPU对外设的操作可使用全部的存储器操作指令,故指令多,使用方便,可对外设中的数据(存于外设的寄存器中)进行算术和逻辑运算,进行循环或移位等。
(2) 内存和外设的地址分布是统一的。
(3) 不需要专门的输入输出指令以及区分是存储器还是I/O操作的控制信号。
这种方式的缺点是:
(1) 外设占用了内存单元,使内存容量减小。
(2) 要寻址的外设的端口地址,显然比内存单元的地址要少得多。所以,在用直接寻址方式寻址外设时,它的地址字节,通常总是要比寻址内存单元的地址少一个字节,因而节省了指令的存储空间,缩短了指令的执行时间。
2. I/O和存储器分别独立编址方式
在这种编址方法中,内存地址空间和I/O端口是相互独立的,各自有自己独立的地址空间。用于内存和用于I/O端口的操作指令是不一样的,需要有专门的I/O指令。
8086/8088CPU就是采用这种方式,其内存地址范围为00000~FFFFFH共1MB,I/O端地址的范围为0000~FFFFH。它们相互独立,互不影响。CPU访问内存和外设时,使用不同的控制信号加以区分。
8086/8088CPU中,I/O端口寻址方式有直接寻址和间接寻址两种,直接寻址方式时地址范围为0~255,间接寻址方式时地址范围为0~FFFFH。在第2章I/O指令中已介绍。
4.3.2 I/O端口地址分配
PC系列微机系统支持的端口数目是1024个,其端口地址空间是从000~3FFH,由地址线A0~A9进行译码。
PC系列微机中的I/O接口电路大体上分为两类:
1. 主板上的I/O接口芯片
这些芯片大多都是可编程的大规模集成电路,完成相应的接口操作,如定时器/计算器、中断控制器、并行接口、DMA控制器以及键盘控制器等。
2. 扩展槽上的I/O接口控制卡
这些接口控制卡是由若干个集成电路按一定的逻辑功能组成的接口部件,如多功能卡、图形卡、串行通信卡、网络接口卡等。
PC系列微机中的I/O端口地址空间也分为两部分,即1024个端口的前256个端口(0~0FFH)专供I/O接口芯片使用,后768个端口(100H~3FFH)为I/O接口控制卡使用。如表4-1和表4-2所示。表中“—”符号表示该微机中无对应的接口芯片或接口卡。用户设计I/O接口电路时,应使用系统未占用的端口地址区域,如表4-2中画有“△”符号的行所对应的范围。
表4-1主板上接口芯片的端口地址
I/O接口器件名称 |
PC/XT |
PC/AT |
DMA控制器1 |
000~01FH |
000~01FH |
中断控制器1 |
020~021H |
020~021H |
定时器 |
040~043H |
040~05FH |
并行接口芯片 |
060~063H |
— |
键盘控制器 |
— |
060~06FH |
RT/CMOS RAM |
— |
070~07FH |
DMA页面寄存器 |
080~083H |
080~09FH |
中断控制器2 |
— |
0A0~0BFH |
NMI屏蔽寄存器 |
0A0~0BFH |
— |
DMA控制器2 |
— |
0C0~0DFH |
协处理器 |
— |
0F0~0FFH |
表4-2扩展槽上接口控制卡的端口地址
I/O接口卡名称 |
PC/XT |
PC/AT |
游戏控制卡 |
200~20FH |
200~20FH |
扩展器/接收器 |
210~21FH |
- |
△ |
220~26FH |
220~26FH |
并行控制卡2 |
270~27FH |
270~27FH |
△ |
280~2EFH |
280~2EFH |
串行控制卡2 |
2F0~2FFH |
2F0~2FFH |
试验卡 |
300~31FH |
300~31FH |
硬盘控制卡 |
320~32FH |
1F0~1FFH |
△ |
330~36FH |
330~36FH |
并行口控制卡1 |
370~37FH |
370~37FH |
同步通信卡2 |
380~38FH |
380~38FH |
△ |
390~39FH |
390~39FH |
同步通信卡1 |
3A0~3AFH |
3A0~3AFH |
单显DMA |
3B0~3BFH |
3B0~3BFH |
彩显示EGA/VGA |
3C0~3CFH |
3C0~3CFH |
彩显CGA |
3D0~3DFH |
3D0~3DFH |
△ |
3E0~3EFH |
3E0~3EFH |
软盘控制卡 |
3F0~3F7H |
3F0~3F7H |
串行控制卡1 |
3F8~3FFH |
3F8~3FFH |
在选定I/O端口地址时要注意:
(1) 凡是被系统配置占用了的端口地址一律不能使用。
(2) 从原则上讲,未被系统占用的地址,用户都可以使用;但计算机厂家申明保留的地址,不要使用,以免发生I/O端口地址的重叠和冲突,而造成所设计的产品与系统不兼容。
(3) 通常,用户可使用300H~31FH,这是PC系列微机留作实验卡用的。在用户可用的I/O地址范围内,为了避免与其他用户开发的接口控制卡发生地址冲突,最好采用地址开关。
4.3.3 I/O端口地址译码原则
8086本来有16位的数据线,为了在进行字节存取时,不改变其它字节的内容,8086采用了信号作为高8位数据的允许信号。
⑴A0与
8086CPU把16位数据的低8位D7~D0分配在偶数地址,即A0=0的地址,高8位数据D8~D15分配给奇数地址,用信号作为高8位数据的允许信号,既然奇数地址分配给高8位数据,奇数地址必须有A0=1,那么为什么不用A0=1来作为高8位的允许信号呢?如果单从高8位和低8位数据的选择来说,是可以用A0作为选择信号的;但是若允许高8位和低8位数据同时传送,那么A0一条线就无法胜任了。因为A0不能同时既为0又为1,所以引入了信号,它可以和A0同时有效,来保证16位数据的传送。A0与对数据传送的控制见表4-3所示。
表4-3 A0与对传送数据的控制
A0 |
|
传送数据位 |
0 |
0 |
16位数据总线上进行传送 |
0 |
1 |
低8位数据总线上进行字节传送 |
1 |
0 |
高8位数据总线上进行字节传送 |
1 |
1 |
无效 |
对于I/O地址译码电路的片选信号,必须有A0和参与控制。对于接低8位数据的I/O芯片的片选,必须有A0和高位地址译码同时有效。对于接高8位数据的I/O芯片的片选,必须和高位地址译码同时有效。对于接高16位数据的I/O芯片的片选,则高位地址译码和以及A0三者同时有效。片选信号的逻辑图如图4.8所示。
4.3.4 I/O端口地址译码方法
1. 用门电路组成的译码电路
用各种基本门电路作译码器是常用的方法。如上面介绍的简化A0与电路的地址改为3FF0H~3FF1H,把它展开写成二进制的形式并与地址线对应起来:
要选中这个地址,将是1的地址线接与门或与非门的输入;将是0的地址线接或非门的输入,最后以与非门的输出作为片选信号,如图4.9所示。
2. 用译码器构成译码电路
上例中共用到地址信号15个,那么可以寻址的I/O端口可达32K,在一般的微机系统中不可能用到这么多的设备,一般都不进行全译码。例如在IBM PC/XT/AT机中它只用10根地址线(A9~A0)。若高6位地址线抛开不管,这样它们可以寻址的I/O空间也达1KB,这不仅足够目前实用,而且为以后的发展和扩充也留下了足够的余地。为了问题简化,通常用10根地址线参与地址译码。
例如:一个接口电路,有16个I/O端口,有8个接数据总线的D7~D0,有8个接数据总线的D15~D8 ,要求既能按字节访问,也能按字访问,端口地址为 210H~21FH。试设计一个译码电路。
首先确定这个译码器不能采用化A0与的电路,因为它不能满足既能按字节访问,也能按字访问的要求。本例有两组,每组8个I/O设备,因此用3~8译码器非常合适。高位地址的译码可由门电路构成。它要求的地址为210H~21FH,那么的A9~A0的地址信号为:
对于16个地址状态,A9~A4是不变量的,可门电路作为高地址译码,A0要作为选控制信号,不能作为3~8译码器的输入,那么接3~8译码器的输入地址应为A3A12A1,其译码电路如图4.10所示。
3. 与大规模集成电路相连的译码电路
设计这样的译码电路,可从三级考虑。根据片内寄存器的数量来确定用片内寄存器的地址选择线,用次高位地址作为片选控制信号,剩下的高位地址线决定各芯片所占的地址空间。
为解决相互间负载驱动问题,一般总线和接口电路之间加一个双向数据驱动电路,对于系统数据总线来说,只相当负载一个门的输入,这样负担就轻多了。