繁体   English   中英

verilog中的组合硬件乘法

[英]combinatorial hardware multiplication in verilog

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

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

        assign result = a * b;

      endmodule

这会产生很多门。

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

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

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

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

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

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

如果您要使用此方法,则必须为数据握手创建其他信号,因为输入结束后输出不再有效1个周期。

由verilog乘数生成可能是非最优的。 在改进乘数和加法器方面有很多研究。 这是一个相当普遍和良好的add / mul生成器之一: http//www.aoki.ecei.tohoku.ac.jp/arith/mg/algorithm.html

此页面包含许多add / mul low-lewel实现的描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM