计算机组成原理19——控制单元的功能和实现1

本系列文章是学习了网课《哈尔滨工业大学–计算机组成原理》之后,用以梳理思路而整理的听课笔记及相关思维拓展。本文涉及到的观点均为个人观点,如有不同意见,欢迎在评论区讨论。

四种周期下的微操作命令

程序在输入至计算机之后,解析成各种指令,这些指令还不能直接被计算机执行,需要输入至控制单元。控制单元将进一步分析这些指令,将其转化为可以操作计算机的微指令序列,从而控制计算机执行程序。

下面以指令周期中的四个阶段进一步分析其对应的微操作指令。

取指周期

假设CPU内有四个寄存器:
MAR与地址总线相连,存放欲访问的存储单元地址;
MDR与数据总线相连,存放欲写入存储器的信息或最近从存储器读出的信息;
PC存放现行指令的地址,有计数功能;
IR存放现行指令。

取指令的操作可以归纳为以下几个操作:
1、PC ->MAR,现行指令地址送到存储器地址寄存器;
2、向主存发送读命令,启动主存做读操作,记作1->R;
3、将MAR所指的主存单元中的内容经数据总线读至MDR内,记作M(MAR)->MDR;
4、将MDR的内容送至IR,记作MDR->IR;
5、指令的操作码送至CU译码,记作OP(IR)->CU;
6、形成下一条指令的地址,记作(PC)+1->PC。

在这里插入图片描述

间址周期

具体操作如下:
1、将指令的地址码(形式码)部分送至存储器地址寄存器,记作Ad(IR)->MAR;
2、向主存发送读命令,启动主存做读操作,记作1->R;
3、将MAR所指的主存单元中的内容经数据总线读至MDR内,记作M(MAR)->MDR;
4、将有效地址送至指令寄存器的地址字段,记作MDR->Ad(IR)。

执行周期

不同的指令执行周期不同,下面分别讨论非访存指令、访存指令和转移类指令的微操作。、

非访存指令

这类指令在执行周期内不访问内存。

1、清除累加器指令CLA,清除累加器,0->ACC
2、累加器取反指令COM,累加器取反, A C C ‾ − > A C C \overline{ACC} -> ACC ACC>ACC
3、算术右移一位指令SHR,累加器算术右移一位,L(ACC)->R(ACC)
4、循环左移一位指令CSL,累加器循环左移一位,R(ACC)->L(ACC)
5、停机指令STP,计算机中有运行标志触发器G。当G=1时,表示机器运行;当G=0时,表示机器停机。STP指令将G置为0。

访存指令

这类指令在执行阶段都需要访问存储器。

1、加法指令ADD X,需要完成累加器内容与对应于主存X地址单元的内容相加,送至累加器。
①将指令的地址码送至存储器地址寄存器,Ad(IR)-> MAR
②向主存发送读命令,启动主存做读操作,记作1 -> R
③将MAR所指的主存单元中的内容经数据总线读至MDR中,记作M(MAR)-> MDR
④给ALU发送加命令,将ACC的内容和MDR的内容相加,结果存于ACC,记作(ACC)+ (MDR)-> ACC

2、存数指令STA X,将指令在执行阶段,将ACC的内容存于主存的X地址单元中。
①将指令的地址码部分送至存储器地址寄存器,记作Ad(IR)-> MAR
②向主存发送写命令,启动主存做写操作,记作1 -> W
③将累加器内容送至MDR,记作ACC -> MDR
④将MDR的内容写入MAR所指的主存单元中,记作MDR -> M(MAR)

3、取数指令LDA X,该指令在执行阶段将主存X地址单元的内容取至ACC中。
①将指令的地址码部分送至存储器地址寄存器,记作Ad(IR) -> MAR
②向主存发读命令,启动主存作读操作,记作1 -> R
③将MAR所指的主存单元中的内容经数据总线读至MDR内,记作M(MAR) -> MDR
④将MDR的内容送至ACC,记作MDR -> ACC

转移类指令

这类指令在执行阶段不访问存储器。

1、无条件转移指令JMP X
将指令的地址码部分送至PC,记作Ad(IR) -> PC

2、条件转移指令BAN X
该指令根据上一条指令运行的结果决定下一条指令的地址。若结果为负,则指令的地址码送至PC;若指令不为负,则源程序按照顺序执行。

在这里插入图片描述

中断周期

在执行周期结束时刻,CPU需要查询是否有请求中断的事件发生,如果有则进入中断周期。
假设程序断点存至主存的0地址单元,且采用硬件向量法寻找入口地址,则在中断周期需完成以下操作:

  ①将特定地址0送至存储器地址寄存器,记作0->MAR
  ②向主存发写命令,启动存储器作写操作,记作1->W
  ③将PC的内容送至MDR,记作PC->MDR
  ④将MDR的内容通过数据总线写入MAR所指的主存单元中,记作MDR->M(MAR)
  ⑤将向量地址形成部件的输出送至PC,记作向量地址->PC,为下一条指令的取指周期做准备
  ⑥关中断,将允许中断触发器清零,记作0->EINT。
  如果程序断点不存入内存,而是存入堆栈,只需将①改为(SP)-1 -> SP,且SP -> MAR。

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-09 21:58:06       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-09 21:58:06       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-09 21:58:06       87 阅读
  4. Python语言-面向对象

    2024-01-09 21:58:06       96 阅读

热门阅读

  1. 一分钟学会Linux软链接

    2024-01-09 21:58:06       67 阅读
  2. 【设计模式】 模板方法模式

    2024-01-09 21:58:06       54 阅读
  3. kotlin的接口详解

    2024-01-09 21:58:06       56 阅读
  4. 【DevOps-08-1】Harbor镜像仓库介绍和安装

    2024-01-09 21:58:06       67 阅读
  5. 找茬小游戏开发需要清楚哪些内容呢?

    2024-01-09 21:58:06       56 阅读