自建站有哪些站点,视频号关键词搜索排名,汕头网站安全开发系统,flash网站整站下载课程链接#xff1a; 计算机组成_北京大学_中国大学MOOC(慕课) 5 - 1 - 501-处理器的设计步骤#xff08;14-49--#xff09;_哔哩哔哩_bilibili 处理器#xff0c;或者说是CPU#xff0c;是现代计算机中最为复杂的一个部件。不过先不要劝退#xff0c;要设计一个简单但是… 课程链接 计算机组成_北京大学_中国大学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。如果不等则新的PCPC4。
因此分支指令的需求首先是要能否比较两个寄存器的内容并判断是否相等。然后还需要PC寄存器支持两种自增的方式。一种是4一种是一个立即数。前者对于之前提到的其他指令也都是需要的。
2. 根据需求选择合适的组件
我们把之前提到的需求总结一下就可以得到对组件的需求。 选择了上述合适的组件后我们就可以开始着手建立数据通路的工作了。
3. 连接组件建立数据通路
要建立数据通路基本原则是分析指令系统中的每一条指令根据其需求连接组件从而建立数据通路。那么指令的需求又分为两大类一类是所有指令的共同需求另一类是不同指令的不同需求。
首先我们来看所有指令的共同需求。
首先需要取指令。指令是放在存储器中的要从存储器中取得指令需要一个地址这个地址则是存放在PC寄存器中。我们已经有了一个32位的PC寄存器我们就把PC寄存器的输出连接到指令存储器而指令存储器则根据地址的输入选中对应的存储单元并将其内容输出。这样我们就得到了所需指令的二进制编码。 那除了取得当前的指令之外我们还需要为下一条指令做准备这就需要更新PC寄存器。这又分成了两种情况。
大多数时候指令是顺序执行的这种情况下PC只要加上当前指令的长度就可以得到下一条指令的地址。在MIPS指令系统中每一条指令都是4个字节的所以PCPC4。那在我们刚才的结构上面需要增加一个简单的加法器实现PC4的操作。这样当前PC寄存器的内容既会送到指令存储器获得指令编码又会送到加法器从而计算出一个PC4的值在下一个时钟上升沿来临时PC寄存器就会将PC4的值存入其中然后再将这个更新后的内容送到指令存储器和加法器如此周而复始。 而如果遇到分支指令那下一条指令的地址就不是简单的PC4而是由分支指令进行指定。因此还需要继续修改这个结构。我们需要增加一个二选一的多选器在顺序执行时我们选择这个多选器的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而非rd2. ALU的输入包含一个立即数3.立即数只有16位。
针对这几个问题我们要把数据通路进行一个改造。针对问题1增加一个二选一的多选器来选择目的寄存器是rd还是rt。针对问题2增加一个二选一的多选器来选择ALU的输入来自于busBrt寄存器还是立即数。针对问题3增加一个零扩展部件对立即数进行扩展。 这样我们就通过增加两个多选器和一个零扩展部件来满足逻辑运算指令带来的新需求。
然后我们再来看访存指令的需求。访存指令也是I型指令。先来看其中的LOAD指令。LOAD指令中存入的地址是rt寄存器这个需求已经被满足了。而访问的地址是将rs寄存器的内容立即数的符号扩展。这里存在的问题是1. 目前还不支持符号扩展2. 这个计算得到的地址应该是去访问存储器从而获得数据而不是直接连到寄存器堆的写入端。
针对这两个问题我们继续对数据通路进行改造。针对问题1将原来的零扩展的部件改造为一个多功能的扩展部件通过控制信号来控制是进行零扩展还是符号扩展。针对问题2新增一个数据存储器这个存储器根据地址就可以得到对应的存储单元中的数据。另外增加一个多选器控制写入到寄存器中的数据是来自于ALU的输出还是来自于数据存储器。 再来看一下另一条访存指令STORE指令。这条指令会把rt寄存器的内容写入到数据存储器中。所以数据存储器需要接收一个输入来自于busBrt寄存器当控制信号MemWr有效时会进行写入的操作。这样我们就满足了STORE指令的需求。 现在除了比较特殊的分支指令之外我们已经分析了其他指令的需求并将各个组件连接了起来。再加上之前已经构造的IFU部件我们就初步完成了数据通路的建立工作。 现在在处理器的设计步骤中我们已经完成了前三步。后两步将会在后续博客中介绍。