计算机组成原理—中央处理器CPU

本文围绕CPU展开,介绍了其功能、架构、组成,包括运算器和控制器。详细阐述指令执行过程、数据通路,对比硬布线和微程序控制器设计。还讲解指令流水线,分析性能指标、影响因素及五段式流水线执行流程,助读者理解CPU高速运作原理。

计组真的太难了!

本章学习是整个计组噩梦,全程高能恶心,学完后我终于理解了CPU是如何运行的,在这里先简单的过一遍CPU执行流程,注意这个流程仅仅是针对于CPU在外部拿指令然后解释该条指令并执行的过程仅此而已,不会涉及操作系统的知识

  • 首先计算机一旦通电,我们的CPU师傅就开始忙了
  • CU控制单元发出取指令地址的信号
  • 指令地址到了CU门口,即IR寄存器
  • 将IR里面的OP操作码送进CU,此时必定会经历一次译码
  • CU控制单元收到译码器译码过来的指令,收到该指令后,因为一个指令会对应多个微操作,所以根据其他信号来执行组成该指令的微操作,即每一个微操作会向外发起一个信号,发到控制总线就各个部件就会进行微操作,比如该信号可以对两个寄存器开路,一个In数据一个Out数据,在整个总线中就会发现只有这两个之间可以传输数据,那就表示这个信号完成了一个微操作(一个指令可能包含多个微操作,所以往后的微操作也会因为这个CU发出的信号一起执行了,那这时候就完成了该指令)
  • 完成该指令后,CU会自动向外发送一个取下一条指令地址的,所以我们CPU会不停不停地执行指令,即使没有指令了,设计者们也不会让CPU闲下来,他们设计了一个NOP操作等等,用来让CPU处于运作状态,即CU会不停的工作,但是不是向外发出控制信号。
    提前注明:CU是控制单元,和CPU不一样,CU存在CPU里面。

CPU的功能与架构

CPU的组成

下面会给出王道视频里面给出的CPU大致样子,讲道理画的确实很好,但是一般初学者都看不懂,因为我们不知道里面具体是干嘛的,怎么互相配合运行,下面会以我最喜欢的提出问题方式记笔记。

在这里插入图片描述
上图中主要要求你学习的就是三个东西,要知道运算器和控制器的作用,然后整个取数存数是如何进行,但是我要简略讲一下所有部件是干嘛的,我最讨厌卖关子,很多视频都这样,给你甩一个知识点后又不告诉你这干嘛的,这是最恶心的。

  • 运算器: 在CU控制器发出信号后,假设该指令会发生一些计算,就会送到运算器中进行运算,总而言之如果指令设计运算就给他,有的指令没有运算就不会来到这里。
  • 控制器: CPU里面最难学最重要的一个部件,该部件是指令能否正确执行的关键,因为指令在译码后送进CU,CU会将收到的指令在CU内部进行一系列操作然后最后发出一个信号到控制总线,然后就会导通里面的out和in的路线,寄存器就会传输数据了。
  • MAR: 地址寄存器,这里会存放PC送过来的地址,然后我们使用这个地址往存储器里面取数据或者指令,那么我们取完数据或者指令后放到哪里呢?
    MDR: 数据寄存器,解决上面的问题就是将取到的东西放到MDR中,等待下一个CU控制信号发出才知道该MDR要送往CPU里面哪个地方。
  • IR: IR就是存放指令地址的,我们的学习指令系统的时候就有学指令长啥样,总之他肯定包含一个OP操作码,我们CPU基本上就是用这个OP操作码确定我们要执行什么操作。
  • PC:程序计数器,就是用来指明你要执行的指令地址,由于每次执行之前都要进行一次取指操作,(因此在后面介绍指令流程设计的时候会围绕这个固定的操作对CPU进行优化,这里可以不用先理解),PC里面存的是指令地址,他会在CU发起取指信号的时候往MAR地址寄存器里面传输过去,记住这个就行。
  • 下面三个寄存器我们计组只需要记住他是操作数就行,不建议还记住他用来存哪些特定的数据
    - ACC: 存放操作数
    - MQ: 存放操作数
    - X: 存放操作数

