汹涌澎湃汹涌澎湃汹涌澎湃汹涌澎湃 - tsinghua€¦ · web...

Click here to load reader

Upload: others

Post on 05-Jun-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

汹涌澎湃汹涌澎湃汹涌澎湃汹涌澎湃

嵌入式系统—— 体系结构、编程与设计(第2版)

第2章 8051和高级处理器体系结构、存储器组织和现实中的接口

8051和高级处理器体系结构、存储器组织和现实中的接口

复习前面所学内容

前面一章介绍了以下内容:

(1) 嵌入式系统嵌入了软件和RTOS。

(2) 嵌入式系统的软件嵌入在硬件之中。嵌入式系统的硬件包括:微处理器、微控制器、DSP或ASIP,以及专用处理器。

(3) 嵌入式系统中包括了存储器(ROM、RAM和高速缓存)、端口、定时器、设备和接口电路。

(4) 微控制器硬件包括:处理单元、RAM、ROM、定时和中断处理设备、专用单芯片或VLSI核专用单元。

(5) 设计指标、过程以及挑战。

(6) 软件、设备驱动程序和设备管理程序。

(7) 软件工具。

本章学习目标

本章中我们将学习下列内容:

(1) 8051的体系结构概述,以及它的处理器、存储器、端口、计数器/定时器、串行IO和中断处理单元

(2) 现实中的接口、内部总线以及将处理器与系统存储器、IO设备和所有其他系统单元连接起来的外部总线

(3) 接口示例:键盘、显示器、ADC和DAC

(4) 高级处理器x86、ARM和SHARC的体系结构

(5) 处理器和存储器的组织

(6) 通过快速的程序执行来改进处理器计算性能的指令级并行、超标量、进程、流水线和高速缓存单元

(7) 各种类型的存储器及其应用

(8) 设备和存储地址分配

(9) 测量处理器性能的性能指标

(10) 嵌入式系统的处理器选择

(11) 嵌入式系统的存储器选择

2.1 8051的体系结构

下面各节简要概述了8051的体系结构,读者可以参考相关教材深入学习有关细节。

2.1.1 8051微控制器体系结构

图2-1展示了典型的8051微控制器的体系结构。典型指的是初始版本,在此基础上推出了各种改进版本。典型版本包括了以下硬件:

复位

¶Ë¿Ú

P1

PC

WDT

IR

ID

A8

-

A15

AD0

-

AD8

¶Ë¿Ú

P3

¶Ë¿Ú

P2

¶Ë¿Ú

P0

Osc

S1

T1

T0

Ö´Ðе¥Ôª

Ìõ¼þ²âÊÔ·ÖÖ§Âß¼

¿ØÖƺͶ¨Ðòµç·

ÖжϿØÖƵç·

ROM

ºÍ

RAM

º¬ÓÐ

8

¸ö¼Ä´æÆ÷µÄ¼Ä´æÆ÷×é

DPTR(2 SFR)

A

¡¢

B

¡¢

PSW

¡¢

SP SFR

SFR IO

ºÍÉ豸

ALU

图2-1 8051体系结构

(1) 一个12MHz的时钟。因此,处理器的指令周期为1μs。

(2) 一个8位的ALU。因此,内部总线宽度为8位。

(3) CISC(复杂指令集计算机)体系结构(CISC为算术、逻辑和其他各种指令提供了多种操作数寻址方式。CISC的复杂指令执行时间超过了一个时钟周期。CISC的复杂指令硬件中是通过微程序控制电路实现的,而不是为每条指令设计独立的硬连接逻辑电路)。

(4) 特殊位操作指令。

(5) 一个程序计数器,处理器将它的默认初始复位值设为0x0000。

(6) 一个栈指针,处理器将它的默认初始复位值设为0x07。

(7) 简单的体系结构,没有浮点处理器,没有高速缓存,没有存储管理单元,没有原子操作单元,没有流水线,也没有指令级并行(参见2.3和2.5节)。典型版和多数其他版都没有DMA控制器(参见4.8节)。

(8) Harvard存储器体系结构(参见2.4.2节)。程序存储空间和数据存储空间各自有从0x0000开始的独立地址空间和独立的控制信号。

(9) 128字节的片上RAM。8052版本提供了256字节的RAM,其中32字节作为4个寄存器组使用。每个寄存器组含有8个寄存器。在大部分版本中,外部数据/栈存储空间可以增加到64kB。一些8051改进版中,这一上限提高到了16MB。

(10) 一组特殊功能寄存器(SFR),包括PSW(处理器状态字)、A(累加器)、B寄存器、 SP(栈指针)以及串行IO、定时器、端口和中断处理器寄存器。

(11) 版本8351有片上ROM,版本8751有片上EPROM,版本8951有4kB片上EEPROM或闪存。还有一些版本提供了更大容量的ROM。片外附加程序存储空间可以增加到64kB。在扩展8051和统一地址空间版本(8051EX和MX版)中,这一限制提高到了16MB。

(12) 两个外部中断管脚INT0和INT1。

(13) 单芯片模式下的4个8位端口P0、P1、P2、P3(参见2.1.3节)。还有两个定时器(参见2.1.5节)和一个串行接口(SI)。通过编程,SI能够提供三种全双工UART模式进行串行IO(在这种IO方式中,每隔一定时间间隔,连续地在数据线上传送字的每一位)。通过编程,还可以让SI进行半双工同步IO(参见2.1.6节)。

(14) 典型版本没有脉宽调制器,但提供了对DAC(参见1.3.7节)的支持。它也没有调制解调器,没有watchdog定时器,没有ADC。但其他某些版本可以支持watchdog定时器和ADC。西门子SAB 80535-N支持具有可编程参考电压的ADC。一些高级版本支持上述特性,设计时要根据系统需要来选择版本。

2.1.2 指令集

图2-2给出了8051指令集中的指令类型。关于整个指令集和每条指令的详细介绍可以参考微控制器的教材或手册。8051的指令分为7种类型,其中比较重要的指令有:

1. 数据传输指令

数据传输指令把源操作数移动(复制)到目的操作数中。例如,MOV A,Rn和MOV Rn,A分别实现把数据从Rn移动(复制)到A和把数据从A移动(复制)到Rn。其中Rn为一组8个寄存器中的第n个,PSW的RS0和RS1位可以预定义这组寄存器。

数据传输指令MOV A,@Ri和MOV@Ri,A分别实现把数据从@Ri移动(复制)到A和把数据从A移动(复制)到@Ri。其中Ri为一组8个寄存器中的第i个,PSW的RS0和RS1位可以预定义这组寄存器。@Ri指的是寄存器组中第i个寄存器的内容指向的8位地址单元。

四条数据传输指令MOV direct,#data,MOV A,#data、MOV Rn,#data和MOV @Ri,#data实现把8位立即数data移动到direct(直接地址)、A、Rn或@Ri。其中direct指的是一个8位的内部128B RAM中的地址单元或者SFR地址。@Ri指的是寄存器组中第i个寄存器的内容指向的8位地址单元(i=0或i)。

七条数据传输指令MOV direct,direct、MOV A, direct、MOV direct,A、MOV direct,Rn、MOV Rn,direct、MOV direct,@Ri、MOV @Ri, direct分别实现在8位直接地址单元(direct)之间、直接地址单元与A、Rn和@Ri之间移动数据。其中direct指的是一个8位的内部128B RAM中的地址单元或者SFR地址。@Ri指的是寄存器组中第i个寄存器的内容指向的8位地址单元(i=0或i)。

DPTR是一个16位的外部存储器数据指针。指令MOV DPTR,data16实现把指定的16位立即数data16发送到DPTR中。

指令MOVX(移动外部存储器指令)将数据移出或移到外部数据存储器,如MOVX A,@DPTR和MOVX @DPTR,A。其中@DPTR指16位的DPTR指向的地址单元。对于8位的外部存储器地址空间,要使用@Ri(i=0或1)代替@DPTR。指令MOVC(从外部程序存储器移动代码指令)将数据从外部程序存储器取出,如MOVC A,@A+DPTR和MOVC A,@A+PC。

栈操作使用指令PUSH direct和POP direct。

2. 位操作指令

在8051硬件中,对某些SFR和每个8位内部RAM的每一位都分配了地址,并可以通过位操作指令进行清零、置位、逻辑与(AND)、逻辑或(OR)和移动(MOV)操作。

3. 字节操作指令

通过字节操作指令可以对A进行循环右移、循环左移、带进位的循环右移、带进位的循环左移、求补、清零和交换A的高四位和低四位。

4. 算术运算指令

算术运算指令的源操作数保存在累加器中,运算的结果同样保存到累加器中。例如,指令ADD A,Rn把第n个寄存器中的字节数据加到A中的字节数据(A←A+Rn)。算术运算指令有三个:ADD、ADDC(含进位加法)和SBBB(借位减法)。如果操作结果产生进位或借位,则进位标志位置为1。借位同样保存在进位标志位中。算术运算指令的第二个操作数可以是Rn、直接地址、@Ri(i=0或1)或立即数。这些操作数的含义与在数据传输指令中相同(参见之前的解释)。另外还有一个指令用于将十六进制加法转化为十进制加法。

位操作指令

(

²¼¶û´¦ÀíÖ¸Áî

)

ÇåÁã¡¢ÖÃλ¡¢Ç󲹡¢Âß¼Óë¡¢Âß¼»ò¡¢Òƶ¯²Ù×÷

×Ö½Ú²Ù×÷Ö¸Áî

ÇåÁã¡¢Ç󲹡¢½»»»ºÍÑ»·Ö¸Áî

Âß¼²Ù×÷Ö¸Áî

Âß¼Óë¡¢Òì»ò¡¢Âß¼»ò²Ù×÷Ö¸Áî

ËãÊõÔËËãÖ¸Áî

ËãÊõÖ¸Áî

¼ÓÒ»¡¢¼õÒ»Ö¸Áî

ÖжÏÁ÷¿ØÖÆÖ¸Áî

ÖжÏÁ÷¿ØÖÆÑÚÂë¡¢ÓÅÏȼ¶¿ØÖÆλ

RETI

ÖжϷµ»ØÖ¸Áî

³ÌÐòÁ÷¿ØÖÆÖ¸Áî

·ÖÖ§Ö¸Áî

Ìõ¼þÌøתָÁî

¼õÒ»²¢Ìõ¼þÌøתָÁî

±È½ÏºóÌõ¼þÌøתָÁî

×Ó³ÌÐòµ÷ÓÃÖ¸Áî

NOP

¿Õ²Ù×÷

ÑÓ³ÙÖ¸Áî

Êý¾Ý´«ÊäÖ¸Áî

ÔÚÀÛ¼ÓÆ÷

(SFR)

ºÍ¼Ä´æÆ÷×éÖеÄÒ»¸ö¼Ä´æÆ÷Ö®¼ä´«Êä×Ö½Ú

´Ó

SFR

»ò

ÄÚ²¿

RAM

