当前位置: 首页 > news >正文

计算机组成原理与体系结构-实验四 微程序控制器 (Proteus 8.15)

一、实验目的

1、理解“微程序”设计思想,了解“指令-微指令-微命令”的微程序结构。

2、掌握微程序控制器的结构和设计方法。

二、实验内容

设计一个“最简版本”的 CPU 模型机:利用时序发生器来产生 CPU 的预定时序,通过微程序控制器的自动控制,在数据通路中完成“唯一”的 CPU 功能——程序跳转。

三、实验器件

1、ROM存储器(2764)和计数器(74LS163、74LS192)。

2、D触发器(74LS74)、寄存器(74LS273)及移位寄存器(74LS194)。

四、实验原理

4.1 理论解释

说明:由于笔者能力有限,加上觉得实验指导的描述专业性、条理性较强,所以摘抄到下文。同时,建议形成自己的理解。笔者觉得,这个实验虽然只设计了4条微指令,但是由于2条微指令的内容又和PC或者说程序的运行(跳转)本身有关,所以理解起来需要费一些功夫;如果设计的微指令可以和实验一的加法器或实验二的ALU相关,理解上的难度会降低。

实验电路由时序发生器(下图中黄框部分)、微程序控制器(下图中红框部分)和数据通路组成。

数据通路由三个部件组成:指令寄存器 IR(74LS273)、程序计数器PC(74LS163 级联)、程序存储器 PROGRAM(ROM)及其地址寄存器 AR(74LS273)。所有 部件都并联挂在单条的 8 位总线 BUS 上,通过数码管显示总线 BUS 信息。 其中,程序计数器 PC 是一个八位递增计数器,由两个同步二进制计数器 74LSl63 级联构成。74LSl63 的逻辑功能如下图所示:D0D1D2D3为并行输入端; Q0Q1Q2Q3为并行输出端;ENT、ENP 为递增使能端;LOAD 为置数端;MR 为清 零端;CLK 为时钟输入端;RCO 为进位输出端。当低四位 74LS163 输出端 Q3-Q0 溢出后,则 RCO=1 送到高四位74LS163 的 ENT 和 ENP 端,允许高四位74LS163 在 CLK 上升沿自加 1 一次(仅允许一次)。注意:74LS163 的加载和自加 1 功能都必须满足 CLK 端上升沿跳变的条件才能实现。

图 17      74LS163计数器 逻辑功能

因为本次实验的数据通路简单,实现的功能有限。所以本实验的 CPU 只能使用 四条基本指令:空指令 NOP、停机指令 HLT,以及直接寻址的跳转指令 JMP1 和 间接寻址的跳转指令 JMP2,如下图所示。

图 18      Mini CPU(微程序控制法设计)--四条基本指令(无操作、停机(断点)、一级跳转、二级跳转)

根据图18所示的 CPU 指令格式,可以编写机器语言(即二进制数据)形式的程序,存放在存储器 PROGRAM 中。程序按地址顺序存放(可以通过程序计数器PC 递增寻址),每一个存储器单元地址上存储 8 位二进制数据,例如下图所示的这段程序:

图 19      ROM-PROGRAM 烧录程序

图19所示的每一条指令,在其指令周期中都经历了取指周期和执行周期两个阶段。所有指令的取指周期都是一样的(除了HLT停机指令,该指令在取值周期的第二个微指令结束后就会使CPU“卡壳”),执行周期则各有不同(NOP 指令不存在执行周期<->总共1个机器周期4条微指令,JMP1执行周期1个<->总共2个机器周期8条微指令,JMP2执行周期2个<->总共3个机器周期12条微指令)。归纳起来所有指令在数据通路上出现的操作只有两种:取指周期中的指令流ROM->IR,执行周期中单次或多次重复出 现的数据流ROM->PC。

