[组成原理] 知识点整理

第六章 设计过程与ALU设计
一位加法器与四位加法器:

​ 输入:A\B\CarryIn

​ 输出:CarryOut\Sum(result)

​ 功能含与、或、一位全加器(通过真值表进行构造)

\[sum(result) = AxorBxorC\\ CarryOut=A\&B|B\&CarryIn|A\&CarryIn \]

考虑需求:ALU:2*32,输出32,1位进位1位溢出,4位进入的mode, Block Diagram框图

​ 减法如何做?相当于加-B(取反+1)

​ 溢出的判断:\(MSB\) 的$CarryIn \neq CarryOut $

行波进位

​ 缺点?2N个门

进位选择
先行进位

\[g_i = a_i \& b_i 表示是否产生进位\\ p_i = a_i|b_i 表示是否传播进位\\ ∴Cin3 = g_2 | p_2\& g_1|p_2\& p_1\& g_0|p_2\& p_1\& p_0\& cin_0 \]

局部先行进位,层叠先行进位

​ 连接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 $

\[规格化数:2^{E-127}*1.f*1^{-s}\\ 非规格化数:2^{-126}*0.f*1^{-s}\\ 无穷大和非数(NaN),f(NaN)=NaN\\ 无穷大: s 111111111..10000....00000\\ 非数:s 111111..1 不全为0 \]

为什么要设定非规格化数值:0和最小规格化数之间缝隙太大

\[ guard\ digit\\ rounding\ digit\\ sticky\ digit\\三个位和nearest\ even之间的关系 \]

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处理器与设计的区别:

\[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

\[ALU ctr如何实现:\\ 运用两级译码(局部译码)的概念:\\ opcode => ALUop\\ ALUop + funct => ALUctr \]

\[除了ALUctr之外的其他部分用PLA(programmable\ logic\ array)来实现 \]

单周期处理器的缺点:

​ 虽然CPI(clock per instruction)恒为1,但是每个时钟的周期太长,必须有:

​ PC的clock-to-Q+指令寄存器访问时间+寄存器堆访问时间+ALU延迟+数据存储器访问时间+寄存器堆建立时间+时钟扭斜 <= 时钟周期

​ 并且有PC的clock-to-Q+最短延迟-时钟扭斜 ≥ hold时间

posted @ 2021-12-08 14:50  Kamkwamba  阅读(226)  评论(0)    收藏  举报