数据表示与计算

  • 数据表示
    • 定点数
      • 分为原码、反码、补码、移码。
      • 原码、反码、补码参考《计算机系统》的数据表示
      • 移码为把所有原始值统一加上一个偏移量,存储的是偏移后的值。常用于浮点数的阶码表示。
      • 这里的定点数既包括整数,也包括小数。
        • 表示整数的定点数不写小数点。
        • 表示小数的定点数中,小数点固定在最左边的数字后面。
    • 浮点数
      • 由尾数和阶码组成,尾数一般使用原码或补码,需要带有符号位,阶码一般使用补码或移码。
      • IEEE 754 标准参考《计算机系统》的数据表示
      • 本课程中的浮点数一般不使用 IEEE 754,而使用尾数为补码、阶码为补码的表示。
    • 自定义数据表示
      • 带标志符数据:数据不仅有原来的值,还有额外标志位表示类型信息、功能信息等。
      • 带数据描述符数据:描述符不含数据,包含地址、长度等数据结构相关信息。
      • 寄存器堆栈:一组专用的寄存器表示堆栈,相邻栈帧之间数据可以推移。栈顶地址固定,栈底随着操作变化。
      • 存储器堆栈:用主存区域存储数据,使用栈顶指针指向栈顶。栈底地址固定,栈顶随着操作变化。
  • 数据计算
    • 先行进位加法器
      • 加法计算公式为 Si=AiBiCi1S_i = A_i \oplus B_i \oplus C_{i - 1}Ci=AiBi+(AiBi)Ci1C_i = A_i B_i + (A_i \oplus B_i) C_{i - 1}
      • 定义进位产生函数为 Gi=AiBiG_i = A_i B_i,进位传递函数为 Pi=AiBiP_i = A_i \oplus B_i,则 Ci=Gi+PiCi1C_i = G_i + P_i C_{i - 1}
      • 单级先行进位加法:展开 Ci=Gi+PiCi1=Gi+PiGi1+PiPi1Ci2=C_i = G_i + P_i C_{i - 1} = G_i + P_i G_{i - 1} + P_i P_{i - 1} C_{i - 2} = \cdots
        • 理论上可以完全展开到 C0C_0,延迟为 2ty2ty,但是逻辑门数量爆炸。
        • 一般仅部分展开。
      • 多级先行进位加法:
        • Two Level CLA Equation
        • Two Level CLA Circuit
    • 溢出判断
      • 单符号位:
        • 运算前两数均为正数,运算后结果为负数,则发生正溢。
        • 运算前两数均为负数,运算后结果为正数,则发生负溢。
      • 双符号位/变形补码:两个符号位,正常的数两者相等。高位的那个符号位代表真正的符号,低位的符号位若与高位不同,则溢出。
      • 进位位:
        • 符号位不产生进位、最高有效位产生进位,则发生正溢。
        • 符号位产生进位、最高有效位不产生进位,则发生负溢。
    • Booth 乘法
      • 给定两个小数点后 nn 位的定点数 X,YX, Y,计算得到小数点后 2n2n 的定点数。
      • 使用的寄存器:
        • AA:初始化为 00,最终会存放乘法的高 nn 位。
        • BB:存放 XX,不变。
        • CC:初始化为 YY,最终会存放乘法的低 nn 位。
      • 计算过程:
        • AACC 排在一起,AA 在高,CC 在低。CC 最后额外补一个 00
        • 根据连接的数字串最后两位(CC 的最后一位和额外一位)确定操作:
          • 00001111AA 不变。
          • 0101AA 加上 XX
          • 1010AA 加上 XX 的相反数,即按位取反后加 11
        • AACC 和额外一位整体右移一位。
        • 循环进行操作,相加 n+1n + 1 次,移位 nn 次。
      • Booth Multiplication
    • 补码加减交替除法
      • 给定两个小数点后 nn 位的定点数 X,YX, Y,计算得到两个小数点后 nn 的定点数商 QQ 和余数 rr
      • 使用的寄存器:
        • AA:初始化为 XX,存放初始的被除数、部分余数、最后的余数。
        • BB:存放 YY,不变。
        • CC:初始化为 00,最后存放商。
      • 计算过程:
        • 根据当前部分余数的符号,选择加除数或加除数的相反数:
          • 需要满足部分余数与选择的除数的符号相反。
        • 相加后得到新的部分余数,与除数比较符号,确定上商:
          • 若新部分余数与除数符号相同,商的最低位写 11
          • 若新部分余数与除数符号不同,商的最低位写 00
        • AACC 整体左移一位。
        • 循环执行,重复 n+1n + 1 次加法,重复 nn 次移位。按照上面的规则上商 nn 次,最后一次上商固定为 11
      • Division
    • 浮点数加减
      • 对齐阶码,小阶扩大为大阶。
      • 对阶后尾数加减。
      • 规格化结果:
        • 两个符号位相同,符号与最高有效位不同 00.1xx00.1xx11.0xx11.0xx:已经规格化。
        • 两个符号位相同,符号与最高有效位相同同 00.0xx00.0xx11.1xx11.1xx:未规格化,需要左移。
        • 两个符号位不同 01.xxx01.xxx10.xxx10.xxx:看似溢出,其实是未规格化,需要右移。
      • 阶码溢出:
        • 上溢:真正的溢出。
        • 下溢:视为 00
    • 浮点数乘法
      • 阶码相加,尾数相乘。
      • 特别需要考虑阶码用移码表示的情况,需要额外减去一个偏置值。
      • 14<MA×MB<12\dfrac{1}{4} < |M_A \times M_B| < \dfrac{1}{2} 时,需要左移规格化一次。
    • 浮点数除法
      • 调整尾数,确保 MA<MB|M_A| < |M_B|,不满足时只需右移 MAM_A、增加 EAE_A 一次完成。
      • 阶码相减,尾数相除。
      • 规格化。
  • ALU 设计
    • 主要考虑加法器设计。
    • 三级分组先行进位加法器:
    • Three Level CLA Circuit