总结一下,不同指令可能对应不等长的微指令个数,这在CISC体系的计算机处理器设计中很常见,也是微程序法主要的应用体系。总体上每个指令都划分为取指周期和执行周期,每个周期由4个时钟周期/4条微指令进行。微指令的结构和与微命令的关系见下文图23。这就是微程序的架构:指令-微指令-微命令的层级模式了。

图 20      微程序架构

指令流(ROM->IR)是从存储器 PROGRAM 取出指令,经过总线 BUS 流向指令寄存器 IR,数据流(ROM->PC)是从存储器 PROGRAM 取出数据,经过总线 BUS 流向程序计数器 PC。无论是指令流还是数据流,信息都是先从一个部件打到总线 BUS,再从总线 BUS打到另一个部件的过程。因为信息从源部件打出到总线 BUS 的操作必须先于信息从总线BUS 打入目标部件的操作。所以为了保证上述操作的先后次序,指令流和数据流内部都可以分为两个周期 T1 和 T2。在 T1 周期,源部件 (例:程序存储器 PROGRAM)的信息打入总线;在 T2 周期;总线的信息打入目标部件(例如指令寄存器 IR 或者程序计数器 PC)。

图 21      微操作信号(单独位控制方法)

图 22      微命令的两种设计方法(位单独控制/位组合控制)[2]

数据通路上设计了一系列的微操作信号用来控制各个部件,如图21所示。

本实验的微指令结构如下图所示:微指令字长 24 位,通过下址转移方式确定后续运行的微指令,即微指令的 1-5 位表示下一条微指令地址 [uA4, uA0]。而微指令的 6-7 位留给判断字段 Px(其中 P0 位空缺),P1=1,表示本微指令是取指周期的微指令;P1=0,表示本 微指令是执行周期的微指令。微指令的 8-24 位则是微命令字段,微命令即是数据通 路中电平触发的微操作信号(详见图21)。某位置“1”,表示该位微操作信号有效;反之,置“0”则表示该位微操作信号无效。

图 23      微指令的结构

本实验用到的四种基本微指令,如图24所示。

图 24      NOP/JMP1/JMP2/HLT 微指令

 将 CPU 指令周期示意图图20 用“微程序”设计原理阐述,可以得到 CPU 指令的微程序流程图(图25)。

图25  CPU指令-微程序流程图

注意,每个机器周期一定由T1、T2、T3、T4四个时钟周期组成,对应4条微指令,对于00000 NOP微指令,下址字段还是自己,所以要跳转到其他两个指令,在T4的时候通过部分强制置位的方式设置MA微指令地址寄存器中的内容。

图 26      从微指令00000(NOP)跳转到00001(JMP1)或00010(JMP2)

如果要跳转到00111(NOP),在T2的时候指令打入IR,通过三输入与非门直接控制“节拍器”74LS194,停止机器周期的计数,从而实现硬件停机效果,见下图。

图 27 硬件停机指令HLT,停机在T2上升沿之后

那么对于其他的非NOP、非HLT指令怎么跳转呢?T3的上升沿作为触发信号直接把下址地址(5位)打入微指令地址寄存器MA0-MA4。

图 28      微地址寄存器,普通指令内执行周期间跳转

笔者在实验电路中通过蓝色数码管显示当前机器周期所处的时钟周期位置,红色数码管记录机器周期个数,绿色数码管显示程序或者数据(读取PROGRAM ROM,可以是指令内容也可以是PC要跳转到的指令位置)。

其他注意事项:时钟信号的设置、机器周期计数显示器、启动设置、跳出断点设置

从断点HLT指令继续时,按照我的理解,不是从下一个指令的T1开始,而是从HLT指令的T3开始,走完T3、T4之后才进入下一个指令的T1去取指,可以通过蓝色数码管直观观察(如果我对实验内容理解准确而且连线设计无误)。所以跳出断点的操作一定不能有下图的步骤2!74LS194的关键控制信号是{S0,S1}(见下图),在跳出断点的第一个步骤之后,S0=1,S1=1也就是送数模式,此时如果手动拨动CLK开关,会使74LS194节拍器回到HLT取指周期的T1,你会发现你将永远跳不出第一条HLT指令的死循环(那种绝望感)。

