前面介绍过无符号数相乘的电路:点击查看。 因为原码的数值位相乘时,也要使用这种无符号数相乘的算法,所以,在计算机教材中,就把无符号数相乘称之为:原码一位乘法。 但是,教材中所介绍的原码乘法,也就是小学学过的乘法而已,并无任何新意。 而且,在教材上,只是介绍了乘法算法,也没有提供电路。
  计算机教材所介绍的
原码乘法,在求乘积的绝对值时,是使用无符号数来相乘。 在求乘积的符号位时,是用两个因数符号位的值,做了异或运算。 但是,这两个因数的符号位,也并不是原码所特有的。 所以,在原码乘法的整个计算过程中,并没有原码来参与。 原码,没有计算功能,这是早有定论的。 在原码乘法中,当然也就没有原码来参加运算。 那么所谓的 “原码一位乘、二位乘”, 这种说法,并不符合实际。 教材上这么乱写,确实是混淆了概念,误导学生以为 “原码也能进行计算”。
  实际上,计算机中各种算术运算,都是用
无符号数和带符号数的补码来完成的。

  今天,做而论道打算介绍一下补码相乘(校正法)的方法及其实现的电路

  先看看两个补码相乘的竖式吧。

  图中的两个因数 A、B 都是整数。 图中虽然写上了小数点,那也只是为了标出符号位而已,并没有小数的含义。 整数相乘的乘积,当然也是整数,即:13 × (-11) = -143,没错吧?
  图中的计算步骤,不过就是:相乘、移位、相加。 大家都会,自然不必多说。
  因为因数 B 是 5 位数,分别与因数 A 相乘,就会乘出来 5 项 “部份积”。 各项均向左移动一位,准备进行累加。 因为因数 A 也是 5 位数,所以,各项部份积也都是 5 位数。 在逐项累加时,难免会出现一个进位,所以, 就应该用 6 位数来计算。 
这就是计算机教材上所说的【要用两个符号位来计算乘法】的原理所在。
  两个因数都是 5 位,乘积,就应该是 10 位。 在图中,把部分积扩充到 10 位,是看起来好看一些,便于看出乘积的长度,实际上只需扩充到 6 位就足矣。 补码扩充位数,要用符号位在左边填充,所以,在图片上,就多出来一串 0。 如果因数 A 是负数,就会多出一串 1。如下图所示。

  补码相乘的关键问题是:补码的首位是负数! (证明可见:点击查看。)

  做加法运算时,补码首位是负数,并没有异常表现,依旧用 “逢二进一” 即可。
  做乘法运算时,补码首位是负数,可就应该注意了。

  在前面的图中,[-11 ]补 = 10101,首位(B4)是 1。在计算时,就要按 “-1” 来相乘
  用-1 乘以 [A],就得到了:-001101。 这个值,与前面得出的那些,就不是相加,而是相减了。

  前几项相加,最后一项相减,这就是计算机教材中所说的【校正法】的特点。

  要注意,有些教材在此处,往往是写成:+[-X ]补,这是不对的。
  因为,即使 [ X ]补 存在,但是 
[-X ]补 却不一定存在。 你写成了 [-X ]补,到时候,求不出来,可怎么办?
  就比如:X = -128,则有:[-128 ]补 = 1000 0000。 但是,
[-X]补 = [+128]补,这个八位补码,又有谁能求出来呢?  。
  
既然求不出来  [-X ]补 ,那么,这种写法,不就是错误的吗?
  正确的写法,当然是:
-[ X ]补。 在图中写的就是:-001101。 虽然此时有个减法,但是计算机做减法,早有解决的方法,不必多虑。

  小结一下:
  由乘法的竖式可知,两个五位的补码相乘,在中间过程中,共有五项部分积。 前四项都是正的,直接相加即可。 最后一项虽然是负的,但是也可以 “取反加一” 后再相加。 故此,共需要四个加法器。 每个加法器都必须具有针对行六位二进制数进行加法运算的能力。
  观察上图可知,各项部份积的排列位置,是错位的。 故此,每次相加,都会留出一位,作为乘积的一位值。 由图可见,共有 4 位乘积就在各次加法之前就生成了。 最后一次相加,是减法运算,产生了 6 位的差。 至此,就得到了 10 位数的乘积。 如果有进位,略去即可。

  有了上面的思路,就可以设计硬件电路了。 不需要教材上写的那些移位的表格和流程图,费那些事干嘛? 也不要听他们说:ACC 是累加器,还得有个什么 MQ 寄存器、计数器 C ! 那些,都是不需要的。 只要能看懂乘法运算的竖式,直接就可以下手设计硬件电路!

  下图就是 “由加法器阵列组成的补码乘法器”。

  图中右下角,用拨动开关输入了两组补码:A = 01101、B = 10101。(可由开关处的红蓝点观察到输入值。) 经过本电路的相乘、移位、累加,即可得出乘积的补码。 就是在图中右边,用 10 位 LED 显示出来的:11 01111 0001
  上述补码,换算到十进制,就是:(+13 ) × (-11 ) = -143。 计算完全正确。

  本电路所用的计算方法是:校正法。
  电路的核心部分是:加法器芯片(74LS283)。 把两片 283 组合到一起,就构成了八位的加法器。 把 283 和异或门芯片(74LS86)配合在一起,便可构成减法电路。 把这些芯片组合在一起,就可以称为:加法器阵列。
  电路中,U1U2 算出了前两项部份积的和。 U3U4、U5U6 分别完成了其余两项求和的工作。 最后的 U7U8,是做减法的,用来对校正值进行减法计算。
  乘法算式中的 5 项部份积,是由下图电路算出的。

  图中的 74LS157,是计算机电路中常用的 “多路选择器” 中的一种:两路选择器。 由 Bi 进行控制,在 0 和 [A] 中选择出一个,在 Y 端输出。 当 Bi = 0 时,Y = 0;Bi = 1 时,Y = [A]。 由此就实现了:Y = Bi × [A]。
  图中的 74LS86,是异或门芯片,用于产生:-[A]。(注意,不是 [-A ] 。)
  上述的两幅电路图,就是 “五位补码乘法器” 的完整电路。 电路中芯片较多、连线也就很多。 为了清晰起见,图中多数的连线,都采用 “同名标号” 来代替了。

  做而论道设计的乘法电路,可以完美的进行补码乘法运算。 电路中,并没有什么 ACC、MQ,脉冲计数器 C、移位寄存器等等。 你只要把两组补码送到 A、B 端,本电路就会以迅雷不及掩耳的速度,在 LED 处输出乘积的补码。 下面再算一组试试看。

  把两组补码输入电路,本电路立即就给出正确的输出,如下所示。

  

  由于做而论道的合理设计,所以,本电路的计算速度极快。 电路的中数据移位,是用连接导线来实现的。 这就是说,并没有使用计算机教材中所 “谆谆教导” 的移位操作 。 那么,本电路不需要任何的移位脉冲,就可以直接就算出补码的乘积的补码。
  由于使用了加法器阵列,所以,本电路就可以:
芯片级的高速度完成乘法运算工作。 因为不用:等待慢悠悠的移位脉冲来移动数据,所以,本电路的工作速度,就要比计算机教材上介绍的方法,高出百倍千倍也不止!
  懂电路的网友,可以从上面的电路图中,看出个中端倪。 本电路并没有使用什么另类的器件,计算机专业的学生,学过了《数字逻辑》,就肯定能看懂这个电路。

  有 PROTEUS 软件的网友,仿照本电路,即可制作出来 “五位补码乘法器”。 如有什么疑问,欢迎留言评论。

--本文完--

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