计算机组成原理课程设计
操作控制和顺序控制
- 操作控制就是由各种微命令来构成的
- 顺序控制就是由P测试和后续微地址构成的
这就构成了整个微指令的三个部分
访存指令就是实现对主存中的数据进行访问或存储
一、 操作控制字段是由各种微命令来构成的,这些微命令怎么来设计?
- 一个萝卜一个坑,一个微命令占据一个二进制位,有多少个微命令操作控制字段占据多少位,这是什么方式?——直接表示——全水平型
- 但如果我们对那些相斥性的微命令采用译码器来进行选通,它可以缩短操作控制字段的长度,但是要注意译码器的选择,四个相斥性的微命令需要3—8译码器,因为2—4译码器只能译出3个相斥性的微命令,4—16的译码器只能译出15个相斥性的微命令,这时要增加译码器的选通,会增加微指令实现的成本和复杂度。因此建议采用水平型。
设计出来微指令之后,设计微指令格式就要来编写微指令,进而来设计我们的微程序控制器的各种器件,包括地址转移逻辑电路,微地址寄存器,微命令寄存器和操作控制器,这一部分就属于设计的操作控制器单元
旧教材
绘制总体的数据通路框图,是一个三总线的结构,
- 数据总线,指令总线,地址总线
- 地址寄存器连通数据cache有一个地址总线
- 程序计数器PC连通icache有一个地址总线
所以上图是一个三总线的结构。
上课的教材是一个单总线的结构,所有的器件都连在一根总线上,不分数据地址还是指令,一根指令有好处有坏处,好处就是简单,有一个设备占据了总线,别的设备就不能用了,所以这就导致了取指分成了4个T周期,数据不断流转,为了防止数据不出错,所以要分成不同的T周期来完成。
自加4是因为它这个通路中的内存条的数据单元,一个内存单元的长度是8位,开始MIPS指令是32位,所以一条指令要放在4个内存单元中,所以下一条指令取指是加4。
3总线的情况下
取指的行为不同
这里是双态的取指结构,
- ALU是算数逻辑运算单元,运算需要数据,数据来源于多路开关,
- 这个多路开关其实就是X,Y这两个暂存器,这两个暂存器的数据来源于各种寄存器的值,
- 但寄存器有R0,R1,R2,R3,因为有四个寄存器,所以在选择的时候需要2-4译码器,然后进行多路运算
- 源寄存器的内容还可以输出,有一个Rs_B三态门保证结果输出到总线,左边这一堆就是运算器所需要的东西。
右边,这个图构造了一个双态取指结构,
- 数据Cache用来保存地址或者是操作数本身,
- 指令Cache用来保存指令,类似于RAM和ROM,做课设的时候就是改成了RAM,ROM
- AR放的是地址寄存器,取的是操作数或者是操作数的有效地址,因此AR寄存器连通数据Cache;
- PC放的是下一条指令的地址,所以PC连通的是指令Cache,PC的内容打入到指令Cache就可以把这条指令取出来;
- 取出来的指令放在指令寄存器IR中,
- IR中的形式地址A可以经过ADDR_B三态门送到数据总线;(MOV传送指令)
- 取出的指令还要结果指令译码器来进行译码从而来决定取出来的到底是一条什么指令,是加法还是减法;
- 然后要再时序产生器中产生各种操作,去控制各个芯片的引脚是开还是关,从而完成本次指令的功能,这就构成了一个非常简单的数据通路。
数据总线是最繁忙的,连接的器件也是最多的,比如ALU的输出,寄存器的输出,形式地址A的输出……这些都要连接数据总线。一个周期内数据总线上只能有一个数据在上面流转,所以这些所有连接到数据总线上的器件都增加了一个三态门,用来控制开关,打开三态门,数据就可以流通到数据总线。
取指怎么取呢?
- 指令的地址一定放在PC中,把PC的内容打入到指令的地址总线,根据地址访问指令Cache,然后将指令Cache中的对应的单元中的内容取出来经由指令总线送到指令寄存器IR中,然后对IR的OP字段译码,确定是什么指令,从而产生相应的操作控制信号,PC+1,本次取指操作完成。
- 我们会发现在这样的一种状态图中,取指guo'ch过程是很流畅的,不需要分时间,这一过程没有任何的时间冲突,所以把它放在了一个周期中,一个CUP周期。
- 对于三总线的结构而言,之前的取值周期的四步内容就可以在一个周期完成,因为它没有任何的冲突,称这个周期是一个CPU周期。
三总线和单总线是有区别的,在取指周期,计算或者是执行周期上都有区别,它的冲突比单总线要少,花费的时间也要少。
三态门在选择的时候怎么选择?
在编程的时候我们要设计一个多路选择器,选谁就把谁选通,不同于译码器,在电子教材中有说明。
这个逻辑结构图很稳定,
(微指令的三个部分:各种微命令,P测试和后续微地址)
控制存储器里面放微指令,所有的微指令都放在控制存储器里面;
微地址寄存器用来保存下一条微指令的地址;
微命令寄存器用来存放P字段和控制字段;
地址转移逻辑电路用来形成下一条有效的微地址(后续微地址?);
四个器件构成。
怎么协调工作呢?
- 刚开始,一开机,因为微地址寄存器中RAM来构成,都是触发器来构成的,一断电就没了,一开机重启了,相当于是从0开始,所以所有控制寄存器都要从0开始取,一开机微地址寄存器中的内容就是0,所以我们一定要把取指指令的地址设置为00H,这样保证一开机就能把指令取出来。
怎么取指令?
- 刚开始是00,把00打入到控制存储器的地址译码电路中,然后找到0号地址单元,将第一条微指令取出来,微指令包括三部分(操作控制字段,P字段,后续微地址字段),所以取出的这条微指令的后续微地址部分就送到微地址寄存器中,P字段和操作控制字段送到微命令寄存器中,送进去之后因为这条微指令要实现特定功能,所以操作控制字段中的各个微命令的值就要生成微命令信号,去控制对应的芯片的引脚,来完成本条微指令的功能。
下一条微指令怎么取出来?
- 如果当前微命令寄存器的P字段显示是没有P测试的,就说明微指令的执行是顺序方式,说明刚才取出来的放在微地址寄存器的后续微地址就是下一条微指令的绝对地址,直接再送到控制寄存器中取指即可。(顺序执行:不是0地址取完取1地址的意思,如果0的后续微地址是3,下一次到3去取,这就是顺序)
- 存在P测试,微指令的执行方式是跳转的,首先,P测试有两种,一种是对操作码来进行P测试的,来进行转移的;另一种是对各种条件来进行判断的,比如说ZF(是否为0),SF(判断正负),CF(判断有没有进位),通过这些状态推荐来进行测试。当存在P测试时,要将它送入到地址转移逻辑电路中,来强行修改微地址中某几位的值,从而生成一个全新的地址,根据这个全新的地址来取指,这就完成了跳转。比如取出来的后续微地址时00H,P测试修改的是微地址中的第5位,所以微地址被强行修改为了10H,10H送到控制寄存器,根据10H取指。(自动执行的核心!自动取指,自动定位,跳转——>全靠P测试)
一般来说,在T4周期内,要形成微指令的微地址,在T2周期的上升沿到来的时候将读出的微指令打入微指令寄存器,这样就保证在不同的节拍上做不同的事,
先设计汇编指令格式,再把它手工翻译成机器指令,
课程设计用到的所有汇编指令的集合就构成一个指令系统。
设计多少汇编指令取决于选择的题目,用到多少种汇编指令就设计多少条。
x86的汇编格式和ARM不一样,这样的指令格式都叫汇编指令(有自己的助记符,有自己的地址码)
一定要写指令功能说明
Rd目的寄存器
Rs源寄存器
STO访存指令
STOI间接访存指令
P测试就是和有条件的转移来结合的(JNZ,结果不为零就跳转,所有有两个分支,怎么判断结果是不是0呢?这里缺失了一条指令)
- JNZ有条件的转移,结果不为零就跳转,怎样判断结果是否为0呢?要增加一条指令CMP比较指令,R1和R2比较,其实是做差,R1-R2(0),关注点是状态,判断结果是否为0,就保留ZF,在JNZ前使用CMP指令,如果ZF=1,说明结果为0,不跳转,做P2测试,如果ZF=0,跳转到一个全新的地址的值,=1,微地址的值不变,JNZ就有两个分支,是P测试。
- 如果是JB,小于,关注的就是SF=1,做差为负数,又因为是小于不是小于等于,所以ZF=0。
- JEB,小于等于,SF=1
汇编指令怎么翻译成机器指令呢?
因为不翻译成机器指令就没有办法写进内存条,看上图可知指令是16位的,
- 其中操作码设计成了4位(因为范例中的指令只有11条,操作码编码是采用译码器实现的,所以占4位,最多可以设计16条指令),最好不要超过16条,不然不好借鉴。
- 11,12位是源寄存器的内容
- 9,8位是目的寄存器的内容(源寄存器,目的寄存器占两位,可供选择的寄存器有4个,2^2=4,选择2-4译码器)(源寄存器,目的寄存器的位置可以换,但要统一)
- 立即数im8位,如果是有效地址addr也是8位。
- XXXX内容无所谓,写成几都没有关系。
最后在运行的时候,把机器指令写入到ROM(指令Cache)中
所有的CPU都是定长的,4个T周期构成
时序产生器说白了就是计数器,每来一个时钟周期就计数一次,对相应的输出值设置为1
00,01,10,11
整个逻辑电路图实际上是3层,
最高这一层就是最终的这个总体框架图
但是在这个控存中还有两层
地址转移逻辑还有一层
总共是3层
在这个模型上设计的汇编指令和机器指令
这些机器指令对应的指令周期图应该怎么写呢?
每一个方框代表一个CPU周期,课本上的每一个方框代表应该时钟周期,这个的区别不重要,重要的是方框里的内容。
第一个周期一定是取指周期,PC送到指令的地址总线上,read 指令Cache(ROM),把读到的指令内容经由指令总线送到IR中,PC+1,再经过一次译码操作完成取指。
这条指令取出来译码了,那要进行什么操作也就清楚了,如果是IN输入指令,就转向IN的那条流程。
P测试有两种,
- P(1):一种是对操作码来进行P测试的,来进行转移的;
- P(2):另一种是对各种条件来进行判断的,比如说ZF(是否为0),SF(判断正负),CF(判断有没有进位),通过这些状态推荐来进行测试。
- 当存在P测试时,要将它送入到地址转移逻辑电路中,来强行修改微地址中某几位的值,从而生成一个全新的地址,根据这个全新的地址来取指,这就完成了跳转。
取指方框末尾的00表示设置后续微地址的值是00,根据P(1)测试来修改后续微地址,从而控制执行哪一个指令。
这里取指后有一个P(1)测试,根据取出来的指令的操作码,来修改对应的后续微地址中的某几位的值,然后来转向对应的内容,比如取出来的指令是IN1,就要把后续微地址从00改为01,如果取出来的指令是JNZ,P(1)测试就要做到把后续微地址从00改为07,这样才能取出谁执行谁。
JNZ指令里有一个P(2)测试,是有条件的转移。
前面有一个空指令,前面讲过每一个方框图代表一个T周期/CPU周期(看教材编写),但是P测试不会独立存在,P测试只能紧跟在上一条微指令中,而且同一条微指令只能做一种P测试,要么做P(1),要么做P(2),所以如果没有这条空指令,会发现P(2)和P(1)都挂载在了取指指令上,发生了冲突,所有为了保证P(2),P(1)分开,一定要加一个空指令,这个空指令的作用就是挂载P(2)测试。
JNZ指令是根据结果是否为0来决定是否跳转,需要判断ZF的值,跳转就是把指令中的形式地址A送到PC中,出现两路分支。
这里的P(2)测试,结果只能是1或0,所以有且仅有两路。
P(1)测试是对操作码的判断,操作码是四位的,所以分支最多有16种。
(第二节课重点讲!!!!!!!!!!!!!!!!!!)
根据设计框图的内容来设计微指令(包括操作控制字段,顺序控制字段)
- 操作控制就是由各种微命令来构成的
- 顺序控制就是由P测试和后续微地址构成的
- 这就构成了整个微指令的三个部分
设计出微指令格式后,再根据刚才的指令周期图有多少个方框就要编写多少个微指令(即赋值),注意,微命令中有一些是1有效,有一些是0有效。
汇编代码->机器指令->微指令
软件层面完成。
硬件层面:(地址转移逻辑电路)
逆时针旋转90°其实就是之前的总体的数据通路框图。直接借鉴这个图,但要注意看跳转指令是否相同。有好几层。不难。最好一次性画完,一气呵成。
ROM中放的就是编写好的机器指令,要把它初始化进去。
控制存储器里面就要把微指令写进去。
两个都初始化进去后,这张图就可以开始运行了。
通过OUT来输出结果,如果结果错了,就调试,看看之前的错了没有。
相关文章:

