实现为单周期MIPS增加可运行指令,以增加“按位与”and指令为例(基于logisim)
主要就只需要对控制器内部做修改,因为主电路各部分是完全具备运行条件的
修改前的控制器内部
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/cdd1f7e380e4f4888210b49c4cd31c76.png)
原MIPS电路中已经包含了两种R型指令add和slt,对于是否为R型的判断前面已经有了(即通过判断OP为00时)所以无需修改
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c77236c7619ba0ce5788942990bef297.png)
然后就是进行一个进一步是运行R性指令而不是退出的判断操作,只是多了一种情况,所以加个“或”门分支就可以了
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d531a34ff7fa898589da57599893757e.png)
然后呢其实增加一个按位与指令and无非就是改一下func字段的判断条件,改成and对应代码的16进制值做“比较判断”,来进一步确定是做and的R型指令(通过查找文档我们得知那个16进制值为24)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f2f673e7edecff6f6b3b70a96cba7d65.png)
最后输出ALU_OP前多一个二选一,即and=1时输出相对应的ALU_OP值7,否则进行之前具有的add或slt运算,因而也完全不会影响原本具有的功能。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9dd387b686cdd9b50b84585938359228.png)
然后让我们来测试一下
我写了一段代码,如下:
addi $1,$0,15
and $3,$0,$1
and $4,$1,$1
addi $v0,$0,10
syscall
上述代码写为16进制呢,得到:
2001000f
00211824
00012024
2002000a
0000000c
预期结果:
0000 000f和0000 000f做与运算,故3号寄存器值应为0000 000f
0000 000f和0000 0000做与运算,故4号寄存器值应为0000 0000
测试截图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/8683fc979c40f0d67bf03c1f0a69dbec.png)