addu addi 000000 001000 100001 rd<-rs+rt rt <- rs + (sign-extend)immediate addiu 001001 rt <- rs + (zero-extend)immediate subu slt ori 000000 000000 001101 100011 101010 rd<-rs-rt if (rs < rt) rd=1 else rd=0 rt <- rs | (zero-extend)immediate lw 100011 rt <- memory[rs + (sign-extend)immediate] sw 101011 memory[rs + (sign-extend)immediate] <- rt if (rs == rt) PC <- PC+4 + (sign-extend)immediate<<2 beq 000100 lui j 001111 000010 rt <- immediate*65536 PC <- (PC+4)[31..28],address,0,0 jr jal lb sb 000000 000011 100000 101000 001000 PC <- rs $31<-PC+4;PC <- (PC+4)[31..28],address,0,0 GPR[rt] ← memory[GPR[base] + offset] memory[GPR[base] + offset] ← GPR[rt] 五、运行结果 GPR
DM
六、问答
状态机设计通常没有唯一答案。Figure3 为 2 个均可行的状态机。状态机设计思路的主要差异在于在译码状态后,根据指令的性质设置了不同的状态分支。每位设计者的设计构思可能都不尽相同。请详细描述你的设计构思,特别是描述你为什么要这样设计状态分支。
J指令(包括JR,JAL,J)经过s0,s1,s9这一回路,因为他们都属于无条件转移指令。 BEQ指令经过s0,s1,s8这一回路,因为属于条件转移指令。
ADDU,SUBU,ORI,LUI同为运算指令,经过部件有都相同,所以将他们安排在同一个分支中。 LW,SW指令在一个大回路中,因为他们同属于存取指令,但是LW,SW经过的部件不全都一样,所以又有分支。
七、收获体会
这是最后一个课设,意味着这门课也学到了尾声,能感受到课设的难度正在逐渐提升。对于这次的新指令编写的过程还算顺利,初始状态机掌握的还可以,但控制器弄得有点不明白,就像老师所说的没太弄懂单周期和多周期的差别,因此也得了个不是很好的分数。通过这三次课设我学到了很多东西,能看出来老师安排的每次课设都很用心,和课堂知识相结合,一步步加深学习,学到了很多有用的东西。