CPU的运算器其实就是进行固定的数据处理,后面讲的CPU主要侧重的是它的控制器功能
左右两边都是16位,因为寄存器可能位于左右两端的一边(源/目的操作数)
A、B两端都要接一堆线
通用寄存器 + ALU都在运算器当中
从主存来的数据直接放到暂存寄存器就OK了
需要等待信号稳定了再送入/送出ALU
采用这种大家都接入总线的方式,就使得A、B两端的接线大大减少了,只有32根数据线就好了
每个通用寄存器都有输入线和输出线,用以控制数据的流入/流出
指令的译码比取指令要快得多,因为它不需要访存是在CPU内部实现的,因此一个指令周期至少要由取指周期和执行周期2部分组成,一个指令周期又由多个时钟周期组成(参考CPU的主频),一个微操作对应的就是一个时钟周期
执行指令有可能需要访存也可能不访存
指令周期》机器周期(CPU周期)》时钟周期
间接寻址就是指针
使用触发器来保存当前CPU处于什么阶段!!!
这样使用统一的时钟部件,CPU知道自己处于指令执行的哪个阶段了,就会由于电信号1的作用去自动地做这个阶段应该做的事情
同理:我们的系统总线也通过总线控制器发出统一的时钟,这样各个设备就都知道自己当前处于什么阶段了(也就是说设备内部的电路可以选择执行相应的操作了),如果没有准备好相应的工作,就给总线控制器发送一个WAIT信号,这样CLK就会被锁存在上一个周期了,可以等你一会
指令流水线:在指令执行的不同阶段,所需要使用的部件(寄存器/内存等) 是不一样的,因此多条指令可以并行执行(把取指令、取有效地址、执行指令分开执行)
数据流向:主存《》寄存器 寄存器《》寄存器 ALU《》寄存器
图中所有的in和out控制信号都和微操作发生器有连线
采用单总线结构同时只允许2个部件之间进行数据交换
专用数据通路:在两个寄存器之间单独建立一个通路
PCin IRout这些信号都是由CU发出的
地址信息准备完成之后应当撤销刚刚的2个控制信号让总线空闲
PC+"1"可以单独设置一个加法器啊,这样不就是自动+"1"吗???
专用数据通路练习题:
2) (PC) -> MAR M(MAR) -> MDR MDR -> IR
专用数据通路意味着可能有多个输入/输出信号到达,所以需要使用多路选择器MUX或者三态门来控制放行哪一路信号(根据信号控制器的信号来决定)
一条微指令(T0)又有可能由一个/几个微命令组成,每发出一个微命令就执行一个微操作
如果控制单元EU采用硬布线方式来设计,这种控制器就叫做硬布线控制器
根据FE、IND、EX、INT来判断此时处于指令周期的哪个机器周期
节拍发生器其实就是一个循环,它从0数到N你这个机器周期就结束了,他也不知道是哪个机器周期也无须知道!!!
一旦你FE信号接通之后,CLK就开始打节拍,FE+T0就会控制电路执行第一个微操作
其实就和你做眼保健操一样的,广播先喊第几节,比如:第一节按揉耳垂眼穴,脚趾抓地,你就知道该做第一节了,然后它再喊12345678 22345678...每个节拍你就会执行这一节的相关动作了!!
PSW标志位等信息可能会影响到接下来的微操作序列的执行流
每条指令对应一段微程序,它由一系列微指令组成
操作控制:这条微指令对应哪几种微操作(比如:1->R 1->W PCout MDRin)
顺序控制:下一条微指令所在地址
顺序逻辑:指令不一定都是顺序执行的,如果有中断发生,微指令执行的顺序会发生变化
微指令是最小的执序行列,一次执行不能被打断,只有执行下一条微指令的时候才会检查中断
只有执行周期的微程序是不一样的
这里跟大家重点分析一下:一开始的取指周期不需要操作码参与,直接执行就完事了,然后执行完取指周期之后下地址是3但是送到顺序逻辑的时候,它会根据指令的寻址特征位的标志判断是否需要执行间址周期的微程序,同样地,执行完取指令周期之后如果不是间接寻址此时才会根据OP来确定这条执行周期的指令地址在哪里
一个微命令对应的是一条线的接通比如1 -> W MARin接通
因为有些微命令使用的寄存器等部件不同,可以同时执行,因此有时一条微指令可能对应多个微命令
注意看:这里的操作控制字段当中的每一位就代表了一个微操作(比如:PC -> MAR),可以并行发出操作命令
其实采用这种方式就彳亍
如何确定下地址?
注意看,这个男人...偶不,LDA等执行周期的最后一条微指令的下地址是0,这样回到取指周期之后执行相应的微操作(PC+"1")就可以顺利地去执行下一条指令了耶!!!
微指令:取指执行的小的那个,可能对应多个微操作
取指周期的第一条微指令由硬件自动给出,直到取指周期结束才会根据操作码来确定执行周期的指令流,其中每个微指令执行结束都会有一个节拍来形成下地址
考虑到有些时候每个指令周期所使用的硬件部件不相同,所以可以采用流水线的方式来执行每个指令周期的指令,从而让CPU充分忙碌起来
指令流水线方式:只有第一条指令消耗3t,剩余n-1个指令周期都消耗t
加速比:不使用流水线的T0/使用流水线的Tk
完成一个任务消耗k▲t,传统方式消耗:k▲t*n,指令流水线方式k▲t+(n-1)▲t(只有第一个周期需要k▲t,剩下的n-1个周期都只需要▲t)
导致流水线的各个阶段没有那么完美衔接的原因是什么呢?
所有指令都安排这5个机器周期,不管你有没有这个机器周期,每个阶段的耗时也取最长的耗时(这样画图的时候才能对齐嘛,这样不就可以根据时钟周期来填入不同的指令了吗???),多出来的那一点时间使用锁存器锁住,到达指定节拍(比如200)的时候统一释放
根据局部性原理,取指阶段的大部分指令都可以通过cache直接获取,当然如果cache不命中的话就必须去访问主存,这样指令流水线就会出现断流的情况
分成指令cache和数据cache的原因就是可以支持这两个操作并行地执行(使用不同的硬件部件)
imm是用来存立即数的,RISC执行阶段处理的数据都是来着通用寄存器/立即数
改变PC:jmp call 中断
写回阶段指的是修改通用寄存器里的值(RISC是这样的,都是用寄存器来保存运算结果)
一个CU多个ALU,指令的执行不是并行的,但是数据的处理是并行的
CU向多个执行部件发出相同的控制信号
在一个for循环当中对数组元素进行++:arr[i]++,可以把大的数组分成几块分别放到局部存储器当中,并使用不同的ALU来对他们进行++操作;使用显卡进行像素点的渲染亦是如此!!
共享一个物理地址空间
多核之间仅共享最低一级的cache
线程切换需要把寄存器的值存到内存当中,这是线程切换的主要开销,因此可以设计硬件多线程