CPU结构
(一)CPU的功能
想了解CPU的结构,首先要知道CPU的功能。然后讨论什么样的结构能够为CPU提供相应的功能。CPU由运算器和控制器组成。
1、控制器的功能
取指令,把指令从内存单元中取出
分析指令,对指令的操作码部分进行阶码,分析这条指令要完成什么功能,是指令集中哪一条指令
执行指令,CPU的控制器发出各种操作命令,由这些操作命令控制相应的部件去完成指令要求的操作,这些操作命令具有一定的先后顺序。如,要完成一个内存操作数和寄存器中数据的加法运算,首先要内存操作数从内存中取出,送入到CPU,然后完成加法操作,再把加法的结果保存在指定的寄存器中。
控制程序的输入和结果的输出。
总线的管理,对总线的控制权和使用权进行管理。
处理异常情况和特殊请求。
2、运算器的功能
实现算术运算和逻辑运算。
对上面的功能进行归纳,CPU要具备以下功能:
指令控制,操作控制,时间控制,处理中断,数据加工。
(二)CPU结构框图
首先CPU通过总线和计算机的其他部分进行通信,这些总线包括了控制总线,数据总线,地址总线。
控制总线:双向的,由CPU向各个部件发出的控制命令,方向是向外的。外部设备向CPU提出的请求,以及外部设备的状态可以通过控制总线向内告知CPU。
数据总线:双向的,CPU向外部设备或者是存储器写入数据,另外CPU还可以从外部设备,内存读入数据
地址线:单向的,都是由CPU发出,送给内存或者是外部设备的接口。
下面通过前面分析的CPU的功能来分析图中CPU的结构。
指令控制功能:把指令从内存单元中取出,需要的硬件包括PC寄存器和IR寄存器,PC寄存器指出了指令的地址。IR是指令寄存器,从内存单元中取出来的指令被放入到CPU中的IR寄存器中。所以从指令控制角度看,CPU需要有寄存器。
操作控制和时间控制:这两部分控制,需要控制单元,由控制单元对指令进行译码,译码之后,在给定的时刻给出给定的操作命令。这个由CU来做。
数据加工:我们需要ALU,由ALU完成数据的算术运算和逻辑运,当然运算过程中需要寄存器,运算的操作数和运算的结果都保存在寄存器中。
处理中断:需要中断系统的支持。
实际上,处理上图中给定的结构,还有其他的辅助电路,以及各个部分之间进行连接的互联机构。
(三)CPU的寄存器
1、用户可见的寄存器
(1) 通用寄存器:可用于存放操作数,也可以作为某种寻址方式的专用寄存器。
(2) 数据寄存器:存放操作数,满足各种数据类型的要求,如保存整数的寄存器和保存浮点数的寄存器。两个寄存器拼接存放双倍字长数据。
(3) 地址寄存器:存放地址,其尾数应当满足最大的地址范围。用于特殊的寻址方式,段基址,栈指针。
(4) 条件码寄存器:存放条件码,作为程序分支的依据。
2、用户不可见的寄存器
如:在流水线结构的计算机中,流水段之间的流水段寄存器都是用户不可见的。
3、控制和状态寄存器
(1)控制寄存器:如,要从计算机的内从中取出一条指令,PC把地址送给MAR,MAR把地址传送给主存储器,并且控制单元发出读命令,读出的指令放入MDR中,MDR指令将指令放入IR中:
这个过程中涉及到了四个寄存器。这些寄存器都是用于控制CPU操作的,所以都属于控制寄存器。其中MAR, MDR, IR是用户不可见的,PC是用户可见的。
所谓用户是否可见指的是用户在编写程序过程中是否可以读取操作这些寄存器的值。
(2)状态寄存器:反应指令执行结果的情况或者是计算机软件,硬件的状态。状态寄存器和前面讲的条件码寄存器是类似的,可以用于存放条件码。
(3)PSW寄存器,他是程序状态字的缩写,用于存放程序状态字的。所谓程序状态字,就是在中断或者是子程序调用过程中,为了能够让程序能够正确的返回断点,返回断点之后还能够接着执行给定的程序,在中断或者是转子程序之前,就要保存程序的运行现场和程序的断点。这些运行现场和断点,包括了程序运行的软件信息和硬件信息,这些信息时保存在寄存中的,有些表示程序运行状态的寄存器可以通过指令集中的指令进行读或者是写,但是有的不能通过指令集中的指令进行读或者写,因为涉及到的状态比较多,如果为每一个状态都设计一条指令进行读的话,指令集将会非常庞大,为了完成程序现场和程序断点的保存,计算机的设计者就把这些软硬件相关的寄存器集合成一个大的寄存器,这个寄存器就是程序状态字寄存器,程序状态字的长度比较长,有些程序状态字可以达到几千位。但是我们可以利用交换程序状态字的方式来完成程序现场切换,这使得程序中断过程中保存程序状态,断点,以及返回之后恢复断点的工作变得比较容易。
(四)控制单元CU和中断系统
1、 CU:产生全部指令执行时候所需要的操作命令序列,任何一条指令要在CPU上执行,CPU要对指令进行译码,根据他是什么样的指令或者要求完成什么功能,要产生完成这些功能所需要的微操作命令序列。不仅仅是要产生这些操作命令,而且要保证这些操作命令之间的先后顺序。
CU的设计方法有两种:
组合逻辑设计:硬连线逻辑实现。这种方式速度快,如精简指令集计算机他的控制器实现实现都是采用硬连线逻辑。
微程序设计:这种方式设计简单,适用于复杂功能的指令的设计,采用存储逻辑进行设计。
2、 中断系统,这个将在后面进行讲解
(五)ALU
在计算机中数的表示中有详细的介绍。
指令周期
(一)指令周期
从取出一条指令开始,一直到这条指令执行结束所需要的全部时间。
完成一条指令需要把指令从内存中取出,放入到CPU的IR寄存器,需要对指令的操作码进行分析,需要对指令寻址方式进行分析,接着就是执行指令,执行指令包括了完成指令要求的全部运算。具体划分如下:
上面这种将指令完成周期分为取值周期和执行周期,这种划分方式只是这里方便讲解的划分,对于不同的CPU,不同的指令集,不同的设计方法可以把完成一条指令分成不同的阶段。按照上面的划分方式,得到:
1、每条指令的指令周期不同
即使在同一个CPU中,不同的指令,指令周期的长度,或者指令周期中包含的机器周期个数也可能是不一样的,如:
(1) 只包括取指周期,不包括执行周期的指令,如 NOP指令表示空操作,计算机系统不需要做任何操作。
(2) 包括了取值周期和执行周期,并且取值周期和执行周期时间长度是相同的。如 ADD mem指令,这条指令表示的是从mem内存单元取出一个操作数和ACC寄存器中的数据做加法,结果保存在ACC中。取值需要访问内存将指令取出,执行也需要访问内存将操作数取出。这两个周期基本相同,因为在执行过程中,访存用时最长。
(3) 包括了取指周期和执行周期,取指周期和执行周期长度不同。如MUL men,把ACC中的内容和内存中的内容做乘法操作,结果保存在寄存器中。乘法执行周期长度较长。
2、具有间址寻址的执行周期
指令集中支持多种类型的寻址方式,特别是间址寻址方式,在寻找操作数地址过程中,也需要访问内存,在执行结果,如果我们把去操作数和执行都放入到执行周期,那么在执行周期需要多次访问,首先要取出操作地址,再次取操作数,这就导致执行周期比较长,所以在执行周期中专门添加一个间址周期。那这条指令解释周期分为三个阶段:
3、具有中断周期的指令周期
如果机器是支持中断的,那么在指令周期执行周期结束的时候,就要确认是否有中断请求,如果有中断请求,我们需要去响应中断,相应中断的过程要保存断点,要形成中断服务程序的入口地址,要关闭中断,这些操作都需要在中断周期中完成。这样一条指令完整的指令周期如下:
4、指令周期流程
5、CPU工作周期的标志
指令周期不同阶段,控制器需要做不同的操作。因此,控制器在指令周期的不同阶段需要发出不同的命令,控制器也需要知道当前处于指令周期的哪一个阶段,即使是对同一个部件进行操作,在执行周期的不同的阶段,这些操作也是不同的。
CPU访存的四种性质,如下图:
取指令:要将指令送入IR中
取地址:要将这个地址送入IR地址码部分,或者是MDR的地址码部分
取操作数:放入到CPU寄存器中
存断点:将断点信息存入内存。
尽管上面的操作都是对内存进行操作,但是在不同的指令周期要完成的操作是不一样的。为了对控制单元进行设计,我们必须要标识出当前处于指令执行的那个阶段,以便于控制器发出相应的控制操作。把数据传送到不同的位置。这些标志就是CPU工作周期的标志,我们采用触发器进行各个周期的标识: