4

假设我有这样的乘数代码,

      module multiply(
        output [63:0] result,
        input [31:0] a,
        input [31:0] b
      );

        assign result = a * b;

      endmodule

这会产生很多门。

应该使用什么更好的方法来实现组合乘法器?

4

3 回答 3

5

硬件乘数很大,你只需要忍受它!

乘法器将随着其输入位宽变大而变大。因此,如果您不需要其中一个操作数上的完整 32 位,那么将此大小减小到最小值将减小最终硬件的大小。

如果你乘以一个固定的数字,我认为编译器也可以进行一些优化来限制硬件的大小。或者您可以对固定数字使用不同的编码方案,例如CSD,这将减少乘法器中加法器的数量,进一步减少其面积。

如果您需要大量乘法器并拥有快速时钟,也许您可​​以将单个硬件乘法器重用于许多计算。这意味着编写一些控制/流水线逻辑来安排乘法,并且您可能需要一些内存,但它可以节省您的整体区域。在这种情况下,您将设计一个 mini-DSP 数据路径。

于 2011-11-17T10:38:50.693 回答
3

如果您可以放弃组合要求,则可以使用加法器和累加器进行乘法运算,如果速度不是一个大问题并且您能够在多个时钟上处理操作数。一些低功耗/低成本/小面积处理器在其ISA中没有专用的乘法指令,或者前端指令解码器将乘法asm指令变为加法运算变成加法微码操作。

如果您要使用此方法,则必须为数据握手创建额外的信号,因为在输入稳定后的 1 个周期内输出不再有效。

于 2011-11-17T18:54:38.177 回答
1

由verilog 生成的乘数可能不是最优的。在 evvective 乘法器和加法器领域有很多研究。这里是 add/mul 的相当普遍和好的生成器之一: http ://www.aoki.ecei.tohoku.ac.jp/arith/mg/algorithm.html

此页面描述了许多 add/mul 低级实现

于 2011-11-17T19:02:29.440 回答