【计算机组成 课程笔记】5.1 处理器的设计步骤

课程链接:

计算机组成_北京大学_中国大学MOOC(慕课)

5 - 1 - 501-处理器的设计步骤(14-'49--)_哔哩哔哩_bilibili

处理器,或者说是CPU,是现代计算机中最为复杂的一个部件。不过先不要劝退,要设计一个简单但是能工作的处理器,也没有那么的神秘。这一节我们就一起来探索处理器是怎么设计出来的。

0. 处理器的设计步骤

要设计一个处理器,主要分为以下几个步骤。

1. 首先,需要分析指令系统。指令系统是在处理器设计之前就由软件和硬件的设计人员共同协商决定的,关于指令系统,可以参考这篇博客:【计算机组成 课程笔记】2.1 设计自己的计算机_Elaine_Bao的博客-CSDN博客。通过分析指令系统,我们可以得出指令所要操作的数据需要通过怎样的一个电路结构,这就是数据通路。

2. 在我们得到这样的需求之后,我们就可以为数据通路选择合适的集成电路组件,比如加法器,减法器,寄存器等。

3. 选好了合适的组件之后,我们就按照最开始分析出的需求把这些组件连接起来,就构成了完整的数据通路。

4. 但是仅有数据通路是不够的,我们还要控制这些数据通路应该如何工作。因此第4步,需要分析每条指令的实现,以确定控制数据通路工作的控制信号。

5. 最后是把这些控制信号汇总起来,形成完整的控制逻辑,也可以称之为控制器。

下面我们还是以MIPS指令系统为例进行讲解。不过整个MIPS指令系统的指令还是太多了,我们进行一个简化,只考虑以下几条指令:

假设这就是我们当前用来设计处理器的指令系统。那么我们下面就要分析这个指令系统对数据通路有什么样的需求。

1. 指令系统对数据通路的需求

首先我们对指令的位域进行分解,来看看各个指令的含义。

对于R型指令,它一共分为6个位域,最高的6-bit是操作码,接下来连续的3个5-bit的位域各自标明了一个寄存器的编号。然后的5-bit在完整的MIPS指令系统中是用作标记移位的数量,而在咱们简化后的版本中没有用到,因此我们可以看成是保留的位域。最后6-bit是功能位域。因此,当我们取到一条R型指令后,就可以将它分解为以上的6组控制信号。

与之类似,I型指令包含了4个位域,也就可以被分解为4组控制信号。

而且我们要注意,这些指令的编码都是从存储器中取得的,因此我们首先需要一个存放指令的存储器。对于指令存储器来说,它不需要支持写入的功能,只要可读就可以了,而且我们希望对于这个存储器,外界给它32位的地址,它就会给出对应的32位的数据。

那么这个32位的地址又是从哪里来呢?这就是我们的另一个需求,我们需要一个存放指令地址的32位寄存器,称为PC,也就是程序计数器。

满足了这两个需求,我们就可以取得想要的指令了。

然后我们再从指令的操作,来分析其他的需求。

首先来看加法和减法指令。

这两条指令的主体功能都是选择两个不同的寄存器,对它进行加法或减法的运算,然后将结果存入另一个寄存器。因此我们首先需要有一组存放数据的通用寄存器,每个寄存器都是32位的,这样一组通用的寄存器我们称为寄存器堆。从加法和减法的指令我们还可以看出,在运算时我们需要同时读取两个寄存器的内容,并写入一个寄存器(两读一写)。

再来看一下立即数的逻辑或指令。

在运算时,它只需要读取一个寄存器的内容,另一个操作数是一个立即数,其中16位是直接填写在指令位域当中的,但是我们的运算是32位的,因此这里还有一个需求是将16位立即数扩展到32位。

上述3条指令都是运算指令,因此我们还要支持不同的运算类型的运算器。这个运算器的操作数既可以是寄存器,也可以是扩展后的立即数。

这些就是运算指令的需求了。

我们再来看一下访存指令。

对于LOAD指令来说,它需要从存储器中读出一个字,而这个字所在的存储单元的地址是由一个寄存器的内容+一个立即数的符号扩展。取出这个字之后,会存放到寄存器堆当中由rt指定的寄存器。

与之相对的还有STORE指令,它是将rt寄存器的内容,写入到存储器中。

对于这两条访存指令,我们的需求是:首先我们需要一个存放数据的存储器,这个存储器既要可读也要可写,它的地址输入以及输入输出的数据都是32位的。另外这个地址的计算中需要堆立即数进行符号扩展。这就是访存指令的主要需求。

最后我们来看分支指令。

对于分支指令,首先要判断两个寄存器中的内容是否相等,如果相等就将指令位域中立即数的部分经过变换加到PC上,从而得到新的PC。如果不等则新的PC=PC+4。

因此分支指令的需求,首先是要能否比较两个寄存器的内容,并判断是否相等。然后还需要PC寄存器支持两种自增的方式。一种是+4,一种是+一个立即数。前者对于之前提到的其他指令也都是需要的。

2. 根据需求选择合适的组件

我们把之前提到的需求总结一下就可以得到对组件的需求。

选择了上述合适的组件后,我们就可以开始着手建立数据通路的工作了。

3. 连接组件建立数据通路

要建立数据通路,基本原则是分析指令系统中的每一条指令,根据其需求连接组件,从而建立数据通路。那么指令的需求又分为两大类,一类是所有指令的共同需求,另一类是不同指令的不同需求。

首先我们来看所有指令的共同需求。

首先需要取指令。指令是放在存储器中的,要从存储器中取得指令,需要一个地址,这个地址则是存放在PC寄存器中。我们已经有了一个32位的PC寄存器,我们就把PC寄存器的输出连接到指令存储器,而指令存储器则根据地址的输入,选中对应的存储单元,并将其内容输出。这样我们就得到了所需指令的二进制编码。

那除了取得当前的指令之外,我们还需要为下一条指令做准备,这就需要更新PC寄存器。这又分成了两种情况。

大多数时候,指令是顺序执行的,这种情况下PC只要加上当前指令的长度,就可以得到下一条指令的地址。在MIPS指令系统中,每一条指令都是4个字节的,所以PC=PC+4。那在我们刚才的结构上面,需要增加一个简单的加法器,实现PC+4的操作。这样,当前PC寄存器的内容,既会送到指令存储器,获得指令编码,又会送到加法器,从而计算出一个PC+4的值,在下一个时钟上升沿来临时,PC寄存器就会将PC+4的值存入其中,然后再将这个更新后的内容送到指令存储器和加法器,如此周而复始。

而如果遇到分支指令,那下一条指令的地址就不是简单的PC+4,而是由分支指令进行指定。因此还需要继续修改这个结构。我们需要增加一个二选一的多选器,在顺序执行时,我们选择这个多选器的0号输入端,在发生分支时,选择1号输入端,也就是由分支指令指定的目标地址。那在下一个时钟上升沿到来的时候,PC寄存器就会采样这个多选器的输出,并将其保存起来。

这样一个结构就完成了不断取指令的功能,我们把它称为取指部件(Instruction Fetch Unit, IFU)。IFU作为一个整体,同外界只有一个时钟信号clk的输入,和一个多选器选择信号nPC_sel的输入,并且提供一个指令编码Instruction Word的输出。

我们只用在系统启动时给PC寄存器一个合适的初始值,并在指令存储器中存放好我们需要运行的指令,然后在运行过程中给出合适的多选器的选择信号,这个IFU就可以在时钟信号的驱动下,自动地连续工作起来了。

这些就是所有指令的共同需求。

然后我们再根据指令的不同类别,分析它们的各自需求。

首先我们来看加法和减法指令。这两个指令是R型执行,读写的都是寄存器,所以我们需要寄存器堆这个组件。指令中读取的寄存器是rs和rt,写入的寄存器是rd,所以我们只需要把这3个位域的值连接到寄存器堆的输入上(Ra,Rb,Rw),这样在寄存器堆的输出端,busA就会输出rs寄存器的内容,busB则会输出rt寄存器的内容。然后我们将busA和busB连接到ALU的输入端,并且我们根据指令编码中的操作码和功能位域就可以知道当前是加法还是减法指令,通过ALUCtr控制信号来选择当前ALU提供的运算的类型。然后还要将ALU的输出连接到寄存器堆的输入端,也就是busW。在下一个时钟上升沿到来的时候,如果寄存器堆的写使能信号RegWr是有效的,busW信号上的内容就会写入rd所指定的寄存器中。这样,我们就在一个时钟周期完成了一条加法或减法的指令。

然后我们来看逻辑运算指令的需求。这是一条I型指令,那么刚才建立的数据通路,要满足这条指令的运算,还存在几个问题:1. 目的寄存器是rt而非rd,2. ALU的输入包含一个立即数,3.立即数只有16位。

针对这几个问题,我们要把数据通路进行一个改造。针对问题1,增加一个二选一的多选器,来选择目的寄存器是rd还是rt。针对问题2,增加一个二选一的多选器来选择ALU的输入来自于busB(rt寄存器)还是立即数。针对问题3,增加一个零扩展部件对立即数进行扩展。

这样我们就通过增加两个多选器和一个零扩展部件来满足逻辑运算指令带来的新需求。

然后我们再来看访存指令的需求。访存指令也是I型指令。先来看其中的LOAD指令。LOAD指令中存入的地址是rt寄存器,这个需求已经被满足了。而访问的地址是将rs寄存器的内容+立即数的符号扩展。这里存在的问题是:1. 目前还不支持符号扩展,2. 这个计算得到的地址应该是去访问存储器,从而获得数据,而不是直接连到寄存器堆的写入端。

针对这两个问题,我们继续对数据通路进行改造。针对问题1,将原来的零扩展的部件改造为一个多功能的扩展部件,通过控制信号来控制是进行零扩展还是符号扩展。针对问题2,新增一个数据存储器,这个存储器根据地址就可以得到对应的存储单元中的数据。另外增加一个多选器,控制写入到寄存器中的数据是来自于ALU的输出还是来自于数据存储器。

再来看一下另一条访存指令,STORE指令。这条指令会把rt寄存器的内容写入到数据存储器中。所以数据存储器需要接收一个输入,来自于busB(rt寄存器),当控制信号MemWr有效时,会进行写入的操作。这样我们就满足了STORE指令的需求。

现在除了比较特殊的分支指令之外,我们已经分析了其他指令的需求,并将各个组件连接了起来。再加上之前已经构造的IFU部件,我们就初步完成了数据通路的建立工作。

现在在处理器的设计步骤中,我们已经完成了前三步。后两步将会在后续博客中介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/69348.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何检测勒索软件攻击

什么是勒索软件 勒索软件又称勒索病毒,是一种特殊的恶意软件,又被归类为“阻断访问式攻击”(denial-of-access attack),与其他病毒最大的不同在于攻击方法以及中毒方式。 攻击方法:攻击它采用技术手段限制…

若依 MyBatis改为MyBatis-Plus

主要内容:升级成mybatis-plus,代码生成也是mybatis-plus版本 跟着我一步一步来,就可完成升级! 检查:启动程序,先保证若依能启动 第一步:添加依赖 这里需要在两个地方添加,一个是最…

【C语言】——调试技巧

目录 ​编辑 ①前言 1.什么是Bug? 2.什么是调试? 2.1调试的基本步骤 2.2Release与Debug 3.常用快捷键 4.如何写出好的代码 4.1常见的coding技巧 👉assert() 👉const() const修饰指针: ①前言 调试是每个程序员都…

机器学习前沿:改进自身缺陷,满足新战略

前机械师( 来源) 一、说明 机器学习在人工智能历史上扮演重要角色,然而,存在问题也不少。为了适应新时代和新任务,不做出重大改进是不可能的,本篇就一些突出问题和改进做出讨论。以便读者掌握未来的思路和方向。 二、机…

【Lychee图床】本地电脑搭建私人图床,公网远程访问

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站,可以看做是云存储的一部分,既可…

springboot配置统一返回结果类

目录结构&#xff1a; Result类&#xff1a; package com.xxxx.common.result;import lombok.Data;Data public class Result<T> {//状态码private Integer code;//信息private String message;//数据private T data;//构造私有化private Result() { }//设置数据,返回对…

报文信息转换器

HttpMessageConverter HttpMessageConverter:报文信息转换器&#xff0c;将请求报文转换为Java对象&#xff0c;或将Java对象转换为响应报文。它提供了两个注解和两个类型&#xff1a; RequestBody, ResponseBody, RequestEntity, ResponseEntity(响应用的较多) 准备 创建模块并…

行业追踪,2023-08-30

自动复盘 2023-08-30 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

从一到无穷大 #13 How does Lindorm TSDB solve the high cardinality problem?

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 引言优势挑战系统架构细节/优化存储引擎索引写入查询 经验Ablation Study总结 引言 …

一文速学-让神经网络不再神秘,一天速学神经网络基础(七)-基于误差的反向传播

前言 思索了很久到底要不要出深度学习内容&#xff0c;毕竟在数学建模专栏里边的机器学习内容还有一大半算法没有更新&#xff0c;很多坑都没有填满&#xff0c;而且现在深度学习的文章和学习课程都十分的多&#xff0c;我考虑了很久决定还是得出神经网络系列文章&#xff0c;…

基于边缘物联网关的智慧零售应用方案

推动经济健康发展增长&#xff0c;就要持续促进和扩大消费需求&#xff0c;提升消费体验。随着物联网技术的普及&#xff0c;面向日常消费的智慧零售应用迎来爆发式增长&#xff0c;不仅可以提升消费者消费体验&#xff0c;还可以提高商家营销和管理效率。本篇就为大家简单介绍…

Ubuntu入门04——目录与文件

目录 1.显示当前工作目录 2.更改目录 3.创建工作目录 4.删除工作目录 5.移动文件或者文件夹 6.文件夹and文件查看命令 7. 回到根目录&#xff0c;回到上一级 8.删除工作目录 9.查看目录和文件 10.以树状图列出目录内容 11.文件查找 12.在数据库中查找文件或目录 1…

uni-app:实现右侧弹窗

效果&#xff1a; 代码&#xff1a; <template><view class"container"><button click"showModal true">点击按钮</button><view class"modal-overlay" v-if"showModal" click"closeModal">…

linux并发服务器 —— 项目实战(九)

阻塞/非阻塞、同步/异步 数据就绪 - 根据系统IO操作的就绪状态 阻塞 - 调用IO方法的线程进入阻塞状态&#xff08;挂起&#xff09; 非阻塞 - 不会改变线程的状态&#xff0c;通过返回值判断 数据读写 - 根据应用程序和内核的交互方式 同步 - 数据的读写需要应用层去读写 …

poll epoll初学习

正是select这些缺点&#xff0c;才有了poll 1.I/O多路转接之poll 2.I/O多路转接之epoll 其中的struct epoll_event:

react-grapesjs——开源代码学习与修改(初出茅庐)

文章目录 ⭐前言⭐grapesjs初始化过程&#x1f496; 渲染大体流程&#x1f496; Editor对象 创建&#x1f496; EditorModel 对象创建&#x1f496; load modules 加载定义的目录模块Module&#x1f496; StyleManager渲染过程 ⭐修改grapesjs配置项⭐总结⭐ 如何修改开源代码⭐…

外贸爬虫系统

全球智能搜索 全球智能搜索 支持全球所有国家搜索引擎&#xff0c;及社交平台&#xff0c;精准定位优质的外贸客户&#xff0c;免翻墙 全球任意国家地区实时采集 搜索引擎全网邮箱电话采集 社交平台一键查看采集&#xff08;Facebook,Twitter,Linkedin等&#xff09; 职位…

基于 Flink CDC 构建 MySQL 和 Postgres 的 Streaming ETL

官方网址&#xff1a;https://ververica.github.io/flink-cdc-connectors/release-2.3/content/%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B/mysql-postgres-tutorial-zh.html官方教程有些坑&#xff0c;经过自己实测&#xff0c;记录个笔记。 服务器环境&#xff1a; VM虚拟机&am…

【个人博客系统网站】我的博客列表页 · 增删改我的博文 · 退出登录 · 博客详情页 · 多线程应用

【JavaEE】进阶 个人博客系统&#xff08;4&#xff09; 文章目录 【JavaEE】进阶 个人博客系统&#xff08;4&#xff09;1. 增加博文1.1 预期效果1.1 约定前后端交互接口1.2 后端代码1.3 前端代码1.4 测试 2. 我的博客列表页2.1 期待效果2.2 显示用户信息以及博客信息2.2.1…

Kotlin管道Channel在receiveAsFlow时debounce与flow差异

Kotlin管道Channel在receiveAsFlow时debounce与flow差异 import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.delay import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import kotlinx.coroutine…