第
3 
章 I/
O 
端口地址译码技术

设备选择功能是接口电路应具备的基本功能之一,因此,进行设备端口选择的I/O端口
地址译码电路是每个接口电路中不可缺少的部分。本章在介绍I/O地址空间、I/O端口基
本概念和I/O端口译码基本原理与方法的基础上,着重讨论I/O端口地址译码电路的设计, 
其中包括采用GAL(PAL)器件的I/O端口地址译码电路设计。

3.1 I/
O 
地址空间
如果忽略I/O地址空间的物理特征,仅从软件编程的角度来看,/O地址空间和内存地

I
址空间一样,也是一片连续的地址单元,专供各种外设与CPU 交换信息时存放数据、状态和
命令代码。实际上,/O地址空间中的一个地址单元对应接口电路中的一个寄存器或控制

I
器,所以把它们称为接口中的端口。

I/O地址空间的地址单元可以被任何外设使用,但是,一个I/O地址一经分配给某个外
设(通过I/O端口地址译码进行分配), 那么,这个地址就成了该外设固有的端口地址,系统
中别的外设就不能同时使用这个端口地址,否则就会发生地址冲突。

I/O端口地址与内存的存储单元一样,都是以数据字节来组织的,因此有8位I/O端
口、16 位I/O端口、32 位I/O端口等。一般情况下,单片机多使用8位或16 位I/O端口,而
PC 和高档嵌入式微机使用32 位I/O端口。

3.2 I/
O 
端口
3.2.1 什么是端口
端口(pot) itrae)电路中能被CPU 访问的寄存器的地址。微机系统给接口

r是接口(nefc
电路中的每个寄存器分配一个端口,因此,CPU 在访问这些寄存器时,只需指明它们的端
口,而不必指明寄存器。这样,在输入输出程序中就只看到端口,而看不到相应的具体寄存
器。也就是说,访问端口就是访问接口电路中的寄存器。可见,端口是为了编程从抽象的逻
辑概念来定义的,而寄存器是从物理含义来定义的。

CPU 通过端口向接口电路中的寄存器发送命令、读取状态和传输数据,因此,一个接口
电路中可以有几种不同类型的端口,如命令(端)口、状态(端)口和数据(端)口。并且,CPU 
的命令只能写到命令口,外设(或接口)的状态只能从状态口读取,数据只能写到数据口或从
数据口读出。3种信息与3种端口类型一一对应,不能错位。否则,接口电路就不能正常工
作,就会产生误操作。

35 


3.2.2 端口的共用技术
一般情况下,一个端口只用于一种信息(命令、状态或数据)的访问;但有些接口芯片允
许同一端口既作为命令口又作为状态口,或允许向同一个命令口写入多个命令字,这就产生
端口共用的问题。对这种情况如何处理? 

如果命令口和状态口共用一个端口,其处理方法是根据读写操作来区分。向该端口写, 
就是写命令,该端口作命令口用;从该端口读,就是读状态,该端口作状态口用。当多个命令
字写到同一个命令口时,可采用两种办法解决:其一,在命令字中设置特征位(或设置专门
的访问位), 根据特征位,就可以识别不同的命令,加以执行,例如,在UART 内部的除数寄
存器就采用这种办法;其二,在编写初始化程序段时,按先后顺序向同一个端口写入不同的
命令字,命令寄存器就根据这种先后顺序的约定来识别不同的命令。另外,还可以用前面两
种方法相结合的手段来解决端口的共用问题,如中断控制器82C59A 。

3.2.3 I/
O 
端口编址方式
CPU 要访问I/O端口,就需要知道端口的编址方式,因为针对不同的编址方式,CPU 会
采用不同的指令进行访问。端口有两种编址方式:一种是I/O端口与内存地址单元分别独
立编址;另一种是I/O端口和内存地址单元统一编址。

1. 
独立编址方式
独立编址方式是接口中的端口地址单独编址而不和内存地址空间合在一起。大型计算
机通常采用这种方式,有些微机,如Intel系列微机,也采用这种方式。
独立编址方式的优点是:I/O端口地址不占用内存地址空间;使用专门的I/O指令对
端口进行操作,/O指令短, 对I/O端口寻址不需要全地址线译码,地址线少,

I执行速度快; 
也就简化了地址译码电路;由于I/O端口访问的专门I/O指令与内存访问指令有明显的区
别,使程序中的I/O操作与其他操作界线清楚、层次分明,程序的可读性好;因为I/O端口地
址和内存地址是分开的,故I/O端口地址和内存地址可以重叠,而不会相互混淆。

独立编址方式的缺点是:I/O指令类型少,只使用IN 和OUT 指令,对I/O的处理能力
不如统一编址方式;由于单独设置I/O指令,故需要增加IOR 和IOW 的控制信号引脚,这对
CPU 芯片来说是一种负担。

2. 
统一编址方式
统一编址方式是从内存地址空间中划出一部分地址空间给I/O设备使用,把I/O接口
中的端口当作内存单元一样进行访问。微控制器、嵌入式微机(例如MIPS 微机)和单片机
采用统一编址方式。

统一编址方式的优点是:由于对I/O设备的访问是使用访问内存的指令,I/O处理能
力增强;统一编址可给I/O端口带来较大的寻址空间,对大型控制系统和数据通信系统是很
有意义的。嵌入式微机系统广泛采用这种方式。

统一编址方式的缺点是:I/O端口占用了内存的地址空间,使内存容量减小;指令长度
比专门的I/O指令长,因而执行时间长;地址线多,地址译码电路复杂。

36 


3 7 
3.2.4 I/O 端口访问
1.独立编址方式的I/O 端口访问 
在对采用独立编址方式的I/O 端口进行访问时,需要使用专门的I/O 指令,并且需要采
用I/O 地址空间的寻址方式进行编程。下面以Intelx86微处理器为例讨论I/O 指令及其
寻址方式。
1)I/O 指令
访问I/O 地址空间的I/O 指令有两类:累加器I/O 指令和串I/O 指令。这里只介绍累
加器I/O 指令。
累加器I/O 指令IN 和OUT用于在I/O 端口和AL、AX、EAX之间交换数据。其中,8 
位端口对应AL,16位端口对应AX,32位端口对应EAX。
IN 指令从8位(或16位、32位)I/O 端口输入一字节(或一字、一双字)到AL(或AX、
EAX)。OUT指令刚好与IN 指令相反,从AL(或AX、EAX)中输出一字节(或一字、一双
字)到8位(或16位、32位)I/O 端口。例如: 
IN AL,0F4H ;从端口0F4H 输入8 位数据到AL 
IN AX,0F4H ;将端口0F4H 和0F5H 的16 位数据送AX 
IN EAX,0F4H ;将端口0F4H、0F5H、0F6H 和0F7H 的32 位数据送EAX 
IN EAX,DX ;从DX 指出的端口输入32 位数据到EAX 
OUT DX,EAX ;将EAX 的内容输出到DX 指出的32 位数据端口
通常所说的CPU 从端口读数据或向端口写数据,仅仅是指I/O 端口与CPU 的累加器
之间的数据传输,并未涉及数据是否传输到内存的问题。
若要求将端口的数据传输到内存,在输入时,则除了使用IN 指令把数据读入累加器之
外,还要用MOV 指令将累加器中的数据再传输到内存。例如: 
MOV DX,300H ;I/O 端口
IN AL,DX ;从I/O 端口读数据到AL 
MOV [DI],AL ;将数据从AL 传输到内存
在输出时,数据用MOV 指令从内存先送到累加器,再用OUT 指令从累加器传输到
I/O 端口。例如: 
MOV DX,301H ;I/O 端口
MOV AL,[SI] ;从内存取数据到AL 
OUT DX,AL ;数据从AL 传输到I/O 端口
2)I/O 端口寻址方式
I/O 端口寻址有直接I/O 端口寻址和间接I/O 端口寻址两种方式,其差别表现在I/O 
端口地址是否经过DX寄存器传输。若I/O 端口地址不经过DX传输,直接写在指令中,作
为指令的一个组成部分,称为直接I/O 寻址;若I/O 端口地址经过DX传输,称为间接I/O 
寻址。例如,在输入时: 
IN AX,0E0H ;直接寻址,端口号0E0H 在指令中直接给出