Òƶ¯Êý¾Ýµ½ÁíÒ»¸öÖ±½ÓµØÖ·

¼ä½ÓµØÖ·Òƶ¯²Ù×÷

Á¢¼´ÊýÒƶ¯²Ù×÷£¬Òƶ¯Á¢¼´Êýµ½

DPTR

MOVC

ºÍ

MOVX

¼ä½ÓµØÖ·²Ù×÷

PUSH

ºÍ

POP

Ö±½ÓµØÖ·²Ù×÷

图2-2 8051指令集指令类型

指令INC和DEC分别对源操作数的值加一或者减一,源操作数可以是Rn、直接地址、@Ri或A。

指令MUL AB和DIV AB执行A–B←A×B和A–B←A÷B的操作。乘法运算结果的低位保存在A中,高位保存在B中。除法运算结果的商保存在A中,余数保存在B中。

5. 逻辑运算指令

逻辑运算指令的一个源操作数为累加器或直接地址,操作结果同样保存在累加器或直接地址中。例如,ANL A,Rn和ANL direct,Rn。这两条指令对A或直接地址中的字节和寄存器组中第n个寄存器中的字节执行逻辑与操作(A←A&Rn)。逻辑操作指令有三个:ANL(逻辑与)、ORL(逻辑或)和XRL(逻辑异或)。当第一个操作数(同时作为源操作数和目的操作数)为A时,第二个操作数可以是@Ri、Rn或直接地址;当第一个操作数(同时作为源操作数和目的操作数)为直接地址时,第二个操作数可以是A和立即数。这些操作数的含义与在数据传输指令中相同(参见之前的解释)。

6. 程序流控制指令

程序流控制可以通过短跳转、绝对跳转、长跳转和跳转指令实现。短跳转指令的跳转范围在相对地址–128~+127范围内,绝对跳转指令跳转到位于程序存储空间中的11位直接地址指定的地址单元,长跳转指令跳转到位于程序存储器中的16位直接地址指定的地址单元,跳转指令的目标地址通过A+@DPTR指定。

8051中还有条件程序流控制指令和循环控制指令。在循环控制指令中,跳转计数值保存在Rn或一个直接地址单元中,另外还需要一个跳转偏移量。这两个值都需要在循环控制指令中指定。

子程序调用中的程序流控制通过绝对调用或长调用实现。绝对调用指令调用一个位于程序存储空间中的指定的11位直接地址单元,长调用指令调用一个位于程序存储空间中的指定的16位直接地址单元。

RET指令用于从程序调用返回,RETI指令用于从中断服务例程返回。

2.1.3 IO端口、电路以及IO编程

图2-3(a) 给出了8051中的IO端口P0、P1、P2和P3。8051在单芯片模式下有4个端口。单芯片模式的意思是没有其他外部存储器芯片、端口、串口或外围设备连接在8051的端口上。2.1.4节将会介绍一个扩展模式的电路。

不同的8051版本,它的端口驱动能力不同。端口P0是一个8位的漏极开路双向IO端口,而P1~P3是准双向IO端口。漏极开路端口意味着输出端口管脚需要一个上拉电路或电阻来把电压提升到逻辑1的水平。8051中的准双向IO端口能够驱动两个时钟周期的8个逻辑LSTTL门。如果要获得更高的驱动能力,就需要使用上拉电路。在P83C538版本中,端口P1也是漏极开路端口,它的两个管脚P1.6和P1.7用于连接I2C总线(参见3.10.1节)的时钟和数据信号。

IO端口电路

2.2.6和3.3 节将会介绍IO端口与开关、小键盘、编码器、电动机和LCD控制器的接口电路。图2-3(b)和(c)分别展示了IO端口P1连接到打印机中两个步进电机和机器人中6个伺服电机的电路。IO端口的字节和位可以通过如下方式进行编程和访问:

(1) IO端口字节编程

8051的内部端口P0、P1、P2和P3的字节可以通过字节地址访问,执行读、写等其他操作。这些地址在指令中通过8位直接地址指定。端口P0、P1、P2和P3的字节地址分别为0x80、0x90、0xA0和0xB0。指令集中所有使用直接地址作为操作数的指令都可以访问端口,对端口执行读、写操作。

(2) IO端口位编程

P0、P1、P2和P3每个端口都有8位数据,每一位都可以通过地址访问,并使用位操作指令执行读、写操作。这些地址是8位的位地址,可以在指令中指定。位P0.0到P0.7的地址分别对应于0x80~0x87。位P1.0~P1.7的地址分别对应于0x90~0x97。位P2.0~P2.7的地址分别对应于0xA0~0xA7。位P3.0~P3.7的地址分别对应于0xB0~0xB7。指令集中所有使用位地址作为操作数的指令都可以访问端口位,对其执行求补、读、写操作。在通过位地址对端口位进行逻辑操作时,PSW中的C标志位作为累加器使用。

示例2-1

(1) MOV 0xA0, #0xFF 将数据写入端口P2,P2的值变为11111111 b。

(2) MOV 0x90, #0x1C 将数据写入端口P1,P1的值变为00011100 b。之后,

(3) INC 0x90 将使P1=00011100 b +1=00011101 b。

(a)

(b)

(c)

伺服电机

1

伺服电机

2

伺服电机

3

伺服电机

4

伺服电机

5

伺服电机

6

步进电机

1&2

图2-3 (a) 8051中的IO端口;(b) IO端口P1连接到打印机中两个步进电机的电路;

(c) IO端口连接到机器人中6个伺服电机的电路

示例2-2

(1) CPL 0x90 将对端口P1的0位求补。

(2) CLR 0x80 将P0.0清零。等待时间T1后,SETB 0x80 将P0.0置位为1。再等待时间T2后,CLR 0x80 再次将P0.0清零。如果循环执行以上指令,就可以产生time_period为T2,占空比为100T1/(T1+T2)的脉冲。

(3) SETB C 将PSW中的进位标志位设置为1。之后,ANL C,0x93将对PSW中的进位标志位C和P1.3执行逻辑与操作,操作结果保存在C中。如果P1.3=0,C将变为0,否则C仍为1。

(4) CLR C将PSW中的进位标志位复位(清零)为0。之后,ORL C,0xB2 将对PSW中的进位标志位C和P3.2执行逻辑或操作,操作结果保存在C中。如果P3.2=0,C仍为0,否则C变为1。之后,MOV 0x85,C将C中的结果写入P0.5。

2.1.4 外部存储器接口电路

图2-4(a)展示了8051连接外部程序和数据存储器的电路。存储器分为两组,分别为程序存储器和数据存储器。处理器通过两个控制信号PSEN和RD控制从程序存储器或数据存储器读取数据。处理器通过控制信号ALE控制在给定的时刻将AD0-AD7作为地址线或数据线。2.2.1节将详细介绍PSEN、RD和ALE控制信号。

锁存器

³ÌÐò´æ´¢Æ÷

Êý¾Ý´æ´¢Æ÷

Ëø´æÆ÷

Ëø´æÆ÷

½âÂëÆ÷

(a)

(b)

图2-4 (a) 8051连接外部程序和数据存储器的电路

(b) 8051连接外部PPI 8255端口PA、PB和PC的接口情况

(1) 端口P0在扩展模式中用作AD0-AD7。AD0-AD7是复用信号线,A0-A7作为地址总线的低地址位,D0-D7作为数据总线。A0-A7和D0-D7的复用采用的是时分复用的方式。处理器在一个指令周期内激活ALE(地址锁存使能),在这个时间段,AD0-AD7线路作为A0-A7,由锁存电路为存储器分理出A0-A7的信号。

(2) 端口P2与 A8-A15地址信号连接。当处理器激活PSEN(程序存储使能)后,它通过D0-D7数据总线从外部程序存储器中读取字节。当处理器激活RD(读取)后,它通过D0-D7数据总线从外部数据存储器中读取字节。

对于超出内部RAM、SFR和内部程序存储空间的地址,处理器总是访问外部存储器,而不管外部使能信号EA是否处于激活状态。内部RAM和SFR地址0x00-0xFF与外部存储器地址0x0000-0xFFFF在同一地址空间。内部程序存储器地址0x000-0xFFF(在4kB内部RAM情况下)与外部程序存储器地址0x0000-0xFFFF在同一地址空间。当控制信号EA激活时,处理器将会访问存储器的外部地址,而不是内部存储器或寄存器地址。

8051采用的是地址映射方式的IO(参见2.2.2节),为内存和端口在数据存储地址空间中分配了独立的地址范围。因此,对存储器、外部接口连接和可编程外围设备接口(PPI)的接口电路设计都是相同的。8255是一个PPI芯片。图2-4(b)展示了使用外部PPI端口PA、PB和PC时的接口情况。

2.1.5 计数器和定时器

图2-5给出了8051中的计数器和定时器T0、T1的规范。典型的8051有两个定时和计数设备——T0和T1,而8052有T0、T1和T2三个。通过两个SFR(TH1-TL1),可以访问T1计数值的高8位和低8位。SFR中保存了T1设备的16位值。通过另外两个SFR(TH0-TL0),可以访问T0的高8位和低8位。SFR中也保存了T0设备的16位值。

P3.2

P3.3

P3.4

P3.5

分别作为

GT0(

开始

/

停止

T0

的门电路

)

GT1(

开始

/

停止

T1

的门电路

)

T0(T0

计数输入

)

T1(T1

计数输入

)

的输入,此时

TMOD

3

7

2

6

位设置为:

定时器

/

计数器

T0

有关的

8

SFR

有:

TMOD(

低四位

)

TCON(5

4

)

TL0(

计数

/

定时位

)

TH0(

计数

/

定时位

)

TMOD.2=1

时,作为计数器,输入来自

P3.4

TMOD.2=0

时,作为定时器,输入来自内部时钟

当模式设置为

0

时,处于

8

位定时器

/

计数器模式。

TH0

用作

T0

TL0

用作计数或时钟输入的预引比例因

(

除法

)

,值为

32

当模式设置为

1

时,处于

16

位定时器

/

计数器模式,

TH0

-

TL0

用作

T0

进行计时或计数

当模式设置为

2

时,处于

8

位定时器

/

计数器模式。

TH0

用作

T0

TH0

超时后自动重载

TL0

中的预设值

当模式设置为

3

时,设置两个

8

位定时器

/

计数器。

TH0

TL0

用作两个独立的

8

位定时器

/

计数器,

T1

起作用

定时器

/

计数器

T1

有关的

8

SFR

有:

TMOD(

高四位

)

TCON(7

6

)

TL1(

计数

/

定时位

)

TH1(

计数

/

定时位

)

TMOD.6=1

时,作为计

数器,输入来自

P3.5

TMOD.6=0

时,作为定时器,输入来自内部时钟

当模式设置为

0

时,处于

8

位定时器

/

计数器模式。

TH1

用作

T0

TL1

用作计数或时钟输入的预引比例因

(

除法

)

,值为

32

当模式设置为

1

时,处于

16

