用csdn查计算机组成原理很久了,但是总是很痛苦,因为各种不能运行,我这次闲着把自己写的电路图传上来,参考过网络资源和学校给的数据,但是有的地方我自己没好好学,也解释不明白。
先做运算控制器和控制信号自动生成。
运算控制器:
这里有两张图,
根据这两张图,一个个对,获得对应指令,不同操作下的ALU_OP值,如果找不到就是没有,就写“X”。填入下面的表格的框里。
然后控制信号表达生成里面就有了ALU_OP的s3,s2,s1,s0的真值生成表达式,然后复制到lologisim里面就行了。
控制信号:
这里华科的没有给控制信号,因为听说是谭志虎老师想让学生自己动手查,我们老师给了,但是因为和网上一些资源有一定程度的出入,我无法保证他的完全正确。我自己做了几个修改后能正常跑马灯 ,我就完全按照他的来了,然后添了一个信号。
上表:
就是如果右边部分控制信号栏里面的有这个信号,就在表格里面置1,当然ALU_OP不用管,它是上一个元件里面完成了。
注意:我在23行LW里面添了一个ALU_SRCB,图里面没有。
上图:
然后,把生成的表达式逐个填到logisim里面这趴完成了。
然后上cpu电路图:
目前在网上看见了三个这个电路图,一个知乎的和csdn上面的一个哥们的很像,但是有点问题,一个是syscall那边连的数字是22H,另一个是在底下立即数0-25那里原理上是左移两位后左边接上pc高四位,或者PC =PC31..28 || instr_index|| 00,当然深究都是6个0,只是原理问题。
还有另一个csdn上的图,全是散图的哥们,那个比较完整,但是和我的控制信号不一样,所以有点出入。
注意:这张图有两个时钟,不能都连,
第二个按下控制位能暂停时钟周期。如果都连,就会变红。选一个就行。
一个跑马灯跑完后,按下go键,重新跑。
下面是我写的24个指令的运行原理,复杂冗长,而且不完整,或者不正确,因为我不知道regfile的原理,所以这部分都摸棱两可。
SLL:指令从随机存储器出来,不是其他指令,直接一路通过pc,到指令存储器,到分线器,分为多个字段。作为R型指令有ALU_OP=0000,和RegWrite,RegDst有信号,syscall无信号,那么RS,RT字段直接进入,R1#,R2#,RegDst有信号,选择Rd进入W#,否则选择Rt进入W#,Rd作为目的寄存器,不参与。信号从R2出来,进入选择器,没有ALUSRCB信号,不选择,进入Alu。与此同时,分线器shamt段信号进入ALU,在ALU_OP作用下产生想坐偏移。不是bne,beq指令,也就是“=”没有信号。出来后,进入随机寄存器,进入对应地址,R2产生分支进入D,因为没有memwrite,所以有数据就不写,没数据就填写。没有MemToReg信号,选择刚才从D进去的数据,也就是R2,就是RT的数。没有JAL信号,直接出来,返回din,回写,没有Regwrite,写到rd段。
而另一边,,因为不是syscall信号,ledout无信号,那么leddata无数据。而halt无信号,回到pc,halt的非为有信号,可以进入下一个周期。总周期数那里的halt同样的道理。
SRA:思路同上,只不过最后,因为ALU_OP不一样,选择了向右偏移。
SRL:同上。
ADD:R型指令因为部分控制信号只有AlU_OP不同,另外两个都是RegWrite,RegDst
所以前半段都相同,而在进入ALU后,因为ALU_OP的不同所以变化。这里ADD指令,进入ALU后,在ALU_OP作用下,R1和R2相加,也就是Rs和Rt相加,信号出来,没有等于信号,不写入。R2分支D进入。Ledout无信号,leddata无数据。下一个。
ADDU:同上,不过不考虑overflow;SUB:同上,不过从加变成了rs-rt;AND:同上,变成了“与”OR:同上,变成“或”NOR:同上,不过时“或非”10.SLT:同上,如果rs
11.SLTU:同上,不论rs>rt还是rs