我可以仅使用2x2乘法器制作4x4乘法器吗?

时间:2015-02-11 02:41:26

标签: verilog vlsi

我想使用2x2位乘法器实现4x4位乘法器。

例如,

A = 1110 B = 1011 2x2结果应该是10011010.

我认为我可以像这样分开。

#case 1
a=10
b=11
2x2 multiplier's result = 0110

#case 2
a=11
b=10
2x2 multiplier's result = 0110

我可以使用2x2乘数得到2结果。 但是如何才能使用2x2乘数来制作4x4乘法器呢?

但我不能暗示任何暗示。那我该如何制作4x4倍增器呢?有谁知道如何做到这一点?请帮忙。

简而言之,您需要多少4x4乘数来执行8x8乘法运算。 如何仅使用4x4乘法器创建8x8乘法器?

更新:

这有用吗?  http://blog.pioneermathematics.com/2011/04/26/vedic-trick-on-multiplication/怎么样?

2 个答案:

答案 0 :(得分:2)

如果您有2x2-> 4乘法器,则可获得4x4-> 8乘法器:

wire [3:0] a; // multiplicands
wire [3:0] b; //

wire [3:0] lr;  // partial products
wire [3:0] mr1; //
wire [3:0] mr2; //
wire [3:0] hr;  //

wire [7:0] result; // resulting full product

assign lr  = a[1:0]*b[1:0]; // lowest 4bit partial product
assign mr1 = a[3:2]*b[1:0]; // middle one
assign mr2 = a[1:0]*b[3:2]; // another middle one
assign hr  = a[3:2]*b[3:2]; // highest one

// combine partial products into final product
assign result = {4'd0,lr} + {2'd0,mr1,2'd0} + {2'd0,mr2,2'd0} + {hr,4'd0};

还有更复杂的方法可以通过乘以数字的一部分来乘以整数,例如Karatsuba algorithm,但它们可能对硬件乘法无用。

答案 1 :(得分:1)

请参阅how to cascade multipliers上的lvds回答。

乘数

上的其他一些点

在输入位宽增长到乘数时,请记住,乘数大小呈指数增长,因此这不是线性问题。

乘数可以被认为是一个移位之和,如果每个移位由被乘数的位置和值控制,我们可以建立一个移位和一些AND门的乘数。

reg [3:0] a;
reg [3:0] b;
reg [7:0] mul;

always @* begin
  // mul = a * b;
  mul = ((a << 3) & {4{b[3]}} )
      + ((a << 2) & {4{b[2]}} )
      + ((a << 1) & {4{b[1]}} )
      + ((a     ) & {4{b[0]}} );
end