irpas技术客

RISC-V单周期处理器设计(基本介绍和数据通路)(一)_小张爱学习哦_单周期处理器

irpas 6876

一、设计步骤

1.处理器设计的基本规范:指令

包括处理器需要具有那些功能,需要注意的是处理器的功能是由指令唯一确定。

2.处理器设计方案(包括数据通路和控制器)

数据通路:指令执行过程中,数据所经过的路径,包括路径中的部件。它是指令的执行部件。

控制器:对指令进行编码,生成指令对应的控制信号,控制数据通路的动作。并且能对执行部件发出控制信号。是指令的控制部件。

二、常见类型指令的数据通路

每种指令的介绍可以参考我上一篇博客关于RISC-V指令集介绍

这里的数据通路包括:R型,I型,S型,B型,J型指令

1.R型数据通路

首先了解个个部件:

PC:程序计数器,单周期就是就是每个周期执行一条指令,每条指令执行完 PC+4(32位)到下一条指令

IM:指令存储器,我们写的一条条指令就放在指令存储器中,通过PC来判断取到了那一条指令。

RF:寄存器堆,R型指令包括三个寄存器 RS1,RS2,Rd。

ALU:运算单元,输入两个寄存器中的数据,通过ALU运算,将计算结果写回到Rd中。

R型指令:寄存器对寄存器操作。数据通路运行如下:通过clk控制pc从IM中取指令,指令送入寄存器堆(RF)中,从寄存器堆(RF)中取出数据送入运算单元(ALU)进行运算,运算结果重新存储到寄存器堆(RF)中。


I型数据通路

?需要注意:我们是要设计一个支持多种指令的数据通路,因此I型不要有新的数据通路,而是要在R型指令的基础上有一点小的改变实现。

首先讲解I型指令:立即数与寄存器操作,或者访问存储器操作。两者的区别在于访存类指令是把存储器中的值写回寄存器堆,而其他类型I型指令是把ALU运算结果写回到寄存器堆。

添加的部件

1.存储器模块(DM):通过ALU计算出访存地址,从存储器中去除数据放入寄存器堆中。

2.立即数生成模块(EXT):从数据通路中提取出立即数。注意不同类型的指令立即数存储格式不太一样,这个在我指令集那一篇博客中有讲解。

2.选择器:两个选择器,一个是送入ALU中数据的选择器,第二个是DM和ALU计算结果的选择。

I型指令:立即数与寄存器堆操作。数据通路如下:通过clk控制pc从IM中取指令,指令送入寄存器堆(RF)和立即数生成单元(EXT)中,从寄存器堆(RF)中取出数据与立即数生成单元(EXT)数据共同进入运算单元(ALU)进行运算,运算结果通过选择器直接(或者访存,将内存中数据)写回寄存器堆。


S型指令数据通路

解释:S型指令与访存类指令其实是一个相反的过程,S型指令是把ALU结果存储的存储器(DM)中去(S型指令不需要写会寄存器堆,也不需要增加其他模块)。

S型指令:将rs2寄存器中的值存储到rs1寄存器偏移立即数位地址中去。数据通路如下:通过clk控制pc从IM中取指令,指令送入寄存器堆(RF)和立即数生成单元(EXT)中,从寄存器堆(RF)中取出数据与立即数生成单元(EXT)数据共同进入运算单元(ALU)进行运算,运算结果作为写入DM的地址,而写入地址中的值是另一个寄存器中的值,具体可以观察上图数据通路。


B型数据通路

??B型指令主要是条件跳转,满足条件要经行跳转,这里跳转实际上是PC指针的跳转(可以想象C语言函数的调用),因此需要比较是否满足条件,还有PC=(PC+立即数)或者(PC+4)。

添加的部件

CMP:比较部件,比较两个寄存器中的值是否相等,是否满足跳转的条件。

两个选择器:一个是判断PC=(PC+立即数)还是(PC+4)。另一个是判断送入A(RS1寄存器中的值)还是PC的值进入ALU。

B型指令:判断两个寄存器值关系(大于,小于,或者相等),满足对应指令条件,PC跳转。数据通路:通过clk控制pc从IM中取指令,指令送入寄存器堆(RF)和立即数生成单元(EXT)中,判断两个寄存器中数据的关系,满足条件PC跳转到PC+立即数位置去,不满足条件则不跳转。


J型数据通路

只增加了蓝色的那一条线

这里很好理解,J型与B型的区别在于,B型是有条件跳转,而J型则是无条件跳转,同时J型需要把PC+4存储到寄存器堆中。

J型指令:将pc+4存储到rd寄存器中,同时pc跳转到pc+立即数位置去。数据通路不在解释,与上面类似。

改进:这几天思考我向pc+4和pc+立即数这样的操作其实没必要使用ALU来完成,不如直接使用一个加法器实现,因此对上面的数据通路做了一个小的改变(主要是写代码的是否变了)

?

总结

上文中主要讲解了,RISC-V的数据通路基本部分,但是我们发现上面有很多的选择器,而每个选择器其实都要有对应的控制信号,那这些控制信号怎么产生那?还有这么多条指令,有如何识别对应的指令那?这就需要说的另一个重要组成部分,控制器。它是负责给数据通路对应的控制信号,同时判断指令类型的。下一篇博客我将会讲解我自己学习控制器的部分。

我对学习RISC-V踩过的坑:不要一上来就急于直接看代码。学习RISC-V时,首先要理解RISC-V指令集,我的上一篇博客就是讲解自己理解的一些基本指令集,接下来就是要学习各种指令类型对应的数据通路。接下来理解控制器。最后就是各各模块的代码编写了。后续我也会把自己各各模块写入博客,期待大家的关注。

上文的数据通路也是我自己查资料,看视频理解的,可能存在一些错误,还望各位指点。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #单周期处理器