筆試寒武紀IC前端,其中有一道設計4位華萊士樹乘法器,此前很少接觸相關方面知識,再次做一簡單總結。

傳統乘法器設計在求出中間結果時,使用全加器對各級中間結果相加求出最終乘法器結果。由於全加器進位鏈的限制,特別是隨著乘法器位寬的增加,乘法器的速度受到限制,而華萊士樹加法器採用進位保存加法器而非全加器對中間結果進行計算,它能同時執行三數相加而非兩數相加,雖然消耗元器件個數增多但其速度提高很多。

進位保存加法器輸入由X,Y和進位Z組成,其輸出由改位和S和進位C組成,一次計算將產生兩個結果,相比傳統的全加器區別在於進位保存加法器的進位輸出並不參與上一位的求和,而是單獨輸出,最後再用一個全加器進行進位加入。下面就4位加法器的計算原理進行解釋說明:

考慮乘法1011想1110,首先計算各個乘積項的中間結果:

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 0PP2: 1 0 1 1 0PP3: 1 0 1 1 0 0---------------------------------------sum1 1 1 1 0 1 0c1 0 0 0 1 0 0 第二個進位保存加法器 carry_in: 1 0 1 1 0 0 0sum1 0 1 1 1 0 1 0 c1 0 0 0 1 0 0 0---------------------------------------sum2: 1 1 0 1 0 1 0c2: 0 0 1 1 0 0 0並行加法器:sum2: 1 1 0 1 0 1 0c2: 0 1 1 0 0 0 0---------------------------------------product 1 0 0 1 1 0 1 0

在參與下一級運算的過程中,由於進位要用於高位的求和,故c1,c2均應左移一位求值。計算結果為:10011010(154)。

4x4乘法器華萊士樹實現代碼及模擬波形如下圖所示:

module Wallace_multipler( input [3:0] a, input [3:0] b, output [7:0] product ); wire [3:0] c[3:0]; wire [5:0] sum1,carry1; wire [6:0] sum2,carry2; assign c[0]=b[0]?a:d0; assign c[1]=b[1]?a:d0; assign c[2]=b[2]?a:d0; assign c[3]=b[3]?a:d0; carry_save_adder #(.DATA_WIDTH(6)) csa1(c[0]|d0,(c[1]<<1)|d0,(c[2]<<2)|d0,sum1,carry1); carry_save_adder#(.DATA_WIDTH(7)) csa2(sum1|d0,(carry1<<1)|d0,(c[3]<<3|d0),sum2,carry2); assign product = sum2 + (carry2<<1);endmodulemodule carry_save_adder#(parameter DATA_WIDTH=4)( input [DATA_WIDTH-1:0]a, input [DATA_WIDTH-1:0]b, input [DATA_WIDTH-1:0]cin, output [DATA_WIDTH-1:0] sum, output [DATA_WIDTH-1:0]carry_out ); generate genvar index; for(index=0;index<DATA_WIDTH;index=index+1b1) begin assign {carry_out[index], sum[index]} = a[index]+b[index]+cin[index]; end endgenerateendmodule


推薦閱讀:
相关文章