ALU放在了运算器中进行解释,因为他是运算器内部结构的重要部件。

运算器

  • ALU: 这家伙就是用来计算的,ALU里面有很多组合电路,常用的计算机必备计算功能都会被集成在里面,所以有很多组合电路,一开始学的时候一定要记住他这个东西是很牛的,不要很所以当然的觉得就是用来计算,好像没啥,里面的学问多的很,但是唯一要记住的是ALU可以通过CU发出的不同控制信号在ALU里面选择一个组合电路进行计算,也就是加法指令要选加法的电路进行,减法要选实现减法的电路。
    那么问题来了,我们的数据是怎么送进去的?
    答:一种是ALU直接与多个寄存器连线,优点是快速,但是缺点是我们寄存器一旦多起来了,路线会很多。
    问题再次出现,我们这么多寄存器怎么知道我们要用哪一个?
    答:有两种办法,如下图所示,使用多路选择器,可以用控制信号发出的信号来选择对应的运算,另一种是使用三态门,这里依旧是使用控制信号给出的来进行选择对应的运算操作。这两种是没啥区别的,功能上都是实现了控制选择运算操作,优点都是不会数据冲突,缺点是设计复杂,不仅路线多,刚刚也说到要根据控制信号来选择,这么多线要实现控制也不容易啊,本身ALU就很多组合电路了。
    在这里插入图片描述
    这里应该还有一个问题就是我们的在将数据送入ALU之前,需要同时将两个操作数送入,很明显我们使用寄存器直连的方式不存在不同时送进去的问题,因为上面的结构中,每一个寄存器都直接与ALU连接着,我们在导通路线之前肯定已经将数据送入了寄存器中才会收到对应的控制信号进行导通路线。既然说这个是一个问题的提出,那下面的这种总线结构会出现这个问题。

下面这张图的这种总线结构,在控制信号发出后,ALU路线打开in,寄存器路线打开out,就可以将数据送入ALU,但是!但是! 我们的总线传输数据的时候只能够有一个in和一个out路线,不能有多个in或者out,因为我们总线里面传输数据只能传一个数据,不能同时存在多个,这样我们想想,你真的非得实现这种的话,你又要筛选哪种数据对应哪个路线的,又要对数据进行隔离不可以让他们串味了,想想的话这样搞就更恶心了,所以我们总线只能够传输一种数据,回到问题根本,我们数据总线只能传送一个数据,但是我们ALU需要同时传入两个数据才能运算,这时候使用这种总线结构就做不到同时传输两个数据到ALU中,那怎么办?
在这里插入图片描述
答:其实这里很容易想到,就是使用缓冲,学习了存储器系统后这里应该很快就想到办法了,我们使用一个暂存寄存器,先让一个数据存入到暂存寄存器中,等到下一个数据送来另一端的时候,我们同时将暂存寄存器里面的数据也一并送进去即可。


这里再穿插一个问题:由于我们刚刚提到总线只允许传输一个数据,那我们ALU运算完后想也不想就往数据总线里面放就会随时造成冲突,因为我们想都不想总线里面有没有东西现在正在传输就扔过去肯定不行的。
答:我们再设置一个暂存寄存器,我们不要立刻将数据抛到总线上先,我们先探测一下该数据总线有没有东西现在正在传输,没有的时候再打开要存放的寄存器的in路线,打开ALU的out路线,这样就完成了一次愉快的数据传输,具体怎么探测就不用管了,再深究就是往设计CPU硬件发展了,我点到为止即可。

  • 从取指操作开始执行流程过一遍:
    CU发起取指信号->PC存入MAR->在存储器中拿出指令->取出的指令数据存入MDR中->MDR中的指令数据被送到IR寄存器中随时准备送入CU控制器处理->指令进入CU控制器后进行一系列操作知道了你这条指令要干嘛(这里是关键,下面我们就是围绕CU这个阶段要干嘛进行学习),然后发起对应的操作信号,发送到控制总线中,然后选择正确的寄存器进行导通,就可以进行数据传输->接下来就是根据CU发出的信号,信号控制下进行数据之间的传输或者计算或者存取数据等等,CPU如此循环往复执行这些操作。

总结:计算机中常用的是总线结构,所以这里只是通过直连寄存器引出总线结构传输的运算器。

