在上篇博文中,做而论道介绍了 “无符号数” 乘法器“有符号数(补码)” 乘法器的电路。可见点击此处
  在本博文中,做而论道将把它们结合在一起,构成一个 “通用乘法器” 的电路。

  无符号数相乘法,其理论依据,就是小学所学的乘法竖式。 一个例题的竖式如下。

  有符号数相乘的方法,其理论依据,也是小学学过的乘法竖式。 如下所示。

  依据这两个竖式,便可设计乘法电路了。 并不需要再列举出计算机教材上写的那些表格形式计算过程甚至画一些莫名其妙的控制流程图。
  简单的观察一下这两个竖式,便可发现有两个不同之处:一处是符号位不同、另一处是在最后一项部份积的加减运算不同。 在上篇博文中,已经分别给出了两种乘法的电路图。 下面,把它们再显示出来,大家可以仔细看看,两图中的不同之处,是如何连线的。
  
四位无符号数的乘法电路如下。

  四位补码(一位乘校正法)的乘法电路如下。

  在无符号数乘法电路中,用四位加法器,就可以完成四位数的乘法运算了。 所以,上图中,并没有留出符号位的位置。
  在
补码乘法电路中,由于需要计算额外的符号位,所以就增加了三片加法器芯片(U8U9U10),这就多出来几条空闲的输入线, 可以用来输入 “符号位”。 观察图中的连线,是用 “乘数 A 的最高位” 与上 “乘数 B 的各个位 Bi ” 连接到这几个 “空闲位” 的。 如果乘数 A 的最高位是 1,这几个位,也就是 1,反之就是 0。 此处电平随着乘数 A 的最高位变化,显然就是扩充出来的 “符号位” 了。
  如果用这个
补码乘法的电路,完成无符号数的乘法运算,这几条线,就必须输入 0。
  想要达到这个目的,只需用上四个与门,即可。

  在无符号数乘法电路中,四项部份积是做 “连加运算”
  在
补码乘法电路中,前三项部份积是相加的,最后一项,则需要做减法。 于是,就在最后。配置了四个异或门,对乘数 A 进行取反,在加法器中,又加上了一。 取反加一后,再去相加,当然就是做减法了。 
  如果用这个
补码乘法的电路,完成无符号数的乘法运算,这几个异或门,就必须让它们 “不取反”,之后,也不要加一了。
  想要达到这个目的,只需用上一个与门,也就可以了。

  下图就是无符号数、补码通用乘法器的电路图。

  图中左下部的拨动开关(SW1)拨到了接地的位置,与门(U13)的输出即为 0,将使得四个异或门都是同相输出。 另外,由 SW1 产生的 0,还送到了左上角的四个与门,这些与门也就都输出了 0。 这些 0,又送到了加法器的 “符号位” 端。 
  “
异或门同相输出、符号位输入零”, 这就完全符合无符号数乘法的需求。
  图中的数据之间的关系是:1101 × 1011 = 1000 1111,也就是十进制的:13 × 11 = 143。

  如果,把拨动开关(SW1)拨到了接电源的位置呢?
  如果 B3 再为 1,与门(U13)的输出即为 1,使得四个异或门
都是反相输出,且在加法器进位输入端,也输入了一个 1。 另外,由 SW1 产生的 1,就使左上角的四个与门,都输出了乘数 A 的最高位,然后又送到了加法器的 “符号位” 端。 
  
“异或门部分反相加一、符号位输入 A 的符号”, 这就完全符合补码校正法乘法的需求。
  下图就是做补码乘法运算时的截图。

  此时,各数据就是:1101 × 1011 = 0000 1111,十进制即为:(-3 ) × (-5 ) = +15。
  输入数据的拨动开关,你可以随意的拨动,同时再观察输出。 你就会发现,做而论道设计的电路可以完美的实现【无符号数或补码的乘法运算】。 运算结果正确,当然不用说了,突出的优点便是:可以在无符号数相乘补码相乘之间随意的切换。

  做而论道的设计过程如下:
  首先,先设计一个 n 位 × n 位的
无符号数乘法器
  增加 n 个异或门,就可以做到
补码一位乘(校正法)的有符号数乘法运算
  再增加 n + 1 个与门,就成为了:
无符号数、补码通用的乘法器


  再看看白中英主编《计算机组成原理》中所设计的补码乘法器吧。
  白老师并没有设计出来具体电路。 只是给出了一个框图,如下所示。

  其中的 “求补器”,电路如下所示。

  由图可知,对 4 位二进制数求补,就需要用 11 个逻辑门。
  那么,对于 4 × 4 的乘法器来说,算前求补,要用
11 + 11 = 22 个门,算后求补,要用 23 个门。 此外,还有一个异或门,用来计算符号位。 总共,就得用 46 个逻辑门! 这才能把无符号数乘法器,改造成补码乘法器
  在此基础上,再增加一位乘数(如 5 × 5),就需要增加 12 个逻辑门。
  而且,改造成功之后,还就改不回去了,只能做
补码乘法运算了,呵呵

  相比之下,做而论道在 4 × 4 无符号数乘法器基础上,仅仅增加了 9 个逻辑门(4 个异或门、5  个与门),就设计成功了无符号数、补码通用的乘法器。 电路既简单,控制又灵活方便。
  在此基础上,再增加一位数(如 5 × 5),也仅仅需要增加 2 个逻辑门。


  另外,白老师给出的(n + 1)位 ×(n + 1)位带求补器的阵列乘法器框图中,数据的位数,显然是不对的。 (n + 1)位 ×(n + 1)位,乘积的位数,应该是 2 ( n + 1 ) = 2n + 2 吧? 而白老师图中的乘积,却仅有 2n + 1 位
  如果两个 4 位的补码相乘(如 1000 × 1000),此时就是 n = 3,乘积,应该是多少位?
  按照白老师的说法,乘积的位数是:
2n + 1 = 7 位
  那么,(-8 ) × (-8 ) = +64,用补码计算,就是:
1000 × 1000 = 0100 0000 !
  正确的乘积,显然应该是 8 位数,0100 0000,这才是 +64 的补码。
  如果按照白老师的说法,
仅取 7 位,就是 100 0000,这就是-64 了!


  唉,怎么能让计算机专业的老师,来讲解电子线路的设计?
  岂不知,隔行如隔山哪!

--本文完--

Logo

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

更多推荐