16 控制器

图片来源:南京大学软件学院COA课程PPT

©author:zzb

16 控制器

image-20211220141451495

image-20211220141603472

左边的图中粗的箭头表示控制信息,细的箭头表示数据的流动

寄存器分类

image-20211220141923575

两种的划分并不严格,有些寄存器具有两种特点

用户可见寄存器

image-20211220142121884

条件码寄存器不是必须的,有些机器没有条件码寄存器

image-20211220142440645

太多的寄存器不能显著减少存储器的访问:指的是当寄存器的数量多于一定数目时,对存储器访问的减少作用很小了,但带来了成本的上升,因此是不值得的

image-20211220142816292

子程序的调用会自动保存用户可见寄存器,这样子程序运行时就可以随意使用用户可见寄存器,而不用担心会对调用者的数据产生影响(即可以理解是如call指令包括了对寄存器保存的指令

但在子程序调用之外,想要保存相关的寄存器内容,就是程序员的任务了,需要编写相关的指令去保存(汇编)

控制和状态寄存器

image-20211220143225326

从主存中读出的数据先到MBR,再通过MBR到通用寄存器

ALU可以对MBR和用户可见寄存器直接存取

image-20211220143400782

image-20211220143441675

image-20211220143456971

控制信息并不全部都是存放在寄存器中的,有相当一部分的控制信息是存放在主存中的,这样可以平衡成本(寄存器越多越贵)和速度(寄存器速度更快)

微操作

关于微操作的出现:CISC和RISC:为什么手机芯片都是ARM?

image-20211220144658432

image-20211220144733549

涉及CPU寄存器操作的更小步骤,称为微操作

取指周期

image-20211220144902430

第二步从主存中取指令的过程中也同时进行了PC+1(1是指一条指令的长度)的操作

上面的t表示一个时间单位,即微操作要表示出**做什么、发生在哪个时间单位**两个内容

image-20211220145504299

如上,PC+1的操作放到t2和放到t3均可以

微操作分组的原则

image-20211220145554405

  • 事件的顺序必须是恰当的

  • 同一时间段内的微操作必须是无关的,可以同时进行的,即谁先谁后都一样,如上面的PC+1

  • 满足前两条的情况下,要让所用时间单位尽可能少,如上面的IR<—(MBR)不能放到第四个时间单位t4,因为这样所花费的时间更多了,事实上3个时间单位就能完成

间址周期

image-20211220150048983

注意:这里通过间接地址取回来的有效地址EA是用于修改指令寄存器中指令的里面的地址的,而不是直接放到MAR中,这样可以保证与不使用间址周期的状态一致,从而为执行周期做好准备,执行周期直接使用指令中的地址就可以得到正确的操作数,保证了兼容性

执行周期

image-20211220150843375

BSA指令中:t1中把要保存PC的地址送到MAR,把PC的内容送到MBR,从而可以把MBR中的内容保存在MAR所存的地址中去。同时这两个微操作是不冲突的,因此放到一个时间单位中执行

中断周期

image-20211220151555675

两个时间单位即可完成

指令周期代码(ICC)

对于整个的指令、多条指令如何将不同的微操作联系起来?

通过ICC来实现

image-20211220152020014

image-20211220152327430

image-20211220152400973

image-20211220152432604

image-20211220152512047

CPU内部总线

image-20211220152617231

上面右图中的空心圆就表示门,由控制信号来决定这些门的开关

这里的例子是一个加法指令,其中数据要先存放到一个Y寄存器中,Y寄存器起到暂存数据的作用,Y与ALU直接连接

注意:

  • 总线上一次只能有一个数据,否则会出错,因此不能说把上图中红色和绿色的实心箭头的门都打开,两个数据一起到ALU运算。

  • 同时,当ALU运算完成后,也不能直接把数据存到AC中,因为这时候总线上还是AC的数据,因此要把结果先存放到另一个寄存器Z中,再通过关闭红色的两个箭头的门,打开蓝色的两个箭头的门,将结果送到AC中

因此,一个add M %eax的指令事实上包含了若干个微操作


控制器

image-20211220153912815

控制器的基本任务:

  • 定序

  • 执行

控制器的输入

image-20211220154436278

控制器的输入有四个:

  • 指令寄存器

  • 标志

  • 时钟

  • 来自控制总线的控制信号:一般情况下是控制器发出信号,在特定情况下,如控制器会收到中断请求

控制器的输出

image-20211220154808602

控制器输出控制信号:

  • CPU内的控制信号

  • 到控制总线的控制信号(CPU外的)

控制信号最终作为二进制输入量(即0和1)来控制各个逻辑门,如0即关闭门,1打开门

控制信号示例:取指周期

image-20211220155304109

控制器的最小特性

image-20211220155827906

最小特性意思是控制器在实现上应该尽可能的简洁,只需要知道是什么指令,逻辑运算结果的性质,无需知道要处理的是什么数据,也不需要知道结果是什么,只需要知道它们的部分性质(如是否为0,正还是负即可,比如条件转移指令中要不要跳转就要看标志信息)

控制器的实现

image-20211220160029056

硬布线实现

image-20211220160211471

image-20211220160620191

定时器在完成一个子周期(取指周期、间址周期等)后会清零,在下一次子周期继续T1,T2的计数

因此需要控制器在指令周期结束后通知定时器清零

image-20211220173459074

为输出的控制信号设计利用控制器输入的布尔表达式

PQ的非表示0,+表示或,·表示与

随着输入和输出的逐渐复杂,布尔表达式会变得很庞大,用电路去实现会非常困难

微程序实现

image-20211220174705236

微程序即固件,位于硬件和软件之间

微指令:用一行微指令可以描述在一个时间内出现的一组微操作(因为可以同时进行,所以它们是互不干扰的,因此它们的控制字可以组合在一起)即微指令是ti内的所有微操作

微指令即为一个控制字,微指令的执行就是把控制字通过控制器输出

控制字:用一串01序列,每一位表示一根控制线,其中1表示控制线所连的门打开,0表示关闭,每个微操作对应的门的开闭是不同的,所以每个微操作可以对应一个控制字

image-20211220175249145

所有情况的控制字存储到控制器存储器中,使得每一个控制字都有自己的地址

image-20211220175527795

在例程的最后会有一个分支或转移微指令,指出下面要到何处执行

上面有一个执行周期例程,它的目的仅仅在于根据当前操作码指明哪个机器指令的例程将被执行

如上图,微程序是要存储所有可能指令的序列

image-20211220180108834

image-20211220180234225

image-20211220180613466

所有的微指令都存储在控制存储器中image-20211220180731607

上面的流程发生在一个时钟单位内

控制缓冲寄存器的左半部分与控制器的控制线相连,发出控制信号,右半部分用于为定序逻辑提供下一条地址信息

image-20211220180926089

image-20211220181215826

  • 由于微程序设计的易实现性,它已经成为CISC控制器的主要技术

  • 而对于RISC,由于指令格式简单,所以一般使用硬布线控制器

总结

image-20211220181456373

  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
  • Copyrights © 2022-2024 zzb
  • RZ
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信