要说乘法,可就比除法简单多了。
在《计算机组成原理》中,总共介绍了三种乘法方案:(人工计算)无符号数相乘、原码相乘、补码相乘。
往下,又细分了:一位乘法、二位乘法。 如果继续,还可能有四位、八位的乘法。
其实,任何的 CPU,也就集成了一种乘法器而已,绝不可能既安装无符号数乘法器、又安装了带符号数乘法器。 更不可能既有一位乘法器、又集成二位乘法器。
究竟什么乘法器是可以兼容两种数字呢? 翻遍了整本书,也没找到一个实用的方案。 既然书上没有明确的结论,那就来看看做而论道的博客吧。
首先看看无符号数的乘法运算。 其实,这事简单,不用细说,大家都会。
已知 x = 1110、y = -1101,求 x·y。
咦,不是无符号数吗? 这里面怎么有个负数?
别担心啊!
乘法运算,都是用绝对值相乘的。 绝对值都是正数,也就相当于无符号数相乘了。
在计算机的教材中,一般不用这种通俗易懂的小学生格式。 总是使用表格的形式,来说明这个相乘的问题。 那就看看下图吧。
确实,所谓的乘法,的确是:相加、右移一位、相加、右移一位 ... 。
四位乘以四位数,乘积就是八位的。 过程的细节,就不用说了吧。
下面,再看看,同样的数字,用原码来相乘,又是怎么操作的。
可以看出,用原码相乘时,两个乘数,都要在绝对值前面添上一个符号位 0。 乘积,也就要多出来两位数。 这就是说:同样的数值,用原码乘法来实现,乘法器的规模,就必须比无符号数乘法器的规模要大。 那么,性价比,原码乘法器显然就要低一些了。
另外,原码相乘后,也不能解决乘积的符号问题。 乘积的符号,还是需要另外计算。
由此来看,原码乘法,没有任何可取之处。
所以,做而论道是强烈推荐使用无符号数乘法这个方案的。 原码乘法,以后,就别提了。
无符号数的相乘,用电子器件来实现,在做而论道这里,是轻而易举的。 可见下图。
在图中的左上角,用两组拨动开关输入了:乘数 A =1110、乘数 B =1101。
你可以用开关旁边的红蓝点,观察到这些数值。
在图中的右下角,由八个 LED 显示出来了乘积:1011 0110。
这个运算结果,和前面的几张图片中的绝对值,是完全相同的。 由它们来互相印证,就可以证明,本电路的计算结果,是完全正确的。
再看几组数的相乘结果吧。
上图是:1111 * 1111 = 1110 0001,也就是十进制的:15 * 15 = 225。
上图是:0011 * 0111 = 0001 0101,也就是十进制的:三七二十一。
这个无符号数相乘的电路,是正确无误的。 如果哪位网友有 PROTEUS 软件,就可以仿照本图进行绘制,于是,你就有了一个四位乘以四位的乘法计算器。 百试百灵的!
做而论道设计的电路,采用了阵列式结构。 虽然零件稍多一些,但是其工作速度,却是极高的。 数据的右移,做而论道采用了导线直接连接的形式。 这样设计,就屏弃了用时钟脉冲控制移位的慢动作。
大家如果看过《计算机组成原理》教材,就知道,教材中是用时钟脉冲来控制数据移位的。 时钟脉冲不来,就移不了位,只能干等。
上图就是《计算机组成原理》所介绍的原码乘法器的组成框图。
是不是有点华而不实? 其实这张图,连 “华” 都谈不上,更别说。。。
时钟脉冲的频率,是由系统控制的,也可以理解为计算机的主频。 八位数乘以八位数,就至少要等来八个脉冲之后,才能得出乘积。
要知道,加法运算的速度,可比时钟脉冲的速度快多了。 因此,在做而论道设计的电路中,数据的移位,是用导线直接连接的,这就不需要等待时钟脉冲了。 无论何时,数据 A、B 送到输入端,本电路就直接做多次加法运算,直接就能算出乘积的数值。
上图是《计算机组成原理》所介绍的原码乘法的控制流程。 其中也只有异或运算,还是值得留用的。 其它功能框,并无可取之处。
咦,这个流程图,是不是还少了点步骤?
哦,是乘积!
在前面,用异或算法算出了乘积的符号位,算完了,就没有下文了。
在前面有:X0 ⊕ Q0 → S,这个 S,貌似是乘积。 在此处仅仅是算出了符号位,那么,S 的绝对值呢? 没有看到乘积,这个流程图,怎么就结束了?
做而论道设计的无符号数乘法电路,其原理,还是很简单的。
原理的介绍,还是等下篇博文再说吧。
本博文中,引用了几张网上的图,侵删。
--本文完--