自己动手画cpu系列 建设中ing 仅供参考!
在这首推华中科技大学计算机组成原理实验课mooc连接
初衷:在mooc上看见了本课觉得超赞,本人已完成了课中所有的实验,在做实验的过程中有时候实验会没有思路或者有些bug会浪费很多时间,目前呢也没找到完整的答案,所以做了份自己的答案给大家困惑的时候一份参考(大神请忽视,我自己也就一弱鸡),也就给大家卡壳的时候能有个找灵感的地方,请先独立思考,切勿抄袭。

    • 数字逻辑基础
    • 数据表示实验
    • 运算器设计
    • 存储器设计
    • MIPS CPU
      • MIPS CPU必备基础知识
      • 8指令单周期MIPS32 CPU
      • 8指令多周期(微指令)MIPS32 CPU
      • 8指令多周期(硬布线)MIPS32 CPU
      • 24条指令5级流水MIPS32 CPU

hu~,终于完成了,真是费劲呐
支持24条指令,5级流水线,可以对分支指令处理,寄存器冲突处理,指令ROM为1K,数据RAM为1M,32位MIPS指令集CPU
但是…
大量使用比较器造成硬件开销巨大,测试一下发现这尼玛真是个老爷车还没单周期跑的快,自己电脑cpu占百分之八九十只能跑到20多赫兹,一个走马灯跑了半天,可优化空间太大了,写了那么多天造成这个破样,有点悲剧。。。
先放个图大伙参考就行了,要是有人想听思路的话接下来再更
支持24条指令的32位mipscpu
更新:
说实在的虽然自己很烂,但是做完成就感爆棚有木有

跑马灯gif:
在这停留几秒才会显示,前面多录了几帧
在这里插入图片描述
这个是最终版本,建议先不要一上来就写流水线这个,有时间的最好把前面的实验都做做,最起码也要把前面单周期,多周期的做一下,要不然确实有些困难。

按我的步骤是硬布线控制器设计->流水接口设计->cpu框架设计->分支指令处理->寄存器冲突处理

一、 硬布线控制器的设计:
参照前面单周期的控制器,只不过这个是24指令的,如图:
在这里插入图片描述
①运算器控制信号设计:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
按照老师给excel表填写完整,运算器部分需把ALU_OP那一列填写完整,运算器规格如下:
在这里插入图片描述
按照不同信号填写不同运算功能就行了
②控制信号生成:
就是ALU_OP后那几列控制信号,如上表填写,这个参照单周期24指令的控制信号,是一样的。
最后把逻辑表达式填入logisim中自动生成电路

ps:关于指令控制信号如何填写,首先把大体框架搭好就是按照取码、译码、执行、访存、写回每部分的逻辑器件先搭好,控制信号基本上控制的多路选择器,老师mooc上也有给出大体框架图,参照这些写出,还是最好把单周期的先做了😂
在这里插入图片描述
二、 流水接口设计:
参照数据表示实验中的流水接口,实际上就是一堆寄存器如下图这样
在这里插入图片描述
五级流水线需要四个接口分别为IF/ID ID/EX EX/MEM MEM/WB对应
|________ |________ |________ |________ |________ |
|<- 取码 -> |<- 译码 -> |<- 执行 -> |<- 访存 -> |<- 写回 -> |
这五个阶段,接口作用就是传递下一周期所需要的值,有了接口才能流水线运作
在这里插入图片描述
一开始看这个图的时候我也搞不清每个控制信号,刚开始我感觉有些控制信号是多余的,事实证明我是错的,上面每个信号都不是多余的甚至你还需要增加些,当然这需要多次调试才行。
每个接口的寄存器看下一阶段需要哪些控制信号了,下面是我的接口设计:

IF/ID
在这里插入图片描述

ID/EX
在这里插入图片描述
在这里插入图片描述

EX/MEM
在这里插入图片描述

MEM/WB
在这里插入图片描述

至此理想流水线是完成了,现在不支持跳转指令以及寄存器不能使用冲突。
这里补充下寄存器冲突是什么意思,实际上mooc上也有讲,就是在译码阶段这条指令是add $s1,$s2,$s4同时在执行阶段的指令是add $s4,$s1,$s3
按理说应该是执行阶段的指令先执行也就是s4=s1+s3,但是下一周期译码阶段取的s4是还没变化的。

分支指令处理,寄存器冲突处理待更…

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