Loading

计算机组成与设计-乘法器

 

引言

源于对CPU与计算机组成的兴趣,学习了经典教材COMPUTER ORGANIZATION AND DESIGN —— THE HARDWARE/SOFTWARE INTERFACE 这本书,现记录下学习内容与心得。

本书基于MIPS指令集。MIPS指令是忽视溢出情况的,需要软件来进行检测是否积大于32位宽的存储空间。

乘法器

无符号乘法器Ver.1

硬件电路的设计应该从实际出发,计算机语言使用二进制进行运算,因此我们首先关注二进制乘法的实现,并且先考虑无符号数的计算。计算流程如下图所示:

 

因此仅需判断乘数当前位是0或是1即可,若为0则不改变积,若为1则将被乘数与积进行加法运算。关键点在于将乘数进行右移,将被乘数进行左移。  

对应这种算法的硬件结构:

考虑到资源消耗的情况,MIPS中所有寄存器都是32位宽,因此在进行32位乘法运算时被乘数每次运算需要左移,初始化32位被乘数放在移位寄存器的右32位,左32位置0。

控制部分决定何时进行被乘数的左移和乘数的右移,以及何时写入新的积值。

考虑运算时长,如果一次移位算1个时钟周期,这样一次32位的乘法运算需要消耗上百个时钟周期,大大限制了时钟频率。

因为被乘数移位寄存器一半的空间都是0,因此设计64位是浪费了大量空间的;并且当被乘数移位后,积空间的LSB是保持一直不变的。因此需要考虑对这种结构进行优化。

无符号乘法器Ver.2

这种版本的乘法器采用32位的ALU,32位的被乘数和乘数,大大节约了计算资源。

将32位的被乘数保持不动,右移的乘数和积结合在一起形成一个64位的移位寄存器,因为乘数需要右移,经32个时钟周期后移出。积也因此拥有了64位的空间。

 

这里的算法同样结合笔算比较清晰:

乘数右移同时积也右移,相当于第一次计算得到红框的结果,第二次计算得到绿框的结果,第三次计算得到蓝框的结果。

或者看下图中的运算解释,被乘数0010,乘数0011。随着运算进行积空间右移移出乘数同时得到积的结果。

有符号乘法器

有符号数的乘法运算遵守两个规则

Rule1:计算时对被乘数进行符号位扩展

Rule2:乘数的符号位若为0则用0作为积,若为1则用-1来乘被乘数。

运算的例程如图所示:

总结

实际上上文仅仅提到了基本的乘法器结构,现今的发展使得乘法运算有了更多的算法与架构进行加速,有待后续学习。

 

posted @ 2022-02-01 12:44  月光小猪(已长膘)  阅读(597)  评论(0编辑  收藏  举报