educoder计算机原理实训
第1关:指令存储器及数据存储器件
先把环境配置好
根据要求把这个文件复制到download里就行了
用Ripes工具,将汇编代码转换成机器码:
根据对指令存储器中的值进行修改方法,进行修改
先把数据写到txt中
再在编辑中打开
选择hex即可
可以看到指令已经显示
即可通过
第2关:寄存器文件
将reg用译码器分成32条线路(选择位为5),并连上使能端
分到32个寄存器,每个寄存器都连接写入数据和时钟,当调用这个寄存器时,进行写入,在时钟上升沿变化
0寄存器单独连32位常数0写入
用多路复用器输出到read1和read2,选择read1和read2得到结果
参考:https://blog.csdn.net/Mr_Fmnwon/article/details/130821431?spm=1001.2014.3001.5501
第3关:立即数扩展部件
按照上边两个表连接即可 ,大概就是这么个意思如下图,剩下的其他节点都要连上I型(下图没有连)
第4关:基础数据通路及控制器设计(仅支持 RV32I 中的 I 类型运算类指令)
先把总体连好
要把Regs的所有输入输出接口都接上,否则无法写入或无法通过(需要输入xb并读入B)
接上以下接口
接好后如下图
注意rs2需要自己先从inst里取好,是inst[24:20]
然后看control
有几个关键点
就是下面这两个东西是一定的
然后就是inst要根据指令的不同来改变ALUSel的值,不过还算是简单吧只有两个指令是不一样的
sub和sral
对于SRAI、SRA:
当funct3是101时,次高位是1(第30位),则为SRA
对于SUB:
当opcode为0110011时(第五位是1),为sub
参考:http://dg.064100.net/qianru/riscv/2022-08-12/445.html
综上,只需要判断指令是不是减法或者右移再计算正确的ALUSel即可。
不过其实并不用判断是不是sub(不是I型)只能是为之后作铺垫吧,接5的线应该可以直接接0,不过i型5也总是0,哈哈
下图是我多此一举了,还能改进,懒得改了这题写好久
第5关:增加对 R 类型运算指令的运行支持
按这个图连接
在control中设置好以下参数(BSel在datapath里设置)
主要是ALUSel吧,结合上一关的铺垫,加一个判断,在已有判断左右移的基础上加一个判断sub和add的判断
判断其是不是0001,1时opcode的第五位,个人感觉是很巧妙的,用这四位就能判断是加、减或左右移(甚至I、R型都搞定了)
稍微把他弄好看一点
用隧道从inst得到几个要输入的参数和BSel即可
第6关:增加对 S 类型和 I 类型访存指令的运行支持
只需要照着上边连就行其他都和上一关一样,唯一要注意的就是这个
主要是control需要动动脑子
在第五关的基础上添加了一个识别opcode的模块如下
但有些判断也不是很严谨,仅仅可以实现题目的所有指令(就几种指令,很多输出只有一个判断就能知道),可能后面还要改动
第7关:增加对 B 类型条件跳转指令的运行支持
只需要满足下表条件即可
设计出control电路图(建议自己思考,有好多方法可以写,只需要满足条件就行),看上去很复杂,实则很简单,就是一些判断罢了。比较模块我是先进行比较,通过funct3指令选择对应指令的结果,再看是不是b指令,是就输出结果,不是就置0。
datapath就根据下图连接就行,只有部分需要改动和添加。记得把reg1和reg2给放进去
第8关:增加对 J 类型和 I 类型跳转链接指令的运行支持
注意这段!!!后面给的表上少了一些信息(对于ALU和PCSel的设置上),测试了好久才发现。。。
方法都和之前一样
照着图连,这个图基本上都不会连错
主要是control。这里做一个更正,之前的ALU没有考虑到I、R类型的一些情况,这里做了一点改动进行完善,但总的还是没有太大变化的。添加了JAL和JALR的部分,还有按照题目所给的控制信号的取值完成电路的设计,哎就是那一段话没有注意看,本来可以写快一点的。
第9关:增加对 U 类型长立即数处理指令的运行支持
按照图连就行
方法都和上边一样,就多了两个U指令的判断,题目错误也已经更新改对了(跟着控制信号取值的那个表做就行了,方法都可仿照上边几关)。可以说没有啥难度,自己做吧
如何找到错误
可以先复制指令
然后写到这里边(或者直接在图形化界面查看),就可以知道这条指令是啥了,然后可以大概判断是哪一个模块出错
然后再在control里边写入inst(写完也不用改回原来的值,也能通过)
用这个手指就可以看所有数据了
假如运算结果是错的,大概率ALUSel是错的
还有就是看指令类型对着信号取值表和control最左边那一栏比较
仅做参考,麻烦各位同学有自己的思考哟(~_~^)