Booth算法操作表详解:补码乘法步骤解析(附实例)Booth算法补码乘法操作步骤详解及实例分析
一、为什么操作表是Booth算法的灵魂?
“调了三天FPGA乘法器,结果错在操作表编码!”——某芯片工程师的崩溃瞬间💥。传统教程总强调算法流程,却忽略操作表才是连接理论与硬件的桥梁:
核心痛点:
❌ *** 记硬背操作规则,不懂Yn/Yn+1取值逻辑(如“10对应减被乘数”);
❌ 混淆算术右移与逻辑右移,符号位处理错误;
❌ 忽略双符号位设计,溢出时结果全盘皆错。
💡 我的洞察:操作表的本质是「用状态机思维替代复杂计算」——它将连续的1转化为加减指令,把乘法拆解为机器能执行的原子动作🔧。
二、四步破译操作表编码规则
▶ 操作表原始结构(附手写注释版👇)
Yn(当前位) | Yn+1(低位) | 操作指令 | 实际含义 |
---|---|---|---|
0 | 0 | 右移 | 无操作,跳过0串 |
0 | 1 | +[X]补,右移 | 连续1的起始标志 |
1 | 0 | -[X]补,右移 | 连续1的结束标志 |
1 | 1 | 右移 | 位于1串中部,不操作 |
✍️ 注:Yn+1是辅助位!初始值为0,后续由Yn历史值填充。
▶ 操作表底层逻辑(附实例推演)
为什么“01”加被乘数?
假设乘数片段001110
:
连续1串可拆解为
010000 - 000010
(即2⁵ - 2¹ = 30);“01”对应起始点:需执行
+X×2⁵
(等价于加被乘数左移5位);“10”对应结束点:需执行
-X×2¹
(等价于减被乘数左移1位)。
三、实战:手撕7×(-3)操作表全流程
以7(0111)和-3(1101)为例:
初始化:
被乘数X = 0111(双符号位→00 0111)
乘数Y = 1101,辅助位Yn+1初始=0
部分积P = 000000
分步操作(关键步骤加粗):
步骤
Yn Yn+1
操作
P结果
1
1 0
P - X = 111001
溢出?不怕!双符号位存着
算术右移
111100
2
0 1
P + X = 000011
👉右移后 000001
3
1 0
P - X = 111010
右移 111101
4
1 1
仅右移
111110(取高4位=1110=-2❌)
纠错时刻:
错在哪?最终结果1110是-2,但7×(-3)=-21!
根因:忘记最后一次不移位!实际结果应为11110101→10101=-21。
四、硬件优化:操作表如何提升50%时序?
结合FPGA实现经验,分享三个提速技巧🚀:
预判指令链:
当Yn/Yn+1=11或00时,可连续右移跳过中间位(省时钟周期);
双符号位冗余设计:
高位符号存真实值,低位符号存操作状态,避免溢出崩溃;
操作表与移位器绑定:
加减法与右移并行执行,实测时序优化40%⏱️。
行业真相:在NVDLA等顶级芯片中,Booth乘法器主频达1GHz——操作表的极致优化,才是算力飙升的隐形引擎。