位定时器

/

计数器模式,

TH1

-

TL1

用于进行计时或计数

当模式设置为

2

时,处于

8

位定时器

/

计数器模式。

TH1

用作

T1

TH1

超时后自动重载

TL1

中的预设值

当模式设置为

3

时,

T1

停止。

TH0

作为一个独立的

8

位定时器代替

T1

图2-5 8051的T0和T1计数器/定时器

有一个称为TMOD的SFR,它的高四位和低四位分别控制T1和T0的工作模式,通过编程可以用来设置T1和T0用于计数或定时。四位中一位控制外部门电路是否输入控制信号,另有一位控制是否使用了计数器或定时器。其余两位控制计数器或定时器的功能模式,可设置为0、1或2。

当从时钟获得输入时,计数/定时设备开始记录时间。如果作为定时器使用,时钟脉冲每隔固定时间从内部给出信号;如果输入信号来自外部,则进行计数。作为计数器时用于计数的输入信号来自外部输入管脚。

(1) 当计数/定时设备是通过外部门电路的输入控制时,如果GT0或GT1被外部信号激活,设备可以正常工作,否则在外部门输入模式下,设备处于非活跃状态。GT0或GT1的信号通过P3.2和P3.3输入。

(2) 当T0处于计数器模式时,它用于计数的输入来自外部输入管脚T0,即P3.4。当T1处于计数器模式时,它用于计数的输入来自外部输入管脚T1,即P3.5。

有一个称为TCON的SFR,它的高四位用于对T1和T0的计数/定时设备进行编程。其中,TCON.7和TCON.5分别显示T1和T0计数器/定时器溢出状态。TCON.6和TCON.4分别控制T1和T0计数器/定时器溢出状态的开始和结束。TCON的低四位用于对INT0和INT1的中断控制(参见2.1.7节)。

2.1.6 串行数据通信输入/输出

图2-6展示了8051的串口以及使用SI(串行接口)的数据串行通信。

SI有两种模式:半双工同步和全双工异步。半双工的意思是单线路通信,全双工的意思是同时双线路通信。

P3.0

P3.1

用作

UART

模式下串行输入输出

RxD

TxD

的管脚,或者用作同步串行模式下数据

和时钟的输入管脚,或者用作同步串行模式下数据和时钟的输出管脚

串行接口

SI(

对半双工同步串行模式或全双工异步

UART

模式可编程

)

相关的

8

SFR

有:

SBUF(8

位的串行数据接收或发送寄存器,根据使用

SBUF

的指令决定用作源还是目的

操作数

)

SCON(8

位的串行模式和控制寄存器

)

PCON(

用到了

PCON.7)

SCON

的位

7

6

00

(

模式

0)

,根据

SBUF

在指令中作为源还是目的操作数决定

SI

是同步串行模式

数据和时钟的输入还是并步串行模式数据和时针的输出

SCON

的位

7

6

01

(

模式

1)

SI

作为

10

(

开始脉冲,

8

位串行数据,停止脉冲,共

10

)UART

模式下的串行输入和输出,具有通过

T1

T0

定时器

(8052

中还有

T2)

可编程的波特率

SCON

的位

7

6

10

(

模式

2)

SI

作为

11

(

开始脉冲,

8

位串行数据,

RB8

TB8

脉冲,停止脉

冲,共

11

)UART

模式下的串行输入和输出,具有固定波特率。波特率为

(f/32)

÷

12

或者

(f/64)

÷

12 Mbaud/s

其中

f =

晶振频率。波特率决定于

PCON

7

,即

SMOD=1

0

SCON

的位

7

6

11

(

模式

3)

SI

作为

11

(

开始脉冲,

8

位串行数据,

RB8

TB8

脉冲,停止脉

冲,共

1

1

)UART

模式下的串行输入和输出,具有通过

T1

T0

定时器

(8052

中还有

T2)

可编程的波特率

图2-6 8051中的串行端口和使用SI(串行接口)的数据串行通信

串行输入输出使用单个SFR作为发送和接收的缓冲区。向该SFR写入数据后,该SFR即保存了SI要传输的8位数据。SI缓冲区的地址为0x99。例如,指令MOV 0x99,A从寄存器A写数据到发送缓冲区,指令MOV R1,0x99从接收缓冲区读取数据到R1。

有一个称为SCON的SFR用于控制SI。它的高三位用于设置SI的模式,可设为0、1、2或3。模式0为半双工同步模式,模式1、2或3为全双工异步模式。模式2以11T格式发送和接收数据,模式1以10T格式发送和接收数据。这里T为连续发送或接收的比特位之间的时间间隔,T-1为波特率(3.2.3节进行了详细介绍)。模式1和3具有可编程的波特率,模式2的波特率是固定的。

SCON.4位可以设置允许或禁止SI的接收功能。SCON.3和SCON.2可以指定要发送的位8(附加位),当处于模式2或3时,位8会被接收。SCON.1可以设置在发送完成时允许或禁止SI发送方中断(TI),SCON.0可以设置在接收完成时允许或禁止SI接收方中断(RI)。

2.1.7 8051的中断

图2-7给出了典型8051的中断系统规范。8051中有多个中断。在打开中断的条件下(没有被屏蔽),发生中断事件会调用相应的ISR。

IE(Interrupt Enable

£¬ÖжÏʹÄÜ

SFR)

µÄλ

7

£¬¼´

EA(Enable All

£¬´ò¿ªÈ«²¿

)

Ϊ

1

£¬²¢ÇÒλ

0

ºÍ

λ

2

Ϊ

1

ºÍ

1

ʱ£¬

P3.2

ºÍ

P3.3

ÓÃ×÷ÍⲿÖжÏ

INT0

ºÍ

INT1

µÄ¹Ü½Å

ÖжÏÔ´

Ïà¹ØµÄ

8

λ

SFR

ÓУº

IE(EA

λ´ò¿ªÈ«²¿Öжϣ¬ÆäËûλΪµ¥¸öÖжÏʹÄÜλ

)

ºÍ

IP(

µ¥¸öÖжÏÓÅÏȼ¶ÉèÖÃλ

)

Íⲿ

INT0

ÖжÏ

T0

Òç³öÖжÏ

Íⲿ

INT1

ÖжÏ

T1

Òç³öÖжÏ

SI

´®ÐÐ

UART

»òͬ²½Ä£Ê½ÖжÏ

SI

ͬ²½´®ÐÐģʽÖжÏ

(

ÔÚС²¿·Ö

8051

ϵÁÐÖе¥¶À·Ö³öÀ´

)

8052

ÖеĶ¨Ê±Æ÷

2(T2)

ÖжÏ

ÏòÁ¿µØÖ·£¬±£´æÁË

8

×Ö½Ú

ISR

»òͨ¹ý±à³ÌÉèÖõÄ

ISR

¿ªÊ¼µØÖ·¡£Èç¹û

EA

ÖÃ룬²¢ÇÒÏàÓ¦µÄÖжÏλÖÃ룬

ÔòÌøתµ½ÏòÁ¿µØÖ·Öб£´æµÄ¶ÔÓ¦µØÖ·¿ªÊ¼Ö´ÐÐ

ISR

Ö´Ðйý³ÌÖеĵÍÓÅÏȼ¶

ISR

ÔÊÐí³ÌÐòÁ÷תµ½¸ü¸ßÓÅÏȼ¶µÄ

ISR

£º

YES

Ó²¼þĬÈϵÄÓÅÏȼ¶

(

ͨ¹ýÈí¼þÔÚ

IP

ÖÐ

·ÖÅäµÄ¸ßÓÅÏȼ¶»á

¸²¸ÇĬÈÏÓÅÏȼ¶

)

0x0003

0x000B

0x0013

0x001B

0x0023

0x002B

²»Í¬°æ±¾µÄ

0x0053

INT0

T0

INT1

T1

Serial

T2

Syn Serial

图2-7 8051体系结构中的中断

通过使用SCON对SI编程,SI的发送或接收中断,以及同步模式中断就会发生。使用TMOD对定时器T1和T0编程,T1和T0的溢出中断就会发生。8051还有两个外部管脚用于来自外围设备或外部电路的中断。

INT0和INT1两个外部中断管脚位于P3.2和P3.3,通过对TCON的低四位和IE寄存器的IE.2和IE.0编程,可以接收来自外部的中断。

当多个中断同时发生时,8051硬件会对每个中断服务程序设置默认的优先级。默认优先级的顺序是:INT0、T0溢出、INT1、T1溢出、SI(UART模式)、T2(在8052中)、SI(同步模式)。8051还允许通过指令定义中断的优先级。IP(Interrupt Priority,中断优先级)是一个SFR,它的字节地址是0xB8,它的位地址是0x88-0x8C、0x8D或0x8E。通过设置IP中对应位为1或0,可以设置给定中断具有较高或较低的优先级(参见4.6.3节)。

SFR IE的字节地址是0xA8,位地址是0xA8-0xAF,通过设置IE的各个位,可以打开或禁止中断(参见4.4.3节)。

TCON.3显示了INT1的状态,当处理INT1的ISR开始执行后,该位自动复位为0。TCON.1显示了INT0的状态,当处理INT0的ISR开始执行后,该位自动复位为0。TCON.2显示了INT1中断的类型,为1表明是边沿触发型,否则为0。TCON.0显示了INT0中断的类型,为1表明是边沿触发型,否则为0。

8051中具有固定的中断向量地址(参见4.4.1节)。在两个向量地址之间有8字节的地址空间,ISR(参见4.2节)或者存储在这些空间中,或者从这些地址调用另一个较长的ISR。

2.2 现实世界中的接口

2.2.1 基于系统总线和基于IO总线的现实世界接口IO

图2-8展示了一个简单总线结构的互联情况,该总线上连接了处理器、存储器和IO设备。系统总线中定义了三组信号,可以将总线划分为地址总线、数据总线和控制总线。处理器的内部总线和系统的外部总线有不同的特征,系统总线需要按照处理器信号时序图、处理器速度以及指令和数据字长的需要设计接口。

处理器

RAM

ROM

IO

¶Ë¿ÚºÍÉ豸

µØÖ·×ÜÏß

Êý¾Ý×ÜÏß

¿ØÖÆ×ÜÏß

图2-8 连接处理器、存储器和IO设备的简单总线互联结构

1. 地址总线

处理器通过地址总线向存储系统发出指令字节或字的地址,或者根据执行的需要,处理器的执行单元通过地址总线向存储系统发出数据(字节或字)地址。32位的地址总线从一个32位值指定的地址取回指令或数据。

示例2-3

(1) 假设处理器开始时重新设置程序计数器指向地址0,处理器就会向总线上发出地址0,并从存储器将地址0处的指令取回。

(2) 假设一条处理器指令需要从存储器地址M将数据加载到寄存器r1。处理器就会向地址总线上发出地址M,并将地址M处的数据取回。

2. 数据总线

