美文网首页
【计算机组成原理】CPU:单周期数据通路(MIPS)

【计算机组成原理】CPU:单周期数据通路(MIPS)

作者: 凡古一往在摸鱼 | 来源:发表于2020-04-27 22:35 被阅读0次

    · 寄存器传送语言RTL 

    1)R(r)表示寄存器r的内容

    2)M(address)表示主存储器地址address的内容

    3)传输方向“←”表示,从右向左传输

    4)程序计数器PC的内容直接用PC表示

    · 输出信号改变时机

    1)setup建立时间:触发时钟边缘之前保持稳定一段时间

    2)hold保持时间:触发时钟边缘之后保持稳定一段时间

    3)clk-2-Q time锁存延迟:触发时钟边缘之后不能立即变化,有一点点延迟

    即:输入的信号(1或0)在输入之前(下跳沿到达之前)要稳住自己,不能出差错,在到达下调沿时输入信号不会立刻影响输出,而是经历一点点延迟(clk2Q)输出才改变,而与此同时输入信号会保持

      ·  寄存器组解读   

    1)ReadinA\RB两个读入接口,符合组合逻辑,输入5-bit寄存器编号,选择32个寄存器之一的内容,耗费一小段时间(取数时间AccessTime),从BusA\busB输出(2^5=32)。

    2)busWrite是写入接口,是时序逻辑,在(WriteEnable=1)&&(时钟下降沿到达)的情况下经过延迟(CLK2Q)将busW的值写入RW读入接口指定的寄存器中;WE=0时即使下降沿到来也不会写入。

    内部结构图

    3)理想数据存储器

       

          

      ① add指令(R-type)   

    指令:add rd,rs,rt

    RTL:

    1)M[PC];

    2)R[rd]←R[rs]+R[rt];

    3)PC ← PC + 4

    设计思路:不考虑1)3)两个公共操作:

    (1)Rs、Rt表示两个源寄存器编号,故与RA、RB相连,读取这两个寄存器的值,分别由busA、busB送入ALU计算,由func控制ALUctr进行add操作;

    (2)结果送入busW写入RW指定的寄存器,故RW连接Rd,只有当结果不溢出且RegWr=1的情况下才将结果写入,结果溢出(OF=1)则送出到溢出处理通路。

    花费时间:PC的CLK2Q时间+指令存储器取指令时间+寄存器组取数时间+ALU延迟+寄存器建立时间+时钟偏移

    ALUctr=add,RegWr=1

    ② ori指令(I-type)

    指令:ori rt,rs,imm16

    RTL:

    1)M[PC];

    2)R[rt] ← R[rs] or ZeroExt(imm16);

    3)PC ← PC + 4

    设计思路:不考虑1)3)两个公共操作:

    (1)因为目的寄存器是rt,跟R-type的rd不一样,所以得在RW装个多路选择器,用RegDst控制是用哪个做目的寄存器(R-type用0,I-type用1);

    (2)由于要进行立即数零扩展(32位才能送入ALU),添加一个扩展器,用ExtOp=1控制进行符号扩展,ExtOp=0控制进行零扩展;

    (3)由于R-type是两个寄存器数运算,I-type有一个来自立即数,所以要在ALU一个输入接口装一个多路选择器,用ALUSrc=0控制寄存器输入,ALUSrc=1控制立即数输入。

    时间:PC的CLK2Q时间+指令存储器取数时间+寄存器组取数时间+ALU延迟+写寄存器的建立时间+时钟偏移

    ALUctr=or,RegWr=1,RegDst=1,ExtOp=0,ALUSrc=1

     

    ③lw、sw指令(I-type)

    指令:lw:lw rt,rs,imm16;sw:sw  rt, rs,imm16

    RTL:

    1)M[PC];

    2)Addr←R[rs]+SignExt(imm16);

    3)lw:R[rt]←M[Addr];sw:M[Addr]←R[rt];

    4)PC ← PC + 4)

    设计思路:不考虑1)4)两个公共操作:

    (1)因为写入目的寄存器的数据来源不是ALU结果,而是存储器的输出,所以要在busW加一个多路选择器,用MemtoReg=0控制ALU结果写入,MemtoReg=1控制存储器读出数据写入;

    (2)因为要从数据存储器取数,所以添加了一个数据存储器部件,存储器的取数地址由ALU计算R[rs]+SignExt(imm16)得到,所以ALU结果连接Adr端,图中busB输出端连接DataIn将数据写入实现的是指令sw的功能,注意该写入是时序逻辑。

    花费时间:

    lw:PC的CLK2Q时间+指令存储器取数时间+寄存器组取数时间+ALU延迟+数据存储器取数时间+写寄存器的建立时间+时钟偏移

    sw:PC的CLK2Q时间+指令存储器取数时间+寄存器组取数时间+ALU延迟+写存储器的建立时间+时钟偏移

    ALUctr=addu,RegWr=1,RegDst=1,ExtOp=1,ALUSrc=1,

    MemWr=1,MemtoReg=1

     

      ④beq指令(I-type)

    指令:beq  rs,rt,imm16

    RTL:

    1)M[PC];

    2)Cond ←R[rs]-R[rt];

    3)if (Cond = 0) {PC ← PC + 4 + (SignExt(imm16) x 4)} else{PC ← PC + 4}

    设计思路:不考虑1)4)两个公共操作:

    (1)因为PC下地址产生不同,所以增加了下地址逻辑,输出下一条指令地址,用Branch=1使用分支功能,Branch=0不使用;

    (2)Zero为R[rs]-R[rt]的零标志,在Branch=1启用分支功能时,Zero=0表示两个源寄存器内容相等,应该走PC ← PC + 4 + ( SignExt(imm16)x4)这一路,反之走普通的PC←PC + 4,Branch=0时不用考虑Zero的值,因为没有启用分支。注意这里的立即数是相对偏移指令数,前面的立即数是相对偏移存储单元数。

    时间:PC的CLK2Q时间+指令存储器取数时间+寄存器组取数时间+ALU延迟+寄存器建立时间(写入PC)+时钟偏移

    ALUctr=subu,RegWr=0,RegDst=1/0,ExtOp=1/0,MemWr=0,MemtoReg=1/0,ALUSrc=1,Branch=1

    因为指令长度32-bit,主存按字节编址,所以指令的地址总是4的倍数,所以低两位总是00,所以PC只用存放前30位,即PC<31:2>,所以下条指令的计算方法如下:

    顺序执行时:PC<31:2> = PC<31:2> + 1

    转移执行时:PC<31:2> = PC<31:2> + 1 + SignExt[imm16]

    取指令时:指令地址=PC<31:2> 串接“00”

    另外:这里用Adder是因为无需ALUctr

     

      ⑤Jump指令(J-type)

    指令:j  target

    RTL:

    1)M[PC];

    2)PC<31:2>←PC<31:28>串接  target<25:0>

    设计思路:不考虑1)4)两个公共操作:

    (1)因为功能是无条件将目标地址写到PC中,所以主要修改的是取指令部件;

    (2)因为送到下一个PC的值不再仅仅是计算结果,也可能是直接跳越的结果,所以在PC的写入端加一个多路选择器,用Jump=1控制写入跳跃目的地址,Jump=0控制写入计算结果。

    时间:PC的CLK2Q时间+指令存储器取数时间+寄存器建立时间(写入PC)+时钟偏移

    ALUctr=1/0,RegWr=0,RegDst=1/0,ExtOp=1/0,ALUSrc=1/0,MemWr=1,MemtoReg=0,Jump=1

    跳转指令的范围:2^28=256MB的内存

    关注公众号,和我一起学习

    【计算机组成原理】CPU:单周期数据通路(MIPS)

    公众号:凡古一往

    相关文章

      网友评论

          本文标题:【计算机组成原理】CPU:单周期数据通路(MIPS)

          本文链接:https://www.haomeiwen.com/subject/fkppwhtx.html