第3章 CHAPTER 3 微 处 理 器 本章主要讲述微处理器的基本构成,并以MIPS微处理器为例,介绍一个基于给定简单指令集的类MIPS微处理器数据通路及控制器的设计,同时介绍现代微处理器流水线技术、超标量技术、多核技术和异常处理机制,最后介绍微处理器的外部接口及软核微处理器——MicroBlaze微处理器及其构成的嵌入式计算机硬件最小系统。 学完本章内容,要求掌握以下知识:  微处理器的基本构成;  单周期简单指令集MIPS微处理器设计;  流水线技术、超标量技术、多核技术基本原理;  微处理器异常处理机制;  MicroBlaze微处理器结构;  嵌入式计算机硬件最小系统构成。 3.1微处理器基本结构 微处理器是计算机系统的核心部件,完成计算机的运算和控制功能。随着计算机技术的不断发展,微处理器的设计也越来越复杂。 微处理器执行一组机器指令,这组指令可向微处理器告知应执行哪些操作。微处理器通常执行三种基本工作: (1) 使用ALU(算术逻辑单元),执行算术、逻辑运算,如加、减、乘、除和逻辑运算。 (2) 将数据从一个存储位置移动到另一个位置。 (3) 做出决定,并根据这些决定跳转到一组新指令。 微处理器能够执行许多非常复杂的工作,但是所有工作都属于上述三种基本操作范畴。 图31显示了一个能够执行上述三种基本操作的简单微处理器基本结构,包括: 图31简单微处理器基本结构 (1) 算术逻辑运算单元ALU,实现各种算术、逻辑运算。 (2) 指令译码器,实现指令译码,并根据译码结果控制CPU完成相关操作。 (3) 寄存器,包括通用寄存器、指令寄存器、程序计数器等。通用寄存器用来暂存参与ALU单元运算的数据和中间结果,指令寄存器用来暂存从存储器读入的指令,程序计数器用来指示下一条要执行的指令在存储器中的存放地址。 微处理器与计算机中其他组件之间的基本接口包括: (1) 一组地址总线,用于向存储器发送地址。 (2) 一组数据总线,用于将数据发送到存储器或从存储器取得数据。 (3) 一条RD(读)和WR(写)控制信号,告诉存储器希望将数据写入某个地址还是从某个地址获得数据。 (4) 时钟信号,将时钟脉冲序列发送到微处理器,控制微处理器进行工作。 (5) 复位信号,用于将程序计数器、通用寄存器重置为某个值并重新开始执行。 3.2单周期简单指令集MIPS微处理器设计 假定单周期简单指令集MIPS微处理器支持的指令集如下。 (1) 算术、逻辑运算指令: add、sub、and、or、slt; (2) 数据传送指令: lw、sw; 实践视频 (3) 程序控制指令: beq、j。 3.2.1简单指令集MIPS微处理器数据通路 数据通路是指指令执行过程中实现指令获取以及数据处理的电路模块和传输路径。 本节首先分析简单指令集不同类型指令的执行部件构成,然后再将各个部件综合形成简单指令集MIPS微处理器的完整数据通路。 1. R型指令执行部件 简单指令集R型指令包括add、sub、and、or、slt。为便于阅读,这里将指令的机器码采用Instr表示,以区分数据。由此得到R型指令的编码如图32所示。 图32R型机器指令编码 R型指令执行时,首先根据指令字段Instr[25..21]、Instr[20..16]获取$Rs、$Rt的值,然后根据字段Instr[31..26]、Instr[5..0]的译码结果执行算术、逻辑运算,最后再将结果保存到字段Instr[15..11]指示的$Rd中。由此可知,R型指令执行时,寄存器文件需同时提供: 三组寄存器编号,包括$Rs编号、$Rt编号、$Rd编号; 两组输出数据线,包括$Rs的值、$Rt的值; 一组输入数据线,即写入$Rd的值。R型指令执行算术、逻辑运算,由算术逻辑单元(ALU)完成,且数据来源分别为$Rs和$Rt的值; 运算结果输出到寄存器文件写入$Rd的数据线。由于MIPS微处理器所有寄存器都为32位,因此所有输入/输出数据线都为32位; 寄存器编号都为5位,因此寄存器编号输入信号都为5位,由此得到R型指令执行部件结构如图33所示。 实践视频 图33R型指令执行部件结构 实践视频 2. 数据传送指令执行部件 简单指令集中数据传输指令包括lw、sw指令,都为I型指令,I型指令编码如表23所示,采用Instr改写之后指令编码如图34所示。 数据传输指令中存储器地址由RF[$Rs]与指令中立即数(Imm)之和构成,因此需要ALU运算单元计算存储单元地址。由于ALU单元仅支持32位数据运算,指令中立即数为16位,需先符号扩展为32位,再参与运算。数据在数据存储器与寄存器文件之间双向传输,因此数据传送指令执行部件包含寄存器文件、ALU、数据存储器及符号扩展部件。它们之间的连接关系如图35所示。 图34数据传输机器指令编码 图35数据传输指令执行部件连接关系 当执行lw指令时,首先从$Rs中获取基地址,并通过ALU运算单元形成存储单元地址,再由存储器输出读数据到寄存器文件的写数据,寄存器文件在寄存器写信号的控制下将数据保存到$Rt中; 当执行sw指令时,同样首先从$Rs中获取基地址,并通过ALU运算单元形成存储单元地址,同时将$Rt中的数据输出到存储器写数据,再在存储器写控制信号的作用下将数据写入数据存储器中。 3. 顺序程序指令获取部件 微处理器采用特殊寄存器——程序计数器PC保存下一条指令地址。MIPS微处理器所有指令等长,都为4字节,且存储器以字节为单位编址,因此程序顺序执行时,PC的值自动加4指向下一条指令。由此可知,MIPS微处理器顺序程序指令获取部件构成如图36所示。 图36MIPS微处理器顺序执行程序指令获取部件构成 4. 条件跳转指令执行部件 简单指令集中的条件跳转指令beq为I型指令,I型指令编码如表23所示,采用Instr改写之后指令编码如图37所示。 图37beq编码格式 条件跳转指令首先比较$Rs、$Rt的值,然后根据比较结果Zero决定是否跳转。因此该指令需要比较两个寄存器的值,同时还需要计算目标跳转地址,这是两种不同的运算。为简化电路设计,设计时采用ALU单元比较两个寄存器的值,另外再采用一个加法器专门计算跳转目标地址。MIPS条件跳转控制指令跳转目标地址由下一条指令PC的值与指令中立即数(Imm)的和构成。由于立即数在指令中仅16位,因此需通过符号扩展部件扩展为32位。指令编码中存储的立即数为跳过的指令条数(每条指令4字节),因此立即数(Imm)符号扩展之后需要进一步左移2位形成跳转距离,即跳转距离的形成需要用到符号扩展以及移位部件。根据以上分析可知,条件跳转指令执行部件构成如图38所示。当执行beq指令且条件成立(Zero=1)时,与门输出1从而控制复用器将跳转目标地址输出到PC寄存器; 否则将PC加4输出到PC寄存器。 图38条件跳转指令执行部件 5. 无条件伪直接跳转指令执行部件 简单指令集中的无条件伪直接跳转j指令为J型指令,指令编码如表26所示,采用Instr改写之后指令编码如图39所示。 图39伪直接跳转j指令编码 该指令中除了6位操作码之外,其余位为伪直接跳转地址立即数(Imm)。实际跳转目标地址由PC的高4位及指令低26位立即数(Imm)左移2位后合并而成。由此得到无条件伪直接跳转指令执行部件构成如图310所示。 图310无条件伪直接跳转指令执行部件 6. 完整数据通路 为简化电路,各指令执行部件的公共部分复用,寄存器PC的值有3种来源: 伪直接跳转目标地址、条件跳转目标地址及顺序执行地址。由于条件跳转控制指令执行部件可实现条件跳转目标地址及顺序执行地址的二选一,因此只需再增加一个复用器,通过两级二选一即可实现三选一复用。寄存器文件写入寄存器编码有两种来源,即R型指令中的$Rd及I型指令中的$Rt,它们在指令中处于不同的域,因此需通过一个二选一复用器实现控制。寄存器文件写入寄存器数据也有两种来源,即R型指令ALU的运算结果及I型指令数据存储器的读数据,此处需通过一个二选一复用器实现控制。ALU运算单元的第二个数据来源也有两种情况,即R型指令和beq指令的RF[$Rt]及数据传送指令中的Imm符号扩展结果,此处也需通过一个二选一复用器实现控制。 复用之后简单指令集MIPS微处理器完整数据通路如图311所示。该数据通路统一采用二选一复用器实现多路信号复用。复用器MUX1复用伪直接跳转目标地址和其他目标地址作为下一条指令地址写入PC; 复用器MUX2复用分支跳转目标地址和顺序执行时的下一条指令地址作为MUX1的其他目标地址; 复用器MUX3复用ALU运算结果和数据存储器的读数据作为寄存器文件写数据; 复用器MUX4复用$Rt的值和指令中立即数符号扩展结果作为ALU的第二个源; 复用器MUX5复用指令中的$Rt编号和$Rd编号作为写寄存器编号。 图311简单指令集MIPS微处理器完整数据通路 实践视频 3.2.2简单指令集MIPS微处理器控制器 由第2章MIPS指令编码可知,简单指令集中指令功能决定因素有两种: ①仅操作码Op(I型、J型指令); ②操作码Op及功能码Funct的联合(R型指令)。不同指令的不同功能需通过控制图311所示数据通路各个部分协调动作实现。简单指令集中R型指令功能的不同主要体现在ALU执行不同的运算; 其他指令功能的不同主要体现在复用器通道选择信号、寄存器文件写信号、数据存储器写信号取值不同。由此可知,控制器仅需产生ALU、复用器、寄存器文件、数据存储器等的控制信号。 1. ALU控制信号 首先分析ALU单元执行的运算类型。简单指令集MIPS微处理器仅支持add、sub、and、or、slt等R型运算指令; 数据传输指令sw、lw通过ALU单元执行加运算计算存储器地址; 条件跳转控制指令beq利用ALU单元执行减运算比较两个寄存器的值是否相等。所有这些指令包含的运算有加、减、与、或、小于设置5种。5种不同运算理论上仅需采用3位二进制编码即可表示,为方便指令集扩展,本书直接采用MIPS微处理器ALU控制信号编码。 MIPS微处理器ALU单元具有4位控制信号(ALUCtr[3:0]),ALU单元通过对4位控制信号译码决定执行何种操作,对应加、减、与、或、小于设置5种运算的ALU控制信号编码如表31所示。 表31对应加、减、与、或、小于设置5种运算的ALU控制信号编码 ALUCtr[3:0]00000001001001100111 操作类型与或加减小于设置 MIPS微处理器R型指令6位操作码全部为0,由6位功能码指示R型指令的具体功能。简单指令集MIPS微处理器支持的R型指令全部为运算指令,若仅考虑R型指令,可以直接对R型指令6位功能码译码产生ALUCtr[3:0]。但是sw、lw以及beq指令也需使用ALU执行运算且没有功能码,因此还需根据操作码区分ALU的运算类型。 对指令的操作码译码,可将简单指令集需利用ALU单元执行运算的指令分为3类: R型(add、sub、and、or、slt)、I型加法(lw、sw)、I型减法(beq)。因此2位编码(ALUOp[1:0])即可表示这些不同指令的类型。I型指令可直接根据ALUOp[1:0]产生ALUCtr[3:0]; R型指令需根据ALUOp[1:0]以及6位功能码Funct[5:0]产生ALUCtr[3:0]。由此可知,根据指令操作码以及功能码形成ALUCtr[3:0]信号的译码电路可采用两级译码电路,如图312所示。 图312形成ALUCtr[3:0]信号的两级译码电路 若定义I型加法的ALUOp[1:0]为(00)2、I型减法的ALUOp[1:0]为(01)2、R型指令的ALUOp[1:0]为(10)2,可得到指令操作码、功能码与ALUOp[1:0]、ALUCtr[3:0]之间的关系如表32所示。 表32指令操作码、功能码与ALUOp[1:0]、ALUCtr[3:0]之间关系 Op[5:0]ALUOp[1:0]指令功能Funct[5:0]ALU运算类型ALUCtr[3:0] 100011(lw)00取字xxxxxx加0010 101011(sw)00存字xxxxxx加0010 000100(beq)01相等跳转xxxxxx减0110 000000(R型add)10加100000加0010 000000(R型sub)10减100010减0110 000000(R型and)10与100100与0000 000000(R型or)10或100101或0001 000000(R型slt)10小于设置101010小于设置0111 由表32可以发现,R型指令6位功能码的前2位完全相同,因此在译码时可以不予考虑,这样就得到如表33、表34所示针对图312中第一级译码电路和第二级译码电路的真值表。 表33ALUOp译码电路真值表 输入(Op[5:0])100011101011000100000000 输出(ALUOp[1:0])00000110 表34ALUCtr译码电路真值表 输入 ALUOp[1:0]00011010101010 Funct[5:0]xxxxxxxxxxxxxx0000xx0010xx0100xx0101xx1010 输出ALUCtr[3:0]0010011000100110000000010111 2. 主控制器 MIPS微处理器主控制器除了产生ALU控制信号之外,还需根据指令操作码Op产生各个复用器的通道选择信号以及寄存器文件、数据存储器写信号。 图311所示数据通路上有5个复用器,所有复用器都需1位通道选择控制信号,因此需5个复用器通道选择信号,再加上存储器写、寄存器写控制信号以及ALUOp[1:0]共9个控制信号。各控制信号在数据通路上所处位置及名称定义如图313所示。 图313中复用器结构框图如图314所示,复用器功能如表35所示。 若图313中寄存器文件及数据存储器写控制信号(RegWr、MemWr)都为高电平有效,则图313中各个控制信号的含义如表36所示。 图313各控制信号在数据通路上所处位置及名称定义 图314复用器结构框图 表35复用器功能 通道选择信号输出数据来源通道选择信号输出数据来源 0通道0 1通道1 表36控制信号含义 信号名称 取 值 含 义 10 RegDst写寄存器编号来自Instr[15:11]($Rd)写寄存器编号来自Instr[20:16]($Rt) JPC来自伪直接跳转地址PC来自复用器MUX2的输出 B条件跳转指令非条件跳转指令续表 信号名称 取 值 含 义 10 Mem2Reg寄存器文件写数据来自数据存储器读数据寄存器文件写数据来自ALU运算结果 ALUSrcALU第二个数据源自Instr [15:0](Imm)的32位符号数据扩展ALU的第二个数据源自RF[$Rt] RegWr寄存器文件写数据写入写寄存器编号的寄存器中无意义 MemWr数据存储器写数据写入地址对应的存储单元中无意义 简单指令集R型指令执行时,首先从指令存储器中取出指令,并且将RF[$Rs]、RF[$Rt]输出到ALU,经过ALU运算之后,将结果保存到$Rd。同时,PC修改为PC+4的值,以便顺序执行下一条指令。R型指令执行时数据通路有效传输路径如图315中深黑色线路所示,MUX1~MUX5选择的通道分别为通道0、通道0、通道0、通道0、通道1,由此可知简单指令集R型指令执行时各个控制信号取值如表37所示。 图315R型指令执行时的有效数据通路 表37R型指令执行时各控制信号取值 指令RegDstJBMem2RegALUSrcRegWrMemWrALUOp[1:0] R型100001010 简单指令集装载指令(lw)执行时,首先从指令存储器中取出指令,并且将RF[$Rs]、Instr[15:0](Imm)符号扩展后输出到ALU,经过ALU加运算将结果输出到数据存储器地址输入端,最后将数据存储器输出的读数据保存到$Rt。同时,PC修改为PC+4的值,以便顺序执行下一条指令。lw指令执行时数据通路有效传输路径如图316中深黑色线路所示,MUX1~MUX5选择的通道分别为通道0、通道0、通道1、通道1、通道0,由此可知装载指令(lw)执行时各个控制信号取值如表38所示。 图316lw指令执行时的有效数据通路 表38lw指令执行时各控制信号取值 指令RegDstJBMem2RegALUSrcRegWrMemWrALUOp[1:0] lw000111000 简单指令集存储指令(sw)执行时,首先从指令存储器中取出指令,并且将RF[$Rs]、Instr[15:0](Imm)符号扩展后输出到ALU,经过ALU加运算将结果输出到数据存储器的地址输入端,RF[$Rt]输出到数据存储器的写数据,最后RF[$Rt]保存到数据存储器相应存储单元。同时,PC修改为PC+4的值,以便顺序执行下一条指令。sw指令执行时数据通路有效传输路径如图317中深黑色线路所示,MUX1~MUX5选择的通道分别为通道0、通道0、任意、通道1、任意,由此可知存储指令(sw)执行时各个控制信号取值如表39所示。 图317sw指令执行时的有效数据通路 表39sw指令执行时各控制信号取值 指令RegDstJBMem2RegALUSrcRegWrMemWrALUOp[1:0] swx00x10100 简单指令集条件跳转控制指令(beq)执行时,首先从指令存储器中取出指令,并且将Rs、Rt数据输出到ALU,经过ALU减运算之后,判断结果是否为零,并且将Zero标志输出以判断条件是否成立。当条件成立时,PC修改为PC+4与指令中立即数(Imm)符号扩展并左移2位的和,跳转到目标指令; 否则PC修改为PC+4的值,顺序执行下一条指令。数据通路有效传输路径如图318中深黑色线路所示,MUX1~MUX5选择的通道分别为通道0、通道0或1(由Zero决定)、任意、通道0、任意,由此可知beq指令执行时各个控制信号的取值如表310所示。 图318beq指令执行时的有效数据通路 表310beq指令执行时各控制信号取值 指令RegDstJBMem2RegALUSrcRegWrMemWrALUOp[1:0] beqx01x00001 简单指令集伪直接跳转控制指令(j)执行时,从指令存储器中取出指令,直接将PC修改为PC+4的高4位与Instr[25:0](Imm)左移2位合并之后的值,从而跳转到目标地址。j指令执行时数据通路有效传输路径如图319中深黑色线路所示,MUX1~MUX5中仅MUX1有意义,且选择的通道为通道1,其余复用器都无意义,由此可知j指令执行时各个控制信号的值如表311所示。 根据以上分析,得到简单指令集各指令执行时各个控制信号的值如表312所示。 根据MIPS汇编指令编码可知,表312中各控制信号产生的依据为指令Op字段(Instr[31:26])。若在数据通路中加入一个控制器,对指令Op字段译码产生这些控制信号,就形成了如图320所示简单MIPS微处理器。指令Op字段为主控制器的输入,各个控制信号为主控制器的输出,主控制器功能如表313所示。 若微处理器各个部件在同一时钟作用下工作,并在一个时钟周期内执行一条指令,就构成了单周期简单指令集MIPS微处理器,其中PC寄存器、指令存储器、寄存器文件、数据存储器都可采用同一时钟控制。 图319j指令执行时的有效数据通路 表311j指令执行时各控制信号取值 指令RegDstJBMem2RegALUSrcRegWrMemWrALUOp[1:0] jx1xxx00xx 表312简单指令集中各指令执行时各个控制信号的值 指令RegDstJBMem2RegALUSrcRegWrMemWrALUOp[1:0] R型100001010 lw000111000 swx00x10100 beqx01x00001 jx1xxx00xx 表313主控制器功能 输入输出 Op[5:0](Instr[31:26])RegDstJBMem2RegALUSrcRegWrMemWrALUOp[1:0] 000000(R型)100001010 100011(lw)000111000 101011(sw)x00x10100 000100(beq)x01x00001 000010(j)x1xxx00xx 图320加上控制器的简单指令集MIPS微处理器完整框图 实践视频 实践视频 3.2.3简单指令集MIPS微处理器典型指令执行过程 本节结合图320所示简单指令集MIPS微处理器完整框图解释典型指令的执行过程。 简单MIPS微处理器执行指令前,要求指令预先存储在指令存储器中。假定指令存储器中从地址0开始预先存储了如图321所示汇编指令序列的机器码,且所有通用寄存器初始值与其编号一致,寄存器PC的初始值为0x0,数据存储器各个存储单元的初始值都为0。 L1: add $t1,$t2,$t3 sw $t1,2($t2) beq $t1,$t2,L1 j L1 图321指令存储器中预存储机器码对应的汇编指令序列 根据以上设定,MIPS微处理器上电前的初始状态如图322所示。上电之后,由于PC的初始值为0,首先取出第一条指令add $t1,$t2,$t3执行,然后顺序取出第二条指令sw $t1,2($t2)执行,再次顺序取出第三条指令beq $t1,$t2,L1执行,该指令为条件跳转指令,因此根据执行时的条件确定是否跳转,若跳转则回到第一条指令; 若不跳转则继续取出第四条指令j L1执行,该指令为无条件跳转,因此无论如何都跳回到第一条指令,依此周而复始。 下面根据简单MIPS微处理器的电路框图结构,逐条分析各指令执行时微处理器内部模块及连接线的状态。 图322MIPS微处理器上电前的初始状态 1. R型指令add $t1,$t2,$t3 执行过程为: (1) 根据PC的初始值0,从指令存储器中获得指令机器码,并将PC加4。 (2) 根据指令机器码,寄存器文件输出RF[$t2($10)]和RF[$t3($11)],同时主控制器译码Instr[31:26]产生相应控制信号。此时ALUSrc为0,RF[$t3]进入ALU参与运算。 (3) R型指令主控制器译码后ALUOp1为1,ALUOp0为0,ALU译码单元进一步对指令功能码译码,控制ALU单元执行加法运算。此时Mem2Reg为0,且RegWr为1,ALU运算结果(0x15)保存到$t1($9)。 add $t1,$t2,$t3执行时,MIPS微处理器内部各模块以及连接线状态如图323所示。下一时钟到来后,PC为4,因此顺序执行下一条指令“sw $t1,2($t2)”。 图323add $t1,$t2,$t3执行时MIPS微处理器内部各模块及连接线状态 实践视频 2. 数据传输指令sw $t1,2($t2) 执行过程为: (1) 根据PC的值4,从指令存储器中获取指令机器码,并将PC加4。 (2) 根据指令机器码,寄存器文件输出RF[$t2]、RF[$t1],同时主控制器译码Instr[31:26]产生相应控制信号。此时ALUSrc为1,Instr[15:0]符号扩展之后进入ALU单元参与运算。 (3) 由于ALUOp1为0,ALUOp0为0,因此ALU单元执行加法运算,ALU单元计算结果送入数据存储器地址。同时,MemWr为1,因此RF[$t1]写入到由ALU单元运算结果(12)所指示的数据存储器地址中。 sw $t1,2($t2)执行时,MIPS微处理器内部各模块以及连接线状态如图324所示。下一时钟到来时,PC为8,因此顺序执行下一条指令“beq $t1,$t2,L1”。 图324sw $t1,2($t2)执行时MIPS微处理器内部各模块及连接线状态 3. 条件跳转控制指令beq $t1,$t2,L1 执行过程为: (1) 根据PC的值8,从指令存储器中获取指令机器码,并将PC加4,同时也将Instr[15:0]符号扩展并左移2位之后与PC+4的值相加得到跳转目标地址。 (2) 根据指令机器码,寄存器文件输出RF[$t1]、RF[$t2],同时主控制器译码Instr[31:26]产生相应控制信号。此时ALUSrc为0,RF[$t2]送入到ALU单元参与运算。 (3) 由于ALUOp1为0,ALUOp0为1,因此ALU单元执行减法运算,并判断结果是否为0。若为0则使Zero输出1,否则输出0。 (4) 若Zero为1,则经过与门之后控制复用器(MUX2)选择跳转目标地址赋给PC,从而实现跳转; 若Zero为0,则选择PC+4的值赋给PC,从而顺序执行程序。 beq $t1,$t2,L1执行时,MIPS微处理器内部各模块以及连接线状态如图325所示。下一时钟到来后,PC为0xc,因此顺序执行下一条指令“j L1”。 图325beq $t1,$t2,L1执行时MIPS微处理器内部各模块以及连接线状态 实践视频 4. J型指令j L1 执行过程为: (1) 根据PC的值0xc,从指令存储器中获取指令机器码,并将PC加4,同时也将Instr[25:0]左移2位之后再与PC+4的高4位合并,形成伪直接跳转目标地址0x0。 (2) 根据指令机器码,主控制器译码指令操作码使得J为1,此时将伪直接跳转目标地址赋给PC,即直接跳转到L1处。 j L1执行时,MIPS微处理器内部各模块以及连接线状态如图326所示。下一时钟到来后,从头开始执行指令。 图326j L1执行时MIPS微处理器内部各模块以及连接线状态 必须注意: 不管执行什么指令,数据通路上不受控制的部件一直处于工作状态,如各个地址加法器。指令执行时,有些部件的输出结果没有意义。 至此,阐述了简单指令集MIPS微处理器设计的基本原理。现代微处理器比简单MIPS微处理器要复杂得多。简单MIPS微处理器,指令一条一条地执行,且任何指令都在一个时钟周期内完成。虽然不同指令执行时所需有效数据通路不同,简单MIPS微处理器将耗时最长指令的执行时间作为微处理器的最短时钟周期,这种设计方案降低了微处理器的执行效率。 3.3微处理器新技术 3.3.1流水线技术 流水线的基本原理是把一个重复的过程分解为若干子过程,前一子过程为下一子过程创造执行条件,每一个子过程可以与其他子过程同时进行。简而言之,就是“功能分解,空间上顺序依次进行,时间上重叠并行”。流水线微处理器就是把一条指令的操作分为若干级,每一级在一个时钟周期完成,微处理器在每个周期发出一条指令。这样,多条指令就可以由微处理器并行执行,每条指令处在不同级。 下面以MIPS微处理器为例,简要阐述微处理器流水线技术的实现原理。 从MIPS微处理器执行指令的过程可知,指令执行通常可以分为以下5个部分: (1) 从指令存储器中取指令(取指令); (2) 从寄存器中读取数据的同时,对指令进行译码(指令译码); (3) 执行指令对应的操作或计算数据存储器地址(运算); (4) 从数据存储器中存、取数据(存储器操作); (5) 将结果写入寄存器中(回写结果)。 微处理器指令的执行通常都由这5个部分构成,分别把这5个部分命名为取指令(IF)、指令译码(DEC)、运算(EXEC)、存储器操作(MEM)、回写结果(WB)。如果将微处理器时钟周期缩短,每个部分利用一个时钟周期完成,那么微处理器执行指令的过程可描述为如图327所示。 图327多时钟周期微处理器指令的执行过程 如果微处理器把这5个部分设计为相对独立的部件,那么它们可以同时执行对应的工作。即在同一条指令中顺序执行,在不同的指令中并行执行,这就是流水线的基本原理,如图328所示。流水线具有多少个不同的执行部件,则称这条流水线具有多少级。 图328指令流水线执行过程 对比图327和图328可以看出,不采用流水线的微处理器在10个时钟周期内仅完成2条指令,而采用流水线则可以在10个时钟周期内完成6条指令。 如果流水线的每个部件执行时间相同,那么在流水线结构中,每条指令执行的时间间隔可以表示为 指令执行的时间间隔=每条指令占有的时钟周期个数流水线级数 简单MIPS微处理器数据通路若按5级流水线重新组织,结构变为如图329所示。 图329MIPS微处理器数据通路的5级流水线划分 由指令执行过程可知,指令的机器码由流水线的IF部件取出来、DEC部件译码、EXEC部件计算。因此当IF部件取下一条指令时,必须保存上一次取得的指令以供后面的部件使用,也就是说在每两个流水线部件之间必须增加器件实现流水线不同部件之间的接口。虽然在流水线处理器中增加少量的器件就较大幅度地提高了微处理器的执行效率,但是它要处理以下问题。 (1) 结构相关: 由于硬件资源不充足而导致流水线不畅通。 (2) 数据相关: 由于指令的源操作数依赖其他指令的计算结果而导致读数据不正确。 (3) 转移相关: 由于流水线操作导致在转移发生之前,若干条转移指令的后续指令已被取到流水线处理器中。 由于这些问题的存在,流水线并不能从根本上解决微处理器的执行效率问题。 3.3.2超标量技术 超标量技术是指微处理器内部集成多个ALU、多个译码器和多条流水线,以并行处理的方式提高性能。采用超标量技术可以提高指令级并行度。这种指令执行的重叠性(使一条流水线畅通)和同时性(多条流水线同时工作)就称为指令级并行。 流水线处理器在每个时钟周期最多发出1条指令,而超标量微处理器可以在每个时钟周期发出1~8条指令。同时发出的指令必须是不相关的并且不能出现资源冲突。假设微处理器有一个整数部件和一个浮点部件,微处理器至多能发出2条指令: 一条是整数类型的指令,包括整数运算、存储器访问和转移指令; 另一条必须是浮点类型的指令。如果微处理器执行部件足够,则资源冲突可能性会减小。这样的微处理器指令的调度策略是一个需要考虑的问题。为实现指令的调度,通常微处理器中会设计一个指令缓冲区,用来存放等待调度的指令。 3.3.3多核处理器 多核处理器是一个芯片上集成两个或多个完整的计算引擎(逻辑CPU核),片内总线上的多个逻辑处理器核由总线控制器提供所有总线控制信号和命令信号。每个微处理器核实质上都是一个相对简单的单线程微处理器或者比较简单的多线程微处理器,这样多个微处理器就可以并行地执行程序代码,因而具有了较高的线程级并行性。通过在多个执行内核之间划分任务,多核处理器可在特定的时钟周期内执行更多任务。 由于多核处理器采用了相对简单的微处理器作为处理器核心,多核处理器具有高主频、设计和验证周期短、控制逻辑简单、扩展性好、易于实现、功耗低、通信延迟低等优点。此外,多核处理器还能充分利用不同应用的指令级并行和线程级并行,具有较高线程级并行性的应用如商业应用等可以很好地利用这种结构来提高性能。单芯片多处理器已经成为处理器体系结构发展的一种必然趋势。 3.4微处理器异常处理机制 计算机除了正常执行程序中的指令之外,往往还有一些特殊的情况需要处理,如计算结果产生了溢出、碰到了非正确的机器指令以及外部设备需要进行数据输入、输出等。微处理器往往不能预测这些事件发生的时间,它们不受程序控制。计算机系统把这些事件称为异常(exception)或中断(interrupt)。MIPS微处理器中的中断特指微处理器外部事件,而Intel微处理器将内部异常事件和外部异常事件统称为中断。计算机系统常见异常事件如表314所示。 表314计算机系统常见异常事件 异 常 种 类来源MIPS处理器命名 I/O设备外部中断 用户程序唤醒操作系统内部异常 计算结果溢出内部异常 未定义的指令(非法指令)内部异常 硬件出错两者异常或中断 微处理器必须提供某种机制处理这类事件,即需具备异常处理机制。异常处理是指计算机在正常执行程序的过程中,由于种种原因,CPU暂时停止当前程序的执行,而转去处理临时发生的异常事件,并当异常事件处理完毕后,再返回去继续执行暂停程序的过程。也就是说,程序正常执行过程中,意外插入另外一段程序处理异常事件。 微处理器完成异常处理需实现以下功能: (1) 记录异常事件的类型。 (2) 记录被暂停程序暂停处指令在存储器中的地址,即断点。只有这样,异常事件处理完之后才能继续执行被暂停的程序。 (3) 记录不同异常事件处理程序入口在存储器中的地址。 (4) 建立异常事件与异常处理程序入口地址之间的对应关系。只有建立了这种对应关系,微处理器才能在遇到某个特定异常事件时执行相对应的异常处理程序。 3.4.1异常事件识别 计算机系统中异常事件种类较多,且不同异常事件处理方式不同。因此微处理器为处理异常事件,首先需要知道异常事件的类型。计算机系统识别异常事件有两种方式: ①状态位法,微处理器利用一个特殊功能寄存器对每种异常事件设立一个标志位,当有异常事件发生时,该寄存器中相应的位被置1,因此一个32位的寄存器可以表示32种不同类型的异常事件; ②向量法,不同异常事件具有一个唯一的编码,这个编码称为中断类型码或异常类型码。若产生了异常事件,则微处理器可以接收到该异常事件的异常类型码,解码就可以获知异常事件的类型。一个8位的寄存器可以表示256种不同类型的异常事件。 3.4.2断点保存和返回 异常事件发生后,CPU转去处理临时发生的异常事件,处理完毕后,再返回去继续执行暂停的程序。要能够继续执行暂停的程序,需要保存断点。只有这样,才能处理完异常事件之后恢复到被暂停程序的断点处继续执行。 计算机保存断点的方式有两种: ①微处理器设置一个特殊寄存器EPC,当出现异常事件时,将PC的值保存到EPC中。异常事件处理完之后,再把EPC的值赋给PC,这样就实现了断点的保存和返回。但是如果计算机正在处理异常事件还没有返回,就不能处理再次发生的异常事件,如同仅采用$ra保存主程序的返回地址一样。因此为实现异常事件处理的嵌套,微处理器在进入异常处理程序之前需要首先将EPC压入栈,然后再保存PC到EPC。②当出现异常事件时,微处理器直接将PC压入栈,异常事件处理结束之后,再从栈顶恢复PC,同样可以实现断点保存和返回,且不用担心异常事件处理的嵌套问题。这种方式断点保存和返回都需要访问栈。 3.4.3异常处理程序进入方式 不同异常事件具有不同的异常处理程序,这些异常处理程序都必须在异常事件发生之前保存在存储器中,以便异常事件发生时执行相应的处理。异常处理程序的入口地址,称为异常向量(中断向量)。异常处理程序保存在存储器的位置与微处理器根据异常事件类型码获取异常处理程序的机制相关。 微处理器获取异常处理程序入口地址有以下几种方式: (1) 微处理器分配一块专门的存储区域保存异常处理程序。每个异常处理程序在这块存储区域分配固定长度的存储空间(如8字节或2条指令),由于这段存储空间存储的指令不能完成异常事件处理,因此通常在这里设置一条跳转指令跳转到真正的异常处理程序。 当异常事件发生时,硬件电路获取异常类型码N,微处理器根据异常类型码N计算出中断向量。如异常处理程序特定存储区域起始地址为某个常数Imm,那么根据异常事件类型码N获取中断向量的计算式为PC=Imm+N×8,其中8为每个异常处理程序分配的固定存储空间大小。 (2) 微处理器仅提供一个异常事件处理程序存放地址,且为某个固定值Imm,发生异常事件时,都首先转移到该地址执行异常事件处理,该异常处理程序为总异常处理程序。总异常处理程序识别异常事件类型,然后再调用子程序执行异常事件处理。在这种方式下,要求总异常处理程序软件维护一个中断向量表。 当异常事件产生时,微处理器硬件电路只需将Imm赋值给PC,即PC=Imm,进入总异常处理程序,之后的处理流程由软件实现。这种转入总异常处理程序的硬件电路实现简单,但是由于采用软件查询方式识别异常事件,因此进入真正异常处理程序的效率较低。 (3) 微处理器分配一块专门的存储区域保存异常向量(中断向量)。这块保存中断向量的存储区域称为中断向量表。由于每个中断向量都是固定长度的(如4字节),因此存储中断向量的存储空间大小也是固定的。异常处理程序可以存放在存储器的任意位置,只需把中断向量保存到中断向量表中正确的地址。当异常事件发生时,微处理器查找中断向量表直接进入异常处理程序。 当异常事件发生时,硬件电路获取异常类型码N,微处理器首先根据异常类型码N计算出中断向量在中断向量表中的存储地址,然后再获取中断向量。若中断向量表的起始地址为Imm,当异常事件发生时,硬件电路获取异常类型码N,计算出中断向量存储地址Addr=Imm+N×4,然后再将该存储空间中的中断向量赋给PC,即PC=mem[Imm+N×4]。这种方式硬件电路较复杂,但是进入真正异常处理程序的速度最快。 假设计算机系统产生了2号异常事件,3种不同方式下微处理器进入异常处理程序的过程如图330所示。方式1、2微处理器内部硬件电路直接修改PC,然后再由软件跳转到特定异常处理程序; 方式3微处理器内部硬件电路计算出中断向量在中断向量表中的存储地址,然后再将存储在该地址的中断向量赋给PC,即由微处理器硬件电路直接控制进入特定异常处理程序。方式3微处理器内部硬件电路实现复杂,但软件简单,因此PC微处理器(如Intel x86系列)采用此方式; 而嵌入式微处理器(如MicroBlaze、PIC32MX系列)通常将方式1、2混合使用,即微处理器将异常事件进行两级分类,即大类和子类,各大类异常处理程序进入方式采用方式1,每个大类下的子异常处理程序进入方式采用方式2,即由大类异常处理程序识别各个子异常事件,然后再调用相应的异常处理子程序。 图3302号异常事件发生时微处理器3种不同方式进入异常处理程序的过程 图330(续) 3.5微处理器外部接口 3.2节设计的简单MIPS微处理器包含了指令存储器和数据存储器,这样设计只是为了简化微处理器设计。实际上,微处理器内部仅含有少量存储单元,如通用计算机微处理器的片内cache,嵌入式微处理器的部分指令存储器和数据存储器。也就是说,计算机系统大量的存储单元位于微处理器外部。微处理器与存储器之间的数据交互,必须通过微处理器外部总线。另外,微处理器作为计算核心,处理的数据除了来源于存储器外,还有大量的数据来自计算机外围各种数据采集设备,如鼠标、键盘、麦克风、摄像头等。微处理器也必须通过总线与这些外围设备之间交互数据。即微处理器必须提供总线接口,才能访问外部器件。 3.5.1Intel x86微处理器外部接口示例 Intel x86微处理器的外部接口采用系统总线接口方式,图331展示了8088微处理器的外部引脚。其中,AD0~AD7为8位地址、数据复用总线接口,A8~A19为高12位地址总线,其余引脚除了电源、时钟引脚之外就是控制总线。 图3318088微处理器外部引脚 图3328088微处理器最小组态系统总线接口电路 图332是针对8088微处理器引脚特点设计的最小组态下系统总线接口电路。ALE为CPU提供的地址锁存信号,当该信号有效时,AD0~AD7及A16~A19输出地址信号,因此可以利用3组锁存器74xx373在ALE地址锁存使能信号的控制下锁存CPU输出的地址信号,从而提供分离的地址总线。DEN为数据有效信号,当该信号有效时,AD0~AD7传输数据信号,数据的传输方向由DT/R引脚指示,可以通过1个双向缓冲器74xx245在DEN以及DT/R的控制下分离出数据总线。控制引脚没有复用,直接由CPU引脚提供。从图332可以看出,8088微处理器工作时,必须外加时钟产生电路8284以产生时钟和复位信号。 微型计算机的微处理器外部接口基本上都采用这种总线方式。不同类型的存储芯片或I/O设备与微处理器相连时,都可以通过特有的接口电路连接到总线上,一方面为用户设计各种计算机接口电路提供了较大的自由度,另一方面也给用户的接口电路设计增加了难度。 3.5.2嵌入式微处理器外部接口示例 为降低用户设计接口电路的难度,嵌入式微处理器将大部分常见接口电路都集成到了微控制器内部,因此用户看到的大多数嵌入式微控制器提供的外部接口并非总线方式,而是针对不同输入、输出设备或存储器提供的不同接口。图333为32位Microchip嵌入式芯片PIC32MX5XX/6XX/7XX系列的内部结构框图。 图333嵌入式芯片PIC32M×5××/6××/7××系列内部结构框图 从图333可以看出,这个芯片已经集成了相当多的外部总线或接口,如USB、CAN、Ethernet、I2C、SPI、UART等。该芯片已经不再是单纯意义上的微处理器,它是一个微缩的集成计算机硬件系统。微处理器仅是这类嵌入式微控制器的一部分,如图333虚线框内的MIPS32 CPU内核。虽然嵌入式芯片外部引脚结构发生了较大的改变,但是从图333可以看出,该微控制器的CPU仍然是通过统一的总线结构(总线矩阵)与微控制器内各个部件相连。 为便于读者学习计算机工作基本原理,本书中的微处理器指采用统一总线接口方式即三总线方式与外部部件实现数据通信的中央处理器(CPU)。 3.6MicroBlaze微处理器简介 MicroBlaze微处理器是Xilinx公司采用硬件描述语言设计的一个软核类MIPS指令集微处理器,它支持32位数据总线和32位地址总线,其基本结构如图334所示。它包含了简单MIPS微处理器的各个部件,并且功能更完善,指令集更复杂。它将指令存储器和数据存储器放在微处理器之外,为实现指令和数据的访问,设计了专门的总线接口部件,由于采用哈佛结构,因此有专门的指令总线接口和数据总线接口。该微处理器可以配置为大字节序或小字节序管理存储器,如采用PLB总线为大字节序,采用AXI总线为小字节序。支持三级或五级流水线,内部具有可选的指令和数据cache,同时支持虚拟存储管理。它支持通过PLB、LMB、AXI等总线与外围接口或部件相连。 图334MicroBlaze微处理器基本结构 3.6.1指令架构 MicroBlaze微处理器支持两种指令格式: A型指令和B型指令。A型指令类似于MIPS指令架构中的R型指令,A型指令编码如图335所示。 图335A型指令编码 B型指令类似于MIPS指令架构中的I型指令,B型指令编码如图336所示。 图336B型指令编码 MicroBlaze将MIPS指令中的J型指令合并到B型指令中,此时目的寄存器编码为保存返回地址的寄存器编码,源寄存器编码不再是真正意义的源寄存器编码,各位具体含义如图337所示。 图337B型跳转控制指令的源寄存器编码各位含义 其中,D表示是否延时之后再跳转,1表示延时数个时钟周期再跳转; 0表示立即跳转。A表示是否是直接跳转,1表示指令中的立即数符号扩展后为直接跳转目标地址; 0表示立即数为相对跳转偏移地址,跳转目标地址为PC+Imm(立即数)。L表示是否保存返回地址,1表示保存下一条指令地址到目的寄存器作为返回地址; 0表示不保存返回地址。 3.6.2寄存器 MicroBlaze微处理器具有32个32位通用寄存器,使用规则与MIPS微处理器通用寄存器的使用规则基本相同,命名为R0~R31。其中R14、R15、R16、R17又用作异常返回地址寄存器,具体使用规则参考本书中断技术章节相关内容。另外还具有18个32位特殊功能寄存器,包括PC、MSR等。这些特殊功能寄存器根据用户对MicroBlaze微处理器的配置决定是否存在。各个特殊功能寄存器的具体含义请读者参考MicroBlaze数据手册,本书不再一一介绍。 3.6.3外部接口 MicroBlaze微处理器外部接口如图338所示。它采用哈佛架构,因此具有独立的数据总线接口和指令总线接口。数据总线接口支持高速缓存AXI总线主设备接口(M_AXI_DC)、高速缓存AXI一致性扩展总线主设备接口(M_ACE_DC)、AXI外设总线主设备接口(M_AXI_DP)、局部存储器总线接口(DLMB)、16个AXI总线流式主设备接口(M0_AXIS~M15_AXIS)和16个AXI总线流式从设备接口(S0_AXIS~S15_AXIS); 指令总线接口支持高速缓存AXI总线主设备接口(M_AXI_IC)、高速缓存AXI一致性扩展总线主设备接口(M_ACE_IC)、AXI外设总线主设备接口(M_AXI_IP)、局部存储器总线接口(ILMB)。MicroBlaze微处理器具有调试接口(DEBUG)和跟踪接口(TRACE),以便系统开发、调试和测试。同时具备多微处理器同步接口(LOCKSTEP)以便多CPU协同工作,以及中断接口(INTERRUPT)以实现与外部设备的中断方式通信。 图338MicroBlaze微处理器外部接口 对比图331、图333以及图338,不难发现PC机的CPU与嵌入式微处理器的CPU外部引脚接口的差别——嵌入式CPU需额外提供调试、测试接口以便程序调试、测试。 实践视频 3.6.4最小系统 MicroBlaze微处理器支持的总线、接口种类众多,构成计算机硬件最小系统时,并不一定需要使用所有总线、接口。MicroBlaze微处理器构成的嵌入式计算机硬件最小系统结构框图如图339所示,包括微处理器(MicroBlaze)、存储器(局部存储器)、总线(AXI总线)、标准输入/输出接口UART(Standard Input and Output,STDIO)、调试模块(JTAG BSCAN)以及计算机系统正常工作的时钟、复位模块。 图339MicroBlaze微处理器构成的嵌入式最小计算机系统硬件结构框图 由于嵌入式计算机系统常作为其他设备的嵌入模块,因此通常不具备微型计算机系统所具有的标准I/O设备(键盘、鼠标、显示器)。为方便用户调试程序,常将微型计算机的I/O设备作为其I/O工具。此时由于微型计算机、嵌入式计算机系统分属两个不同的计算机系统,因此必须通过某个接口实现双机通信,嵌入式系统的标准I/O通信接口为UART串行通信接口。微型计算机系统作为嵌入式计算机系统标准I/O设备的连接拓扑如图340所示。 图340微型计算机系统作为嵌入式计算机系统标准I/O设备的连接拓扑 本章小结 微处理器支持的基本操作包括运算、数据传送以及程序控制三类,微处理器通过ALU、译码器以及寄存器的配合实现以上操作。 简单指令集MIPS微处理器数据通路包含寄存器文件、ALU运算单元、数据存储器、指令存储器、符号数据扩展、移位以及复用器等模块。数据通路上各个部件的控制信号由主控制器以及ALU控制器根据指令操作码、功能码译码产生。控制信号产生采用两级译码: 第一级根据操作码产生各个模块的写控制信号、复用器的通道选择信号以及ALU控制器的编码信号; 第二级再根据功能码及ALU控制器的编码信号产生ALU运算单元的控制信号。 单周期MIPS微处理器仅是一个原型微处理器,现代微处理器采用了更复杂的技术,如流水线技术、超标量技术、多核技术等。这些技术可以实现程序的指令级、线程级并行。 微处理器除了在程序的控制下正常执行各类操作之外,还必须支持异常处理。不同微处理采用的异常处理机制不同。无论如何,都必须采取某种方式识别异常事件、保存断点、建立异常事件(中断类型码)与异常处理程序入口地址(中断向量)之间的映射机制。识别异常事件的方法有状态位、中断类型码; 保存断点方法有寄存器、栈; 进入异常处理程序的方法有分配固定的存储区域保存异常处理程序,为所有异常处理程序提供一个统一的入口,分配固定的存储区域保存异常处理程序入口地址。 微处理器通过总线与计算机系统内其他模块通信,因此微处理器必须具备总线接口。嵌入式微控制器不同于通常意义的微处理器,它集成了微处理器、存储器、接口等。MicroBlaze微处理器是一个采用硬件描述语言实现的嵌入式类MIPS微处理器软核,具有可配置的特点。嵌入式计算机系统通常不支持在系统内编程、调试,因此嵌入式计算机硬件最小系统除了微处理器、存储器之外,还提供调试接口(JTAG BSCAN)以及作为标准I/O接口的UART接口。 思考与练习 1. 微处理器的三种基本操作分别是什么? 2. 微处理器的基本构成包括哪些部分?这些部分分别起什么作用? 3. 微处理器的数据通路包括哪些部件?分别完成什么功能? 4. 试对比分析图31与图320微处理器构成的异同。 5. 支持简单指令集MIPS微处理器结构如题图31所示。当该微处理器初始化时,通用寄存器的值与编码一致,数据存储器以字为最小单位且所有存储单元都初始化为0x5a,PC寄存器的初始值为0,指令存储器从地址0开始存储如题图32所示汇编指令段的机器指令。 题图31简单指令集MIPS微处理器 slt $9,$10,$11 beq $9,$0,b1 or $9,$10,$11 sw $9,2($10) j exit b1:and $9,$10,$11 sw $9,3($11) exit: 题图32MIPS汇编程序段 回答以下问题: (1) 完善题图32中各汇编指令的机器指令(采用二进制表示)。 汇 编 指 令OpRsRtRdShamtFunct slt $9,$10,$1100000000000101010 beq $9,$0,b1000100 or $9,$10,$1100000000000100101 sw $9,2($10)101011 j exit000010 b1:and $9,$10,$1100000000000100100 sw $9,3($11)101011 (2) 指出题图31中各标注信号线的位宽。 信号线编号信号线位宽信号线编号信号线位宽 AE BF NG OH CM D (3) 指出题图32程序段相应指令执行时,题图31中各标注信号线的值(十六进制表示)。 指令ABCDEFGRPLKMST slt $9,$10,$11 beq $9,$0,b1 or $9,$10,$11 sw $9,2($10) j exit (4) 指出题图32程序段执行完后,值被修改的寄存器编号及其修改后的值或值被修改的存储单元地址及其修改后的值。 被修改的寄存器编号或存储单元地址修改后的值 6. 若在简单MIPS指令集基础上增加addiu指令,图39所示简单MIPS微处理器数据通路构成是否需要修改?若需要修改,如何修改?并基于修改后的数据通路完成ALU控制器译码和主控制器译码设计,画出各个译码器的逻辑真值表。 7. 若在简单MIPS指令集基础上增加ori指令,图39所示简单MIPS微处理器数据通路构成是否需要修改?若需要修改,如何修改?并基于修改后的数据通路完成ALU控制器译码和主控制器译码设计,画出各个译码器的逻辑真值表。 8. 简述流水线技术、超标量技术、多核技术的特点。 9. 微处理器识别异常事件的方法有哪些?它们各有什么优缺点? 10. 微处理器保存断点的方法有哪些?它们各有什么优缺点? 11. 微处理器进入异常处理的方法有哪些?它们各有什么优缺点? 12. 阅读MicroBlaze数据手册,说明MSR寄存器各位的具体含义。 13. 微控制器与微处理器的区别是什么? 14. 嵌入式计算机硬件最小系统包含哪些模块?分别实现什么功能? 15. 嵌入式计算机系统常用的标准输入/输出接口是什么接口?它如何实现嵌入式系统的输入/输出?