当处理器发出指令的地址时,就会通过数据总线获得相应的指令。当处理器发出数据的地址时,就会通过数据总线加载相应的数据。当处理器发出数据的地址时,就会通过数据总线将数据存储到存储器中。32位的总线取回、加载或者存储32位的指令或数据。

示例2-4

(1) 当处理器发出一个指令的地址m时,它通过数据总线从地址m取回指令(对一个32位的指令,数据总线上的字来自地址m、m+1、m+2和m+3)。

(2) 当一条指令要将寄存器r1中的数据存储到存储器地址M时,处理器向总线发出地址M,并通过数据总线发送M中的数据(对32位的数据,总线上的字将存到地址M、M+1、M+2和M+3)。

3. 控制总线

控制总线发出信号,控制互联过程中各种行为的时序,实现对各个子系统的同步。控制信号可以是以下几种:

地址锁存使能(Address Latch Enable,ALE。包括地址选通(AS)或地址有效(ADV))、存储器读(RD)或写(WR)、IO(读(IORD)、写(IOWR)或数据有效(DAV))、对事件请求处理器关注的中断应答(INTA)、对请求允许使用系统总线的外部请求的保持应答(HLDA),以及其他与处理器设计有关的控制信号。当外部设备产生中断时,系统的输入控制信号为INTR(中断);当外部设备发送一个直接存储器访问(DMA)的保持请求时,输入控制信号为HOLD。

示例2-5

(1) 当处理器发出地址时,它同样还发出一个存储器读控制信号,并等待数据或指令。存储单元必须在存储器读信号有效且没有撤销之前将数据放到总线上。

(2) 当处理器将地址发送到地址总线,并将数据发送到数据总线(在足够时间后使所有地址位就绪)后,它发出一个存储器写控制信号(在足够时间后使所有数据位就绪),将数据写入存储器。存储单元必须在存储器写信号有效且没有撤销之前写入数据。

总线和存储器之间可以采用时分多路复用(TDM)方式的地址和数据线,接口电路通过控制信号实现总线的信号分离(分时复用技术(TDM)的意思是,在不同的时间段中,有不同的信号集合(通道))。在一个时间段中是地址信号,而在另外一个时间段中是数据总线信号。在8051中有一个称为地址锁存使能(Address Latch Enable,ALE)的控制信号。在68HC11中,控制信号是地址选通脉冲(Address Strobe,AS)。 80196中控制信号是地址有效(ADV)信号。ALE、AS或者ADV对输入到设备的地址和数据总线进行信号分离。

连接程序和数据存储器的总线可以复用。接口电路使用控制信号实现总线的信号分离。在8051中,程序和数据存储器公用的地址总线信号分离是由PSEN完成的。当这个信号有效时,到达程序存储器设备的地址信号有效。当RD有效时,到达数据存储器的地址信号有效。

每一个与处理器相连接的存储器设备芯片或者端口都有一个单独的片选信号(CS)。译码器是一个电路,当输入端有正确的地址总线位时,产生相应的CS信号给每一个设备(存储器和端口)。这些设备都位于系统的不同地址空间。在8051中,信号分离器和解码器电路使用的是地址总线的高位地址线、PSEN和ALE。

胶合电路包括了一个解码器,这个解码器用于处理器、存储器和IO设备之间的总线互联。互联通过数据、地址和控制总线信号实现。对总线信号时序图的理解是适当地设计接口电路和GAL或者FPGA中的熔断(烧制)的基本要求。图2-4和图2-9(a)、(b)分别给出了8051和68HC11中存储器设备和端口的接口电路。8051微控制器使用一个附加的信号PSEN (由程序存储器的读操作产生的程序存储使能),这是因为主存为Harvard体系结构(参见2.4.2节)。

(b)

(a)

(

写期间

)

(

读和写期间

)

A8

-

A15

图2-9 (a) 68HC11中与存储器和端口互联时处理器发出信号的时序图

(b) 68HC11中与存储器和端口的接口电路

接口电路包括了解码器和信号分离器。它的设计要以可用的控制信号和总线信号时序图为依据。接口电路通过系统总线连接了所有单元、处理器、存储器和IO设备。它是系统中使用的胶合电路的一部分,同样也用在GAL(通用阵列逻辑)或FPGA中。

图2-8展示了一个典型的计算机系统示意图,该系统通过总线实现了处理器、存储器和IO系统的互联网络。现实中的互联网络是由各个主要的子系统中的总线构成的。

系统总线连接了各个子系统,子系统连接了处理器和存储系统,还连接了另外一组信号—— IO总线。这是一种两级总线体系结构。通过使用IO总线,计算机可以连接各种IO设备,而不用为每一个IO设备实现专用接口。IO总线支持各种各样的设备,它允许用户只需将设备硬连接到系统就可以向系统中添加设备。也可以设计连接到总线的设备,使这些设备在任何使用相同类型总线的系统上都是兼容的。IO总线实现了对接口的抽象,它使处理器仅使用一组有限的接口硬件就可以和各种IO设备互联。

关于流行的IO总线和无线通信,在3.10~3.13节进行了详细介绍。PCI和USB总线(参见3.12.2节)接口是分别符合PCI标准和USB(参见3.10.3节)标准的两种总线接口。

每个操作系统中需要的仅仅是一个设备驱动程序(参见4.2.4节),用来实现操作系统对IO设备(参见8.6.1节)的控制。

使用IO总线连接IO设备的缺点是计算机中的所有IO设备必须共享IO总线,并且IO总线的速度慢于处理器和IO设备之间的专用连接。这是因为IO总线的设计目标是最大的兼容性和灵活性。

注意:

接口电路包含译码器和信号分离器,以及一个IO总线桥接控制器,并按照可用控制信号和总线信号的时序图进行设计。这个电路连接了所有的单元、处理器、存储器设备、IO总线桥接控制器和IO设备。IO总线桥接控制器是系统中使用的胶合接口电路的一部分,是在PLD(可编程逻辑器件)、GAL(通用阵列逻辑)或者FPGA中设计的。

4. 多级总线(multilevel bus)

图2-10展示了一个两级总线体系结构,图2-11展示了三级总线体系结构。

RAM

ROM

存储器总线

IO

É豸

IO

×ÜÏß

´¦ÀíÆ÷

µØÖ·×ÜÏß

Êý¾Ý×ÜÏß

¿ØÖÆ×ÜÏß

ÊäÈëÊä³ö×ÜÏß¿ØÖÆÆ÷£¬ÀýÈç

PCI

»ò

USB

IO

É豸

IO

É豸

IO

É豸

图2-10 两级总线结构中存储器、系统总线和IO总线的互联

RAM

ROM

存储器总线

´¦ÀíÆ÷

µØÖ·×ÜÏß

Êý¾Ý×ÜÏß

¿ØÖÆ×ÜÏß

´ÅÅÌ

1

´ÅÅÌ

2

USB

É豸

USB

¶Ë¿Ú

LCD

»ò´¥ÃþÆÁ

ÏÔʾÆ÷¿ØÖÆÆ÷

CD ROM

É豸

IO

É豸

Ó²ÅÌ¿ØÖÆÆ÷

´ÅÅÌ×ÜÏß

×ÜÏß¿ØÖÆÆ÷

PCI

»ò

SCSI

USB

×ÜÏß¿ØÖÆÆ÷

IO

×ÜÏß

图2-11 与存储系统通信的独立存储器和IO总线,IO系统

使用了一个总线控制器和一个独立的磁盘IO总线

2.2.2 现实接口中的端口和设备的IO地址

1. 存储器地址映射IO操作

许多处理器和存储器器组织方式要求存储器映射IO。IO设备和端口连接在总线上,因此它们和存储器地址需要分开。存储器地址用于数据和软件,IO地址用于IO。以下是存储器映射IO的特点:

· 处理器没有独立的端口和设备IO地址空间。

· 对存储器地址、IO端口和设备地址数据进行操作的指令和控制信号相同。

· 处理器没有独立的输入/输出和存储器load-store命令。

· 针对主存中的数据进行的算术运算、逻辑和位操作指令也同样适用于IO数据。处理器可以直接对IO端口或设备执行读取和保存数据的操作。存储器中所有指令的操作可以使用累加器、任何寄存器或任何其他存储器地址,在算术运算或逻辑操作执行前、后或执行中,IO端口字节都可以传送到这些位置。

因此,几乎所有的微控制器对IO处理都没有单独的指令。8051(参见2.1节)是一个基于存储器映射IO的处理器和存储器组织方式微控制器的示例。8051和80196微控制器的内部设备地址是事先分配的,它们是不可配置的。

图2-12(a)展示了设备地址在RAM中,并且与存储器地址截然不同。Motorola处理器也没有专门用于IO处理的单独指令。考虑另外一个具有68HC11微控制器的系统。

图中的配置表明,端口A、IO控制寄存器PIOC、端口C、B和端口控制(CTL)寄存器的地址在0x0000~0x0004之间。片上RAM的地址被配置为0x003F~0x0040之间。端口地址和片上RAM可以通过68HC11中的配置寄存器位来配置。例如,可以对上述地址进行配置,并分配在0x0100~0x1040之间。

2. IO地址映射IO操作

一些处理器和存储器组织方式要求IO地址映射IO操作。考虑一个具有80x86微处理器的系统。图2-12(b)的左边给出了存储器地址。图的右边给出了IBM PC系统分配给定时器、键盘、实时时钟和串口(称为COM2)的端口地址。这个图说明,设备地址不需要与存储器地址分开,它们可以相同,控制信号会对它们作出区分。以下是IO地址映射IO的特点:

· 处理器具有独立的端口和设备IO地址空间。

· 对存储器地址、IO端口和设备地址数据进行操作的指令和控制信号不同,简化了设计。IO设备和端口的互联与存储器无关,因此不用考虑分配给软件和数据的存储器地址。

· 处理器具有独立的输入/输出(用于读和写)指令和存储器load-store(用于读和写)指令。

· 所有针对主存中的数据进行的算术运算、逻辑和位操作指令首先使用累加器进行操作,接着在算术运算或逻辑操作之后,数据从累加器中传送出去。

68HC11

配置中的

I/O

端口和存储器地址

PC

中的设备

IO

端口地址

串口

2

实时时钟

键盘

定时器

(a)

(b)

Config

Onchip

RAM

Off chip

RAM

0x00000...

to

0xFFFFF...

系统

存储器

图2-12 (a) 68HC11(含有存储器映射体系结构)的处理器和存储器组织方式, 其中为IO设备分配了地址空间;(b) 基于80x86的IBM-PC中的设备地址

IO子系统中的输入单元和输出单元同样称为IO设备。所有的IO端口和设备都有地址。它们根据系统处理器和系统硬件的配置分配给各个设备。系统不支持直接针对端口数据的ALU操作。

注意:

设备的地址取决于系统硬件配置。多数的处理器采用存储器映射IO,使用相同的指令处理存储器设备和其他设备数据。一些处理采用IO映射IO,例如,80x86处理器使用不同的指令集(输入/输出指令集)和控制信号处理这些设备。