控制器


下图也是从王道视频里面截图来的,但是缺少了一个控制总线,不然就完美了,在下面解释中要时刻记住所有信号的发出都是通过CU发信号到控制总线然后通过控制总线来导通对应的寄存器进行传输数据。
在这里插入图片描述
其实流程已经在运算器里面说了一遍了,说到底还是CU扮演者最重要的指挥者角色。下面再根据细节过一遍流程
::::
通电后,CPU开始运行,CU控制单元首先发出一个取指令地址信号
(执行指令之前拿到指令地址取出来,这是必不可少的)

收到信号后,控制总线将打开:PC程序计数器的out线,打开MAR的in线,通过CPU内部总线将PC里面存着的指令地址放到MAR中

MAR拿到指令地址后,CU这时候会知道继续发起信号,将MAR的out线打开,MDR的in线打开,其实就是将MAR存的指令地址,在存储器中通过该地址找到存放的指令(指令的样子或者说指令存储的结构位数等等都是在指令系统讲过了,这里不说明,直到我们通过地址找到指令数据就行),然后将该指令数据存放在MDR中

MDR拿到真正的指令数据后,CU这时候会知道继续发起信号,将MDR的out线打开,IR的in线打开,这里就是要把MDR的指令数据送进IR寄存器,因为我们最终是要把指令送进CU里面,但是送进CU只有一条路,那就是经过IR(目前这么理解就可以,后面解释CU这个大部件的时候会再次解释为何要放一个IR寄存器)

IR拿到指令数据后,在指令系统中我们学到这条指令前部分是OP,即指令操作码,用来标识这条指令是干嘛的,后半部分就是操作数的地址码,还可能有寻址方式等。回到正题,我们需要的是将OP操作码部分送入CU控制单元,然后CU拿到OP后就知道要发出什么控制信号了

假设我们是一个取数指令操作,将操作数存到R寄存器中(R是我假设的,不要纠结)

CU拿到OP后发送控制信号,将IR中的地址码部分送到MAR中,也就是:打开IR的out线,打开MAR的in线,这就完成了将IR中的地址码部分送过去给MAR(我们这里假设不采用间接寻址,而是直接寻址)

CU这时候知道继续发送控制信号,将MAR的out线打开,将MDR的in线打开,这时候我们使用MAR地址找到了对应的操作数,将其放到MDR中

MDR拿到操作数数据后,CU已经有了OP操作码,所以接下来会知道根据这条指令操作码要做什么,也就是说CU知道接下来要将数据传到哪里,这时候CU发出控制信号,将MDR的out线打开,将R寄存器的in线打开,即将MDR拿到的数据存放到R寄存器中

这样就完成了一个指令的操作

其实还没有完,再细节一点的话,这时候CU应该是再发起信号将PC程序计数器里面的地址去继续取出下一条指令然后存在IR中(具体解释就是:我们CU有两种设计硬布线和微程序,不管是哪种设计都会是每一条指令在执行之前先找到该指令,叫做取指阶段,我们这个阶段是必须要做的,由于每一个指令内,可以分为多个操作,我们将一个数字取出来存好,也要经历取地址取操作数存操作数等等,那我们将这些细分后,既可以类比成一个循环,我们在指令最后一个微小操作执行完后,我们接下来要干什么?是不是要进行下一条指令,那下一条指令执行前要干嘛?是不是要取指令地址?那这样的话也就是说执行完最后一步后会自动转到取指令地址操作,就加入一条指令有10个微操作,其中0往后肯定是取指操作,当我们执行到最后一条操作的时候,10%10=0,那0是不是取指?那是不是就解释了为什么我们为什么说其实再细节一点的话应该是结束指令后会进行取地址的操作,OK至此终于解释完毕)



事实上在这里应该有人会有一个疑问,我们一直说总线总线的,难到我地址和数据都往一条总线传吗,当然不是,我们会区分数据总线,控制总线,地址总线,每一个总线只能够传输一种类型的数据。


下面是将运算器与控制器拼一起的图,可以看到是通过CPU内部总线进行通讯的。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

竹等寒

谢过道友支持,在下就却之不恭了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值