[组成原理] 知识点整理
第六章 设计过程与ALU设计
一位加法器与四位加法器:
输入:A\B\CarryIn
输出:CarryOut\Sum(result)
功能含与、或、一位全加器(通过真值表进行构造)
考虑需求:ALU:2*32,输出32,1位进位1位溢出,4位进入的mode, Block Diagram框图
减法如何做?相当于加-B(取反+1)
溢出的判断:\(MSB\) 的$CarryIn \neq CarryOut $
行波进位
缺点?2N个门
进位选择
先行进位
局部先行进位,层叠先行进位
连接4个8位先行进位加法器,形成一个32位局部先行进位加法器
进位跳跃加法器
地位:行波进位,高位:先行进位
乘法
multiplicand * multiplier = product
四种乘法的做法
ALU乘法的三种做法
1、multiplicand 64, ALU64,product64,multiplier 32
multiplicand左移,multiplier右移,当multiplier为0停止
2、multiplicand32,ALU32,product64,multiplier32
用product右移代替multiplicand左移,加到product的左半边,最后结果是整个product,有效位移到最右边结束
3、multiplicand32,ALU32,product64
把结果放在product左半部分,multiplier放在product右半部分,依次右移,与2操作相同
MIPS中实现:HI和LOW两个部分
booth算法,如何实现有符号数的乘法
见第二次作业,例子\(5*(-6)\),注意先进行运算,再统一移动
移位器
用移位代替乘法不现实,实现任意0-31移位非常复杂
移位器与多路选择器
漏斗移位器
逻辑移位:高位为\(0\),低位为原始数据
算数移位:高位为\(sign(A)\),低位为原始数据
循环移位:两个部分都为\(A\)
左移:高位为\(A\),低位为\(0\),移位量为\(32-i\)
桶式移位器
利用晶体管输出
除法、浮点数
1.第一种实现
余数(Remainder)寄存器64为,除数(divider)64位,商(quotient)32位
一开始除数divider放在左32位,被除数放在余数remainder中,之后除数divider右移,quotient商左移,divider与product做减法,当remainder < quotient 的时候停止
2.第二种实现
divider为32位,remainder左移,做减法,quotient左移,最后得到的remainder的左半部分为remainder
3.第三种实现
第二种实现的变式,最后结果为:remander | quotient
- 规定被除数(dividend)和余数(remainder)的符号必须相同
浮点运算
IEEE 754标准:
单精浮点: 1 8 23 $ -126 \leftrightarrow 127$
双精浮点:1 11 52 $-1022 \leftrightarrow 1023 $
为什么要设定非规格化数值:0和最小规格化数之间缝隙太大
PDP-11和VAX不能表示低于正常的数值,这些机器用下溢成0来代替
第七章 单周期数据通路
MIPS子集三种类型指令
R型: op Rs Rt Rd shamt funct
I型: op Rs Rt immediate
J型: op target_address
add: Rd Rs Rt
Ori: Rt Rs
lw, sw Rt, Rs, Immediate 16
beq Rs Rt, Immediate 16
j target
第八章 单周期处理器的控制逻辑
实际MIPS处理器与设计的区别:
The summary of the logic of every control point
use RTL in convenience:
Branch:
<= if (OP == BEQ) then 1 else 0
Jump:
<= if (op ==JUMP) then 1 else 0
ALUsrc:
<= if (op == R-type) then 0(RegB) else 1(Immed)
ALUctr:
<= if (op == R-type) then funct
elseif (op == ORi) then OR
elseif (op == BEQ) then SUB
else add
ExtOp:
<= if(OP == ORi) then Zero else Sign
MemWr:
<= if(OP==Store) then 1
MemtoReg:
<= if(OP==Load) then 1
RegWr:
<= if(OP == R-type or OP == Ori or OP == load) then 1
or: if (OP == store or OP == BEQ or OP==JUMP) then 0
RegDst:
<= if(OP==Ori or OP==lw) then 0
The summary of the datapath && control of MIPS
Rtype:
RegDst = 1
ALUsrc = 0
MemtoReg = 0
RegWrite = 1
MemWrite = 0
Branch = 0
Jump = 0
ExtOp = X
ALUop(Symbolic) = R-type
ALUop<2>
ALUop<1>
ALUop<0>
Ori:
RegDst = 0
ALUsrc = 1
MemtoReg = 0
RegWrite = 1
MemWrite = 0
Branch = 0
Jump = 0
ExtOp = 0
ALUop(Symbolic) = Or
ALUop<2>
ALUop<1>
ALUop<0>
lw:
RegDst = 0
ALUsrc = 1
MemtoReg = 1
RegWrite = 1
MemWrite = 0
Branch = 0
Jump = 0
ExtOp = 1
ALUop(Symbolic) = add
ALUop<2>
ALUop<1>
ALUop<0>
sw:
RegDst = x
ALUsrc = 1
MemtoReg = x
RegWrite = 0
MemWrite = 1
Branch = 0
Jump = 0
ExtOp = 1
ALUop(Symbolic) = add
ALUop<2>
ALUop<1>
ALUop<0>
beq:
*************************************************
RegDst = x
ALUsrc = 0
MemtoReg = x
RegWrite = 0
MemWrite = 0
Branch = 1
Jump = 0
*************************************************
ExtOp = 0 × => X ? Yes,it is X because the adder is built in Instruction Fetch Unit, and the ALUsrc is equal to 0, not 1 (only 1 needs to use the ExtOp)
ALUop(Symbolic) = sub
ALUop<2>
ALUop<1>
ALUop<0>
jump:
RegDst = X
ALUsrc = X
MemtoReg = X
RegWrite = 0
MemWrite = 0
Branch = 0
Jump = 1
ExtOp = X
ALUop(Symbolic) = XXX
ALUop<2> = X
ALUop<1> = X
ALUop<0> = X
单周期处理器的缺点:
虽然CPI(clock per instruction)恒为1,但是每个时钟的周期太长,必须有:
PC的clock-to-Q+指令寄存器访问时间+寄存器堆访问时间+ALU延迟+数据存储器访问时间+寄存器堆建立时间+时钟扭斜 <= 时钟周期
并且有PC的clock-to-Q+最短延迟-时钟扭斜 ≥ hold时间

浙公网安备 33010602011771号