假设我有一个像这样的乘数代码,
module multiply(
output [63:0] result,
input [31:0] a,
input [31:0] b
);
assign result = a * b;
endmodule
这会产生很多门。
应该使用什么更好的方法来实现组合乘法器?
答案 0 :(得分:5)
硬件乘数很大,你只需忍受它!
随着输入位宽变大,乘法器会变大。因此,如果您不需要其中一个操作数的完整32位,那么将此大小减小到最小将减小所得硬件的大小。
如果你乘以一个固定的数字,我认为编译器可以进行一些优化来限制硬件的大小。或者,您可以对固定数字使用不同的编码方案,例如CSD,这将减少乘数中的加法器数量,从而进一步缩小其面积。
如果您需要大量乘法器并且具有快速时钟,那么您可以重复使用单个硬件乘法器进行多次计算。这意味着编写一些控制/流水线逻辑来安排你的乘法,你可能需要一些内存,但它可以节省整个区域。在这种情况下,您将设计一个mini-DSP数据路径。
答案 1 :(得分:3)
如果你可以放弃组合要求,你可以使用加法器和accumulator进行乘法运算,如果速度不是很大的问题,你就可以在多个时钟上处理操作数。一些低功耗/低成本/小面积处理器在其ISA中没有专用的乘法指令,或者乘法asm指令被前端指令解码器改为加法运算到加法microcode运算中
如果您要使用此方法,则必须为数据hand-shake创建其他信号,因为输出结束后输出不再有效1个循环。
答案 2 :(得分:1)
由verilog乘数生成可能是非最优的。在改进乘数和加法器方面有很多研究。这是一个相当普遍和良好的add / mul生成器: http://www.aoki.ecei.tohoku.ac.jp/arith/mg/algorithm.html
此页面介绍了许多add / mul low-lewel实现