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

Can I make 4x4 multiplier only using 2x2 multiplier?

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

例如, 一=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 乘数。有谁知道如何做到这一点?请帮忙

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

更新:

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

请参阅 上的 lvds 回答。

关于乘数的一些其他要点

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

乘数可以看作是移位的和,如果每个移位都由被乘数的位置和值控制,我们可以用移位和一些与门构建一个乘数。

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

如果您有 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,但它们可能对硬件乘法没有用。