首页 > 编程知识 正文

计算机的硬件系统由控制器、运算器,计算机控制系统中的控制器是用什么实现的

时间:2023-05-06 06:18:19 阅读:245218 作者:4329

控制器部分的内容算是让我对处理器有了更深一步的理解学到汇编其实还是有些抽象,为什么机器指令就可以直接被机器识别并执行呢?这才知道,机器指令之下还有微程序,细究起来最不可分的操作应当是微指令,多条微指令实现了一个指令的功能进一步把指令细分为很多阶段(称为周期,如取指周期、执行周期等)的话,那在微指令和指令层次之间,还有一个指令的分段的中间层次,即多条微指令实现指令的某个阶段(如取指、读取等等)的功能,指令的多个阶段的功能就组成了这条指令的功能,多条指令又组成了程序来运行一条微指令作为最基本的机器动作,按我理解就是,一条微指令就指明了哪些部件在这一步需要工作,哪些不需要工作。需要工作的就给“通上电”,不需要的就“断开”,部件通上了电也就会自己运行起来,电流就流通起来,像门电路这种就实现各种逻辑,最终完成一条微指令的操作
比如取指周期的安排 节拍动作C1MAR <- (PC), R <- 1C2MDR <- M(MAR)C3PC <- (PC)+1C4IR <- (MDR), CU <-OP(IR) 节拍是时序的控制信号,所有的动作都在时序的严格控制下
C1节拍,PC的内容也就是下一条指令的地址送入MAR中,并置读信号为1有效C2节拍按照MAR的地址指示从主存中读取数据到MDR中,读取的是一条指令C3节拍PC自加1,指向下一条指令C4节拍讲MDR的指令送入IR指令寄存器,并将IR指令的操作码部分送入CU控制器准备译码每一个“MAR <- (PC)”的小动作就由一个微指令来完成,只涉及少数几个部件。都是通过电信号来控制,那么按我的猜想,给PC的输出打开,给MAR的输入打开,电流自然流通,PC的内容也就传送到MAR中去了。不知道对不对,反正有电路控制下都可以实现。 组成与功能 处理器的工作就是在控制器CU的指挥下,按照“取指令 - 分析指令 - 根据寻址方式计算操作数地址- 取源操作数 - 处理源操作数 - 写目的操作数”的顺序,周而复始地解释指令。CU的功能就是,对指令进行分析(译码),按照一定时序,根据当前处理器状态,向计算机的各个部件发出控制信号/命令

时序系统 操作有序的基础,即在时序的控制下。

简单来讲就是规定时间间隔,每个时间段内完成能完成的任务,完不成就分配两个时间段等等,但时间总是时间段的整数倍。

指令周期:处理器从主存取出一条指令并执行完该指令所需的时间

然而不同指令所需的时间不同,且同一指令的时间也受环境的影响,为了简化控制,一般都设计成节拍的某个整数倍——基准周期基准周期称为机器周期或CPU周期,其长短取决于指令的基本操作和期间的工作速度对于单周期处理器,所有指令的指令周期都是相同的,都等于一个机器周期。
为了保证适配所有的指令,所以指令周期就要选取最复杂指令所用的时间多周期处理器,把一条指令的周期分为好几个部分来细化,最简单的两周期就分为“取指周期”和“执行周期”
多个周期之间总得有个基准,这个基准就是机器周期 为了保证一个机器周期内至少可以完成一个指令的基本操作(细化后的一个部分),一般选取花费时间较长的一次访存的时间(访存依赖于总线,所以一次访存的时间也叫总线周期)一个标准的、同步总线的总线周期为4个节拍 三级时序 节拍
时钟脉冲,由一个频率相当精确和稳定的脉冲信号发生器按一定电压幅度,一定时间间隔连续发出的脉冲信号。其频率在CPU设计的时候就确定下来,作为最基础的时序控制。机器周期
CPU的基准时间,设计的长度可以保证至少能完成一个指令的基本操作,简化了控制。设计成节拍的某个整数倍一个标准的、同步总线的机器周期为4个节拍

指令周期

一条指令执行所需要的时间 分为单周期处理器和多周期处理器
单周期:所有指令的指令周期一样长。既然一样长就干脆设置成为一个机器周期的长度好了,更简化了控制。只不过这个时候机器周期是不是一般而言的4个节拍,那就不好说了。万一某条指令非常复杂需要的时间超过了4个节拍呢?那就得机器周期了呗,至少得大于等于最复杂指令的执行时间吧。多周期:指令被分为好几个部分执行,每个部分需要的时间规定为一个机器周期,这样机器周期才是设计为保证至少完成一个基本操作。指令周期的例子

三级时序系统

即最底层的节拍、节拍之上作为基准的基准周期(也叫机器周期,一般设置和总线周期相同,但和总线周期不是一个概念)、再在这个基准之上在组间我们的指令周期