3 8 
MOV DX,300H 
IN AX,DX ;间接寻址,端口号300H 在DX 中间接给出
在输出时: 
OUT 0E0H,AX ;直接寻址
MOV DX,300H 
OUT DX,AX ;间接寻址
3)I/O 指令与I/O 读写控制信号的关系
I/O 指令与I/O 读写控制信号是完成I/O 操作这一共同任务的软件(逻辑上的)和硬件
(物理上的),是相互依存、缺一不可的两个方面。IOR和IOW是CPU 对I/O 设备进行读写
的硬件上的控制信号,低电平有效。该信号为低,表示对外设进行读写;该信号为高,则不读
写。但是,这两个控制信号并不能激活自己,使自己变为有效,以控制读写操作;而必须通过
编程,在程序中执行IN/OUT指令激活IOR和IOW,使之变为有效(低电平),对外设进行读
写操作。在程序中,执行IN 指令使IOR信号有效,完成读(输入)操作;执行OUT 指令使
IOW信号有效,完成写(输出)操作。在这里,I/O 指令与读写控制信号IOR和IOW的软件与
硬件对应关系表现得十分明显。
2.内存映射的I/O 端口访问
以MIPS微处理器为例,看看两个内存映射I/O 端口访问的表现形式。代码如下: 
//把0x543 写到LED 
addiu $7,$0,0x543 ;$7 = 0x543 
lui $5,0xbf80 ;$5 = 0xbf800000(LED 地址) 
sw $7,0($5) ;LED = 0x543 
//把开关的值读到10 号寄存器中
lui $5,0xbf80 ;$5 = 0xbf800000 
lw $10,8($5) ;$10 为开关的值
3.3 I/O 端口地址分配及选用的原则
I/O 端口地址是微机系统的重要资源,I/O 端口地址的分配对接口设计十分重要。因
为要把新的I/O 设备添加到系统中,就要在I/O 地址空间给它分配确定的I/O 端口地址。
只有了解了哪些地址被系统占用,哪些地址已分配给了别的设备,哪些地址是计算机厂商申
明保留的,哪些地址是空闲的,等等,才能做出合理的地址选择。不同的微机系统,端口地址
的分配方案不同。下面以Intelx86微机为例介绍I/O 地址分配情况。
3.3.1 早期微机I/O 地址的分配
早期微机只使用低10位地址线A0~A9,故其I/O 端口地址范围是0000H~03FFH。
同时,I/O 地址空间分成系统级I/O 接口芯片的端口地址和外设接口卡的端口地址两部分, 
分别如表3.1和表3.2所示。

表3.系统级I/
O 
接口芯片的端口地址表3.外设接口卡的端口地址

12 

I/O接口芯片

DMA 控制器1 
DMA 控制器2 
DMA 页面寄存器

中断控制器1 
中断控制器2 

定时器

并行接口芯片

RT/CMOSRAM 

协处理器

端口地址

000H~01FH 
0C0H~0DFH 
080H~09FH 

020H~03FH 
0A0H~0BFH 

040H~05FH 
060H~06FH 
070H~07FH 
0F8H~0FFH 

外设接口卡

并行口控制卡1 
并行口控制卡2 

串行口控制卡1 
串行口控制卡2 
原型插件板(用户可用) 