2.2.3 现实接口中的设备地址

在处理器执行的指令中,如果指定了一个设备的地址,则表明选择了该设备,设备就可以通过一组地址和系统总线或IO总线进行通信。这些地址或者由解码器电路的设计,或者由IO总线控制器的设备驱动程序选定。处理器执行读写操作时可以访问设备地址。

(1) 设备数据寄存器(device data register)或者RAM缓冲区。

(2) 设备控制寄存器(device control register)。它保存控制位和配置位。

(3) 设备状态寄存器(device status register)。它保存标志位作为设备的状态。一个标志位可以反映服务请求,并表示发生了设备中断。

每一个设备,也就是每一个设备寄存器,必须在存储器映射中分配地址。

有一点非常重要,在大多数情况下,每个IO设备地址空间都是由系统硬件确定的。定位器或者加载器不能够将它们重新分配给另外的地址空间。另外一点需要记住的就是,根据设备不同,在一个设备地址上可以有一个或者多个设备寄存器。

物理或者虚拟设备可以通过配置与接收输入或者发送输出连接或者断开。设备地址也可以像一个文件,使之只读或者只写,或者可读可写。

示例2-6给出了一个IO设备寄存器地址的详细介绍。这种IO设备称为串行设备,也称为UART设备。

示例2-6

串行设备(serial line device)的设备寄存器具有分配的地址。在使用80x86处理器的系统中,这些地址是由其UART端口接口电路硬件配置决定的。在IBM-PC中处于COM1,地址是0x2F8~0x2FE。

(1) (A)两个IO数据缓冲寄存器(一个用来接收,另外一个用来发送)具有一个公共的地址—— 0x2F8。假设地址0x2FB上的控制位为0,(i)在从这个地址读取的过程中,处理器访问设备的RBR(Receiver Data Buffer Register,接收数据缓冲寄存器);(ii)在向这个地址写的过程中,处理器访问设备的TRH(Transmitter Holding Register,发送保持寄存器)。RBR和TRH的地址都是0x2F8。(B)假设地址0x2FB的控制位为1,除数锁存器(divisor latch)的两个字节的数据具有不同的地址—— 0x2F8(LSB)和0x2F9(MSB)。除数锁存器保持了一个16位的数值,用来对系统时钟进行分频。这样就选择了串行发送的速率(另外一个寄存器(控制寄存器)的一个位将0x2F8从IO寄存器改变为除数锁存寄存器的低字节,将0x2F9改变为高字节)。

(2) 设备的三个控制寄存器IER、LCR和MCR分别具有不同的地址—— 0x2FA、0x2FB和0x2FC。这些寄存器如下所述:(1)IER(Interrupt Enabliig Register,中断使能寄存器)。它控制设备中断。(ii)LCR(Line Control Register,线路控制寄存器)。它定义了有多少位以及这些位在线路上的情况。(iii)MCR(Modem Control Register,调制解调器控制寄存器)。它定义了调制解调器如何进行握手和通信。

(3) 设备的三个状态寄存器分别具有不同的地址—— 0x2FA、0x2FD和0x2FE。这些寄存器如下所述:(i)0x2FA上的IIR(Interrupt Identification Register,中断识别寄存器)。它具有标志位。标志位在设备中断的时候置位,当对相应的设备中断服务和系统复位的时候复位。(ii)0x2FD上的LCR。它定义了有多少位以及这些位在线路上的情况。(iii)0x2FE上的MCR。它定义了调制解调器如何进行握手和通信。

注意:

每一个IO设备都具有不同的地址。每一个设备都有三个寄存器组:数据缓冲寄存器、控制寄存器和状态寄存器。在一个设备地址上可以有一个或者多个设备寄存器。

2.2.4 中断和IO

和处理器相比,IO设备的运行速度非常慢。因此,系统采用了中断驱动的IO。中断是大部分处理器用来处理异步事件的一种机制。

从本质上讲,中断就是允许设备发出一个请求,使处理器停止当前正在执行的工作,转而执行另外一个软件(称为中断服务例程)来处理设备的请求。这与过程调用非常相像。ISR是由外部设备上的一个事件发起的,而不是由一条程序指令发起。

当处理器需要对某些IO设备执行操作,以及在等待IO设备操作完成的过程中需要进行其他工作时,也需要用到中断。

示例2-7

(1) 考虑一个键盘的例子。发送按键的键码需要10ms,因此在1秒之内最多可以按下10次键。键盘输入事件发生的时机是不确定的,连续两次键盘输入事件之间的时间间隔也是不确定的。在中断驱动的IO模式下,当按下一个键时,发送到处理单元的中断信号RxRDY(接收数据就绪)会引发服务例程执行,这个服务例程程序负责读取键码数据。图2-13(a)展示了通过RxRDY中断进行端口输入/输出的方式。

(2) 考虑一个打印机的例子。假设1秒最多可以打印300个字符,那么打印一个输出到端口的数据需要大概0.3ms。完成一个字符打印的时间是不确定的,连续两次字符打印事件之间的时间间隔也是不确定的。在中断驱动模式下,当一个打印操作完成时,发送到打印机处理单元(打印控制器)的中断信号TxDE(传输数据空)将引发一个服务例程执行,该例程负责发送另外一个输出数据。图2-13(b)展示了通过TxDE中断进行端口输入/输出的方式。

INT

Port

(a)

处理器

(

或微控制器

)

INT

INTA

Port

处理器

(

或微控制器

)

键码缓冲区

(8

)

打印机缓

冲区

(8

)

打印机控制器

小键盘控制器

数据字节

t

2

ʱ¿Ì£¬ÔÚ

t

1

Ö®ºó

t

1

ʱ¿Ì£¬ÔÚ

t

0

Ö®ºó

INT1

TxDE

t

0

ʱ¿Ì

Êý¾Ý×Ö½Ú

(b)

´«ÊäÊý¾Ý»º³åÇø¿ÕÖжÏ

t

2

ʱ¿Ì£¬ÔÚ

t

1

Ö®ºó

t

1

ʱ¿Ì£¬ÔÚ

t

0

Ö®ºó

Êä³ö»º³åÇøÒÑÂú

(

½ÓÊÜÇëÇó

)

INT0

t

0

ʱ¿Ì

RxR

DY

½ÓÊÕ»º³åÇø¾ÍÐ÷ÖжÏ

ÖжÏÓ¦´ð

(

ѡͨÇëÇó

)

OBF

图2-13 (a) 通过RxRDY中断进行端口输入/输出的方式

(b) 通过TxDE中断进行端口输入/输出的方式

2.2.5 总线仲裁

多个处理器以及多个专用处理器(参见1.2.1节)可以共享一个总线。专用处理器还可以是控制器,这个控制器可能是一个设备或外围设备的一部分。

图2-14(a)展示了控制器、IO处理器和多种控制器对总线的共享访问。在图中,任一时刻,只能有一个设备授权为总线主设备。通常,系统中会有多个DMA或其他控制器和处理器试图同时访问总线,但是只有其中一个能够获得访问权,也就是只能有一个设备成为总线主设备。在某一时刻访问总线的控制器称为总线主设备。总线上的任何控制器或处理器在不同时刻都可以成为总线主设备。

总线仲裁过程,指的是当前访问总线的主设备释放总线,将控制权交给另一个请求总线的处理器单元的过程。总线仲裁过程有三种方式,它们是菊花链(Daisy Chain)、独立总线请求和授权(Independent Bus Request and Grant)以及轮询(Polling)方式。

1. 菊花链方式

图2-14(b)展示了称为菊花链的总线仲裁方式。它是一种集中式总线仲裁方式,这种方式下,总线控制权从一个总线主设备传递到下一个总线主设备。在图中,总线控制权从控制器U0传递到U1,从U1传递到U2,之后是U3,依次向后。仲裁处理过程中的信号如下:总线授权(bus-grant,BG)信号,它的作用如同一个令牌。开始时,它被发送给U0,如果U0不需要使用总线,则U0将它发送给U1。需要使用总线的控制器可以发出总线请求(bus-request,BR)信号。如果一个控制器成为总线主设备,它会发出一个总线忙(bus-busy,BUSY)信号。当总线主设备不再需要使用总线时,它将取消BR和BUSY信号。这时总线发出BG信号,并从U0开始,按照控制器的优先级一个接着一个向下传递。

这种仲裁方式的优点是,在任一时刻对总线的访问,第i个控制器的优先级高于第i+1个,所有控制器和处理器获得总线访问权(成为主设备)的优先级是固定的。

总线控制器

¿ØÖÆÆ÷

U0

¿ØÖÆÆ÷

U1

¿ØÖÆÆ÷

U2

¿ØÖÆÆ÷

U3

BR0

Data

BR1

BR2

BR3

Busy

Poll lines

(d)

×ÜÏß¿ØÖÆÆ÷

¿ØÖÆÆ÷

U0

¿ØÖÆÆ÷

U1

¿ØÖÆÆ÷

U2

¿ØÖÆÆ÷

U3

BR0

Data

BG0

Busy

BR1

BG1

BR2

BG2

BR3

BG3

Busy

(c)

(b)

(a)

×ÜÏß¿ØÖÆÆ÷

¿ØÖÆÆ÷

U0

¿ØÖÆÆ÷

U1

¿ØÖÆÆ÷

U2

¿ØÖÆÆ÷

U3

BG

BG

BG

Busy

BR

×ÜÏß¿ØÖÆÆ÷

BG

Data

¹²Ïí×ÜÏß

É豸ÖеĿØÖÆÆ÷

ÍâΧÉ豸ÖеĿØÖÆÆ÷

IO

¶Ë¿Ú¿ØÖÆÆ÷

IO

´¦ÀíÆ÷

图2-14 (a) 多个控制器共享系统总线。当IO处理器和多个控制器同时访问总线时, 在任一时刻,它们中只能有一个获得授权成为总线主设备;(b) 菊花链方式的 总线仲裁;(c) 独立总线请求方式的总线仲裁;(d) 总线轮询方式的总线仲裁

2. 独立总线请求方式

图2-14(c)展示了独立总线请求方式的总线仲裁。在这种方式中,每个控制器具有独立的BR信号,BR0、BR1、…、BRn。同时,每个控制器还具有独立的BG信号,BG0、BG1、…、BGn。第i个控制器发送BRi(第i个总线请求信号)后,如果收到BGi(第i个总线授权信号),则它可以使用总线,并将BUSY信号激活。任何控制器如果发现BUSY信号处于活跃状态,则不会发出BR信号。这种仲裁方式的优点是,第i个控制器通过编程可以获得访问总线的最高优先级,所以控制器的优先级可以动态编程决定。

3. 总线轮询方式

