0

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 乗数を作成するにはどうすればよいですか?

アップデート :

これは稼働していますか? http://blog.pioneermathematics.com/2011/04/26/vedic-trick-on-multiplication/どうやって?

4

2 に答える 2

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};

カラツバ アルゴリズムなど、数値の一部を乗算して完全な数を乗算するより洗練された方法もありますが、ハードウェアの乗算にはおそらく役に立たないでしょう。

于 2015-02-11T11:15:06.857 に答える
1

乗数をカスケードする方法については、 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
于 2015-02-11T08:26:18.973 に答える