图 29      跳出断点 三步操作VS两步操作

关于手动清零的设计,涉及IR、MA、PC、MDR、AR这五个器件,指令地址寄存器AR可以清零也可以不清零,如果AR跳出断点时没有被清零就是上面我说的第一种绝望,如果被清零了就属于下面我要说的第二种绝望。

图 30      断点-清零AR导致整个程序重新执行

下图(图31)中启动设置的步骤1,通过RESET手动清零只能设计成可以清零IRMA0-MA4微地址寄存器,不能设计清零PC和三个MDR中的内容清零PC会导致跳出断点之后程序无法记忆,从头开始执行(仿真一开始PC指向0x00),那么你会发现你将永远看不到第一条HLT指令后的世界(绝望感)。

启动时不能清零MA0-MA4微指令地址寄存器,因为启动时微指令默认指向00000(NOP),控制信号存在值为1的位,清零之后直接系统紊乱;但是,跳出断点时“可以清零”MDR中的内容,因为图24显示HLT微指令(00111)的所有位都是0!但是设计时需要支持任何一种特殊情况,因此不能清零MDR寄存器。

图 31      其他注意事项

4.2 电路架构

由于实验四的电路过于庞杂,笔者把整个系统基于4.1开头提到的三个子模块按照功能进一步拆分,如下面几张图所示,有些在4.1节已经出现。

图 32      微程序控制组件(2条总线MABUS/NABUS):微地址寄存器(下址地址,T3/T4有效)+微指令读取

图 33      红:指令周期计数 绿:程序内容显示 蓝:节拍定位(指令周期内部)与数据通路(1条总线,数据和指令共享)

图 34     00000微指令下址地址跳转模块(T4有效)、00111停机微指令作用模块(T2生效)

图 35      启动/断点调试与时钟信号源选择

图 36      时序发生器(三种模式)

五、实验步骤

  1. 根据图24 微指令代码表可以编写下列微程序,编译并生成三个 HEX 文件,分别烧写到图 2-34所示的控制存储器 EPROM1、EPROM2 及 EPROM3。

  1. 问题:在写入控制存储器的微指令代码表中,地址[00001](JMP1)和[00010](JMP2)的两条执行周期微指令执行的微操作完全一样。请问,可否合并这两条微指令?若不能,原因是什么?

不能合并。因为[00010](JMP2)的下址地址是[00001](JMP1)微指令而非[00000](NOP)微指令,相当于JMP2并不是直接定义的,而是使用嵌套的间接定义方式,建立在JMP1的基础上。

3)编译如下所示的机器语言源程序,生成 HEX 文件烧写到图 2-34 所示的程序存储器PROGRAM中。

个人在过CPU跳转的时候认为烧录程序的第四条 “指令”的助记符应该是“NOP”。这段程序相当于是一个死循环,JMP1执行1次,此后永久的执行第三行到JMP2指令的程序段。

1、启动仿真前,时钟信号CLK 接在 MANUAL_CLK 端;启动仿真,使能复位信号RESET=1,然后手动按钮 MANUAL_CLK,令时钟信号 CLK上升沿跳变,初始节拍{T1,T2,T3,T4}={1,0,0,0};最后恢复复位信号 RESET=0,初始化过程完成。

2、手动按钮 MANUAL_CLK,令时钟信号 CLK 形成脉冲,单步执行上述机器语言程序。在 JMP1 或 JMP2 指令的指令周期中,对照微程序流程图 2-37,观察每一条微指令的作用,以及单步执行的结果(例如寄存器 AR、IR、PC 及总线 BUS 上的数据)。

