单核计算机系统:
cpu的组成:
如何设计一个处理器?:
支持简单指令集的处理器实例:
回顾一下格式:
因此我们可以看出我们的需求:
数据通路组件选择:
我们使用的组件有哪些?:
risev主要状态单元:存储器:
数据存储器:
指令存储器:
这个部分是没有写入操作的,说以看起来既较简单。
寄存器组:
就是之前的那些经常处理的老朋友。
数据通路的需求:
这一看到数据通路基本上都是和计算和数据存取有关。这些肯定不能改变程序代码对吧,所以之前的指令存储器不能由数据通路修改。
ALU是计算器:
现在知道为什么指令码里要有func部分了吧?就是用在这里。
设计技巧:
简单运算:
减法运算:
X-Y的补码就是X的补码加上-Y的补码。这里的尚且只有一位
部分指令的数据通路设计:这回是有关指令的了。
我们现在是在第三步。
不管是什么指令,肯定都要取指:
肯定也要更新pc:
这里解释一下pc是啥:pc就是程序计数器(program counter),不然怎么记录自己运行到哪一行指令了。一个指令4个字节,所以一般是加4.当然也可以直接跳转:
比如我们要实现一个add指令:
我们首先要取指:
译码:
计算:
算完了当然就要存回寄存器:
总结的时序图:
实现减法器:
I形指令:
这个是add的模型,但是我的addi没有rs2,怎么办?:
通过这个Bsel来控制使用rs2还是立即数。
immGen是拿来干嘛的?是符号扩展的:
这样我们就可以制造R形和I形公用的数据通路了:
还有特殊的I形指令:load
我们现在来想想怎么再加上这个部分:
DM可以把rs1和imm加起来得到的地址对应的数据取出来,然后通过MUX选择是要地址还是数据(这里当然是数据,只是如果不加这个部件那你以后就再也不能用R形和imm加法了)。
这样load指令也就解决了。
现在来看看s指令:
记得吗?s指令的rs1是在汇编代码里右边的那个,是存储地址的那个。
因为和之前的数据通路是一脉相承的嘛,和load一样是用rs1和立即数的和来算地址。不过这个地方注意DM有时钟了——存储要时钟,读取不要。
S形也o了,现在来看B形:
用加法器计算Pc加imm,就得到了下一步的指令地址(假如要跳转的话)。这里详细解释一下BranchComp(分支比较):
特殊的I形指令:jalr(一个寄存器,一个立即数,还有一个目的寄存器,所以是I形指令):
jal则是j形指令(因为它没有寄存器) :