控制方式 一般都是多周期处理器。单周期虽然设计简单,但太浪费了。好好的CPU时间大部分都闲着但是多周期的话,就要考虑不同的指令其指令周期必然不同,而对指令划分的每个部分,其也不一定会相同
虽然我们用一次访存的时间来作为机器周期,目的是为了保证在一个机器周期内能完成一个基本操作,比如取指、间址、执行、中断查询这四个部分的话,就要保证一个机器周期内能完成一个部分的操作但是对于复杂的运算,比如乘法、除法,其执行周期很可能就大于一次访存的时间,也就是在一个机器周期内完成不了执行周期所需的完成的操作这就尴尬了所以我们需要控制
同步控制:和单周期处理器的思想差不多,既然把指令划分了,那就以最长的一个部分的操作时间作为基准
假设乘除最长且需要在两个机器周期内完成,那么对于取指、间址等其他部分,也分配两个机器周期的时间但是对于大部分的操作,两个机器周期太长了,这就会导致CPU经常处于空闲的状态。浪费浪费作为一种在同步控制之下的弥补手段,人们又设计了不等长的机器周期。简单的操作就采用3个节拍的机器周期,复杂的操作采用5个节拍的机器周期。不过在此之上由需要一层控制在分配机器周期异步控制
即采用“握手/应答”的方式来确定机器周期的长短。当进入一个机器周期的时候,将相应的某个“指令执行阶段标志”置为1,当最后一个微操作结束的时候,向控制器发出一个信号,控制器再发出一个信号来将“指令执行阶段标志”置为0。这样才算一个机器周期结束如此一来机器周期的长短也无法实现规定联合控制
两种办法相结合呗比如在部件(如ALU)的内部采用同步,部件之间采用异步在比如,固定机器周期的长度,但是根据指令复杂度的不同,每个指令分配的机器周期的数量也不等。这属于联合控制,异步中有同步(机器周期固定长度),同步中有异步(不同指令周期有不同数量的机器周期) 硬布线与微程序 终于到了微指令的部分了。说,一条指令被控制器翻译成多条微指令(亦称微操作,不过微指令的“指令”层面的概念尤其对应微程序,因为硬布线实在牵扯不到“指令”层面上),而一条指令本身又是可划分的,可以被划分为多个部分,那么每个部分同样对应着多条微指令 硬布线

原理

把每个微操作所对应的需要用到的部件、信号都用逻辑电路连接起来,等合适的信号来了就自动启动了对应了部件(通上电…开关打开…之类的)…

比如对于取指周期,一般给安排一个机器周期的时间就够用,通常的机器周期是4个节拍,也就是4个节拍要完成取指这个操作

节拍动作C1MAR <- (PC), R <- 1C2MDR <- M(MAR)C3PC <- (PC)+1C4IR <- (MDR), CU <-OP(IR) 对于每个微操作,列出其所在的指令的哪个周期、哪个节拍、哪些指令需要用到 周期节拍微指令SHLLDAMSTAMJMP XJZ XADD MCOMFEC1MAR <- (PC)1111111FEC1R <- 11111111FEC2MDR <- M(MAR)1111111FEC3PC <- (PC)+11111111FEC4IR <- (MDR)1111111FEC4CU <- OP(IR)1111111EXEC1MAR <-AD(IR)0100010…………………………EXEC2MDR <- M(MAR)0100010………………………… 太长我就不写了以“MDR<-M(MAR)”为例,也就是一次读取主存内容的微操作
从表格可以看出,在取指周期FE的C2节拍安排了这个微操作,在执行周期EXE的C2节拍也有这个操作因为取指周期必然的(所有的指令都用到了),就是说只要到了取指周期的C2节拍,那么这个微操作就必然要启动执行执行周期不一样,有些指令需要从主存取数、而有些指令则不需要,但只要需要,就安排在了C2节拍里。也就是说,到了执行周期的C2节拍,如果是需要从主存取数的指令,那么这个微操作也会被启动执行所以对于所有的微操作,都是提前安排好了,你你你在哪个周期哪个节拍,他又在哪个周期的哪个节拍,从指令转换成微操作序列,也需要符合这个表格所规定的微操作的先后顺序
只不过这里使用最简单的两周期来举例在设计组合电路之前,还要写出微操作所对应的逻辑表达式
如“MDR<-M(MAR)”FE · C2 · (SHL + LDA M + STA M + JMP X + JZ X + COM) + EXE · C2 · (LDA M) = FE · C2 + EXE · C2 · (LDA M) = C2 · [ FE + EXE · ( LDA M ) ]注:逻辑加和逻辑乘

FE、C2均是当前的状态信号,现在是哪个周期、哪个节拍对于LDA M信号,那自然就是ID指令译码器所要发出的信号了,就是判断当前的指令是哪条指令这个时候的输出还只是我要启动“MDR<-M(MAR)”这个微操作,相当于把当前指令根据时序翻译成了微操作序列然后这条输出就对应到了相应的控制信号,同样也是通过逻辑电路来对应的。

按我的理(猜)解(想),每个微操作对应多个部件,那么要实现这个微操作就需要对每个对应的部件就要发出一个控制信号,这个控制信号被称为微命令。差不多是很底层的命令了。不过应该还可以被相应的部件继续翻译(应该是吧),比如发给ALU的信号就是要告诉它进行什么运算,是加还是减还是移位等等,ALU收到信号翻译后听懂了就进行相应的动作。

