Skip to content

运算器

约 1389 个字 预计阅读时间 5 分钟

二进制编码

  1. 原码(oringinal code):由符号位+绝对值组成
  2. 反码(radix-minus-one complement):由原码到补码的一种中间形态,正数的反码就是它本身,负数的反码是保持符号位不变,其他位依次取反
  3. 补码(two complement):正数的补码是它本身,负数的补码是它的反码+1
  4. 移码:保证所有数编码都为正,一般4byte int +$2^{32} $

门电路

不知道为什么这门课不包含具体的数字逻辑设计的知识,在这里做个补充,其中异或门是由基础门组合而成的。

alt text

加减法

延迟时间的估计

将一个与门/或门的时间作为单位,比如异或门最长路劲是一个与非门加一个与门,所以延迟时间就为三个单位

半加器与全加器

半加器由一个与门计算进位,一个异或门计算本位,延迟三位

全加器由三个与门一个或门来计算进位,两个异或门来计算本位,延迟六位(两个异或门)

加法器

一个全加器只能计算一位,可以用多个全加器组成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 $

乘除法

无符号数乘法器

朴素实现

朴素地模拟手算乘法

alt text

优化

alt text

流水线乘法器

为乘数的每一位都提供一个n位加法器

alt text

alt text

可以组合成树状结构,树的高度是$\log_2(N) $,高度会决定运行时间

alt text

阵列乘法器

模拟手算乘法过程

alt text

除法器

朴素实现

相当于在做减法,Divsor和Remainder寄存器都是64位的,Quotient寄存器是32位的。被除数是不移动的,最开始在余数寄存器中;除数最开始在最左边的32位,每次循环往右移一位;商每次左移一位,根据ALU减法结果确定是写0还是写1。

alt text

优化

优化方法是将移位和减法同时进行,看起来和乘法器一模一样,实际上就是一样的( 因此可以节省硬件开销。除数寄存器是32位的,余数和商共用一个64位寄存器,开始时是被除数,结束时左边32位是余数,右边32位是商。注意事实上余数商寄存器需要65位来避免溢出。

alt text

快速除法器

一次算多位 alt text

有符号除法

正确的有符号除法在源操作数的符号相反时商为负,同时非零余数的符号与被除数相同

浮点数(floating point)

Like scientific notaion 二进制的科学计数法$\pm1.xxxxxxx_2\times 2^{yyy} $ 在内存中存储x和y,尾数的1可以不存,阶码是用的移码,确保是正数,single bias:127 double bias:1023 alt text

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} $

alt text alt text

浮点数范围比定点数大,但数的个数没变多,故数之间更稀疏,且不均匀

浮点数的表示中有保留的非正常数据

0:尾数和指数都是0,它是特殊表示 下溢数:达不到最小数 无穷大:尾数为0,指数是最大

浮点数的表示都是不精确的,移位有可能会导致溢出(实际当中寄存器可能有多的位数)

浮点数的加法器

浮点数的加法一般无法在一个时钟周期内完成,电路看着就很复杂,但是可以pipeline,流水可以充分利用各个阶段的部件

  1. 蓝色的线表示控制信号
  2. 那个0,1,表示多路选择器

alt text

浮点数的乘法

尾数跟尾数相乘,指数跟指数相乘,如果指数是移码,需要减掉一个

一开始的CPU只会做整数运算,所以存在一个协处理器来辅助浮点数的计算。浮点数的寄存器$f_0-f_{31} $ ,可以两个拼一个double

这门课只要求基础的MIPS命令,所以浮点的不用管