单核计算机系统:

CPU架构 性能 cpu架构设计_线性代数

CPU架构 性能 cpu架构设计_数据通路_02

cpu的组成:

CPU架构 性能 cpu架构设计_寄存器_03

CPU架构 性能 cpu架构设计_寄存器_04

如何设计一个处理器?:

CPU架构 性能 cpu架构设计_CPU架构 性能_05

支持简单指令集的处理器实例:

CPU架构 性能 cpu架构设计_补码_06

回顾一下格式:

CPU架构 性能 cpu架构设计_CPU架构 性能_07

CPU架构 性能 cpu架构设计_补码_08

因此我们可以看出我们的需求:

CPU架构 性能 cpu架构设计_补码_09

数据通路组件选择:

CPU架构 性能 cpu架构设计_数据通路_10

我们使用的组件有哪些?:

CPU架构 性能 cpu架构设计_数据通路_11

CPU架构 性能 cpu架构设计_补码_12

risev主要状态单元:存储器:

CPU架构 性能 cpu架构设计_寄存器_13

数据存储器:

CPU架构 性能 cpu架构设计_线性代数_14

指令存储器:

CPU架构 性能 cpu架构设计_补码_15

这个部分是没有写入操作的,说以看起来既较简单。

寄存器组:

CPU架构 性能 cpu架构设计_补码_16

就是之前的那些经常处理的老朋友。

数据通路的需求:

CPU架构 性能 cpu架构设计_补码_17

这一看到数据通路基本上都是和计算和数据存取有关。这些肯定不能改变程序代码对吧,所以之前的指令存储器不能由数据通路修改。

CPU架构 性能 cpu架构设计_寄存器_18

 ALU是计算器:

CPU架构 性能 cpu架构设计_线性代数_19

现在知道为什么指令码里要有func部分了吧?就是用在这里。

设计技巧:

CPU架构 性能 cpu架构设计_补码_20

简单运算:

CPU架构 性能 cpu架构设计_CPU架构 性能_21

减法运算:

CPU架构 性能 cpu架构设计_寄存器_22

X-Y的补码就是X的补码加上-Y的补码。这里的尚且只有一位

CPU架构 性能 cpu架构设计_补码_23

CPU架构 性能 cpu架构设计_数据通路_24

CPU架构 性能 cpu架构设计_线性代数_25

CPU架构 性能 cpu架构设计_线性代数_26

部分指令的数据通路设计:这回是有关指令的了。

CPU架构 性能 cpu架构设计_CPU架构 性能_27

CPU架构 性能 cpu架构设计_补码_28

我们现在是在第三步。

不管是什么指令,肯定都要取指:

CPU架构 性能 cpu架构设计_数据通路_29

肯定也要更新pc:

CPU架构 性能 cpu架构设计_寄存器_30

这里解释一下pc是啥:pc就是程序计数器(program counter),不然怎么记录自己运行到哪一行指令了。一个指令4个字节,所以一般是加4.当然也可以直接跳转:

CPU架构 性能 cpu架构设计_CPU架构 性能_31

 比如我们要实现一个add指令:

CPU架构 性能 cpu架构设计_线性代数_32

我们首先要取指:

CPU架构 性能 cpu架构设计_数据通路_33

译码:

CPU架构 性能 cpu架构设计_数据通路_34

 计算:

CPU架构 性能 cpu架构设计_补码_35

算完了当然就要存回寄存器:

CPU架构 性能 cpu架构设计_CPU架构 性能_36

总结的时序图:

CPU架构 性能 cpu架构设计_补码_37

实现减法器:

CPU架构 性能 cpu架构设计_线性代数_38

CPU架构 性能 cpu架构设计_CPU架构 性能_39

 

CPU架构 性能 cpu架构设计_数据通路_40

 

I形指令:

CPU架构 性能 cpu架构设计_线性代数_41

 

CPU架构 性能 cpu架构设计_数据通路_42

 

这个是add的模型,但是我的addi没有rs2,怎么办?:

CPU架构 性能 cpu架构设计_补码_43

 

通过这个Bsel来控制使用rs2还是立即数。

immGen是拿来干嘛的?是符号扩展的:

CPU架构 性能 cpu架构设计_CPU架构 性能_44

 

这样我们就可以制造R形和I形公用的数据通路了:

CPU架构 性能 cpu架构设计_数据通路_45

 

还有特殊的I形指令:load

CPU架构 性能 cpu架构设计_补码_46

 

我们现在来想想怎么再加上这个部分:

CPU架构 性能 cpu架构设计_寄存器_47

 

DM可以把rs1和imm加起来得到的地址对应的数据取出来,然后通过MUX选择是要地址还是数据(这里当然是数据,只是如果不加这个部件那你以后就再也不能用R形和imm加法了)。

这样load指令也就解决了。

CPU架构 性能 cpu架构设计_CPU架构 性能_48

 

 现在来看看s指令:

CPU架构 性能 cpu架构设计_线性代数_49

记得吗?s指令的rs1是在汇编代码里右边的那个,是存储地址的那个。

CPU架构 性能 cpu架构设计_CPU架构 性能_50

 

因为和之前的数据通路是一脉相承的嘛,和load一样是用rs1和立即数的和来算地址。不过这个地方注意DM有时钟了——存储要时钟,读取不要。

CPU架构 性能 cpu架构设计_数据通路_51

 

S形也o了,现在来看B形:

CPU架构 性能 cpu架构设计_线性代数_52

 

CPU架构 性能 cpu架构设计_线性代数_53

 

CPU架构 性能 cpu架构设计_补码_54

 

 

 用加法器计算Pc加imm,就得到了下一步的指令地址(假如要跳转的话)。这里详细解释一下BranchComp(分支比较):

CPU架构 性能 cpu架构设计_寄存器_55

 

CPU架构 性能 cpu架构设计_寄存器_56

特殊的I形指令:jalr(一个寄存器,一个立即数,还有一个目的寄存器,所以是I形指令):

CPU架构 性能 cpu架构设计_CPU架构 性能_57

 

CPU架构 性能 cpu架构设计_补码_58

 

CPU架构 性能 cpu架构设计_寄存器_59

 

jal则是j形指令(因为它没有寄存器) :

CPU架构 性能 cpu架构设计_CPU架构 性能_60