同步通信卡1 
同步通信卡2 

彩显EGA/VGA 
硬驱控制卡

端口地址

378H~37FH 
278H~27FH 

3F8H~3FFH 
2F8H~2FFH 
300H~31FH 

3A0H~3AFH 
380H~38FH 

3C0H~3CFH 

320H~32FH 

随着微机硬件技术的发展,淘汰了许多外设,新增了许多新型外设,但有一部分作为接
口上层应用程序的I/O设备的地址仍被保留,以便保持逻辑上的兼容。另外,从接口技术分
层次的观点来看,现代微机接口分为设备接口和总线接口两个层次,上述I/O地址的分配属
于接口上层(即设备接口)的资源分配,是整体接口的一部分,因此,这些I/O地址对接口上
层应用程序可照常使用。

由于早期微机系统没有即插即用的资源配置机制,因此,上述I/O端口地址的分配是固
定的,不能按照系统资源的使用情况动态分配。

3.3.2 现代微机I/
O 
地址的分配
现代微机的操作系统具有即插即用的资源配置机制,因此,作为系统重要资源的I/O端
口地址的分配是动态变化的。操作系统根据现代微机系统资源的使用情况动态地重新分配
用户应用程序要使用的I/O地址,即用户程序使用的I/O端口地址与操作系统分配的系统
端口地址是不一致的,两者之间通过配置地址空间进行映射,即操作系统利用配置地址空间
对用户程序要使用的I/O端口地址进行重新分配。用户在原创性开发时使用现代微机系统
的地址(通过驱动程序使用), 而在二次性开发时使用早期微机系统的地址,两种不同系统的
地址之间要进行映射。

这种I/O地址映射(或者说I/O地址重新分配)的工作对用户是透明的,不影响用户对
I/O端口地址的使用,在用户程序中仍然可以使用早期微机系统的I/O地址对端口进行访
问。I/O地址映射已在2.2节中作了介绍, 24,25 ]。

