我想使用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/怎么样?
答案 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