图2-14(d)展示了含有两条轮询线和四个控制器的总线轮询方式。在这种方式中,控制器会接收到一个轮询次数值,并将轮询次数值加一,以使下一个控制器可以获得总线访问权。假设有8个控制器,三个轮询计数信号p2、p1和p0连续地从000、001、…、110、111、000循环变化。如果当轮询次数等于i时接收到一个BR信号,那么轮询次数停止增加,第i个控制器成为总线主设备并激活BUSY信号。当BR信号释放时,BUSY信号也随之释放,轮询次数继续增加。这种方式的优点是,当前总线主设备完成总线操作后,总是下一个控制器具有访问总线的最高优先级。

2.2.6 键盘、显示器、A/D和D/A转换设备接口示例

1. 键盘

图2-15(a)展示了一个键盘接口。键盘控制器可以发出两个信号KBINT和TxD。KBINT是由键盘控制器的RxRDY信号产生的中断信号。TxD是控制器的串行UART数据输出信号,它与8051 SI的RxD、Intel 8250的UART或16550的UART相连。16550的UART具有一个16字节的缓冲区。

按键后会反弹,这是类似于弹簧动作的特性。在键盘中,每次反弹都会产生一个虚假脉冲(false pulse)。键盘控制器含有一个硬件去除抖动器,用来压制虚假脉冲。键盘控制器中有一个计数器,它以固定的速度持续增加,并不断地扫描每个键,检查它们是否处于按下或释放状态。它有一个编码器,负责对键盘输出进行编码,然后交给一个ROM。这个ROM为每次按键生成一个ASCII码。生成的ASCII码要考虑同时按下组合键的含义。例如,如果同时按下了Shift键,就会生成大写字母的ASCII码。ASCII码的各个位以串行的方式传送到TxD输出,并由SI的RxD输入接收。

2. 显示器

1.3.8节描述了LCD、LED和触摸屏显示单元。图2-15(b)展示了一个LCD显示器控制器的接口电路。3.3.4节对其做了详细描述。该接口有8个输出数据和3个信号E、RS和R/W。一个8位的端口用于输出数据,另一个端口输出3位信号。

3. 数模转换器

1.3.7节描述了DAC(又称为D/A)。D/A需要一个PWM电路,该电路是微控制器的一个内部设备。脉宽寄存器(PWR)可以根据模拟输出的需要进行编程。计数器/定时器设备可以产生两个内部中断:一个在定时器溢出时,另一个在与PWR比例相等的时间间隔之后。在第一个中断中,输出为1,而在第二个中断中,输出为0。一个外部积分电路按照输出为1的周期(第一种中断和第二种中断之间的时间)与输出脉冲的的总周期(连续两个第一种中断之间的时间)比值产生模拟输出。图2-15(c)展示了一个外部D/A的接口。当不使用PWM时,可以用外部D/A代替PWM。

4. 模数转换器

1.3.7节描述了ADC(又称为A/D)。一个n位的A/D需要:(i)一个用于转换的开始脉冲,使用一个短脉宽单脉冲发生器电路产生。(ii)一个简单的保持放大器电路,用于在转换期间保持信号的连续性。(iii)正负参考电压,用于提供将模拟输入转换为n位输出的参考电位差。微控制器内部嵌入了一个4通道或8通道的A/D。外部ADC也可以像这些端口一样用在接口中,如ADC0808。图2-15(d)展示了不使用内部A/D时的外部A/D接口。

WR

CS

Port

微控制器

R/W

Port

E

微控制器

RS

INT

INTA

S1

处理器

(

微控制器

)

CS

Port

INTO

微控制器

ChAddr

Start

RxD

TxD

Data bit

t

2

ʱ¿Ì¿ªÊ¼

ÖжÏÓ¦´ð

(

ѡͨÇëÇó

)

(RxRDY)

t

1

ʱ¿Ì£¬ÔÚ

t

0

Ö®ºó

TxRDY

´«Ê仺³åÇø¾ÍÐ÷ÖжÏ

INT0(DBINT)

t0

ʱ¿Ì

ʹÄÜ

t

0

ʱ¿ÌµÄÂö³å

t

1

ʱ¿Ì£¬ÔÚ

t

0

Ö®ºó

¼Ä´æÆ÷Ñ¡Ôñ

¶Ô

8

λÊý¾ÝÏßµÄд

/

¶Á

t

3

ʱ¿Ì

¶Á

/

д

t

2

ʱ¿Ì£¬ÔÚ

t

1

Ö®ºó

дÈëÊý¾ÝÏß

(a)

t

0

ʱ¿Ì

Ƭѡ

t

1

ʱ¿Ì£¬ÔÚ

t

0

Ö®ºó

¶Á

/

д

t

2

ʱ¿Ì£¬ÔÚ

t

1

Ö®ºó

(c)

INTO

t

2

ʱ¿Ì

Ƭѡ

t

0

ʱ¿Ì

¿ªÊ¼

t

1

ʱ¿Ì£¬ÔÚ

t

0

Ö®ºó

¶àͨµÀ

A/D

(ADC)

t

0

ʱ¿Ì֮ǰ

t

3

ʱ¿Ì£¬ÔÚ

t

2

Ö®ºó

´ÓÊý¾ÝÏ߶ÁÈ¡Êý¾Ý

¶àͨµÀ

Ä£Äâ²É

ÑùÊäÈë

V Ref

D/A

DAC

OPAMP

and

Filter

V

Ref

×ÖÌå±í£¬

CGRAM

£¬

LCD

Çý¶¯³ÌÐò

LCD

ÏÔʾÆ÷¿ØÖÆÆ÷

ÏÔʾÆ÷

ɨÃèʱÖÓ£¬

¼ÆÊýÆ÷¡¢

½âÂëÆ÷

ROM

Debouncer

Keys

È¥³ý¶¶¶¯Æ÷

¼üÂ뻺³åÇø

(8

λ

)

(b)

ͨµÀµØַλ

(d)

图2-15 (a)使用键盘控制器的键盘接口;(b)LCD显示器控制器的接口;(c)不使用内部 PWM时的外部D/A(DAC)接口;(d) 不使用内部ADC时的外部A/D(ADC)接口

2.3 高级体系结构介绍

图2-16给出了各种处理器结构单元的组织方式。图中用虚线框中的单元只在高性能处理器中才有。外部地址、数据和控制总线连接着处理器,并连接着外部存储单元、端口和设备。

内部总线

µØÖ·×ÜÏß

Êý¾Ý×ÜÏß

¿ØÖÆ×ÜÏß

Inst.

»º´æ

¸ß¼¶´¦Àíµ¥Ôª

ÄÚ²¿×ÜÏß

BT

»º´æ

Data

»º´æ

图2-16 各种处理器结构单元组织方式示意图。虚线框中的 单元只在高性能的高级体系结构处理器中才有

下面是大部分处理器都具有的一般特征:

(1) 固定的指令周期时间(fixed instruction cycle time):这是处理器执行一条指令所需要的时间,对于工作频率约为12MHz的8051处理器来说,这个值约为1µs;对于ARM9处理器,这个值为0.9µs。系统设计者将指令周期时间作为指示器,以选择与每个应用程序匹配的处理器时钟速度。对于需要快速处理的应用程序,ARM9处理器比较适合;对于那些处理速度较慢也能满足要求的应用程序,可以选择8051、68HC11或者80196处理器。

(2) 内部总线宽度(internal bus width):ALU从总线上获得输入。ALU(在一次算术运算或者逻辑操作中)的一个操作数的位数等于总线宽度。32位的总线能够满足在一个周期中对32位的操作数进行算术运算操作的要求。对于信号处理和控制系统指令,32位总线是必要的。当总线宽度为32位时,其读写的整数宽度就为32位,且执行速度比总线宽度为8时的速度快大约4倍。SHARC处理器的内部总线宽度为128位,奔腾处理器的内部总线宽度为64位。

(3) 程序计数器(program-counter,PC)及其复位值:PC的位数确定了处理器可以访问的物理内存的最大空间。复位值告诉设计者,运行系统复位和加电的程序应该存放在什么地方,处理器将从此开始执行(最初的指令指针和代码段寄存器位确定了80x86处理器中最初的程序存储器地址)。

(5) 堆栈指针(stack pointer)及其初始复位值:堆栈指针值必须指向存储在堆栈中字的地址。这些地址必须在系统分配给堆栈使用的地址范围之内。软件设计者定义初始复位值,并由此设置初始化程序中过程的堆栈指针。

表2-1中列出了通用处理器中的结构单元以及每一个单元的功能。

表2-1 处理器体系结构中的普通结构单元及功能

结 构

单 元

功 能

MAR

存储器地址

它保存将要从外部存储器取来的字节或者字的地址

寄存器

处理器在开始一个取周期之前,先把指令或者数据的地址发送给MAR

MDR

存储器数据寄存器

它保存从(或者要发送到)外部存储器或者IO地址取来的字节或者字

系统总线

内部总线

将处理器的所有结构单元内部相连。它的宽度可以是8、16、32、48或者64位

地址总线

这是一个外部总线,将地址从MAR发送到存储器、IO设备以及系统的其他单元

数据总线

在读写操作过程中从一个地址中取来(或者发送到)指令或者数据字节的外部总线。这个地址由MAR决定

控制总线

在处理器或存储器(或者设备)之间传送控制信号的外部

总线

BIU

总线接口单元

它是外部总线与处理器内部单元之间的接口单元

IR

指令寄存器

它连续地将指令码(操作码)发送给处理器的执行单元

ID

指令译码器

它翻译IR接收到的指令操作码,并将它发送给处理器CU

CU

控制单元

它控制着处理过程所需的所有总线行为和单元功能

ARS

应用寄存器组

(a)一组在处理用户应用程序的指令过程中使用的片上寄存器;(b)寄存器窗口;(c)包含寄存器的一个子集,每一个子集包含一个软件例程的静态变量;(d)寄存器文件,是与单元(如ALU或者FLPU)相结合的文件

ALU

算术运算逻辑单元

根据IR中出现的当前指令,执行算术或者逻辑指令的单元

PC

程序计数器

它产生了通过MAR从存储器获取地址的指令周期。当有规律地连续取指时,它的值自动增加。在80x86处理器中称为指令指针

SP

栈指针

它是一个地址指针,与存储器的栈顶对应

2.3.1 高级处理器体系结构

图2-16给出了用虚线框中的附加处理器结构单元,这些单元只在高级处理器体系结构(高性能处理器)中才有。表2-2中列出了通用处理器组织方式中的高级体系结构单元,以及每一个单元的功能。

表2-2 高级处理器体系结构中的结构单元及功能

结 构

单 元

功 能

ILP

指令级并行单元

用于指令级并行(参见2.5节)、多级流水处理、多路超标量处理以及双核、四核和多核处理,使得处理速度达到每个时钟周期能执行多条指令1,因此提升了处理器性能

IQ

指令队列

它是一个指令队列,作用是使得当一条指令执行完后,IR没有必要等待下一条指令

PFCU

预取控制单元

