计算机组成原理:最快速的乘法器设计(无符号数、补码)
计算机组成原理:最快速的乘法器设计(无符号数、补码)
在计算机组成原理中,乘法器的设计是一个重要的课题。传统的乘法器设计往往依赖于复杂的移位和加法操作,但随着电子技术的发展,我们可以采用更高效的方法来实现快速乘法运算。本文将介绍一种基于ROM芯片存储预计算数据的乘法器设计方法,包括无符号数乘法器和补码乘法器的实现方案。
数字式电子计算机诞生于1946年,当时的计算机主要使用电子管作为器件,存在耗电量大、发热严重、体积庞大等问题。因此,早期的计算机设计中只包含加法器,通过加法器加上补码的方法来实现减法运算。随着电子技术的发展,计算机行业经历了晶体管、集成电路、大规模集成电路的时代,计算机性能大幅提升。然而,许多计算机教材仍然固守着"只有加法器"的传统观念,没有跟上时代的发展。
用计算机做除法,本质上是相减、移位、上商的过程。由于CPU中早已配置了ALU(算术逻辑单元),可以直接进行二进制数相减,无需处处讨论用补码相加。同样地,用计算机做乘法,本质上是相乘、移位、求和的过程。传统的乘法器设计往往采用移位寄存器一步一步地进行计算,但在集成度不断提高的条件下,可以采用加法器阵列来避免移位操作带来的问题。然而,许多计算机专业的教材仍然停留在1946年的思维水平,没有认识到这种更高效的实现方式。
对于除法电路或乘法电路,都属于"组合逻辑电路"。在这种电路中,输入和输出的内容是固定不变的,因此可以采用预存数据的方法,将所需的输出内容存储在存储器中,在需要的时候调用出来。这种手段在软件方面已经很常见,比如现在的汉字操作系统就是将所有的汉字信息都保存在计算机中,需要显示某个汉字时,输入汉字的代码,操作系统就会找出对应的汉字点阵码输出到屏幕上。
下图展示了一个利用ROM芯片存储无符号乘积数据的电路图。当输入16位的地址号码时,它会立刻在指定的单元中取出16位数的乘积数据输出到数据总线。
图中的乘法电路极其简单,只有两块存储器芯片27512。27512的容量是2^16 × 8 bit,也就是64 KB。用拨动开关输入16位地址,这块芯片就会输出指定字节单元中预存的8位数据。
按照乘法的规律,8位 × 8位时,乘积就是16位数。所以,就必须使用两块这样的芯片,分别存储乘积的高低八位,才能满足乘法运算的需求。
图中输入的两组数据分别是:X = 0110 0100、Y = 1000 0010,即:X = 100、Y = 130。输出的乘积则是:P = 0011 0010 1100 1000,即:P = 13000。
输入数据时,图中没有配置显示器件,就只能观察开关处的红蓝点了。27512输出的数据,则用16个LED进行显示,这就比较直观了。
两个八位的二进制数相乘,得出十六位二进制数的乘积,其运算过程可见下图。上图中,乘数是8位,本应该有8项部分积,但是为了简明起见,略去了6个为零的项。所以只写了两行。但是,实际上,在本电路中,并无任何的乘法运算步骤。所有的乘积,都是预先存到ROM芯片中的。如想从中得出乘积,只需耗费两次存储器的读写周期而已。也可以说,这个"乘法运算"的速度,就是【立等可取】!
书上介绍的乘法电路,往往都是4位 × 4位。本电路的计算规模虽然大了一倍,但是,往往还是不够用的。解决的办法就是:分次相乘,再移位相加。可见下图所示。上图中,做了四次8位 × 8位的乘法,把它们移位相加,便可组合成32位的乘积。如果位数还不够,可再次如法炮制,就可以形成32位 × 32位的乘法,得出64位数的乘积。
在浮点数相乘的运算中,浮点数的尾数,都是无符号数,就必须使用此类乘法器进行运算。
使用存储器来实现乘法器的功能,是否可行呢?当然是可行的。现在的CPU都是大规模集成电路工艺的产品,一片CPU芯片,都含有几亿的门电路。64 KB的存储器也就用几十万个门而已,这点消耗,根本就不值一提。
用同样的电路,也可做一个补码乘法器,如下所示。图中输入的两组补码分别是:X = 0110 0100、Y = 1000 0010,即 X:+100、Y:-126。输出的乘积(补码)则是:P = 1100 1110 1100 1000,这正是:-12600的补码。
这组补码数据的乘法计算过程,可见下图。看到了吗?这两张电路图,输入的二进制数是相同的,都是0110 0100、1000 0010。但是这两个电路的输出,是不同的。前一个电路输出的是无符号数的乘积、后面的电路输出的是补码的乘积。之所以有这种区别,就是在存储器中,预存了不同的数据。
用PROTEUS软件绘制电路图时,可以预先在存储器中存入数据。数据的格式,要求是二进制形式。为了生成这种格式的数据文件,你可以用C或汇编语言编程,根据你的需要,在内存中编写二进制信息。然后,将这批数据信息存盘。存盘文件名的后缀,通常都是.BIN。然后在PROTEUS中打开这个数据文件,存到存储器芯片即可。
如果是在真实的存储器芯片中存入数据,往往还需要有一些特定的设备(如写入器、编程器等等),这就不多说了。
另外,如果补码乘法器的规模不够大,能不能用前述的:分次运算,再移位相加呢?答案是:不可。这就是说,你有多大的数进行相乘,你就必须设计一个多大的补码乘法器!不能凑凑付付、勉勉强强的,就弄个大的。。。
本文原文来自CSDN