2.3 ATmega16单片机的内部结构
图2-4所示为ATmega16的结构框图。它是在AVR单片机内核(见图2-3)的基础上,具体化的一个实例。从图中可以看出,ATmega16内部的主要构成部分有:
1)CPU部分。包括:运算逻辑单元(ALU)、32个8位快速访问通用寄存器组(寄存器文件)、程序计数器(PC)、指令寄存器、指令译码器。
2)程序存储器Flash。
3)数据存储器RAM和EEPROM。
4)各种功能的外围接口、I/O,以及与它们相关的数据、控制、状态寄存器等。
2.3.1 中央处理器
CPU是单片机的核心部分,它由运算逻辑单元(ALU)、程序计数器(PC)、指令寄存器、指令译码器等部件组成。
1.运算逻辑单元(ALU)
运算逻辑单元(ALU)的功能是进行算术运算和逻辑运算,可对半字节(4位)、单字节等数据进行操作,如能完成加、减、自动加1、自动减1、比较等算术运算和与、或、异或、求补、循环移位等逻辑操作。操作结果的状态,如产生进位、结果为零等状态信息将影响到状态寄存器(SREG)相应的标志位。
运算逻辑单元(ALU)还包含一个布尔处理器,用来处理位操作。它可执行置位、清零、取反等操作。
ATmega16的ALU还能实现无符号数、有符号数以及浮点数的硬件乘法操作。一次硬件乘法操作的时间为2个时钟周期。
2.程序计数器(PC)、指令寄存器和指令译码器
程序计数器(PC)用来存放下一条需要执行指令在程序存储器空间的地址(指向Flash空间)。取出的指令存放在指令寄存器中,然后送入指令译码器产生各种控制信号,控制CPU的运行(执行指令)。
图2-4 ATmega16的结构框图
AVR单片机一条指令的长度大多数为16位,还有少部分为32位,因此AVR单片机的程序存储器结构实际上是以字(16位)为一个存储单元的。ATmega16的程序计数器为13位,正好满足了对片内8KB(即16KB)的Flash程序存储器空间直接寻址的需要,因此就不能(不支持)在外部扩展更多的程序存储器。
AVR单片机CPU在译码执行一条指令的同时,就将PC指定的Flash单元中的指令取出,放入指令寄存器中,构成了一级流水线运行方式。AVR单片机采用一级流水线技术,在当前指令执行的时候,就取出下一条将要执行的指令,加上大多数AVR指令的长度是1W,就使得AVR单片机CPU实现了一个时钟周期执行一条指令。采用这种结构,减少了取指令的次数,大大提高了CPU的运行速度,同时也提高了取指令操作的(系统的)可靠性。而在其他的CISC以及类似的RISC结构的单片机中,外部振荡器的时钟被分频降低到传统的内部指令执行周期,这种分频最大达12倍(例如,标准8031结构的单片机)。
3.通用工作寄存器组
在AVR单片机中,由命名为R0~R31的32个8位通用工作寄存器构成一个“通用快速工作寄存器组”,图2-5所示为通用快速工作寄存器组的结构图。
AVR单片机CPU中的ALU与这32个通用工作寄存器组直接相连,为了使ALU能够高效和灵活地对寄存器组进行访问操作,通用寄存器组提供和支持ALU使用4种不同的数据输入/输出的操作方式:
1)提供一个8位源操作数,并保存的一个8位结果;
2)提供两个8位源操作数,并保存的一个8位结果;
3)提供两个8位源操作数,并保存的一个16位结果;
4)提供一个16位源操作数,并保存的一个16位结果。
因此,AVR单片机大多数操作工作寄存器组的指令都可以直接访问所有的寄存器,而且多数这样的指令的执行时间是一个时钟周期。例如,从寄存器组中取出两个操作数,对操作数实施处理,处理结果回写到目的寄存器中。这3个过程是在一个时钟周期内完成的,构成一个完整的ALU指令操作。
在传统的基于累加器结构的单片机中(如8051),则需要大量的程序代码来完成和实现在累加器和存储器之间的数据传送。如上面所介绍的操作过程就需要3条指令来实现:第1条完成从寄存器中取出源操作数;第2条完成对操作数实施处理;第3条将处理结果回写。这样就构成了累加器和存储器之间数据传送的瓶颈,影响了指令运行效率。
而在AVR单片机中,由于采用了32个通用工作寄存器构成快速存取寄存器组,相当于用32个通用工作寄存器代替了累加器,从而避免了在传统结构中的那种由于累加器和存储器之间频繁的数据传送交换而形成的瓶颈现象,又进一步提高了指令的运行效率和速度。
在AVR单片机中,通用寄存器组与片内的数据存储器(SRAM)处在相同的空间,32个通用寄存器被直接映射到用于数据空间的前32个地址,如图2-5所示。虽然寄存器组的物理结构与SRAM不同,但是这种内存空间的组织方式为访问工作寄存器提供了极大的灵活性,如可以利用地址指针寄存器X、Y或Z实现对通用寄存器组的间接寻址操作。
2.3.2 系统时钟部件
1.系统时钟
ATmega16的片内含有4种频率(1MHz/2MHz/4MHz/8MHz)的RC振荡源,可直接作为系统的工作时钟使用。同时片内还设有一个由反向放大器所构成的OSC(Oscillator)振荡电路,外围引脚XTAL1和XTAL2分别为OSC振荡电路的输入端和输出端,用于外接石英晶体等,构成高精度的或其他标称频率的系统时钟系统。
系统时钟为控制器提供时钟脉冲,是控制器的“心脏”。系统时钟的频率是单片机的重要性能指标之一。系统时钟频率越高,单片机的执行节拍就越快,处理速度也越快。ATmega16最高的工作频率为16MHz(16MIPS),在8位单片机中算是佼佼者。但并不是系统时钟频率越快就越好,因为当时钟频率越高时,其耗电量也越大,也容易受到干扰(或干扰别的设备)。因此,在具体设计时,应根据实际产品的需要,尽量采用较低的系统时钟频率,这样不仅能降低功耗,同时也提高系统的可靠性和稳定性。
图2-5 通用工作寄存器组在RAM空间的地址分配图
为ATmega16提供系统时钟源时,有3种主要的选择:①直接使用片内1MHz/2MHz/4MHz/8MHz的RC振荡源;②在引脚XTAL1和XTAL2上外接由石英晶体和电容组成的谐振回路,配合片内的OSC振荡电路构成的振荡源;③直接使用外部时钟源输出的脉冲信号。方式2和方式3的电路连接如图2-6所示。
图2-6 系统时钟源的电路连接
图2-6a是比较常用的方法,由于采用了外接石英晶体作为振荡的谐振回路,因此可以提供比较灵活的频率(由使用晶体的谐振频率决定)和稳定精确的振荡。在XTAL1和XTAL2引脚上加上由石英晶体和电容组成的谐振回路,与内部振荡电路配合就能产生系统需要的时钟信号了。最常采用的晶体元件为一个石英晶体和两个电容组成谐振电路。晶体可在0~16MHz之间选择,电容值在20~30pF之间(最好与所选用的晶体相匹配)。
当对系统时钟电路的精度要求不高的话,可以使用方式1,即使用片内可选择的1MHz/2MHz/4MHz/8MHz的RC振荡源作为系统时钟源,可以节省外接器件,此时XTAL1和XTAL2引脚悬空。
系统时钟电路产生振荡脉冲不经过分频将直接作为系统的主工作时钟,同时它还作为芯片内部的各种计数脉冲,以及各种串口定时时钟等使用(可由程序设定分频比例)。
值得注意的是,AVR单片机有一组专用的、与芯片功能、特性、参数配置相关的可编程熔丝位。其中有几个专门的熔丝位(CKSEL3..0)用于配置芯片所要使用的系统时钟源的类型。
新芯片的默认配置设定为使用内部1MHz的RC振荡源作为系统的时钟源。因此,当第一次使用前,必须先正确地配置熔丝位,使其与使用的系统时钟源类型相匹配。另外,在配置其他熔丝位时,或进行程序下载时,千万不要对CKSEL3..0这几个熔丝位误操作,否则会组成芯片表面现象上的“坏死”,因为没有系统时钟源,芯片不会工作的。
关于ATmega16重要熔丝位的配置、使用方式将在下文详细介绍。
2.内部看门狗定时器
在AVR单片机片内还集成了一个1MHz独立的时钟电路,它仅供片内的看门狗定时器(WDT)使用。因此,AVR单片机片内的WDT是独立硬件形式的看门狗,使用AVR单片机可以省掉外部的WDT芯片。使用WDT可以有效地提高系统的可靠性。
2.3.3 CPU的工作时序
AVR单片机CPU的工作是由系统时钟直接驱动的,在片内不再进行分频。图2-7所示为哈佛结构和快速访问寄存器组的并行指令存取和指令执行时序。CPU在启动后第1个时钟周期T1取出第1条指令,在T2周期便执行取出的指令,并同时又取出第2条指令,依次进行。这种基于流水线形式的取指令方式,使AVR单片机可以以非常高的速度执行指令,获得高达1MIPS/MHz的效率。
图2-7 并行指令存取和指令执行
图2-8所示为ALU与寄存器堆操作单周期指令的执行时序。在单一时钟周期内,由2个寄存器提供操作数,ALU执行相应的操作,最后将操作结果回送到目的寄存器中。
AVR单片机对片内SRAM的访问需要2个时钟周期。如图2-9所示,在2个系统时钟周期内,ALU完成对片内数据存储器(SRAM)访问的操作时序。
2.3.4 存储器
AVR单片机在片内集成了Flash程序存储器、SRAM数据存储器和EEPROM数据存储器。3个存储器空间互相独立,物理结构也不同。程序存储器为闪存存储器Flash,以16位(字)为一个存储单元,作为数据读取时,以字节为单位,而擦除、写入则是以页为单位的(不同型号AVR单片机一页的大小也不同)。SRAM数据存储器是以8位(字节)为一个存储单元,编址方式采用与工作寄存器组、I/O寄存器和SRAM统一寻址的方式。EEPROM数据存储器也是以8位(字节)为一个存储单元,对其的读写操作都以字节为单位。有关存储器结构将在下一节详细叙述。
图2-8 单周期ALU操作
图2-9 片内SRAM访问时序
2.3.5 I/O口
ATmega16有4个8位的双向I/O口PA、PB、PC、PD,它们对外对应32个I/O引脚,每一位都可以独立地用于逻辑信号的输入和输出。在5V工作电压下,输出时每个引脚可输出达20mA的驱动电流。而输入时,每个引脚可吸纳最大为40mA的电流,可直接驱动发光二极管(LED)(一般LED的驱动电流为10mA左右)和小型继电器。
AVR单片机大部分的I/O口都具备双重功能,分别与片内的各种不同功能的外围接口电路组合成一些可以完成特殊功能的I/O口,如定时器、计数器、串行接口、模拟比较器、捕捉器等。实际上,学习单片机的主要任务,就是了解、掌握单片机I/O口的功能,以及如何正确设计这些端口与外围电路的连接构成一个嵌入式系统,并编程、管理和运用它们完成各种各样的任务。有关这些内容,将在后面的章节中逐步介绍。