这是一个控制将数据提前从存储器中取到I-缓存或者D-缓存中的单元。当处理器的执行单元需要指令和数据时,将指令和数据传送过去。处理器没有必要在执行指令之前才取数据。预取单元通过提前取出将要处理的指令和数据提高了处理器性能。高速缓存以及MMU是通过使处理器执行单元快速获得指令和数据提高了性能

I-Cache

指令缓存

它连续地将指令以FIFO的模式保存,就像一个指令队列。它使得处理器能够通过使用PFCU高速执行指令;处理器访问外部系统存储器的速度相对要慢很多

BT-Cache

分支目标缓存

当遇到分支指令时,例如jump、loop或者call,它协助准备好要执行的下一个指令集。它的取单元能够预见指令缓存中的分支指令

D-Cache

数据缓存

它保存从外部存储器预取来的数据。数据缓存通常将键(地址)和数值(字)共同保存在一个位置上。如果进行适当的配置,它还可以保存写穿透(write-through)数据。写穿透数据意味着从执行单元获得执行结果,并将这个结果从缓存传回到相应的外部存储器地址中

MMU

存储管理单元

它是管理存储器2的单元,负责提供执行过程所需要的指

令或者数据

SRS

系统寄存器组

在处理监督系统程序的指令过程中使用的一组寄存器

FLPU

浮点处理单元

一个从ALU分离出来的单元,用于浮点处理,这是在微处理器或者DSP中快速执行数学函数的基本单元

FRS

浮点寄存器组

专门用来以标准格式保存浮点数的寄存器组,FLPU使用它来保存数据和堆栈

(续表)

结 构

单 元

功 能

MAC

乘法和累加单元

MAC3单元用于计算过程中系数的相乘和累加

AOU

原子操作单元

它使得当一个用户(编译器)指令分割成几个叫做原子操作的处理器指令后,在发生过程中断之前结束该指令的操作。这样就避免了各个例程和任务之间发生共享数据的问题

1. 指令周期时间比处理器时钟周期要短得多。

2. MMU(存储器管理单元)管理RAM存储器中的页,以及这些页在外部和内部高速缓存中的副本。管理必须做到当指令执行时,产生的页和高速缓存失败(失效)要尽量少。

3. 在DSP中总是需要MAC单元(参见2.3.5节)。

高级处理器使用了RISC体系结构。它通过多种方式提高性能:在单个时钟周期内执行指令(指令的硬连线实现);使用多个寄存器组、窗口和文件;由于减少了算术运算和逻辑运算指令寻址方式而降低数据对外部存储器访问的依赖性。RISC只有少量算术运算和逻辑运算指令寻址方式。它不包括以下这些寻址方式:用于ALU指令的间接(变址)、自动索引和相对变址的寻址方式。算术运算和逻辑运算指令的第二个操作数不使用立即寻址的寻址方式。

高级处理器电路包含了浮点处理单元。使用浮点单元和FRS比使用处理整数的ALU来处理数学函数的速度更快,而且具有更大的旋进。

高级处理单元包括指令流水线单元,它通过在多个级中处理指令从而提高性能。流水线允许处理器重叠执行多条指令,实现在同样的时间段内执行更多的指令。2.5.1节将讲述指令的多阶段执行,还将讲述指令级并行(ILP)是如何更进一步地提高处理器性能的。

图2-17展示了指令流是如何通过流水线的。

在第1个时钟周期,第一条指令I1进入流水线中的取指令(IF)阶段,并停止在取指令和指令译码(ID)阶段之间的流水线锁存(缓冲区)。在第2个时钟周期,第二条指令I2进入取指令阶段,I1运行到指令译码阶段。在第3个时钟周期,I1进入寄存器(输入)读(RR)阶段,指令I2处于指令译码阶段,并且指令I3进入取指令阶段。在第4个时钟周期,I1前进到执行阶段,而第5个时钟周期I1执行到结果写回阶段。

Instr 8

Instr 7

Instr 6

Instr 5

Instr 4

Instr 7

Instr 6

Instr 5

Instr 4

Instr 3

Instr 6

Instr 5

Instr 4

Instr 3

Instr 2

Instr 5

Instr 4

Instr 3

Instr 2

Instr 1

Instr 4

Instr 3

Instr 2

Instr 1

Instr 3

Instr 2

Instr 1

Instr 2

Instr 1

In

str 1

阶段

取指令

译码

读操作数

执行

写回

连续的时钟间隙

图2-17 高级体系结构处理器流水线中的指令流

指令在流水线中每个周期前进一个阶段,直到寄存器(结果)写回(WB)阶段。此时,指令I1(图中的第一条指令)完成执行。因此,在本例中的第6个时钟周期,指令I2~I6处在流水线中,而指令I1已经不在流水线中。一个5级流水线处理器的指令执行速度(吞吐量)仍然是每个周期一条指令,但是每条指令的延迟时间由1个周期变为5个周期。这种情况下,指令周期可以缩短为非流水线指令周期的1/5或者更短,由此可以获得更快的执行速度。

2.3.2 80x86体系结构

最初4代的80x86处理器是8086、80286、80386和80486。80x86系列的第一款处理器是16位8086处理器(1981)。自从80386之后,80x86都具有32位的体系结构。奔腾是基于32位的80386的第5代体系结构。奔腾4是第7代,Xeon和Core2是第8代体系结构。Core2的意思是双核体系结构。80x86体系结构自从应用在IBM PC(个人计算机)以来一直非常流行。Itanium是一个基于64位的体系结构,它与80x86体系结构很相似。

80x86体系结构具有以下特点:

(1) 最初的8086体系结构包括了通用寄存器AX、BX、CX和DX,它们每一个都可以当作两个8位的寄存器来考虑。例如,AX可以当作AL(低字节)和AH(高字节)。它们32位的扩展是EAX、EBX、ECX和EDX寄存器,每一个都可以当作两个16位的寄存器来考虑。例如,EAX的低16位是AX。图2-18给出了80x86体系结构中的寄存器。

(2) 8086体系结构提供了代码、数据、堆栈和堆栈段。最初的8086体系结构包括了四个段寄存器CS、DS、SS和ES,通过它们可以访问分配在不同地址空间的地址。

(3) IP(指令指针)是一个16位的地址。CS包含了16位的程序代码段地址,作为地址的高16位。

(4) SI包含了16位的源操作数变址,DI包含了16位的目的操作数变址。BP是16位的存储器偏移地址指针,DS包含了数据存储器段地址的高16位。

(5) 16位、32位或64位字以little-endian方式存储。存储在地址为2或4的倍数的数据不需要对齐操作,而且存储地址可以从任何地方开始。

16

位寄存器

CS

DS

SS

ES

FS

GS

A

B

C

D

例如,

16

位的

AX

BX

CX

DX

8

位、

16

位、

32

位或

64

位通用寄存器

16

位、

32

位或

64

位寄存器

IP

指令

(

代码

)

指针

SI

源操作数变址指针

DI

目的操作数变址指针

SP

堆栈指针

BP

基址指针

图2-18 80x86体系结构寄存器

(6) 80x86系列使用双地址的算术运算和逻辑运算指令。这意味着累加器不是唯一的用于累加ALU结果的寄存器。反过来就是说,寄存器操作数(AX、BX、CX或DX)既可以作为目的操作数也可以作为第一个操作数。

(7) 存储器地址既可以作为第一个也可以作为第二个操作数,这是CISC ALU指令寻址方式的一个特点。

(8) 现在这一代80x86体系结构将CISC指令译码为一系列微操作,而这些微操作在一个RISC微体系结构中实现。

(9) 这些少量的通用寄存器(也是继承自8086)使寄存器相对寻址(通过一个小立即数偏移量)成为一个重要的操作数访问方式,特别是在栈中。

(10) 80x86采用IO映射IO。每个IO数据字节都有一个16位的IO地址。Intel 8086系列处理器通过独立的IN和OUT指令访问IO单元和IO设备。IO映射IO类型的处理器通过一组独立的地址访问输入/输出设备。这种方式简化了连接到处理器的IO单元接口电路。

(11) 8086支持256级的硬件和软件中断,并支持中断嵌套。这意味着ISR可以被一个更高优先级的ISR中断和插入执行。

(12) 新一代8086体系结构支持一种称为实模式(real mode)的模式。实模式支持超越段直接访问外围设备和基本输入输出系统(BIOS)。实模式支持20位的段,替代了原来16位的段。段寄存器只包含了地址的高16位,所有的低位都为0。

(13) 也提供了32位保护模式,这种模式支持内存分页机制。

(14) 8086支持多种OS,包括Windows和多任务操作系统。

(15) 最新的80x86体系结构支持线程处理、整数SIMD和SIMD扩展指令集。

程序例程和进程可以具有不同的段。例如,程序代码可以分段,并且每段保存在不同的存储块。指针地址指向保存段的存储块的开始位置,通过偏移量可以获得段内存储地址。数据同样也可以分段,并且各段可以位于不同的块中。类似的,字符串也可以分段存储。

80x86体系结构是一种广泛应用的体系结构。它的数据以little-endian方式存储,并且不需要对齐。它包含有通用指针和段寄存器,支持内存分段和分页。不同的函数和进程(任务)在内存中可以有不同的段,这些段可能包括了不同的数据段和不同的堆栈段。

2.3.3 ARM

ARM的详细信息可以参考http://www.arm.com。ARM体系结构的特点使它对嵌入式系统非常重要,如数码相机、摄像机和移动电话。下面给出对它的简要描述。

图2-19给出了ARM7的寄存器和三级流水线体系结构。ARM有R0~R15共16个寄存器。R15还用作程序计数器,R14用作链接寄存器。它还有CPSR(当前程序状态寄存器)和SPSR(备份程序状态寄存器)。

ARM有以下主要特点:

(1) 它具有32位的体系结构,同时支持16位和8位的数据类型。它支持16位指令和Thumb模式。它还支持Jazelle Java执行加速器技术。

(2) ARM可编程支持little-endian或big-endian两种数据存储方式。

(3) 在功能方面,ARM具有CISC的优点,而在程序快速执行和压缩代码长度方面,ARM又具有RISC的特点。它能够快速执行是因为寄存器字对执行单元立即可用。ARM的大部分指令使用寄存器作为操作数,这使它的代码长度得以压缩。通过指令中一些位,就可以指定寄存器作为操作数。在使用8位、16位或24位存储地址作为操作数时,偏移量已经包含在指令的某些位中。

(4) ARM7和ARM9微处理器结合了CISC和RISC的特点。ARM支持基于复杂寻址模式的指令集。ARM处理器有一个RISC执行核心。它有一个内置编译单元,首先将CISC指令编译为RISC格式,然后使用处理器的RISC核心执行。从本质上来说,大部分指令实现像是一个RISC(没有微程序单元)。

(5) ARM7的主存是Princeton结构,ARM9的主存是Harvard结构(参见2.4.2节)。

CPSR

IR

ID

32

位总线

执行单元

每条指令的硬件电路

32

位的

r15

作为

PC

r14

作为

链接寄存器

SPSR

锁存

锁存

r0

~

r15

一个时钟周期

C

i