计算机组成原理课程设计
操作控制和顺序控制 操作控制就是由各种微命令来构成的顺序控制就是由P测试和后续微地址构成的 这就构成了整个微指令的三个部分 访存指令就是实现对主存中的数据进行访问或存储 一、 操作控制字段是由各种微命令来构成的,这些微命令怎么来设计? 一个萝卜…...

《从菜鸟到大师之路 MySQL 篇》
《从菜鸟到大师之路 MySQL 篇》 数据库是什么 数据库管理系统,简称为DBMS(Database Management System),是用来存储数据的管理系统。 DBMS 的重要性 无法多人共享数据 无法提供操作大量数据所需的格式 实现读取自动化需要编程…...

使用qt完善对话框功能
1、 完善登录框 点击登录按钮后,判断账号(admin)和密码(123456)是否一致,如果匹配失败,则弹出错误对话框,文本内容“账号密码不匹配,是否重新登录”,给定两…...

Day 03 python学习笔记
位运算 基于二进制的运算(计算机的底层基于位运算) 计算机最小单位:bit (比特/位/二进制) 1byte(字节) 8bit ( 0000 0000) &:与 (全真为真,一假则…...

优化类问题概述
数学建模系列文章: 以下是个人在准备数模国赛时候的一些模型算法和代码整理,有空会不断更新内容: 评价模型(一)层次分析法(AHP),熵权法,TOPSIS分析 及其对应 PYTHON 实现代码和例题…...

第一个 Go 程序“hello,world“ 与 main 函数
第一个 Go 程序"hello,world" 与 main 函数 文章目录 第一个 Go 程序"hello,world" 与 main 函数一.创建“hello,world”示例程序二. “hello,world” 程序结构拆解三、main 函数四、Go 语言中程序是怎么编译…...
MySQL缓冲池Buffer Pool
前言 在应用系统中,为加速数据访问,会把高频的数据放在「缓存」(Redis、MongoDB)里,减轻数据库的压力。在操作系统中,为了减少磁盘IO,同时为了快速响应,引入了「缓冲池」(buffer pool)机制。 MySQL…...

springboot实现发送邮箱验证码
准备工作 在邮箱官网开放SMTP授权,获取相应密钥,才可以进行发送邮件 这里以网易163邮箱为例,登录邮箱后,依次点击“设置-POP3/SMTP/IMAP” ,然后开启SMTP服务。这时候会提示一个授权码,例如:H…...

ESP8266使用记录(三)
通过udp把mpu6050数据发送到PC端 /********************************************************************** 项目名称/Project : 零基础入门学用物联网 程序名称/Program name : ESP8266WiFiUdp_12 团队/Team : 太极创客团队 / Taichi-Maker (w…...

基于微信小程序的在线视频课程学习平台设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言用户微信端的主要功能有:管理员的主要功能有:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉…...
CloudCompare 二次开发(15)——点云添加高斯噪声
目录 一、概述二、代码集成三、结果展示一、概述 不依赖任何第三方点云相关库,使用CloudCompare编程实现点云添加高斯噪声。添加高斯噪声的算法原理见:PCL 点云添加高斯噪声并保存。 二、代码集成 1、mainwindow.h文件public中添加: void doActionAddGassNoise(); //…...
一波免费、好用的API接口分享
全国快递物流地图轨迹查询:【H5物流轨迹、单号识别】通过物流单号和收寄件地址,自动评估物流时效,并在地图中展示包裹运输轨迹。包括顺丰、圆通、申通等主流快递公司。自动识别快递公司及单号,实时查询,稳定高效&#…...
Android App ~ LiveData
LiveData 两种更新数据方式 setValue(T value)postValue(T value) setValue()只能在主线程中调用,postValue()可以在任何线程中调用。 MutableLiveData 1.首先LiveData其实与数据实体类(POJO类)是一样的东西,它负责暂存数据. 2.其次LiveData其实也是一个观察者…...

全球第4大操作系统(鸿蒙)的软件后缀.hap
system exe 2022-12-01 04:38:38 首页 > 操作系统 145|0条评论 鸿蒙OS兼容已有安卓程序:这事不稀奇。 其实一个系统兼容另外系统的可执行程序并非新鲜事,比如linux下的wine和crossover可以兼容许多win系统的.exe程序。 作为回应,Wind…...
算法练习第六十四天
LCR 184. 设计自助结算系统 - 力扣(LeetCode) 总结:利用一个双端维护队列一个往后递减的队列,对头是最大值,每次进入一个新值时就一直和队尾元素比较将比新的值小的数排出,这样能保证留在队列中的数都是会…...

安卓系列机型 框架LSP 安装步骤 支持多机型 LSP框架通用安装步骤【二】
安卓玩机教程---全机型安卓4----安卓12 框架xp edx lsp安装方法【一】 低版本可以参考上个博文了解相关安装方法。 LSP框架优点 简单来说装lsp框架的优点在于可以安装各种模块。包括 但不限于系统优化 加速 游戏开挂等等的模块。大致相当于电脑的扩展油猴 Lspos…...
实现一个宽高自适应的正方形
.square {width: 10%;height: 10vw;background: tomato; }.square {width: 20%;height: 0;padding-top: 20%;background: orange; }.square {width: 30%;overflow: hidden;background: yellow; } .square::after {content: ;display: block;margin-top: 100%; }...

shell脚本命令
Shell命令是在类Unix操作系统中使用的命令行解释器(shell)中执行的命令。Shell命令可以用于执行系统命令、操作文件、进行文本处理、管理进程等。以下是一些常见的Shell命令: 1. ls:列出当前目录下的文件和文件夹。 2. cd&#x…...
Vue2023 面试归纳及复习(2)
1 vue3中的动态组件和KeepAlive组件 动态组件component <component>动态组件是一种可以根据数据变化而动态加载不同组件的方式。使用动态组件可以有效地减少代码复杂度,提高组件的复用性和灵活性。 动态组件通过一个特殊的属性is来实现动态加载,…...

idea 本地项目上传到 Git 步骤
第一步:菜单栏 VCS——>import into Version control——>Create git Repository——>弹出框找到选中自己项目——>点击Ok 第二步:选中项目右键 ——>git——>Add 文件会变成绿色表示成功 第三步:VCS——>commit——>ok 提交到…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...