3、时钟信号 CLK 改接在 AUTO-CLK 信号源(主频 10Hz),程序会自动运行到 HLT 指 令“断点”暂停。查看“断点”处的微指令周期数指示,以及寄存器 AR、 IR、PC 及总线 BUS上的数据。然后,使能复位信号 RESET“0->1->0”,跳出“断点” ,进入 HLT 指令的后续下一条指令继续运行。

 4)(实验 2)增加一条二次间接寻址的跳转指令 JMP3,嵌套定义在JMP2指令的基础上。

并编译如下所示的机器语言源程序,生成 HEX 文件烧写到图 2-34 所示的程序存储器PROGRAM中。

这段程序是有限次数的执行。

5)问题:在本实验程序中,有部分地址标示“NOP/[ADDR]”,为何相同代码会有不同的执行效果?执行到该处,在什么情况下是不执行任何操作?在什么情况下是程序跳转?

因为程序中的每一行可以解读成指令或者指令需要的数据,比如有些地址标示NOP,如果是从NOP或者JMP1执行完到这一行那就是NOP;但如果是JMP2或者JMP3中间跳转的暂停点就是作为数据的ADDR了。

六、思考题

1、微程序版本 CPU 最多有多少条微指令?最多有多少条 CPU 指令?微指令和 CPU 指令的容量分别由什么因素限定?

在本仿真实验中,CPU微指令可以有32条,因为下址字段有5位;IR存储的指令种操作码长度是3位(I7I6I5),所以最多8条,实际应用时需要结合指令的操作码长度以及操作码的编码方式(扩展操作码或固定操作码长度,见下图)。因此在CISC体系中,微程序版本CPU微指令的容量受到下址字段的位数限定,CPU指令的容量受到指令的字数和字长(比如32位/64位操作系统的概念),以及操作码的编码方式等因素的限制。

图 37      指令的字数和字长、操作码的编码方式[2]

2、请问微程序控制器“状态机”可否提升效率,减少到三个状态{T1,T2,T3}?即微指令周期可否减少到只用 T1、T2、T3 三个节拍即可完成一条微指令从取指到执行的全过程?

不可以,因为微指令结构中有PX位的设定,本实验对于00000(NOP)微指令P1=1,其余(图24,关键图)其余微指令P1=0,这也引出了图34(左)的设计,对于00000生效在T4,对于其他微指令生效在T3,所以不能再减少机器周期(指令周期,一个指令可以有多个周期)的数量。

附:实验1-4设计演示视频:

计算机组成原理专业实验课有多“卷”?来看看什么叫细节的海洋~~~_哔哩哔哩_bilibili

参考资料

[1] 热爱生活的fuyao. 学习笔记——3-8译码器实例(FPGA)[EB/OL]. (2021-01-24)[2025-06-29]. 学习笔记——3-8译码器实例(FPGA)_3-8译码器功能表-CSDN博客

[2] 华南理工大学计算机学院王国华老师的课件

相关文章:

  • day46/60
  • Java垃圾收集机制Test
  • Modbus 报文结构与 CRC 校验实战指南(一)
  • 5 c++核心——文件操作
  • 【NLP 实战】蒙古语情感分析:从 CNN 架构设计到模型训练的全流程解析(内附项目源码及模型成果)
  • EPLAN Electric P8 2.9 零基础保姆级安装教程
  • 力扣第84题-柱状图中最大的矩形
  • [Python 基础课程]Python 规范
  • 【QT】信号和槽(1) 使用 || 定义
  • 信号处理分析工具——时频分析(二)
  • python sklearn 机器学习(1)
  • 【C++】C++的虚析构函数
  • Linux基本命令篇 —— head命令
  • 什么是P2P 网络(Peer-to-Peer Network)
  • linux运维学习第10周
  • FastAPI+Sqlite+HTML的登录注册与文件上传系统:完整实现指南
  • 命令模式 - Flutter中的操作封装大师,把“动作“变成可管理的对象!
  • 数据同步工具对比:Canal、DataX与Flink CDC
  • stm32hal模块驱动(2)bmi270气压计
  • 数据结构之单链表