从百度百科盗图一张

微程序 原理
既然每条微指令需要发出的控制信号都是相同的,那么就存储下来,用到的时候直接拿出来用不就可以了嘛。机智!相比于硬布线,其硬件的复杂度大大降低了,只不过还需要从存微指令的地方取出来,所以花费的时间肯定要比直接采用逻辑电路的硬布线要慢对于RISC还是采取硬布线的方式比较合算,因为RISC本身的指令就不多,硬件复杂度也不会高到哪去历史
其实早在1951年这个想法就被英国剑桥大学的计算机教授Wilkes提出来了,所以“微程序控制”也被称为“Wilkes模型”然而,当时的存储器太慢太慢了,,,,,,,,,,,,设计
同样是先根据周期、节拍来规定好每个微指令在何时才能执行把微指令编制成微程序把所有的微程序存入控制器内部的一个ROM——控制存储器CM(Control Memory,简称控存)机器运行的时候,控制器根据当前指令、状态(节拍)取出对应的微指令,按照规定好的节拍一条一条送入控存数据寄存器CMDR由CMDR发出微命令(即控制信号)来通知相应的部件开始干活

微程序控制器组成
原本控制器的IR、PC依旧保存,其余的见上图微地址形成逻辑代替了实现了指令译码器的功能微指令寄存器存放当前的微指令控制存储器存储所有的微指令,以微程序的形式微指令地址寄存器(uAR)存放微指令的地址,也称为CMAR微程序和微指令
微程序
通常微程序可以完成一个基础操作,比如取指操作可以编制成一个微程序。而想这种公共操作可以只存储一份,基本上就是取指、间址、中断判断这三个公共的部分对于其他每个指令,其执行部分的微指令必然是不同的,每条指令就需要对应一个执行部分的微程序一般来说,N条指令,就需要编制N+3个微程序微指令
由“操作控制字段”和“顺序控制字段”组成“操作控制字段”记录着所需要发出的微命令,因为是提前编制好的,这些微命令就可以完成这条微指令的操作“顺序控制字段”用来确定下一条微指令的地址,如果当前的微程序没有执行完,一般就是顺序加1指向下一条微指令。如果执行完了,则相当于告诉微地址形成逻辑,我当前的微程序执行完了,应该选择下一个微程序执行了。一般是通过设置相应的标志位。于是就根据当前的指令操作码、时序来确定下一个微程序是哪个。取指的微程序执行完了,如果当前指令需要间址则跳到间址的微程序,不需要就直接跳到当前指令的执行部分的微程序

细说微指令
操作控制字段:记录要发出的控制信号,有不同的编码方式
直接表示法
每一位对应一个控制信号,如果该位为1则表示要发出这个控制信号,为0不发出但是控制信号太他妈多了啊。轻轻松松上百个。一条指令都舍不得占几位,一个微指令就要占几百位。No Way!编码表示法
所以就编码表示了呗但是只有互斥(不能同时发出)的控制信号才可以被编码有编码自然也有译码 字段直接编码 字段间接编码顺序控制字段
也叫“下地址” 并不是所有时候都需要用到该微指令的下地址
开机后,第一条微指令的地址由专门的电路生成某条指令的最后一条微指令结束,那么下一条必然为取指周期的微程序,也有专门的电路生成 一般由取指周期微程序的最后一条微指令来置“间址标志IND”为1,表示下一步要进入该指令的间址周期,由于间址是公共操作,所以也有专门的电路生成若有条微指令置了“执行标志EXE”为1,表示要进入执行周期,则下地址由微地址形成逻辑根据指令操作码形成。由于存储在CM的微程序的位置都是固定的,可以在另外设置一个ROM来存储每个微程序的首地址,并且每个指令操作码对应的微程序首地址在该ROM存储的地址为这个指令操作码,就是说直接把指令操作码(是一个二进制编码)当作地址(所有的指令操作码均不相同)去访问该ROM就可以快速得到这个指令操作码所对应微程序在CM中的地址~给出下地址的方法
直接给出:当前为A,下地址通常为B,除非当前微程序执行结束,则无条件转移到B。如执行结束必然要进入中断,则可以直接给出 增量计数:将uAR赋予自动加1的特点,这样可以满足所有的顺序微指令,对于分支/跳转,就需要改进顺序控制字段,分为“转移控制字段BCF”和“转移地址字段BAF”,若条件满足则直接用BAF来改写uAR 断定法:顺序控制字段分为“非测试字段”和“测试字段”
“非测试字段”直接构成下地址的高位 “测试字段”和“非测试字段”以及状态(时序等)、指令操作码等等送入“测试网络”来生成下地址的地位 这样就支持多路转移,转移的路数由“测试字段”的位数决定(n位则有2^n路) 这周应校选课要求,读了一本书叫《世界是平的》,虽然已出版很久了,不过仍然值得一读。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。