我在这次学习中,使用的是MIPS指令集的子集,可参考之前的几篇笔记,其中访存指令lw和sw都是I型指令,
lw rt,imm16(rs)
sw rt,imm16(rs)
1. lw指令
lw指令的指令格式如下图所示,
1.1 lw指令的操作步骤
<1> MEM[PC],从指令存储器取指
<2> R[rt] = DataMemory{R[rs] + SignExt[imm16]},指令指定的操作
<3> PC = PC+4,顺序执行的指令
由此可见,lw指令的第<1>步和<3>步与addu指令一样,我们可以只看lw指令的第<2>步。
1.2 lw指令的操作
我们还是来看下面这幅截图,在学习ori指令时已经看过了,这里因为都是I型指令,因此再次粘贴过来参考,
控制信号应该这样给出,
<1> nPC_sel = "+4",顺序执行的指令
<2> ALUSrc = 1,选择立即数作为ALU的第二个输入
<3> ExtOp = "SIGN",对imm16进行符号扩展
<4> ALUCtr = "ADD",ALU进行加法运算,计算访存地址
<5> MemWr = 0,保证数据存储器的内容不会发生改变
<6> MemtoReg = 1,把数据存储器的输出传递到寄存器堆的数据输入端
<7> RegWr = 1,这样下个时钟上升沿就可以把数据存储器的数据输出写入到寄存器堆中
<8> RegDst = 0,rt指定写入寄存器的编号
这样,lw指令就可以在下个时钟上升沿,将数据存储器内指定地址的内容写入rt指定的寄存器中。
2. sw指令
sw指令的指令格式与lw一样。
2.1 sw指令的操作步骤
<1> MEM[PC],取指
<2> DataMemory{R[rs] + SignExt[imm16]} = R[rt]
<3> PC = PC+4
我们还是只看第<2>步。
2.2 sw指令的操作
图就参考上面的图就行,这里直接给出控制信号,
<1> nPC_sel = "+4",顺序执行的指令
<2> ALUSrc = 1,选择立即数作为ALU的第二个输入
<3> ExtOp = "SIGN",对imm16进行符号扩展
<4> ALUCtr = "ADD",ALU进行加法运算,计算访存地址
<5> MemWr = 1,这样,下个时钟上升沿,数据存储器就会采样其数据输入端的信号,并进行写入操作
<6> MemtoReg = x
<7> RegWr = 0,寄存器堆的内容就不会改变
<8> RegDst = x