运算器
约 1389 个字 预计阅读时间 5 分钟
二进制编码
- 原码(oringinal code):由符号位+绝对值组成
- 反码(radix-minus-one complement):由原码到补码的一种中间形态,正数的反码就是它本身,负数的反码是保持符号位不变,其他位依次取反
- 补码(two complement):正数的补码是它本身,负数的补码是它的反码+1
- 移码:保证所有数编码都为正,一般4byte int +$2^{32} $
门电路
不知道为什么这门课不包含具体的数字逻辑设计的知识,在这里做个补充,其中异或门是由基础门组合而成的。
加减法
延迟时间的估计
将一个与门/或门的时间作为单位,比如异或门最长路劲是一个与非门加一个与门,所以延迟时间就为三个单位
半加器与全加器
半加器由一个与门计算进位,一个异或门计算本位,延迟三位
全加器由三个与门一个或门来计算进位,两个异或门来计算本位,延迟六位(两个异或门)
加法器
一个全加器只能计算一位,可以用多个全加器组成n位加法器
串行加法器
将n个全加器直接串接起来,顾名思义,进位是串行传送的,所以延迟较高: * 从$C_0 $ 到 $C_n \(延迟时间:\)2n \(级 * 最后一位和数\)2(n-1)+3=2n-1 $,注意两个输入的异或很早就做好了
先行进位加法器
设置辅助函数: * 进位生成函数:$G_i=A_iB_i $ * 进位传递函数:$P_i=A_i+B_i $ 全加逻辑方程: * $F_i=A_i\otimes B_i \otimes C_i $ * $C_{i+1}=G_i+P_iC_i $ 根据递推可以求出通项,然后可以发现各进位之间无等待,相互独立,同时产生
组间串行的先行进位加法器
比如四个8位先行进位加法器(或者8个4位先行进位加法器)串行 延迟时间: * 4个8位:$3+2+2+5=12 $ * 8个4位:$3+2+2+2+2+2+2+2+5=20 $
n位带标志加法器
两个n位带符号数补码相加,需要判断是否溢出,具体而言需要计算一些标志: * 溢出标志OF:$OF=C_n\otimes C_{n-1} $ * 符号标志:$SF=F_{n-1} $ * 零标志ZF:=1当且仅当F=0 * 进位/借位标志CFk:$CF=count\otimes cin $
n位整数加减运算器
补码加减运算公式: * $[A+B]_补=[A]_补+[B]_补 (mod 2^n) $ * $[A-B]_补=[A]_补+[-B]_补 (mod 2^n) $ * $[-B_补]=\overline{B_补}+1 $
乘除法
无符号数乘法器
朴素实现
朴素地模拟手算乘法
优化
流水线乘法器
为乘数的每一位都提供一个n位加法器
可以组合成树状结构,树的高度是$\log_2(N) $,高度会决定运行时间
阵列乘法器
模拟手算乘法过程
除法器
朴素实现
相当于在做减法,Divsor和Remainder寄存器都是64位的,Quotient寄存器是32位的。被除数是不移动的,最开始在余数寄存器中;除数最开始在最左边的32位,每次循环往右移一位;商每次左移一位,根据ALU减法结果确定是写0还是写1。
优化
优化方法是将移位和减法同时进行,看起来和乘法器一模一样,实际上就是一样的( 因此可以节省硬件开销。除数寄存器是32位的,余数和商共用一个64位寄存器,开始时是被除数,结束时左边32位是余数,右边32位是商。注意事实上余数商寄存器需要65位来避免溢出。
快速除法器
一次算多位
有符号除法
正确的有符号除法在源操作数的符号相反时商为负,同时非零余数的符号与被除数相同
浮点数(floating point)
Like scientific notaion 二进制的科学计数法$\pm1.xxxxxxx_2\times 2^{yyy} $ 在内存中存储x和y,尾数的1可以不存,阶码是用的移码,确保是正数,single bias:127 double bias:1023
Single-Precision Range:
最小数 $\pm1.0\times 2^{-126}\approx \pm 1.2\times 10^{-38} $
最大数 $\pm2.0\times 2^{+127}\approx \pm 3.4\times 10^{28} $
Double-Precision Range:
最小数 $\pm1.0\times 2^{-1022}\approx \pm 2.2\times 10^{-308} $
最大数 $\pm2.0\times 2^{+1023}\approx \pm 1.8\times 10^{308} $
浮点数范围比定点数大,但数的个数没变多,故数之间更稀疏,且不均匀
浮点数的表示中有保留的非正常数据
0:尾数和指数都是0,它是特殊表示 下溢数:达不到最小数 无穷大:尾数为0,指数是最大
浮点数的表示都是不精确的,移位有可能会导致溢出(实际当中寄存器可能有多的位数)
浮点数的加法器
浮点数的加法一般无法在一个时钟周期内完成,电路看着就很复杂,但是可以pipeline,流水可以充分利用各个阶段的部件
- 蓝色的线表示控制信号
- 那个0,1,表示多路选择器
浮点数的乘法
尾数跟尾数相乘,指数跟指数相乘,如果指数是移码,需要减掉一个
一开始的CPU只会做整数运算,所以存在一个协处理器来辅助浮点数的计算。浮点数的寄存器$f_0-f_{31} $ ,可以两个拼一个double
这门课只要求基础的MIPS命令,所以浮点的不用管