文章目录
3 乘法运算
3.1 无符号数乘法
n位无符号数间乘法可以看作是循环n次的加法运算,因此可以用以下的硬件结构实现:
如果乘数的最低有效位为1,则将被乘数加在积上,否则,进入下一步。在下一步中进行被乘数的左移和乘数的右移。这一步骤需要重复32次,计算流程如下所示:
这个乘法器可以进一步优化,节约占用的硬件资源数,优化后的乘法器如下所示:
一种无符号阵列乘法器如下图所示,这样的阵列加法器由于需要进位信号逐层传递,因此具有较大的门延迟。
![111](https://img-blog.csdnimg.cn/2021022009541833.PNG #pic_center =x700)
一种并行化的方法是将32个加法器组织成一个并行树,这样只需要等待 log 2 32 \log_232 log232,即5次32位加法的时间就能得到乘法的结果。
3.2 原码乘法
原码乘法时,将符号位和数值位分别进行运算,符号位取异或得到积的符号位,数值位按照3.1中的无符号数乘法进行计算即可。
3.3 补码乘法
3.3.1 Booth乘法
-
计算过程
(1)参加运算的数都是补码表示的,符号位一同参与运算,得到的结果也是补码数。
(2)乘数Y的末尾增设一位附加位 Y − 1 Y_{-1} Y−1,初始值为0。部分积的初始值为0。
(3)根据乘数Y的最低两位 Y 0 Y − 1 Y_0 Y_{-1} Y0Y−1的值,进行相应的操作。具体操作如下表所示。其中 − X -X −X是通过 + [ − X ] 补 +[-X]_补 +[−X]补来实现的。
(4)将过程(3)重复n遍,最后得到的部分积就是运算结果。
-
工作原理
通过观察3.1中的乘法计算过程,可以发现二进制乘法器在处理0时,除了移位之外,无需执行任何其他操作。
考虑一个正乘法器,例如“00111110”,乘积为:
M × 00111110 = M × ( 2 5 + 2 4 + 2 3 + 2 2 + 2 1 ) = M × ( 2 6 − 2 1 ) = M × 62 M\times 00111110 = M \times (2^5 + 2^4 + 2^3 + 2^2 + 2^1) = M \times (2^6 - 2^1) = M \times 62 M×00111110=M×(25+24+23+22+21)=M×(26−21)=M×62
实际上,可以证明任何二进制数中任何连续1序列,都可以分解为两个二进制数之差:
( … 0 1 … 1 ⏞ n 0 … ) 2 ≡ ( … 1 0 … 0 ⏞ n 0 … ) 2 ≡ ( … 0 0 … 1 ⏞ n 0 … ) 2 (\dots 0 \overbrace {1\dots 1}^n 0 \dots)_2 \equiv (\dots 1 \overbrace {0\dots 0}^n 0 \dots)_2 \equiv (\dots 0 \overbrace {0\dots 1}^n 0 \dots)_2 (…01…1 n0…)2≡(…10…0 </