Skip to content

Commit 66db133

Browse files
committed
add mul0
1 parent 47bb9eb commit 66db133

1 file changed

Lines changed: 71 additions & 0 deletions

File tree

docs/cs/Hardware/multiplier.md

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
\boxed{\text{移位相加乘法算法原理与实例解析}}
2+
3+
#### 一、算法核心思路
4+
该伪代码实现了经典的 **移位相加乘法算法**,通过逐位处理乘数的二进制位完成乘法运算。以下是关键步骤解析:
5+
6+
---
7+
**数据结构**
8+
- **high_product**:存储乘积的高位部分
9+
- **low_product**:存储乘数及乘积的低位部分
10+
- **multiplicand**:固定不变的被乘数
11+
12+
**算法流程**
13+
1. **循环控制**:对乘数的每一位进行遍历(64次迭代对应64位乘法)
14+
2. **乘数位检测**:检查`low_product`的最低位(即当前处理的乘数位)
15+
3. **条件加法**:若当前位为1,执行`high_product += multiplicand`
16+
4. **联合右移**:将`{high_product, low_product}`整体逻辑右移1位,实现:
17+
- 将加法结果整合到乘积中
18+
- 为下一位运算腾出空间
19+
- 通过移位隐式处理进位
20+
21+
---
22+
#### 二、实例演示(4位乘法:3 × 3 = 9)
23+
24+
**参数设定**
25+
- 被乘数 `multiplicand = 3 (0011)`
26+
- 初始乘积寄存器:
27+
- `high_product = 0000`
28+
- `low_product = 0011`(存放乘数3)
29+
30+
**迭代过程**
31+
32+
| 迭代 | 操作步骤 | 寄存器状态 (high:low) |
33+
|------|--------------------------------------------------------------------------|-----------------------------|
34+
| 初始 | - | `0000 0011` |
35+
| 1 | 1. 检测到`low_product[0]=1`<br>2. `high += 3 → 0011`<br>3. 右移1位 | `0011 0011``0001 1001` |
36+
| 2 | 1. 检测到`low_product[0]=1`<br>2. `high += 3 → 0100`<br>3. 右移1位 | `0100 1001``0010 0100` |
37+
| 3 | 1. 检测到`low_product[0]=0`<br>2. 不加<br>3. 右移1位 | `0010 0100``0001 0010` |
38+
| 4 | 1. 检测到`low_product[0]=0`<br>2. 不加<br>3. 右移1位 | `0001 0010``0000 1001` |
39+
40+
**最终结果**`0000 1001`(十进制9)
41+
42+
---
43+
#### 三、关键机制详解
44+
1. **乘数位移处理**
45+
- `low_product`初始存储乘数,每次右移将已处理的位丢弃,同时将新的乘数位移动到最低位
46+
- 示例中`0011 → 1001 → 0100 → 0010 → 0001`的演变过程
47+
48+
2. **进位隐式处理**
49+
```verilog
50+
// 加法后的右移操作自动处理进位
51+
{high, low} = {high_tmp, low} >> 1;
52+
```
53+
- 当加法产生进位时,高位部分会自然扩展(如步骤2中`0011+0011=0110`,右移后高位正确捕获进位)
54+
55+
3. **被乘数位移等效性**
56+
- 每次右移乘积寄存器等价于将被乘数左移对应位数
57+
- 示例中第1次加`0011`(3),第2次等效加`0110`(6),符合竖式乘法原理
58+
59+
---
60+
#### 四、硬件实现优势
61+
- **资源节约**:仅需1个加法器和移位电路,适合FPGA/ASIC实现
62+
- **时序可控**:每周期完成1位处理,64位乘法固定64周期
63+
- **面积优化**:相比组合逻辑乘法器,大幅减少门电路数量
64+
65+
---
66+
#### 五、扩展应用
67+
- **有符号数支持**:可通过补码运算和符号位扩展实现
68+
- **流水线优化**:拆分加法与移位阶段提升吞吐量
69+
- **Booth算法改进**:通过编码减少加法次数(此基础算法需n次加法,Booth可优化至n/2次)
70+
71+
通过这种清晰的位操作流程,算法在硬件层面高效地完成了大数乘法,是CPU乘法器设计的经典基础结构。

0 commit comments

Comments
 (0)