乗算器 - 4ワラスツリー乗数ベースの実装

    知識は、部分積を利用する際見つけ圧縮乗数のブースエンコーディングプラスウォレスツリー圧縮を学ぶブロガー最近の研究の加算器、乗算(保存キャリー桁上げ保存加算器加算器)は、そのようなブロガーの追加を非常に理解がありませんが、長い時間のためにドラッグ、私はいつもキャリーセーブ加算器はここに、あなたと共有する今日最終的にいくつかの理解の一般的なシリアルの加算器であると思いました。

  まず、我々は例をあげ、4個の符号なし乗算1110および1011のために、我々は次の式を得ます:

          1  0  1  1
              x   1  1  1  0
        ------------------------------
                  0  0  0  0             PP1
               1  0  1  1                PP2
            1  0  1  1                   PP3
         1  0  1  1                      PP4
        ------------------------------   
  乘积项中间结果有4个:PP1、PP2、PP3、PP4。由于进位保存加法器只能进行三个数的相加,因而可采用两个进位保存加法器实现。第一个进位保存加法器实现PP1、PP2、PP3的加法,第二个进位保存加法器将PP3和上一级的S和C相加。最终通过一个并行加法器输出积。计算过程如下:
第一个进位保存加法器
PP1:                    0  0  0  0
PP2:                 1  0  1  1  0
PP3:              1  0  1  1  0  0
---------------------------------------
sum1              1  1  1  0  1  0
c1                0  0  0  1  0  0   
第二个进位保存加法器 
carry_in:         1  0  1  1  0  0  0
sum1              0  1  1  1  0  1  0                   
c1                0  0  0  1  0  0  0
---------------------------------------
sum2:             1  1  0  1  0  1  0
c2:              0  0  1  1  0  0  0
并行加法器:
sum2:             1  1  0  1  0  1  0
c2:              0  1  1  0  0  0  0
---------------------------------------
result            1  0  0  1  1  0  1  0  

  我们注意到,在参与下一级运算的过程中,由于进位要用于高位的求和,故c1,c2均应左移一位求。算出来的结果为:10011010(154)。
所谓“进位保留”,便是进位不进上去,只在本位之间计算。
基于Wallace树的4位乘法器实现Verilog代码如下所示:

モジュールwallace_multiplier(
入力[3:0] A、
入力[3:0] B、
出力[7:0]の結果
)。

 

ワイヤー[7:0] PP1。
ワイヤー[7:0] PP2。
ワイヤー[7:0] PP3。
ワイヤー[7:0] PP4。

 

ワイヤー[7:0] SUM1。
ワイヤー[7:0] CARRY1。
ワイヤー[7:0] SUM2。
ワイヤー[7:0] carry2。

 

PP1の=のB [0]を割り当てますか?A:「D0;
割り当てPP2の= bの[1]?A:「D0;
PP3の= bの[2]を割り当てますか?A:「D0;
割り当てPP4の=のB [3]?A:「D0;

 

結果= SUM2 +(carry2 << 1)を割り当てます。

 

carry_save_adder u1_carry_save_adder(
pp1 ,
pp2 << 1'b1,
pp3 << 2'd2,
sum1 ,
carry1
);

 

carry_save_adder u2_carry_save_adder(
pp4 << 2'd3 ,
sum1 ,
carry1 << 1'b1,
sum2 ,
carry2
);
endmodule

 

module carry_save_adder
#(
parameter DATA_WIDTH = 7
)
(
input [DATA_WIDTH:0] a,
input [DATA_WIDTH:0] b,
input [DATA_WIDTH:0] cin,
output [DATA_WIDTH:0] sum,
output [DATA_WIDTH:0] cout
);

 

assign sum = a ^ b ^ cin;
assign cout = a & b | (a | b) & cin;

 

endmodule

 

testbench:

`timescale 1ns / 1ns

module wallace_multiplier_tb();

reg [3:0] a;
reg [3:0] b;
wire[7:0] result;

wallace_multiplier u_wallace_multiplier(
.a (a ),
.b (b ),
.result (result )
);

initial begin
a = 4'b0010;
b = 4'b0110;
#10;
a = 4'b0001;
b = 4'b1000;
#10;
a = 4'b1010;
b = 4'b0111;
#10;
a = 4'b1110;
b = 4'b0010;
#10;
a = 4'b1111;
b = 4'b1111;
#10;
a = 4'b0110;
b = 4'b1001;
end

endmodule

  仿真结果如下图:

  以上就是Wallace树型4位乘法器的实现了,我认为关键在于进位保留加法器(Carry Save Adder)的理解,希望能给大家带来帮助。  

 

 

 

 


 

おすすめ

転載: www.cnblogs.com/wangkai2019/p/11228411.html