6.1CPU的设计规范6.2一个非常简单CPU的设计与实现6.3相对简单CPU的设计和实现6.4简单CPU的缺点6.5实例:8085微处理器的内部结构CPU设计CPU设计的两种方法:•硬布线逻辑控制(hardwiredcontrol)•微序列控制器(microsequencer)(微序列控制或微程序控制)6.1CPU的设计规范1.设计CPU的步骤◆确定它的用途关键:使CPU的处理能力和它所执行的任务匹配。◆设计指令集结构◆设计状态图(CPU就是一个复杂的有限状态机)•列出在每个状态中执行的微操作•从一个状态转移到另外一个状态的条件◆设计必要的数据通路和控制逻辑,实现这个有限状态机,最终实现这个CPU。2.CPU执行如下的操作序列•取指令周期:从存储器中取出一条指令,然后转到译码周期。•译码周期:对该指令进行译码,即确定取到的是哪一种指令,然后转移到这种指令对应的执行周期。•执行周期:执行该指令,然后转移到取指令周期去取下一条指令。3.一般CPU状态图6.2.1非常简单CPU的设计规范1.64字节的存储空间,每个字节是8位。6位宽的地址:A[5..0]存储器的8位值:D[7..0]2.一个程序员可以访问的寄存器AC(8位累加器)3.指令集(4条指令)6.2一个非常简单CPU的设计与实现指令指令码操作ADD00AAAAAAAC←AC+M[AAAAAA]AND01AAAAAAAC←AC∧M[AAAAAA]JMP10AAAAAAGOTOAAAAAAINC11XXXXXXAC←AC+14.寄存器•一个6位的地址寄存器AR:它通过A[5..0]向存储器提供地址。•一个6位的程序计数器PC:它包含下一条将被执行指令的地址。•一个8位的数据寄存器DR:它通过D[5..0]从存储器接收指令和数据。•一个2位的指令寄存器IR:它用来存放从存储器中取回的指令的操作码部分。一个CPU仅仅就是一个复杂的有限状态机。设计CPU的途径:•设计CPU的状态图。•设计必要的数据通路和控制逻辑,以便实现这个有限状态机,最终实现这个CPU。6.2.2从存储器中取指令一、从存储器中取出指令的操作序列1.将地址放在地址引脚A[5..0]上,把地址送给存储器。2.在给存储器足够的时间处理内部译码并将需要的指令取出来之后,向存储器发一个信号,使存储器将此指令输出到它的输出引脚,这些引脚与CPU的D[7..0]相连接。CPU从这些引脚读入数据。二、取指令周期的状态FETCH1:AR←PCFETCH2:DR←M,PC←PC+1FETCH3:IR←DR[7..6],AR←DR[5..0]◆实现PC加1的两种方案•在取指令周期(易与实现)•在执行周期三、取指令周期的状态图6.2.3指令译码◆当CPU把一条指令从存储器中取出来之后,它必须判断所取的是哪种指令,从而可以调用正确的执行周期。◆在状态图中,此过程表示为一系列的从取指令周期结束到各个执行周期之间的分支。◆对于本CPU,有四条指令,因此有四个不同的执行周期。取指令和译码周期的状态图6.2.4指令执行6.2.4.1ADD指令CPU必须完成两件事情:◆从存储器中取出一个操作数。◆将这个操作数和累加器中的值相加,并把结果存回到累加器中。ADD1:DR←MADD2:AC←AC+DR6.2.4.2AND指令AND1:DR←MAND2:AC←AC∧DR6.2.4.3JMP指令JMP1:PC←DR[5..0]另外一种选择;PC←AR6.2.4.4INC指令INC1:AC←AC+1◆本CPU的状态图包括了取指、译码和执行周期。6.2.5建立所需的数据通路考察存在哪些数据传送从而设计CPU的内部数据通路。一、与CPU的每个状态相关联的操作FETCH1:AR←PCFETCH2:DR←M,PC←PC+1FETCH3:IR←DR[7..6],AR←DR[5..0]ADD1:DR←MADD2:AC←AC+DRAND1:DR←MAND2:AC←AC∧DRJMP1:PC←DR[5..0]INC1:AC←AC+1二、设计数据通路的两种不同方案1.在所有需要传送数据的部件之间创建一条直接通路。使用多路选择器或者缓冲器为那些有多个数据源的寄存器从多个可能的输入中选择一个。随着CPU复杂度的增加,这种方案将变得不现实。2.在CPU的内部创建一条总线。在各个部件之间使用总线传递数据。三、设计数据通路第一步:把每个部件都连接到系统总线上第二步:决定每个部件应该完成的功能◆将操作重新分组分组的依据:他们所修改的寄存器。AR:AR←PC;AR←DR[5..0]PC:PC←PC+1;PC←DR[5..0]DR:DR←MIR:IR←DR[7..6]AC:AC←AC+DR;AC←AC∧DR;AC←AC+1◆对每一个操作进行分析从而决定每个部件应该完成的功能1.AR,DR以及IR总是从其它一些部件中装入数据2.PC和AC能够从其它一些部件中装入数据,但它们还要能够自增他们的当前值。▲创建一个单独的硬件用来使这两个寄存器的当前值加1,并且使结果能够重新装入寄存器;▲把每个寄存器设计为一个计数器而且能够并行的装载。第三步:修改设计注意如下几点:1.AR仅仅向存储器提供数据,除此之外不跟任何部件传送数据。因此,没有必要将它的输出连接到内部总线上。2.IR不通过内部总线向任何其他部件提供数据,所以IR的输出到内部总线的连接可以删除。3.AC不向其他任何单元提供数据;因此与内部总线的连接也可以删除。4.总线是8位宽,但是并非所有被传送的数据都是8位宽;有一些是6位宽,有一个是2位宽。必须确定哪些寄存器从总线的哪些位上接收和发送数据。5.AC必须能够装载AC和DR的和,以及AC和DR的逻辑与的结果。CPU必须包含一个能够产生这些结果的ALU。第四步:修改后的CPU内部组织结构(图中的控制信号将会由控制单元来产生)第五步:必须保证在同一个状态将要发生的传送能够事实上同时发生。FETCH2:DR←M,PC←PC+1FETCH3:IR←DR[7..6],AR←DR[5..0]AR←PC;AR←DR[5..0]PC←PC+1;PC←DR[5..0]DR←MIR←DR[7..6]AC←AC+DR;AC←AC∧DR;AC←AC+16.2.6非常简单ALU的设计1.ALU完成两个功能◆将两个输入相加◆将两个输入相与2.设计方法◆创建两个单独的硬件来实现每个功能,加法:用标准的8位并行加法器逻辑与:用8个2位与门◆使用一个多路选择器从两个结果中选择一个输出3.电路图ALU6.2.7用硬布线逻辑设计控制单元控制单元:产生控制信号,从而使所有的操作能以正确的顺序执行。设计控制单元有两种主要的方法:▲硬布线控制:使用时序逻辑和组合逻辑产生控制信号。▲微程序控制(或微序列控制):使用存储器查表方式来输出控制信号。本章重点:硬布线控制方法◆简单的控制单元包括三个部分•一个计数器:保存当前状态;•一个译码器:接受当前状态并为每个状态生成单独的信号;•一些组合逻辑:接受单独的状态信号为每一部件生成控制信号,以及计数器的控制信号。◆一般硬布线控制单元◆对于本CPU,总共有9个状态。因此,需要一个4位的计数器和一个4-16位的译码器。译码器的输出位中有7个用不到。一、将状态分配到译码器的各个输出1.将FETCH1规定为计数器的0值,并使用计数器的CLR输入来达到这个状态。2.将顺序的状态指派为计数器的连续值,并且使用计数器的INC输入来遍历所有的这些状态。FETCH2:计数器值1FETCH3:计数器值2同样:将ADD1和ADD2指派为连续的计数值对AND1和AND2也是一样3.根据指令操作码和执行周期的最大状态数量来指派执行周期的第一个状态。用操作码产生计数器的数据输入,并用计数器的LD输入使之达到合适的执行周期。实质:实现从操作码到执行周期的一种映射。◆为了装入正确执行周期的地址,控制单元必须完成两件事情。▲必须能够将正确的执行周期的第一个状态的地址放到计数器的输入上。▲必须发出计数器的LD信号。◆如何构造映射函数?计数器的输入是IR值的一个函数。目标:使这个函数越简单越好。一个可能的映射:10IR[1..0]▲如果IR=00,那么计数器的输入就是1000;▲当IR=01,则输入为1001,以此类推。非常简单CPU的指令,第一状态,以及操作码指令第一状态IRADDADD100ANDAND101JMPJMP110INCINC111文中给出的映射函数的计数值IR[1..0]计数值状态001000(8)ADD1011001(9)AND1101010(10)JMP1111011(11)INC1◆存在一些问题由于状态ADD1的计数值是8,而AND1的计数值是9,那我们应该给ADD2安排一个什么值?如何从ADD1去访问ADD2呢?解决方法:使执行周期的第一个状态的计数值之间的间隔至少为2。通过映射1IR[1..0]0可以达到这个目的。▲使得ADD1,AND1,JMP1,INC1的计数值分别是8,10,12,14▲将ADD2指派为计数值9▲AND2的计数值指派为11二、为计数器产生控制信号对于计数器,我们必须产生INC,CLR和LD信号。◆当控制单元遍历顺序状态,从FETCH1,FETCH2,ADD1到AND1时,INC信号有效。◆CLR则用来从每一个执行周期的末尾返回到取指令周期,这可能发生在ADD2,AND2,JMP1和INC1状态。◆LD信号在每个取指令周期的末尾FETCH3状态中发出。三、控制单元部分电路图四、组合形成控制AR,PC,DR,IR,M,ALU以及缓冲器的控制信号。◆首先考虑AR寄存器,它是在状态FETCH1(AR←PC)和FETCH3(AR←DR[5..0])期间装载的。通过将这两个状态信号进行逻辑OR操作,CPU就为AR产生了LD信号。为PC,DR,AC以及IR创建如下的控制信号:PCLOAD=JMP1PCINC=FETCH2FETCH1:AR←PCFETCH2:DR←M,PC←PC+1FETCH3:IR←DR[7..6],AR←DR[5..0]ADD1:DR←MADD2:AC←AC+DRAND1:DR←MAND2:AC←AC∧DRJMP1:PC←DR[5..0]INC1:AC←AC+1DRLOAD=FETCH2∨ADD1∨AND1ACLOAD=ADD2∨AND2ACINC=INC1IRLOAD=FETCH3◆ALU的控制输入ALUSEL把ALUSEL设置为AND2,就能保证当CPU执行ADD或AND指令时,有正确的结果从ALU流向AC。•当ALUSEL=0时,ALU输出的是两个输入的算术和;•当ALUSEL=1时,那么输出就是输入的逻辑与。◆产生缓冲器的有效信号例如:DR寄存器在FETCH3(IR←DR[7..6],AR←DR[5..0]),ADD2(AC←AC+DR),AND2(AC←AC∧DR)以及JMP1(PC←DR[5..0])的时候,DR的内容必须放到总线上。将这些状态值进行逻辑或,就能够得到DRBUS信号。这个过程也可以用于产生其它缓冲器的控制信号:MEMBUS=FETCH2∨ADD1∨AND1PCBUS=FETCH1◆产生一个READ信号该信号从CPU输出,并要求存储器输出它读到的数据。READ=FETCH2∨ADD1∨AND1五、控制单元中用来产生这些控制信号的部分电路图6.2.8设计验证对每条指令的取指令、译码以及执行周期进行跟踪。1.考虑如下这段代码,它每条指令仅仅包含了一次。0:ADD41:AND52:INC3:JMP04:27H5:39H2.CPU遵循状态图并以合适的状态顺序取出、译码和执行每条指令:ADD4:FETCH1→FETCH2→FETCH3→ADD1→ADD2AND5:FETCH1→FETCH2→FETCH3→AND1→AND2INC:FETCH1→FETCH2→FETCH3→INC1JMP0:FETCH1→FETCH2→FETCH3→JMP13.对这段程序的一次循环的跟踪情况(所有寄存器的初始值都是0)指令状态有效信号所执行的操作下一个状态ADD4FETC