6.也可见参考文献[
3.3.3 I/
O 
端口地址选用的原则
用户在使用PC 系统的I/O地址时,为了避免I/O端口地址发生冲突,应遵循如下
原则: 

(1)凡是由系统配置的外设占用的地址一律不能使用。
(2)未被占用的地址,用户可以使用,但计算机厂家申明保留的地址不要使用。
39 


(3)一般情况下,用户可使用300H~31FH 的地表3.3 
用户扩展的接口芯片
址,这是早期微机留给原型插件板使用的,用户可以I/
O 
端口地址
使用。接口芯片
端口地址
根据上述系统对I/O端口地址的分配情况和I/O 82C55A 
端口地址的选用原则,在本书接口设计举例中使用的82C54A 
300H~303H 

304H~307H 

端口地址分为两部分:涉及系统配置的接口芯片和接

308H~30BH 

口卡使用表3.2中分配的I用8251A 

1和表3./O端口地址; 

30CH~30DH 

户扩展的接口芯片使用表3.3中分配的I/O端口82C79A 
地址。

3.4 I/
O 
端口地址译码
CPU 通过I/O地址译码电路把地址总线上的地址信号翻译成要访问的I/O端口,这就
是I/O端口地址译码。

3.4.1 I/
O 
端口地址译码的方法
微机系统的I/O端口地址译码有全译码、部分译码和开关式译码3种方法,其中全译码
很少使用。

1. 
全译码
全译码是指将所有I/O地址线全部作为译码电路的输入参加译码。一般在要求产生单
个I/O端口时采用,在PC 中很少使用。

2. 
部分译码
部分译码的具体做法是把I/O地址线分为两部分:一是高位地址线,参加译码,经译码
电路产生I/O接口芯片的片选CS 信号,实现接口芯片之间的寻址;二是低位地址线,不参
加译码,直接连到接口芯片,进行接口芯片的片内端口寻址,即寄存器寻址。所以,低位地址
线(又称接口电路中的寄存器寻址线)由接口芯片内部进行译码。

3. 
开关式译码
开关式译码是指在部分译码方法的基础上,加上地址开关来改变I/O端口地址,一般在
要求I/O端口地址需要改变时采用。地址开关不能直接接到I/O地址线上,而必须通过某
种中介元件将地址开关的状态(ON/OFF)转移到I/O地址线上,能够实现这种中介转移作
用的有比较器、异或门等。

3.4.2 I/
O 
端口地址译码电路的输入与输出信号线
在微机系统中,通过I/O端口地址译码电路把来自地址总线上的地址信号翻译成要访
问的I/O端口,因此I/O端口地址译码电路的工作原理实际上就是它的输入与输出信号之
间的关系。

40 


1.I/
O 
端口地址译码电路的输入信号
I/O端口地址译码电路的输入信号首先是地址信号,其次是控制信号。所以,在设计
I/O端口地址译码电路时,其输入信号除了I/O地址线之外,还包括控制线。

2.I/
O 
端口地址译码电路的输出信号
I/O端口地址译码电路的输出信号中只有1根CS 片选信号,且低电平有效。CS=0时
有效,芯片被选中;CS=1时无效,芯片未被选中。

3.4.3 CS的物理含义
CS 的物理含义是:如果CS 有效,选中一个接口芯片时,这个芯片内部的数据线打开,并
与系统的数据总线接通,从而打通了接口电路与系统数据总线的通路;而其他芯片的CS 无
效,即未被选中,于是芯片数据线呈高阻抗,自然就与系统的数据总线隔离开,从而关闭了接
口电路与系统总线的通路。此时,虽然那些未被选中的芯片的数据线与系统数据总线在外
部看起来是连在一起的,但因内部并未接通,呈断路状态,也就不能与CPU 交换信息。每一
个外设接口芯片都需要一个CS 信号去接通/断开其数据线与系统数据总线,从这个意义来
讲,CS 是一个起开/关作用的控制信号。

3.5 设计I/
O 
端口地址译码电路时应注意的问题
设计I/O端口地址译码电路时应注意以下几个问题。

1. 
合理选用I/
O 
端口地址范围
根据系统对I/O地址的分配情况和用户对I/O端口地址选用的原则,合理选用I/O端
口地址范围,即选用用户可用的地址段或未被占用的地址段,以避免地址冲突。

2. 
正确选用I/
O 
端口地址译码方法
根据用户对I/O端口地址的设计要求,正确选用译码方法。一般情况下,单个端口地址
译码采用全译码法,多个端口地址译码采用部分译码法。

3. 
灵活选用I/
O 
端口地址译码电路
I/O端口地址译码电路设计的灵活性很大,产生同样的I/O端口地址的译码电路不是
唯一的,可以有多种选择。首先,电路可以采用不同的元器件组成;其次,参加译码的地址信
号和控制信号之间的逻辑组合可以不同。因此,在设计I/O端口地址译码电路时,对元器件
和参加译码的信号之间的逻辑组合可以不拘一格地进行恰当的选择,只要能满足I/O端口
地址的要求就行。

3.6 I/
O 
端口地址译码电路举例
I/O端口地址译码电路设计包括采用不同元器件(译码器、不同译

IC 电路、GAL 器件)、
码方法以及不同译码电路结构形式(固定式、开关式)的地址译码电路设计。

41 


下面从不同侧面举几个I/O端口地址译码电路设计的例子
。
例3.固定式单端口地址译码电路的设计
。


1 

要求

设计I/O端口地址为2F8H 的只读译码电路。

分析

由于是单个端口地址的译码电路,不需要产生片选信号CS,故采用全译码方法。地址线
全部作为译码电路的输入线参加译码。为了满足端口地址是2F8H 的要求,对于只使用10 
位I/O地址线的情况,4所示。

输入地址线的值必须如表3.

表3.固定式单端口地址2F8H 
输入地址线的值

4 

地址线A9A8 A7A6A5A4 A3A2A1A0 
二进制值1 0 1 1 1 1 1 0 0 0 
十六进制值2 F 8 

设计

能够实现上述地址线取值的译码电路有很多种,一般采用IC 门电路就可以实现,而且
很方便。本例采用门电路实现地址译码,译码电路如图3.

1所示。


图3.

1 固定式单端口地址译码电路

图3.还有控制线IOR( IOW(写端口)

1中参加译码的除地址线A0~A9 之外, 读端口)、
等,以控制端口可读或可写。例如, 1(中, 故该端口只能读, 

1(中,
图3.a) 只有IOR 参加译码, 不能
写;而图3.b) IOR 和IOW 都参加译码,故该端口既可读又可写。
例3.多个端口的I/O地址译码电路的设计。

2 

要求

使用74LS138 设计一个系统板上的I/O端口地址译码电路,要求可选8个接口芯片并
且让每个接口芯片内部的端口数目为32 个。

分析

为了让每个被选中的芯片内部拥有32 个端口,留出5根低位地址线不参加译码,其余

42 


的高位地址线作为74LS138 的输入线参加译码,或作为74LS138 的控制线控制74LS138 的
译码操作,由此可以得到多个端口的I如表3.

/O地址译码电路输入地址线的值,5所示。

表3.多个端口的I/
O 
地址译码电路输入地址线的值

5 

地址线A9A8 A7A6A5 A4A3A2A1A0 
用途控制片选片内端口寻址
十六进制值0H 0H~7H 00H~1FH 

....
当满足控制信号线G1=1
..
,..
..
..0时,74LS138 才能进行译码;二是译码的逻辑关系, 

对于译码器74LS138 的分析有两点很重要。一是它的控制信号线G1、G2A 
和G2B 
,只有

G2A 
=G2B 
=
即输入(C、B、A)与输出(Y0~Y7)的对应关系,74LS138 输入与输出的逻辑关系(即真值表)
如表3.

6所示。

表3.138 
的真值表

6 
74LS

输入输出
G1 ..G2A 
..G2B C B A 
..Y7 ..Y6 ..Y5 ..Y4 ..Y3 ..Y2 ..Y1 ..Y0 
1 0 0 0 0 0 1 1 1 1 1 1 1 0 
1 0 0 0 0 1 1 1 1 1 1 1 0 1 
1 0 0 0 1 0 1 1 1 1 1 0 1 1 
1 0 0 0 1 1 1 1 1 1 0 1 1 1 
1 0 0 1 0 0 1 1 1 0 1 1 1 1 
1 0 0 1 0 1 1 1 0 1 1 1 1 1 
1 0 0 1 1 0 1 0 1 1 1 1 1 1 
1 0 0 1 1 1 0 1 1 1 1 1 1 1 
0 × × × × × 1 1 1 1 1 1 1 1 
× 1 × × × × 1 1 1 1 1 1 1 1 
× × 1 × × × 1 1 1 1 1 1 1 1 

从表3.若满足G1 接高电平、..
..
和..接低电平的控制条件, B、

6可知, G2AG2B 
则由输入端C、
A 
来决定输出:当CBA=000 时,输出端Y0=0,其他输出端为高电平;当CBA=001 时,输
....

出端Y1=0,其他输出端为高电平…… 当CBA=111 时,则输出端Y7=0,其他输出端为高
电平。由此可分别产生8个译码输出信号(低电平), 可选用8个接口芯片。若控制条件不
满足,则输出全为1,不产生译码输出信号,即译码无效。

设计

采用74LS138 译码器设计的I/O端口地址译码电路如图3.

2所示。
图3.2中的地址线的高5位参加译码,其中A5~A7 经3-8译码器分别产生DMACS 
(82C37A )、INTRCS(82C59A )、T/CCS(82C54A )、PPICS(82C55A)的片选信号,而地址线

43 


图3./O端口地址译码电路

2 采用74LS138 译码器设计的I

的低5位A0~A4 作为芯片内部寄存器的访问地址线。从表3.

6给出的74LS138 译码器的
真值表可知,82C37A 的端口地址范围是000~01FH,82C59A 的端口地址范围是020~ 
03FH,正好与表3./O接口芯片的端口地址一致。

1中所列出的系统级I
另外,图3.、....作为74LS138 的控制信

2中的A9 A8 和AEN 分别连接到G2A 
、G2B 
和G1 端, 
号,而其他4个

IOW 信号用来控制DMA 页面寄存器与不可屏蔽中断寄存器只能写不能读, 
支持芯片既可写又可读。
例3.3 
开关式I/O端口地址译码电路的设计。

要求

设计某微机实验平台板的I/O端口地址译码电路,要求实验平台板上每个接口芯片的
内部I/O端口数目为4个,并且I/O端口地址可选,其地址选择范围为300H~31FH 。

分析

开关式I/O端口地址译码电路可由译码器、DIP 开关、比较器或异或门这几种元器件组
成。先分析DIP 开关、比较器的工作原理,然后根据要求进行电路设计。
DIP 开关有两种状态,即通(ON)和断(OFF )。所以,要对这两种状态进行设置,可以设
置DIP 开关状态为ON=0、OFF=1。

对于比较器有两点要考虑:一是比较的对象;二是比较的结果。本例采用4位比较器
74LS85,把它的
A 
组4根线与地址线连接,
B 
组4根线与DIP 开关相连,这样就把比较器
A 
组
与
B 
组的比较转换成了地址线的值与DIP 开关状态的比较。74LS85 比较的结果有3种:A> 
B,A<B,A=B。本例采用A=
B 
的结果,并令A=
B 
时74LS85 输出高电平。这意味着,当4 
位地址线的值与4个DIP 开关的状态相等时,74LS85 输出高电平;否则,

74LS85 输出低电平。

将74LS85 的A=
B 
输出线连到译码器74LS138 的控制线G1 上,因此,只有当4位地
址线(A6~A9)的值与4个DIP 开关的状态(S0~S3)各位均相等时,才能使74LS138 的控
制线G1=1,译码器工作;否则,译码器不能工作。所以,如果改变DIP 开关的状态,则迫使
地址线的值发生改变,才能使两者相等,从而达到利用DIP 开关改变地址的目的。

设计

根据上述分析可设计出实验平台板的I/O端口地址译码电路,3所示。

如图3.
从图3.3中可看出,在高位地址线中,A9A8A7A6 的值由DIP 开关的状态S3S2S1S0 决

44 


图3.

定,4位开关有16 种不同的组合, 

出,由于S3 和S2 断开,S1 和S0 合上, 

的G2A 
上,故A5=

..
低电平有效的选择信号Y0~Y7,

....

位地址线A1 和A0 未参加译码, 

I
具有4个I/O端口的设计要求, 
例3.可编程端口地址译码电路设计。

4 

二是编写GAL 编程输入源文件中的逻辑表达式, 

编程代码文件,并烧写到GAL 芯片内部。

要求

范围为300H~31FH,包括8个接口芯片, 

端口可读可写。

分析

首先分析GAL 芯片的输入线。
根据设计要求, 
址线取值如表3.I

7所示。其中,

453 实验平台板的I/O端口地址译码电路
也就是可改变16 种地址。按图3.3中开关的状态不难看
故使A9=A8=1,A7=A6=0,而A5 连在74LS138 
0。A4A3A2 这3根地址线作为74LS138 的输入线,经译码后可产生8个
作为实验平台板上的接口芯片选择信号。最后剩下两根低
作为寄存器选择信号,以实现每个接口芯片内部拥有4个
/O端口的设计要求。以上设计完全满足300H~31FH 端口地址范围和每个接口芯片内部
正好与表3./O端口地址一致。3中所列出的I
可编程端口地址译码电路采用FPGA 来实现。主要工作有两点:一是选择GAL 芯片; 
其中输入与输出信号之间的逻辑表达式的
编写是译码电路设计的关键。另外就是借助于编程工具生成GAL 芯片熔丝状态分布图及
利用GAL 芯片设计MFID 多功能微机接口实验平台的I/O端口地址译码电路,其地址
每个接口芯片内部拥有4个I/O端口,每个I/O 
参加译码的有地址线和控制线,从地址范围300H~31FH 可知,10 根地
x代表可变输入位,为0或1。
表3.7GAL芯片的地址线取值
地址线A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 
取值1 1 0 0 0 IX IX IX 

在表3.7中,10 位地址线的设置是:高5位地址为A9=A8=1,A7=A6=A5=0,固定
不变,保证起始地址300H;中间3位A4~A2(由GAL 芯片内部译码,产生8个片选

IXIXIX) 
信号;最低两位A1A0 不参加译码,由接口芯片内部产生4个端口。为了减少送到GAL 芯
片的输入线数目,将参加译码的8根地址线做了一些处理,A9~A5 这5根地址线经过与非
门之后,其输出线YM 接到GAL 芯片,因此,实际上送到GAL 芯片参加译码的只有4根地
址线。

控制线有3根,除AEN 外,还有IOR 和IOW 也参加译码,以满足译码产生的I/O端口可
读可写的设计要求。所以,GAL 芯片的输入线有4根地址线和3根控制线,共7根。
其次分析GAL 芯片的输出线。
....

根据设计要求,需要8个片选信号Y0~Y7,所以,GAL 芯片的输出线有8根。
由于需要的输入线、输出线都在8根线以内,故选择GAL16V8 正合适,它有8个输入
端(2~9)和8个输出端(12~19 )。

设计

首先进行硬件设计。
根据上述分析,采用GAL16V8 设计的MFID 多功能微机接口实验平台的I/O端口地
址译码电路如图3.

4所示。


图3./O端口地址译码电路

4 采用GAL16V8 设计的I

其次进行软件设计。

使用GAL 芯片进行译码电路设计。与以往采用SSI 、MSI 等IC 器件的情况不同,本例
除了进行硬件设计外,还要根据要实现的逻辑功能和编程工具要求的格式编写GAL 芯片的
编程输入源文件。该文件把逻辑变量之间的函数关系(输入与输出的关系)变换为阵列结构
的与或关系(和积式)。再借助于编程工具生成GAL 芯片熔丝状态分布图及编程代码文件, 
最后将编程代码烧写到GAL 芯片内部。

..
下面是GAL 芯片的编程输入源文件中产生8个输出信号(Y0~Y7)的逻辑表达式①。

....

Y0:A9*A8*/A7*/A6*/A5*/A4*/A3*/A2*/AEN*/IOR+A9*A8*/A7*/
A6*/A5*/A4*/A3*/A2*/AEN*/IOW 

..

Y1:A9*A8*/A7*/A6*/A5*/A4*/A3*A2*/AEN*/IOR+A9*A8*/A7*/ 

① 按照GAL 芯片的编程输入源文件的格式要求,逻辑表达式中的逻辑符号“非”使用斜线,而不使用上画线。
46 


A6*/A5*/A4*/A3*A2*/AEN*/IOW 
..

Y2:A9*A8*/A7*/A6*/A5*/A4*A3*/A2*/AEN*/IOR+A9*A8*/A7*/
A6*/A5*/A4*A3*/A2*/AEN*/IOW 

..

Y3:A9*A8*/A7*/A6*/A5*/A4*A3*A2*/AEN*/IOR+A9*A8*/A7*/
A6*/A5*/A4*A3*A2*/AEN*/IOW 

..

Y4:A9*A8*/A7*/A6*/A5*A4*/A3*/A2*/AEN*/IOR+A9*A8*/A7*/
A6*/A5*A4*/A3*/A2*/AEN*/IOW 

..

Y5:A9*A8*/A7*/A6*/A5*A4*/A3*A2*/AEN*/IOR+A9*A8*/A7*/
A6*/A5*A4*/A3*A2*/AEN*/IOW 

..

Y6:A9*A8*/A7*/A6*/A5*A4*A3*/A2*/AEN*/IOR+A9*A8*/A7*/
A6*/A5*A4*A3*/A2*/AEN*/IOW 

..

Y7:A9*A8*/A7*/A6*/A5*A4*A3*A2*/AEN*/IOR+A9*A8*/A7*/
A6*/A5*A4*A3*A2*/AEN*/IOW 
每个逻辑表达式都是两个与式之和,而前后两个与式的不同在于读项和写项的差别, 
者是读有效(0), IOW=这表示该I辑(前) 

IOR=后者是写有效(0), /O端口既可读又可写。各逻
表达式前面的
Y 
项是逻辑表达式的输出值,即GAL 芯片译码输出的片选信号。
由..Y7 产生8个接口芯片的片选信号, 11 的变

Y0~..再加上不参加译码的最低两位00~
化可得

..

Y0=300H~303H 
..

Y1=304H~307H 
..

Y2=308H~30BH 
..

Y3=30CH~30FH 
. 
..

Y7=31CH~31FH 

习题3

1.PC 系统的I/O地址空间有多少字节? 
2. 什么是端口? 
3. 什么是端口共用技术? 采用哪些方法来识别共用的端口地址? 
4.I/O端口的编址方式有几种? 各有何特点? 
5. 输入输出指令IN/OUT 与I/O读写控制信号IOR/IOW 是什么关系? 
6. 设计I/O设备接口卡时,为防止地址冲突,选用I/O端口地址的原则是什么? 
7.I/O端口地址译码电路在接口电路中起什么作用? 
8. 微机系统的I/O端口地址译码有哪几种方法? 各用在什么场合? 
9. 设计I/O端口地址译码电路应注意什么问题? 
10. 在I/O端口地址译码电路中常常设置AEN=0,这有何意义? 
47 


11. 说明I/O端口地址译码电路的输出信号CS 的物理含义。
12.I/O地址线的高位地址线和低位地址线在I/O端口地址译码时分别有什么用途? 
13. 可选式I/O端口地址译码电路一般由哪几部分组成? 
14. 采用GAL 芯片进行I/O端口地址译码电路设计的关键是什么? 
15. 若要求I/O端口读写地址为374H,则图3.中的输入地址线要做哪些改动?1(b) 
它有何特点?2中地址线
16. 图3.2是PC 系统板的I/O端口地址译码电路, 根据图3.
的分配,分别写出DMA 控制器(中断控制器(定时/计数器(T/C)以及并
行接口(PPI)等芯片的地址范围。
DMAC )、INTR )、
17. 在图3.3所示的I/O端口地址译码电路中,若将地址开关的状态改为S3 和S0 断
开,S2 和S1 接通,则此时译码电路译出的地址范围是多少? 
18. 要求在例3.4中将I/O地址范围为从300H~31FH 改为340H~34FH,其他不变, 
此时GAL 芯片的编程输入源文件中的逻辑表达式应如何改写(可参考例3.
4)? 

48 


第
4 
章 基于MIPSfpga 
的微处理器系统

4.1 MIPSfpga 
处理器
4.1.1 概述
MIPS是很流行的一种RISC处理器。MIPS的意思是无内部互锁流水级的微处理器
(MicroprocesorwithoutInterlockedPipedStages),其机制是尽量利用软件的方法避免流
水线中与数据相关的问题。它是在20世纪80年代初期由美国斯坦福大学JohnHennesy
教授领导的研究小组研制出来的,随后成立MIPS计算机公司,完成了MIPS处理器的商
业化。

MIPS计算机公司成立于1984年,1986年推出R2000处理器,1988年推出R3000处理
器,1991年推出第一款64位商用微处理器R4000 。1992年,SGI公司收购了MIPS计算机
公司。1998年,MIPS计算机公司脱离SGI公司,成为MIPS技术公司。随后,MIPS技术公
司的战略发生变化,把重点放在嵌入式系统上。1999年,MIPS技术公司发布MIPS32和
MIPS64架构标准,为未来MIPS处理器的开发奠定了基础。MIPS技术公司于2013年被
ImaginationTechnologies公司收购。

MIPS处理器在20世纪80年代和90年代是SGI高性能图形工作站的核心。MIPS 
R3000拥有5级流水线,是MIPS公司第一个在商业上取得成功的处理器;随后是R4000,该
处理器新增了64位指令;R8000则是超标量处理器;R10000进而实现了乱序执行流水线。
它们均是高性能处理器的代表。

MIPS处理器架构在高性能处理器领域取得成功的同时,也开始进军消费类产品市场, 
将其拓展为低功耗、低成本的处理器,应用领域包括消费电子、网络和微控制器。其中M4K 
系列是基于经典的5级流水结构的处理器;M14K则在M4K的基础上通过增加16位的
microMIPS指令集来减少应用程序的代码,以便更好地应用于成本敏感的嵌入式系统; 
microAptiv则对M14K进行了进一步延伸,添加了可选的数字信号处理指令。microAptiv 
其实是微控制器(MicroControler,μC)和微处理器(MicroProcesor,μP)的变种,通过在微
处理器中增加高速缓存和虚拟内存来支持操作系统,以便运行Linux或Android等操作系
统。市场上广泛应用的美国微芯科技(MicrochipTechnology)公司的PIC32微控制器系列
就是基于M4K架构开发的。

MIPSM4K 、M14K和microAptiv是ImaginationTechnologies公司以微体系结构方式
(MicroArchitecture,MA)提供的最简单的处理器核。但是,它们与ImaginationTechnologies公
司的中档处理器(interAptiv)和高端处理器(proAptiv)系列以及以这些处理器为核心构成的多
核处理器在软件方面是兼容的。中档的MIPSinterAptiv系列定位于Cortex-A5/A7/A9的竞
争产品,是32位处理器核,流水线深度为9级,不支持乱序执行;但是,它在硬件上支持多线程
以及双发射超标量的64位MIPSI6400体系结构。高端的MIPSproAptiv系列包括1~6个处

49 


理器核。每个proAptiv核都是一颗超标量并支持乱序执行的处理器,拥有32位MIPSP5600 
架构和可扩展SIMD等高级功能。

MIPSfpga是ImaginationTechnologies公司推出的应用于教学目的的处理器,它是在
MIPS32microAptiv微处理器架构上通过增加高速缓存和MMU而来的,以Verilog硬件描
述语言源代码方式提供,因此可以在FPGA开发板上进行仿真和执行。

4.1.2 MIPSfpga 
处理器核
MIPSfpga处理器核基于microAptiv处理器。microAptiv处理器广泛应用于工业、办
公自动化、汽车、消费电子、无线通信等商业领域。MIPSfpga处理器核用Verilog硬件描述
语言描述,因此是一个处理器软核,而不是一个处理器芯片。用于描述MIPSfpga的Verilog
程序代码量大约1万行。具体来说,MIPSfpga处理器核有如下特点: 

(1)5级流水线结构
。
(5DMIPS/MHz 
。


2)运行MIPS32ISA指令集,性能为1.
(3)4KB的两路组相联指令高速缓存和数据高速缓存
。


(4)带16个TLB表项的MMU 
。
(5)AHB-Lite总线接口
。
(6)EJTAG编程/调试接口,支持两条指令和一个数据断点
。
(7)性能计数器。
(8)输入信号同步
。
(9)CorExtend接口,用于用户自定义指令
。
(10)不包括数字信号处理(DigitalSignalProcesing,DSP)扩展、协处理器2(CoProcesor2CP2)接口和影子寄存器(ShadowRegisters,SR )。
MIPSfpga仅可用于教学而非商业用途。它可以用来学习微处理器是如何工作的,通
过仿真或者在FPGA中来观察处理器的工作情况,通过阅读代码了解和学习处理器的微
体系结构是如何实现的,用汇编语言或C语言编写程序来了解程序在Verilog仿真器或
FPGA开发板上的运行过程。可以通过其总线来连接外部设备,学习接口技术。同样,还
可以修改源代码来得到新的指令或者对其微体系结构进行扩展,也可以运行Linux操作
系统来学习处理器系统是如何从编写Verilog设计代码直至在操作系统中运行的整个

过程。
1所示。处理器的核心是执行单元(

MIPSfpga处理器的结构如图4.ExecutionUnit, 
EU),它负责执行指令的操作,例如进行加法运算或减法运算。执行单元可扩展乘/除单元
(Multiply/DivideUnit,MDU),用于乘法和除法运算。指令译码器(InstructionDecoder, 
ID)对从指令高速缓存中读取的指令进行译码处理,产生相应的控制信号,对执行单元进行
控制。系统协处理器(systemco-procesor)为协处理器提供系统时钟、复位等系统级的接口
信号;通用寄存器(GeneralPurposeRegisters,GPR)用于存放指令的操作数。

图4.1顶部的其他接口分别是UDI接口、CP2接口和中断接口(neptitrae),

itrunefc它
们分别用于使处理器能够运行用户自定义指令、与协处理器2(CP2)互连以及接收外部中断
信号。

50 


51
图4.1 MIPSfpga处理器核结构
指令高速缓存和数据高速缓存(I-Cache和D-Cache)分别通过各自的控制器连接到内
存管理单元(MemoryManagementUnit,MMU ) 。MMU 负责内存的地址变换以及当指令
或数据不在高速缓存中时将其从内存“搬运”到高速缓存中来。总线接口单元(BusInterface 
Unit,BIU)使用户可以通过AHB-Lite总线协议给处理器外接存储器或者采用内存映射方
式的外部设备(详见4.2节) 。
数据和指令中间结果暂存寄存器(ScratchpadRAM,SRAM)接口使得处理器能够以低
延迟访问片上存储器(on-chipmemory) 。调试和分析器单元(DebugandProfilerUnit)提
供JTAG 接口,用于调试、下载程序代码和对处理器的性能进行监控。
MIPSfpga处理器采用5级流水线,但是与标准的MIPS5 级流水线稍有不同。MIPSfpga 
处理器5级流水线如表4.1所示,其时空图如图4.2所示。

表4.pga处理器5级流水线

1 
MIPSf

序号流水级名称描述
1 I 取指处理器取出指令
2 E 执行处理器从寄存器取出操作数并进行运算
3 M 访存根据指令,处理器从内存取出操作数或向内存存入操作数
4 A 对齐根据指令,处理器将从内存中取出的数进行32 位边界对齐
5 W 写回根据指令,处理器将结果写回寄存器


图4.2 MIPSfpga处理器5级流水线时空图

MIPSfpga采用32 位地址空间(虚拟地址和物理地址均是32 位)。MIPSfpga有3种操
作模式,分别为内核模式、用户模式和调试模式。复位后,处理器处于内核模式,并且跳到
0xBFC00000(虚拟地址)复位地址开始运行程序,3所示。0x

如图4.BFC00000 地址位于
kseg1段,属于不映射、不缓存地址段。这意味着该段地址中的指令是直接取自内存而不是
高速缓存,同时虚拟地址直接映射到物理地址,而不是通过MMU 进行地址变换。这一点非
常重要,因为复位时处理器的MMU 和高速缓存都还没有完成初始化,不能正常工作。kseg1 
段虚拟地址采用直接减0xA0000000 的方式映射到物理地址,即复位地址0xBFC00000 将映射
到内存的物理地址0x1FC00000 。

图4.4为MIPSfpga处理器系统的关键部件。该处理器系统的时钟、复位和EJTAG 编程
信号来自FPGA 开发板或仿真模拟测试平台。在系统最简化情况下,可以仅外接发光二极管
(LED)或开关,4所示的系统中, fpga处理器核(m14k_

驱动AHB 总线接口。在图4.除MIPStop)外,仅包含mipsfpgaahb 模块,该模块内含RAM 、GPIO 和AHB-Lite总线接口。
mipfpga块提(_) 5所示。它包括以下几部分:一个

sahb 模供的物理地址映射关系如图4.
起始地址从0x1(_) FC00000 开始的128KBRAM,用于存放处理器复位后将执行的程序代码; 
一个起始地址从0x00000000 开始的256KBRAM,用于存放其他的程序代码或数据;另外, 
还包括4个GPIO 寄存器,用于控制发光二极管和开关的输入和输出(3节)。

详见5.

52 


53
图4.3 MIPSfpga虚拟地址映射图
图4.4 MIPSfpga处理器系统的关键部件图4.5 mipsfpga_ahb 模块提供的
物理地址映射关系
4.2 MIPSfpga处理器的接口
MIPSfpga处理器系统的接口主要有3个:AHB-Lite总线接口、FPGA 开发板接口和
EJTAG 接口。MIPSfpga处理器核通过AHB-Lite总线与内存和外设连接;FPGA 开发板

接口使得MIPSfpga处理器核可以控制FPGA 开发板上的开关和LED;EJTAG 接口则用于
将程序下载到MIPSfpga处理器核,并进行实时调试。下面对这3个接口进行详细介绍。

4.2.1 MIPSfpga 
处理器接口
MIPSfpga处理器接口信号如表4.2所示。时钟信号(SIClkIn)是整个MIPSfpga处理
器的系统时钟;如果使用Xilinx公司的Nexys4DDR 开发板,(_) MIPSfpga可以正常运行的最
大时钟频率为62MHz;建议将开发板上的100MHz(Nexys4DDR)时钟分频为50MHz 输入
使用。复位信号(SI_Reset_N)低电平有效(带后缀“_N”),Nexys4DDR 开发板上的复位按
钮(CPU_RESETN)可用于连接该引脚。MIPSfpga处理器上电后必须先进行复位。

表4.pga处理器接口信号

2 
MIPSf

信号分类信号名称备注
系统SI_Reset_N 处理器复位信号
SI_ClkIn 时钟信号,最大时钟频率为62MHz,建议值为50MHz 
HADDR[31:0] 总线地址
AHB-Lite总线HRDATA[31:0] 读的数据
HWDATA[31:0] 写的数据
HWRITE 读写控制信号
IO_Switch[17:0] 接开发板上的滑动开关
开发板引脚IO_PB[4:0] 接开发板上的按钮
IO_LEDR[17:0] 接开发板上的LED 
IO_LEDG[8:0] 接开发板上的LED 
EJ_TRST_N_probe 
接开发板上的EJTAG 接口
EJ_TDI 
EJ_TDO 
EJTAG EJ_TMS 
EJ_TCK 
SI_ColdReset_N 
EJ_DINT 接地

表4.

2各个信号名称前缀的意义如下: 

.SI 为系统接口信号。
.H为AHB-Lite总线信号。
.IO 为开发板输入输出引脚。
.EJ 为EJTAG 接口信号。
54