booth乘法器原理


微處理器芯片中,乘法器是進行數字信號處理的核心,同一時候也是微處理器中進行數據處理關鍵部件乘法器完畢一次操作的周期基本上決定了微處理器的主頻。乘法器的速度和面積優化對於整個CPU的性能來說是非常重要的。

為了加快乘法器的運行速度。降低乘法器的面積。有必要對乘法器的算法、結構及電路的詳細實現做深入的研究。 Booth算法與乘法器的一般結構 乘法器工作的基本原理是首先生成部分積。再將這些部分積相加得到乘積。在眼下的乘法器設計中,基4Booth算法是部分積生成過程中普遍採用的算法。

對於N位有符號數乘法A×B來說,常規的乘法運算會產生N個部分積。假設對乘數B進行基4Booth編碼。每次需考慮3位:相鄰高位、本位和相鄰低位,編碼后產生部分積的個數能夠降低到[(N+1)/2]??

([X]取值為不大於X的整數),確定運算量0、±1A、±2A。

對於2A的實現。僅僅須要將A左移一位。因此,對於符號數乘法而言。基4 Booth算法既方便又快捷。而對於無符號數來說,僅僅需對其高位作0擴展。而其它處理方法同樣。盡管擴展后可能導致部分積的個數比有符號數乘法多1,可是這樣的算法非常好地保證了硬件上的一致性。有利於實現。對於32位乘法來說。結合指令集的設計,通常情況下須要相加的部分積不超過18個

 

booth乘法器是一種位操作乘法器。與傳統乘法器不同的是直接操作位。傳統乘法器依靠加法,不斷累加。在這里就不說了。

------------------------------------------------------------------------------------------------------------------------------------------------------------

booth乘法器有個重要的加碼運算。來看一下

BOOTH乘法器——看到別人解說的booth乘法器,能夠作為booth,借鑒下 - 成 - 學海泛舟

 B[-1]就是B的零位右邊的位。是假想的位。如0010  0  B[-1]就是0。

  做booth乘法器又引入了p空間。

BOOTH乘法器——看到別人解說的booth乘法器,能夠作為booth,借鑒下 - 成 - 學海泛舟
上圖的左移一位或者右移一位指的是p空間。什么是p空間呢?我們以7(0111)和2(0010)相乘為例。他們位數n均為4位。所以p空間大小為n*2+1=9。
p空間是怎樣做乘法運算的呢?
BOOTH乘法器——看到別人解說的booth乘法器,能夠作為booth,借鑒下 - 成 - 學海泛舟
BOOTH乘法器——看到別人解說的booth乘法器,能夠作為booth,借鑒下 - 成 - 學海泛舟

 

代碼例如以下:

module product ( input CLK, input RSTn,

input Start_Sig, input [7:0]A, input [7:0]B,

output Done_Sig, output [15:0]Product,

output [7:0]SQ_a, output [7:0]SQ_s, output [16:0]SQ_p );

/*************************/

reg [3:0]i; reg [7:0]a; // a的寄存器 reg [7:0]s; // a的補碼加1 a非 reg [16:0]p; // p空間存儲器 reg [3:0]X;   //操作次數 reg isDone;

always @ ( posedge CLK or negedge RSTn )  if( !RSTn )   begin        i <= 4'd0;    a <= 8'd0;    s <= 8'd0;    p <= 17'd0;    X <= 4'd0;    isDone <= 1'b0;   end  else if( Start_Sig )   case( i )        0:     begin a <= A; s <= ( ~A + 1'b1 ); p <= { 8'd0 , B , 1'b0 }; i <= i + 1'b1; end        1:     if( X == 8 ) begin X <= 4'd0; i <= i + 4'd2; end     else if( p[1:0] == 2'b01 ) begin p <= { p[16:9] + a , p[8:0] }; i <= i + 1'b1; end     else if( p[1:0] == 2'b10 ) begin p <= { p[16:9] + s , p[8:0] }; i <= i + 1'b1; end     else i <= i + 1'b1;        2:     begin p <= { p[16] , p[16:1] }; X <= X + 1'b1; i <= i - 1'b1; end        3:     begin isDone <= 1'b1; i <= i + 1'b1; end        4:     begin isDone <= 1'b0; i <= 4'd0; end       endcase

/*************************/

assign Done_Sig = isDone; assign Product = p[16:1];

/*************************/

assign SQ_a = a; assign SQ_s = s; assign SQ_p = p; /**************************/ endmodule



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM