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 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 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: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 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
指令: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)