目录
https://blog.csdn.net/weixin_45792450/article/details/109314693
指令执行阶段
单个时钟周期内执行单个阶段,指令执行有序执行
执行数据通路
注:上述图中ALUOp=01应该为:ALU执行减法
执行过程解析
取指-IF阶段
主要任务:从内存中取出指令,并计算下一条指令的地址
从内存取出指令:控制器设置控制信号MemRead和IRWrite有效,将IorD置0以选择PC作为内存地址来源
计算下一条地址:控制器置控制信号ALUSrcA为0,ALUSrcB为01,ALUOp为00(加法运算),ALU实现计算PC+4,置PCSrc为00,下一条指令地址成功存入PC
指令译码和读取寄存器-ID阶段
主要任务:翻译指令和准备数据,IF和ID阶段均不知道指令内容
由于指令没有具体翻译出来,具体执行何种指令是未知的,此时我们需要多做一些准备,以应对可能需求,尽管可能有些步骤在某些指令看来是多余的,但所幸没有坏处。
读取寄存器:读取寄存器Rs和Rt,并分别存入寄存器A和B
如果是分支指令,下一周期可能还要用到PC的地址,故需要提前准备
准备偏移地址:控制器置ALUSrcA=0,ALUSrcB=11,ALUOp=00(加法运算),这样偏移地址就计算出来,并存入寄存器ALUOut了
指令执行,存储地址计算或者分支完成-EX阶段
主要任务:完成具体的指令操作或者准备具体的指令数据
访存指令:控制器置ALUSrcA=1,ALUSrcB=10,ALUOp=00,ALU将操作数相加,得到存储地址,存入ALUOut
此处考虑R型的运算指令,立即数型的运算指令对比之下不难实现。
运算指令:控制器置ALUSrc=1,ALUSrcB=00,ALUOp=10,完成算术运算,结果存入ALUOut
分支指令:控制器置ALUSrcA=1,ALUSrcB=00,ALUOp=01,以进行等值测试;置PCWriteCond=1,PCSrc=01,若ALU的零输出为1,与PCWriteCond做与运算得1,最后写入运算后的PC值,否则不做任何处理。
跳转指令:控制器置PCSrc=10,PCWrite=1,通过一个或门后将跳转地址送入PC
存储器访问或R型指令完成-WB阶段&MeM阶段
这个阶段的R型指令会将结果写回寄存器,对访存指令来说将进行访存操作
运算指令:控制器置RegDst=1,RegWrite=1,MemtoReg=0,向寄存器Rd存入计算结果
访存指令:若为取字指令,则从内存读出数据,并写入MDR;若为存字指令,则直接将数据写入内存。控制器置MemRead或MemWrite=1,IorD=1,实现数据直接存入内存或者从内存取数据到MDR。
取字指令的尾声:这一步将MDR的数据写入对应寄存器。控制器置MemtoReg=1,RegWrite=1,RegDst=0,实现寄存器数据的写入。