(2)补码两位乘

  我们可以方便地从上一小节讲的、用比较法实现补码一位乘的方案,推导出补码两位乘的实现原理。当我们把补码两位乘理解为:合并原来两步补码一位乘为单步操作,则可找出如下对应关系。

  假定上步乘法的部分积为 [Pi] ,本步的部分积应为
   [Pi+1] =2-1 { [Pi] + ( Yn+1-i -Yn-i ) * [X] }

  此后,下一步的部分积应为
   [Pi+2] =2-1 { [Pi+1] + ( Yn-i -Yn-1-i ) * [X] }

  将第一个公式中的 [Pi+1]补 代入第二个公式中时,则得到
[Pi+2] = 2-1 { 2-1 { [Pi]+( Yn+1-i -Yn-i ) *[X]}+(Yn-i-Yn-1-i)*[X] }
     = 2-2 { [Pi]+ [ ( Yn+1-i -Yn-i ) + 2 * ( Yn-i -Yn-1-i ) ]*[X] }
     = 2-2 { [Pi] + [ ( Yn+1-i +Yn-i + 2 * Yn-1-i) ] * [X] } (2.17)

  公式(2.17)表明,在有了部分积 [Pi] 之后,再求部分积 [Pi+2], 可用 [Pi]补 加上乘数寄存器最低两位与附加位三位值的组合结果与被乘数 [X] 之积、再右移两位得到。

  其中三位值的组合关系为
   Yn+1-i + Yn-i + 2 * Yn-1-i

  代入它们的八组取值,则得到


  上表结果表明,执行补码两位乘的过程中,有部分积 +[X]、部分积 +[-X]、部分积 +2[X]与部分积 +2[-X] 四种操作。除需要有把 [X]、[-X] 送加法器的线路外,还需要有把[X]、[-X]左斜一位送加法器的线路。与此相应的,加法器应使用三位符号位,以避免 [X]左斜一位送加法器时运算结果溢出的情形。最后一点是,部分积和乘数每次应右移两位,运算器中应有支持右移两位的逻辑电路。

  请注意:求部分积的次数和右移操作的控制问题。当乘数由1位符号和15位数据位组成时,求部分积的次数为 (1+15)/2 , 即8次 ,而且最后一次的右移操作只右移一位。若数值位本身为偶数n,则必须再增加一位符号位,使总位数仍为偶数,此时求部分积的次数为n/2 + 1,而且最后一次不再执行右移操作。

  看一个两位补码乘的实例
  假定 X = + 0.0110011 Y = - 0.0110010 [Y]=1 1001110
   则 [X] = 0 0110011 [-X] = 1 1001101
    2[X] = 0 1100110 2[-X] = 1 0011010


  运算结果为 1 11011000001010,即为 -0.00100111110110