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

news2024/11/25 0:02:01

课程链接:

计算机组成_北京大学_中国大学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.coloradmin.cn/o/977701.html

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

相关文章

1343. 大小为 K 且平均值大于等于阈值的子数组数目

1343. 大小为 K 且平均值大于等于阈值的子数组数目 C代码&#xff1a;滑动窗口 // 窗口长度固定、返回窗口平均值>threshold的窗口个数int numOfSubarrays(int* arr, int arrSize, int k, int threshold){int cnt 0;int l 0;int sum 0;for (int r 0; r < arrSize; r…

轻松制作玩具小程序商城

随着移动互联网的快速发展&#xff0c;小程序成为了各行各业的新宠儿。想要快速搭建一个属于自己的小程序商城吗&#xff1f;乔拓云平台将为你提供最简单的解决方案。下面就跟随我的步骤&#xff0c;一起来学习如何搭建一个玩具小程序商城吧&#xff01; 首先&#xff0c;我们需…

微机原理与技术(2)8086微处理器

8086微处理器 考点介绍功能和介绍后续会继续更新&#xff0c;点赞follow me继续学习 考点介绍 考点一: 掌握8086/8088CPU的功能构成及流水线技术&#xff0c;理解流水线管理规则。2.1 8086/8088 CPU的功能构成2.2 8086/8088CPU的流水线技术考点二:掌握8086/8088CPU寄存器的组成…

论文阅读_大模型_ToolLLM

英文名称: ToolLLM: Facilitating Large Language Models to Master 16000 Real-world APIs 中文名称: TOOLLLM&#xff1a;帮助大语言模型掌握16000多个真实世界的API 文章: http://arxiv.org/abs/2307.16789 代码: https://github.com/OpenBMB/ToolBench 作者: Yujia Qin 日期…

第66步 时间序列建模实战:ARIMA建模(SPSS)

基于WIN10的64位系统演示 一、写在前面 从这一期&#xff0c;我们使用SPSS进行SARIMA模型的构建。 同样&#xff0c;使用某省2005年1月至2016年12月AIDS死亡率的时间序列数据。 二、SPSS建立SARIMA实战 &#xff08;1&#xff09;录入数据和格式调整 双击打开IBM SPSS Sta…

Android 在TextView前面添加多个任意View且不影响换行

实现效果如下&#xff1a; 如上&#xff0c;将头像后面的东西看作一个整体&#xff0c;因为不能影响后面内容的换行&#xff0c;且前面控件的长度是可变的&#xff0c;所以采用自定义View的方法来实现&#xff1a; /*** CSDN深海呐 https://blog.csdn.net/qq_40945489/articl…

通俗易懂讲解大模型:Tokenizer

Tokenizer Tokenizer 是 NLP pipeline 的核心组件之一。Tokenizer 的目标是&#xff1a;将文本转换为模型可以处理的数据。模型只能处理数字&#xff0c;因此 Tokenizer 需要将文本输入转换为数字输入。 通常而言有三种类型的 Tokenizer &#xff1a;Word-based Tokenizer、Cha…

【漏洞复现】广联达办公OAsql+文件上传+弱口令

漏洞描述 广联达办公OA是一款综合办公自动化解决方案,旨在提高组织内部的工作效率和协作能力。它提供了一系列功能和工具,帮助企业管理和处理日常办公任务、流程和文档。默认弱口令admin password,后面就不提了。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当…

Unity 引擎中国版 “团结引擎” 发布

导读Unity 官方宣布&#xff0c;Unity 中国正式推出 Unity 中国版引擎 —— 团结引擎&#xff0c;同时也开启了 Unity 中国本土化进程的全新篇章。作为推动团结引擎落地的核心人物&#xff0c;Unity 中国 CEO 张俊波称致力于将其打造为一款更懂中国开发者的引擎。 团结引擎以 U…

JavaScript基础06——let和var两个关键字有啥不同