È¡Ö¸Áî

I

n

Ò»¸öʱÖÓÖÜÆÚ

C

i+1

¶Ô

I

n

ÒëÂë²¢¶Á²Ù×÷Êý

Ò»¸öʱÖÓÖÜÆÚ

C

i+2

Ö´ÐÐ

I

n

£¬´æ´¢Æ÷ÊäÈë

I

n

ºÍÑ°Ö·£¬Ð´½á¹û

I

n

图2-19 ARM7寄存器和三级流水线体系结构

(6) ARM的调试和跟踪工具,以全速的内核速度,快速调试实时软件,跟踪指令执行和相关程序数据。

(7) 对于引导EDA(Electronic Design Automation,电子设计自动化)环境的开发工具和模拟模型的选择范围很广,对SoC设计的调试支持很好。

(8) ARM代码向前兼容其高级版本。例如,ARM7代码向前兼容ARM9、ARM9E和ARM10处理器,以及Intel XScale微体系结构。ARM9E和ARM10系列使用向量浮点(Vector Floating Point,VFP)ARM协处理器,增加了完整的浮点操作数。VFP也提供了在使用如MatLab®这样的工具时,对SoC设计的快速开发。其应用领域有图像处理(缩放)、2D和3D转换、字体生成和数字滤波。

(9) ARM可以使用一个专用于16位操作的附加指令集编程。Thumb是一个工业标准指令集,可以使用 8/16位的系统开销得到32位的性能。这节省了高达35%的存储空间,等价于32位的代码,保持了32位系统的所有优点(例如对完全的32位地址空间的访问)。在Thumb和一般ARM状态之间的移动开销(在时间和存储空间方面)为零。两种状态在例程上是兼容的。代码设计者对于性能和代码长度的优化有完全的控制权。

(10) ARM使用智能能源管理(Intelligent Energy Manager,IEM)技术,实现了优化平衡处理器负载和能源消耗的高级算法,使系统响应达到最大化。IEM与操作系统和移动OS一起工作。运行在移动电话上的应用程序,动态调节所要求的CPU性能级别。

(11) ARM处理器使用AHB(AMBA Advanced High Performance Bus,AMBA改进的高性能总线)。AMBA为片上互连(参见3.12.3节)确定了开放源代码规范,作为一个框架,为SoC设计和IP核的开发提供服务。所有新的ARM核都支持AHB。它提供了高性能和完全同步的底板(底板有一组附加的控制器,它们之间能够通过一组普通总线相互访问,这组普通总线完全不同于系统总线)。ARM926EJ-S和ARM10系列的所有成员中的多层AHB体现了显著的改进。它减少了访问延时,增加了可用于多控制系统(多个设备可以作为主设备访问总线)的带宽。

1. ARM7指令集

处理器有以下类型的指令。带有后缀T的ARM7版本支持一个称为Thumb®的指令集。

(1) 数据传送指令——下面所给的是寄存器/存储器之间数据传送的指令。存储器地址是按照用作变址、相对变址或者快速自动变址寻址模式的寄存器的内容得到的。

a. 寄存器加载一个字(LDR)。

b. 寄存器字存储一个字(STR)。

c. 设置存储器地址到寄存器中。地址是12位(寄存器中另一种16位地址设置方法是在运算操作中使用任意寄存器或者r15)。

d. 寄存器加载一个字节(LDRB)。

e. 寄存器字节存储(STRB)。

f. 寄存器半字存储(STRH)(在ARM中一个字是32位)。

g. 寄存器加载半字时保持不变或者加上符号(LDRH或者LDRSH)。

以下是寄存器之间的字传送指令:

a. 移动(MOV)。

b. 求反后移动(MVR)。

加载、移动或者存储指令可以按条件来实现。例如,MOVLT r3, #10。如果前面的比较指令表明第1个源操作数小于第2个源操作数,则立即操作数10传送到r3。条件有LT(有符号数小于)、GT(有符号数大于)、LE(有符号数小于或等于)、EQ(等于)、NE(不等于)、VS(溢出)、VC(未溢出)、GE(有符号数大于或等于)、HI(无符号数高于)、LS(无符号数低于)、PL(正数,非负数)、MI(负)、CC(进位复位)、CS(进位置位)。

(2) 位传送或控制指令

a. 寄存器位逻辑左移位(LSL)。

b. 寄存器位逻辑左算术移位(ASL)。

c. 寄存器位逻辑右移(LSR)。

d. 寄存器位逻辑右算术移位(ASR)。

e. 寄存器位循环右移(ROR)。

f. 寄存器位带进位的循环右移,也称作循环扩展(RRX)。

(3) 运算和逻辑指令

以下是用于算术操作的指令:每条指令使用3个来自寄存器的操作数。但是,在加法和减法操作中,一个源操作数可以使用立即寻址。

a. 两个字无进位相加,结果在第3个操作数中(ADD)。

b. 两个字带进位相加,结果在第3个操作数中(ADC)。

c. 两个字无进位相减,结果在第3个操作数中(SUB)(进位用作借位)。

d. 两个字带进位相减,结果在第3个操作数中(SBC)。

e. 两个字无进位反转(第2个和第1个源操作数反转)相减,结果在第3个操作数中(RSB)(进位用作借位)。

f. 两个字带进位反转相减,结果在第3个操作数中(RSC)。

g. 两个不同的寄存器相乘,结果在目标寄存器中(MUL)。

h. 两个源寄存器相乘,结果和第3个源寄存器相加,然后把新的结果放到目标寄存器中(MLA)(有4个操作数寄存器)。

以下是用于逻辑操作的指令:

a. 两个字按位或(OR),结果在第3个操作数中(ORR)。

b. 两个字按位与(AND),结果在第3个操作数中(AND)。

c. 两个字按位异或(OR),结果在第3个操作数中(EOR)。

d. 位清零(BIC)(一个源操作数用于位,第2个源操作数用于屏蔽,结果在第3个操作数中)。

运算和逻辑指令可以按条件来实现。例如,SUBGE r1, r3, r5。如果在前面出现GE条件(在比较两个有符号数时N和V状态位相等),则r3中的操作数被减去r5中的操作数。条件的类型和前面所提到的一样,这些条件都是比较或验证的结果。

以下是比较和验证操作的指令。结果放到CPSR中,它存储4个条件位N、V、C和Z。

a. 两个字按位检验(TST)。

b. 两个字按位求反检验(TEQ)。

c. 比较两个字,结果放到CPSR条件位(CMP)。

d. 比较两个负字,结果放到CPSR条件位(CMN)。

(4) 程序流控制指令

以下是用于分支操作的指令。分支指令也可以按条件实现。转到与PC字r15 (B)相关的地址的分支。“B #1A8”意思是PC加0x1A8,并改变程序流程。“BGE #100”意思是如果在前面的比较或测试时结果为GE,则PC加1A8。对于处理器状态标志的不同条件,指令是相似的。

示例2-8

本例给出了一个ARM汇编语言程序的例子。

回顾3个数的加法问题,x、y和z(分别等于127、29和40)3个数相加,结果存放到存储器地址a中(a = x + y + z)。使用前面的指令集,得到的汇编语言程序如下:

1. BEGIN: MOV r2, #0x007F

;Transfer 127 into processor register r2.

2. MOV r3, #0x001D ; Transfer 29 into processor register r3.

3. MOV r4, #0x0028 ; Transfer 40 into processor register r4.

4. MOV r1, #0x0000

; Transfer 0 into processor register r1.

5. ADD r1, r1, r4 ; Add the register r4 word into the r1.

6. ADC r1, r1, r3 ; Add the register r3 word along with the carry

(if any) from previous addition into the r1.

7. ADC r1, r1, r2 ; Add the register r2 word along with the carry

(if any) from previous addition into the r1.

8. ADR r5, #0x800

; Set the address into r5. Memory address M set

0x800.

9. STR [r5], r1

; Store the r1 at the address pointed by r5.

表2-3给出了典型高性能ARM系列处理器的特性和其比较。

表2-3 ARM系列处理器特性比较

特 性

ARM7TM Thumb®系列

ARM9TM Thumb®系列

ARM11

系列成员

示例

(a)ARM7TDMI®(整数内核)

(b)ARM7TDMI-STM(ARM7TDMI的同步版本)

(c)ARM7EJ-STM(DSP和Jazelle技术的内核)和ARM720TTM(高速缓存处理器宏单元,8K高速缓存内核,带有支持操作系统存储器管理单元(MMU),支持Window CE、Palm OS、Symbian OS和Linux

(a)ARM920T(双16k高速缓存,带有支持多操作系统的MMU)

(b)ARM922T(用于应用程序的双8k高速缓存支持多操作系统)

(c)ARM940TTM(用于运行RTOS的嵌入式控制应用程序的双4k高速缓存)

带有ARMv6指令集体系结构的系列,包括用于代码密度的Thumb®扩展,用于加速的JazelleTM技术,ARM DSP扩展和SIMD媒体处理扩展。带有支持操作系统和Palm OS的MMU

带有ARM®

和Thumb®

指令集的

内核

32位RISC内核

32位RISC处理器内核超标量5级整数流水线。8入口写缓冲器。它防止在外部存储器进行写操作时阻塞处理器

32位RISC处理器内核,带有8级整数流水线、静态和动态分支预测、独立的load-store和算术流水线,从而使指令吞吐量最大化

应用领域

价格和功耗敏感的个人消费领域,如个人音频设备(MP3、WMA、AAC播放机)、入口级移动电话、两路寻呼机、静态数码相机、PDA

机顶盒、住宅网关、游戏控制台、MP3、MPEG4摄像头视频电话、便携式通话机、PDA、下一代手持产品、数字消费商品、图像商品、桌面打印机、静态图片照相机、数码视频照相机、自动遥测装置和信息维持系统

充电电池和高密度嵌入式应用。面向下一代无线和家电应用的嵌入式SoC。致力于嵌入式应用、高级操作系统和诸如音频和视频CODEC的多媒体的需求,包括2.5G和3.0G的移动电话听筒设备、PDA和多媒体无线设备、诸如图像和数码相机的家庭应用,包括IP通话和宽带调制器的基础设施

(续表)

特 性

ARM7TM Thumb®系列

ARM9TM Thumb®系列

ARM11

性能

在通常0.13µm工艺下使用Dhrystone 2.1测试为130 MIPS

达到1.1MIPS/MHz。在通常0.13µm工艺下为300 MIPS(Dhrystone 2.1)

把Dhrystone MIPS 400~ 1200作为性能范围目标

代码密度

高代码密度(与16位微控制器相比)

高代码密度

高代码密度

硅芯片尺寸

小芯片,可移植到0.25µm、0.18µm和0.13µm各型号

在ARM940T中芯片面积为4.2mm2。可移植到最新的0.18µm、0.15µm和0.13µm硅片工艺。在0.18µm的ARM 940T上频率为185MHz

0.13µm制造工艺在最坏的情况下可以提供350~500 +MHz的