# 定点加减法运算

# 补码加减法运算方法

# 补码加法

[x]+[y]=[x+y](modM)[x]_补+[y]_补=[x+y]_补 \pmod M

即,在以 MM 为模时,两数补码的和等于两数和的补码

# 补码减法

[xy]=[x]+[y]=[x][y](modM)[x-y]_补=[x]_补+[-y]_补=[x]_补-[y]_补\pmod M

对于定点小数 M=2M=2,对于定点整数 M=2n+1M=2^{n+1}nn 不含符号位的位数)

只需证明 [y]=[y][-y]_补=-[y]_补即可

证明:

[y]([y])=[y]+[y]=[y+y]=0[-y]_补-(-[y]_补)=[-y]_补+[y]_补=[-y+y]_补=0

# 溢出及检测

# 溢出的概念

因为计算机的字长是有限的,因此所能表达的数据范围也是有限的

当运算结果超出所能表示的数据范围时,就会出现溢出;溢出会导致运算结果错误

# 溢出检测

方法一:根据操作数和运算结果的符号位是否一致进行检测

证明

假设机器字长为 n+1n+1

因此补码所能表示的范围是

2n真值2n-2^n\leq \text{真值}\leq 2^n

当真值 xxyy 同为负数时:

2nx<02ny<0}0>x+y2n+1\left.\begin{matrix} -2^n\leq x<0 \\ -2^n\leq y<0 \end{matrix}\right\}\Rightarrow 0>x+y\geq -2^{n+1}

可能负溢

当真值 xxyy 同为正数时:

0<x<2n0<y<2n}0<x+y<2n+1\left.\begin{matrix} 0< x<2^n \\ 0< y<2^n \end{matrix}\right\}\Rightarrow 0<x+y<2^{n+1}

可能正溢

方法二:

根据运算过程中最高数值位的进位符号位的进位是否一致进行判断。不同可判定为产生溢出,相同可判定为没有产生溢出

方法三:

利用变形补码(具有 2 位符号位的补码)的符号位进行判断

  • 双符号位为 00 时,表示正数
  • 双符号位为 11 时,表示负数
  • 双符号位为 01 时,表示正溢出
  • 双符号位为 10 时,表示负溢出

# 加减法的逻辑实现

# 全加器

Si=xiYiCiCi+1=XiYi+(XiYi)CiS_i=x_i\oplus Y_i\oplus C_i\\ C_{i+1}=X_iY_i+(X_i\oplus Y_i)C_i

假设所有与门和或门的传播时间延迟是 TT,异或门的传播时间延迟为 3T3T

# 多位串行加法器

# 可控加减法电路

sub=1sub=1 时:

  • 会与 YiY_i 异或,相当于对 YY 取反
  • 同时会让 C0=1C_0=1,相当于末尾加 11

# 先行进位加法器

因为每一个全加器的进位都需要 5T5T 的时延,所以如果都采用串联的方式,时延会很大

化简使得 后面加法器的进位不需要依赖于之前的加法器:

先行进位电路的时延是 2T2T

可以得到 44 位快速加法器的时延:

可以得到 1616 位快速加法器的时延:

为了进一步提升性能,我们将组间也使用并联进位加法器:

C4=G3+P3G2+P3P2G1+P3P2P1G0+P3P2P1P0C0C_4=G_3+P_3G_2+P_3P_2G_1+P_3P_2P_1G_0+P_3P_2P_1P_0C_0

# 74181ALU 和 74182CLA

32 位全先行进位 ALU

  • 设计思路

    • 44 位 用 117418174181 处理
    • 447418174181(16 位)用 117418274182 实现组间先行进位
    • 对于 3232 位,需要 两级 7418274182 实现全先行进位(即组内和组间均并行进位)
  • 计算

    • 74181 数量

      32 位4 位/=8 片\frac{32 位}{4 位/片}=8 片

    • 74182 数量

      • 第一级:每 44741817418111741827418222 片(覆盖 887418174181
      • 第二级:用 117418274182 汇总前两级 7418274182 的进位 → 11
      • 总计2+1=3 片2+1=3 片

64 位全先行进位 ALU

  • 设计思路

    • 类似 32 位,但扩展到 64 位,需要 三级 74182 实现全先行进位。
  • 计算

    • 74181 数量

      64 位4 位/=16 片\frac{64 位}{4 位/片}=16 片

    • 74182 数量

      • 第一级:每 44741817418111741827418244
      • 第二级:每 44 片第一级741827418211 片第二级 741827418211
      • 第三级:117418274182 汇总第二级进位 → 11
      • 总计4+1+1=6 片4+1+1=6 片

64 位组内先行进位、组间串行进位 ALU

  • 设计思路

    • 组内:每组 4 位用 74181 + 74182 实现先行进位
    • 组间:组与组之间的进位直接串行传递(不额外使用 74182)
  • 计算

    • 74181 数量

      64 位4 位/=16 片\frac{64 位}{4 位/片}=16 片

    • 74182 数量

      • 447418174181117418274182(仅组内优化)→ 44
      • 组间无额外 74182,进位直接串行传递

64 位片间串行进位 ALU

  • 设计思路

    • 完全放弃先行进位,所有 74181 的进位直接串行传递
    • 无需 74182
  • 计算

    • 74181 数量

      64 位4 位/=16 片\frac{64 位}{4 位/片}=16 片

    • 74182 数量:0 片

# 定点乘法运算

# 无符号数乘法运算的硬件逻辑实现

# 原码一位乘法

与上述无符号数乘法运算类似,只需要添加符号位的操作即可

# 补码一位乘法–Booth 算法

显然我们可以将二者统一成

[X×Y]=[X]×0.Y1Y2...Yn[X]×Y0[X\times Y]_补=[X]_补\times 0.Y_1Y_2...Y_n-[X]_补\times Y_0

# 阵列乘法器

# 补码阵列乘法器

# 定点除法运算

# 原码恢复余数法

# 原码不恢复余数法

# 阵列除法器