3-2-1 Binary Multipliters 整数乘法
如果忽略符号位, m位 x n位 = m+n 位乘积 (即最大m+n位)
二进制乘法使用的是“Shift and Add” Multiplier
v1 无符号移位-加法乘法器
- 需要32次迭代(加法移位⽐较)
- ⼏乎⽤ 100 时钟周期
-
⾮常⼤, 太慢
- 64位被乘数寄存器、 64位ALU、 64位乘积寄存器、32位乘数寄存器
第⼀种乘法的启示
- 每个周期 1个时钟 => 每次乘法⼤约100(32*3) 个时钟乘法与加法的出现频率⽐ 5:1 ~ 100:1
- 64位被乘数中 1/2的位数 总是为 0 => 使⽤64位加法器, 太浪费 !!!
- 在被乘数左移的过程中, 在右边插⼊ 0 => ⼀旦产⽣了乘积的最低位, 它就永远不变 !!!
- ⽤乘积右移 替代 被乘数左移? 这样的话被乘数不用移动,就不用64位的了
改进方案:
被乘数固定不动, 乘积右移 ALU reduced to 32 bits!
Multiplier V2– Logic Diagram
32位被乘数寄存器、 32位ALU、 64位乘积寄存器、 32位乘数寄存器 (与v1比,被乘数寄存器变成32位,ALU变成32位)
步骤:把v1算法流程图中 被乘数左移1位改成乘积右移动一位
第二种乘法的启示
乘积寄存器的低 32 bits 只是简单地被移出去 ,而刚好乘数和乘积都是要右移。乘积寄存器浪费的空间正好 与乘数中⽆⽤的空间相同
改进方案:
把乘积寄存器的低32位⽤作乘数寄存器,高32位初始化为0,32次操作后,乘数则会被全部移出去,此时这个64位寄存器中的64位整体即为乘积结果
Multiplier V 3 (Final Version)
此时乘积寄存器的高32位一开始初始化为0,低32位是乘数
步骤:
以下操作要重复n次,n为乘数和被乘数位数(32位为例)
- 检查乘积寄存器的最后一位(因为乘积寄存器低32位存的是乘数,所以其实就是乘数的最后一位)
- 若为1,则乘积=乘积+被乘数(只有乘积寄存器的高32位与被乘数的32位相加,而乘积寄存器的低32位不变)
- 若为0,不用加
- 乘积寄存器右移(此时整体的64位都要右移,零扩展)
Signed Multiplication 有符号乘法
有符号数乘法如何?
-
简单地策略是 假设两个源操作数都是正数, 在运算结束时再对乘积进⾏修正 (不算符号位, 运算31步)
-
使⽤补码-需要对部分乘积进⾏符号扩展, 在最后再进⾏减法
==比较合理的版本:==
- 使用无符号乘法硬件(即假设两个源操作数都是正数)
- 右移时, 扩展乘积的符号位(乘积进⾏符号扩展)
- 如果乘数是负数(即最后一步的时候乘数最右一位为1), 最后一步应该是减法(也可以将被乘数转为补码相加)
Booth‘s Algorithm 布斯算法改进
如果乘数中有连续的1,则可以用此算法
key idea
看⼀下1的串 : 2 x 30 = 00010 x 011110 30 = -2 + 32 011110 = - 000010 + 100000
乘: • 加 000010 4次 (w/ shifts) ( 011110) - 或 - • 加 100000 ⼀次 减 000010 ⼀次 (w/ shifts) ( - 000010 + 100000 )
Idea:乘数中间有’1’的串 ⽤在第⼀次看⻅1时的⼀次初始减法 和 在最后⼀个1后的⼀次加法代替
早期, 由于移位⽐加法速度更快, 采⽤该算法主要为了速度
算法步骤: 如果乘数有连续个 ‘1’
- 乘数第⼀个1做减法
- 对‘1’移位
- 最后⼀个1做加法
Booth’s Algorithm rule
算数右移即要做符号扩展
example
Array Multiplier 阵列乘法器
基本思路
若将所有的部分积aibj都同时算出来, 剩下的就是带进位位的加法求和。 这种乘法器要实现n位* n位时, 需要n(n-1)个全加器和n 个“与”⻔。
ALU设计
阵列乘法存在的问题
-
存在的问题: ■ 第0级的加法没有必要 ■ 每⼀级加法采⽤串⾏进位, 速度受到影响
-
改进措施: 采⽤CSA——保存进位加法器(Carry Save Adder) ■ CSA输出每⼀位相加的部分和, 同时将每⼀位的进位保存下来, 作为⼀个输出结果供下⼀级加法器来处理, ⽽不是向同⼀级的下⼀位进位 ■ 由于CSA不存在同级每个位之间的串⾏进位, 所以能以更快的速度得到进位和部分和
乘法器
- 从结构和逻辑上看, 1位CSA就是⼀个1位全加器
- 采⽤CSA构造阵列乘法器, 前⾯⼏级采⽤不考虑进位的CSA, 最后⼀级采⽤常规的进位传播加法器CPA(Carry Propagate Adder)产⽣最后的乘积结果
- CPA可以采⽤串⾏进位加法器, 也可以采⽤先⾏进位加法器
例子: