Verilog 我可以只使用2x2倍增器制作4x4倍增器吗?

Verilog 我可以只使用2x2倍增器制作4x4倍增器吗?,verilog,vlsi,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乘法器呢。有人知道怎么做吗?

我想只使用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乘法器呢。有人知道怎么做吗?请帮忙

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

更新:

这样行吗? 如何解决?

请参阅上的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
reg[3:0]a;
reg[3:0]b;
reg[7:0]mul;
总是开始
//mul=a*b;
mul=((a参见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
reg[3:0]a;
reg[3:0]b;
reg[7:0]mul;
总是开始
//mul=a*b;
mul=((a参见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
reg[3:0]a;
reg[3:0]b;
reg[7:0]mul;
总是开始
//mul=a*b;
mul=((a参见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
reg[3:0]a;
reg[3:0]b;
reg[7:0]mul;
总是开始
//mul=a*b;

mul=((a如果有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};

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

如果您有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};

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

如果您有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};

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

如果您有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};


还有更复杂的方法,例如,通过将部分数字相乘来将整数相乘,但它们可能对硬件乘法没有用处。

这基本上是一个数学问题。乘法后转换?你有加法还是乘法?还有什么其他构建块可用?你至少需要wiring和寄存器以及时钟相关的东西。任何移位或累加寄存器?嗯…我认为可以通过将常规寄存器连接到自身来制作累加器。这基本上是一个数学问题。乘法后转换?你有加法还是乘法?还有什么其他积木可用?你至少需要连接一个nd寄存器和时钟相关的东西。有移位寄存器或累加寄存器吗?嗯……我认为可以通过将常规寄存器连接到自身来制作累加器。这基本上是一个数学问题。在乘法之后转换?你有加法还是乘法?还有什么其他的积木可用?你至少需要连接和r寄存器和时钟相关的东西。有移位寄存器或累加寄存器吗?嗯……我认为可以通过将常规寄存器连接到自身来制作累加器。这基本上是一个数学问题。乘法后转换?你有加法还是乘法?还有什么其他的积木可用?你至少需要连接和寄存器寄存器和时钟相关的东西。有移位寄存器或累加寄存器吗?嗯……我认为可以通过将常规寄存器连接到自身来对其进行累加。非常感谢,先生。如果可以,请您演示一下如何仅使用4x4乘法器来创建8x8乘法器?@kaji,您应该能够在这里找到该模式。8x8将被激活ke 4 4x4。输入宽度翻倍总是需要4个。LSB、MSB每个的LSB与其他的MSB相对。@lvd令人印象深刻,没有见过的乘法器像这样级联来制作更大的乘法器。我们可以在级之间插入触发器来制作多周期流水线乘法器。非常感谢您,先生。如果可以,请您演示8x8乘法器将仅使用4x4乘法器创建?@kaji,您应该能够在此处找到模式。8x8将使用4x4。输入宽度总是需要4倍。LSB、MSB和LSB的LSB与其他的MSB的LSB对比。@lvd令人印象深刻,没有见过的乘法器像这样级联以生成更大的乘法器。我们可以插入触发器在级之间制作多周期流水线乘法器。