哈喽&#xff0c;小伙伴们大家好&#xff0c;我是雷工&#xff01; 每日学习一点点&#xff0c;今天继续学习JavaScript基础知识&#xff0c;下面是学习笔记。 1、变量的本质 内存&#xff1a;计算机中存储数据的地方&#xff0c;相当于一空间。 变量的本质&#xff1a;是程序…

论文阅读:SERE: Exploring Feature Self-relation for Self-supervised Transformer

Related Work Self-supervised 学习目的是在无人工标注的情况下通过自定制的任务&#xff08;hand-crafted pretext tasks&#xff09;学习丰富的表示。 Abstract 使用自监督学习为卷积网络&#xff08;CNN&#xff09;学习表示已经被验证对视觉任务有效。作为CNN的一种替代…

poll epoll初学习

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

[计算机入门] 项目的压缩与解压缩

3.6 项目的压缩与解压缩 有几个原因使得我们要将文件压缩打包&#xff1a; 节省存储空间&#xff1a;压缩文件能够减小文件的体积&#xff0c;从而节省存储空间。尤其是对于多个大型文件或文件夹进行打包压缩时&#xff0c;可以显著降低所需的存储容量。方便传输&#xff1a;…

gRpc入门

gRpc 一、简介 1、gprc概念 gRpc是有google开源的一个高性能的pc框架&#xff0c;Stubby google内部的rpc,2015年正式开源&#xff0c;云原生时代一个RPC标准。 tips:异构系统&#xff0c;就是不同编程语言的系统。 2、grpc核心设计思路 grpc核心设计思路1. 网络通信 --&g…

C++ string

目录 string类介绍访问&#xff1a;[ ] 遍历迭代器遍历范围for遍历 容量相关&#xff1a;修改相关&#xff1a;编码表的了解写时拷贝的了解string的模拟 STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&a…

【Linux】高级IO --- 多路转接,select,poll,epoll

所有通过捷径所获取的快乐&#xff0c;无论是金钱、性还是名望&#xff0c;最终都会给自己带来痛苦 文章目录 一、五种IO模型1.什么是高效的IO&#xff1f;&#xff08;降低等待的时间比重&#xff09;2.有哪些IO模型&#xff1f;哪些模型是高效的&#xff1f;3.五种IO模型的特…

【韩顺平 零基础30天学会Java】面向对象编程(基础)(5days)

面向对象编程 Java设计者引入类与对象&#xff08;OOP&#xff09;&#xff0c;根本原因就是现有的技术&#xff0c;不能完美的解决新的需求。 对象主要是由属性和行为构成的。 类就是数据类型&#xff08;比如Cat&#xff09;&#xff0c;对象就是具体的实例。 //定义一个猫…

QT转型Visual Studio(qmake项目到cmake项目的移植)

前言 由于工作需要&#xff0c;同时也为了方便以后的集成升级&#xff0c;希望将之前用Qt creator qmake开发的项目移植到cmake项目中&#xff0c;并使用Visual Studio 进行后续开发&#xff0c;本文主要用以记录该过程中的常规步骤和遇到的特殊情况。 qmake项目 在一开始&a…

MATLAB 的 figure 用法总结

文章目录 Syntax&#xff1a;DescriptionExamples1.figure2.figure(Name,Value)Position 属性: 设置 Figure 的位置和大小Name 属性: 设置 Figure 的名称NumberTitle 属性: 取消 Figure 名称里默认的数字units 属性color 属性 3.f figure(___)4.Working with Multiple Figures…

JAVA反序列化漏洞复现

Weblogic&#xff08;CVE-2017-10271&#xff09; 拉取容器 访问 http://192.168.142.151:7001/console/login/LoginForm.jsp ​ 启动nacs 进行漏洞扫描 下载weblogicScanner工具 git clone https://github.com/0xn0ne/weblogicScanner.git 开始扫描 访问http://192.168.1…