乘法器、移位相加、移位器怎么取舍?
更新时间:2026-09-21。问题驱动短答页。乘法器结构见 乘法与移位、Wallace/Dadda 树,FPGA 资源见 LUT/BRAM/DSP。
一句话回答
常数乘 2 的幂就是移位、几乎不花逻辑;常数乘任意整数也能由综合器拆成几次“移位后相加”(配合减法的 CSD 编码可进一步省项)。通用“变量 × 变量”N 位乘法才需要真正的乘法器,阵列式面积约 O(N²)、延迟多级,高性能用 Wallace/Dadda 压缩树或直接调乘法器/DSP IP。FPGA 上变量乘法应优先让它映射到专用 DSP 块;ASIC 里若面积紧张可把一次乘法在多个周期用移位累加复用一个加法器,用时间换面积。
三种实现对比
| 方式 | 适用 | 面积 | 延迟 |
|---|---|---|---|
纯移位 x<<k | 常数乘 2^k | 仅连线 | 0 |
| 移位相加(常数乘法器) | 常数乘任意整数 | 少量加法器 | 1~多级 |
| 阵列/树乘法器 | 变量 × 变量 | O(N²) 量级 | 多级压缩 |
| DSP/乘法器 IP | FPGA/高性能 ASIC | 专用硬块 | 1~几拍流水 |
常数乘法的移位加
verilog
assign y4 = x << 2; // *4:只接线
assign y3 = (x << 1) + x; // *3 = 2x + x
// 时序复用:多周期算 a * b(省面积)
always @(posedge clk)
if (start) begin acc <= 0; m <= b; end
else if (m != 0) begin
if (m[0]) acc <= acc + a;
a <= a << 1; m <= m >> 1;
end综合器对常数乘法会自动做移位加/CSD 优化,所以写 x*17 也不会生成巨型乘法器;真正贵的是两个操作数都是变量的 a*b。
选择建议
- 操作数之一是常数:放心写乘法,让工具优化成移位加。
- 两个都是变量、又在 FPGA:写
*并加流水寄存器,促使映射 DSP48,别用 LUT 拼大乘法器。 - 高速 ASIC:用压缩树乘法器或流水化 IP,关注关键路径,见 关键路径。
- 面积极敏感、吞吐低:多周期移位累加复用加法器。
常见坑
- 以为
x*常数也会占大乘法器,手动写出更差的逻辑。 - 变量乘法在 FPGA 没进 DSP、被铺成大量 LUT,时序和面积双输。
- 乘法结果位宽声明不足,高位被截断(N×M 结果需要 N+M 位)。
- 一次组合乘法放关键路径导致频率上不去,却没加流水。
总结
乘 2^k 是零成本移位、乘任意常数由综合器化成少量移位加,只有两个变量相乘才需要面积 O(N²)、多级延迟的真乘法器,高性能走 Wallace/Dadda 或乘法器 IP;FPGA 上变量乘法应映射 DSP、ASIC 面积紧张就用多周期移位累加,本质都是在面积、延迟、吞吐三者间按操作数是否为常数和性能目标做权衡。