0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

布斯算法(Booth Algorithm)乘法器的Verilog實現(xiàn)

冬至子 ? 來源:Lin芯說 ? 作者:Lin芯說 ? 2023-12-04 15:16 ? 次閱讀

布斯算法介紹

Booth 的算法檢查有符號二的補碼表示中 'N'位乘數(shù) Y 的相鄰位對,包括低于最低有效位 y?1 = 0 的隱式位。對于每個位 yi,對于從 0 到 N ? 1 的 i,考慮位 yi 和 yi?1。當這兩個位相等時,乘積累加器P保持不變。其中 yi = 0 且 yi?1 = 1,乘以 2i 添加到 P;其中 yi = 1 且 yi?1 = 0,則從 P 中減去乘以 2i。P 的最終值為有符號結果。

未指定乘數(shù)和乘積的表示形式;通常,這些也都在二的補碼表示中,就像乘數(shù)一樣,但是任何支持加法和減法的數(shù)字系統(tǒng)也可以工作。如此處所述,步驟的順序尚未確定。通常,它從LSB到MSB,從i = 0開始;然后乘以2i通常被P累加器在步長之間向右的增量移位所取代;低位可以移出,然后可以在P的最高N位上進行后續(xù)的加法和減法。

該算法通常被描述為將乘數(shù)中 1 的字符串轉換為字符串末端的高階 +1 和低階 ?1。當字符串通過 MSB 運行時,沒有高階 +1,并且凈效應被解釋為相應值的負數(shù)。

計算步驟

使用的寄存器:A,M,Q,Qres(Qres是Q右移后的殘余位),n(計數(shù)器)

第1步: 加載寄存器的初始值。

A = 0(累加器),Qres = 0,M = 乘法,Q = 乘法器,n是等于乘法器位數(shù)的計數(shù)值。

第2步: 檢查 {Q0,Qres} 的值。如果為 00 或 11,請轉到步驟 5。如果為01,轉到步驟3。如果為 10,轉到步驟 4。

第3步: 執(zhí)行 A = A + M,轉到步驟 5。

第4步: 執(zhí)行 A = A - M。

第5步: 執(zhí)行 {A,Q,Qres} 的算術位移和遞減計數(shù)。

第6步: 檢查計數(shù)器值 n 是否為零。如果是,請轉到下一步。否則轉到步驟 2。

第7步: 停止計算,輸出計算結果。

計算流程圖

以下是布斯計算的流程圖,從圖中可以清楚的看出計算的過程,簡單的來說就是判定乘數(shù)的最低位和次低位,如果兩位相同則直接執(zhí)行移位操作,如果兩者不同,如為“10”則將原始值減去被乘數(shù),如為“01”則將原始值加上被乘數(shù)。

圖片

舉個栗子

下面就以被乘數(shù)為6,乘數(shù)為-4為例,做一個計算過程的舉例。

圖片

  1. 將所有寄存器初始化,累加器A初始化為0,乘數(shù)加載寄存,最低位移出位設定為0。
  2. 判定最低位和移出位為“00”,不進行加減操作,將結果結果值右移一位。
  3. 判定最低位和移出位為“00”,不進行加減操作,將結果結果值右移一位。
  4. 判定最低位和移出位為“10”,對累加器減去被乘數(shù),并將結果結果值右移一位,注意此時累加器A為負數(shù)。
  5. 判定最低位和移出位為“10”,不進行加減操作,將結果結果值右移一位,此時累加器為負數(shù),因此右移最高位補1。
  6. 判定最低位和移出位為“10”,不進行加減操作,將結果結果值右移一位,此時累加器為負數(shù),因此右移最高位補1。
  7. 計數(shù)器為0表示計算完成,停止計算并輸出計算結果值。

Verilog 實現(xiàn)

設計思想

總的來說和上面提到的計算步驟是一致的,利用三段狀態(tài)機實現(xiàn),分別為空閑狀態(tài)、計算狀態(tài)和完成狀態(tài),其中空閑狀態(tài)等待開始計算信號的到來,計算狀態(tài)完成布斯計算步驟,完成狀態(tài)輸出結果數(shù)據(jù)以及同步的有效標志信號。

Verilog 代碼

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*Engineer    : Linest-5                                                         
/*File        : booth_multiple.v                                                         
/*Create      : 2022-08-27 16:40:34
/*Revise      : 2022-08-27 16:40:34                                                  
/*Module Name : booth_multiple                                                  
/*Description : 基于布斯算法的乘法器設計                                                                         
/*Editor : sublime text3, tab size (4)                                                                                
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

modulebooth_multiple(
inputclk,
inputrst,
inputstart,
inputsigned [3:0]   X,
inputsigned [3:0]   Y,
outputreg signed [7:0]   Z,
outputvalid
);

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*參數(shù)和信號申明                                                              */
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
parameterIDLE      =  3'b001;
parameterCACULATE  =  3'b010;
parameterFINISH    =  3'b100;
reg[2:0]   state;
reg[2:0]   next_state;
reg[1:0]   q_reg;           //右移最后兩位寄存 
reg[2:0]   cnt;             //右移次數(shù)計數(shù)信號  
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*三段狀態(tài)機                                                                  */
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//狀態(tài)機第一段,狀態(tài)初始化,時序邏輯非阻塞賦值
always @(posedge clk or posedge rst) begin
  if (rst) begin
    state <= IDLE;
  end
  else begin
    state <= next_state;
  end
end
//狀態(tài)機第二段,狀態(tài)跳轉,組合邏輯阻塞賦值
always @(*) begin
  next_state = state;
  case(state)
    IDLE: begin
      if (start) begin
        next_state = CACULATE;
      end
      else begin
        next_state = IDLE;
      end
    end
    CACULATE: begin
      if (cnt == 'd3) begin
        next_state = FINISH;
      end
      else begin
        next_state = CACULATE;
      end
    end
    FINISH: begin
      next_state = IDLE;
    end
  endcase
end

//狀態(tài)機第三段,結果輸出,時序邏輯非阻塞賦值
always @(posedge clk or posedge rst) begin
  if (rst) begin
    cnt   <= 'd0;
    q_reg <= 'd0;
    Z     <= 'd0;
  end
  else begin
    case(state)
      IDLE: begin
        cnt   <= 'd0;
        q_reg <= {Y[cnt],1'b0};
        Z     <= {4'b0000,Y};
      end
      CACULATE: begin
        cnt   <= cnt + 'd1;
        q_reg <= {Y[cnt+1],Y[cnt]};
        case(q_reg)
          2'b00,2'b11: begin
            Z <= $signed(Z) >> >1;
          end
          2'b10: begin
            Z <= $signed({Z[7:4]-X,Z[3:0]}) >> >1;
          end
          2'b01: begin
            Z <= $signed({Z[7:4]+X,Z[3:0]}) >> >1;            
          end
        endcase
      end
      FINISH: begin
        cnt   <= 'd0;
        q_reg <= 'd0;
        Z     <= Z;        
      end          
    endcase
  end
end
assign valid = (state==FINISH);
endmodule

TestBench 代碼

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ 
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/* Engineer    : Linest-5                                                         
/* File        : tb_booth_multiple.v                                                         
/* Create      : 2022-08-27 19:22:46
/* Revise      : 2022-08-27 20:21:49                                                  
/* Module Name : tb_booth_multiple                                                  
/* Description : 基于布斯算法的乘法器仿真模塊                                                                         
/* Editor : sublime text3, tab size (4)                                                                                
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

`timescale 1ns/1ns
module tb_booth_multiple();
  reg                 clk;
  reg                 rst;
  reg                 start;
  reg  signed [3:0]   X;
  reg  signed [3:0]   Y;
  wire signed [7:0]   Z;
  wire                valid;

  initial begin
    clk = 'd0;
    rst = 'd1;
    #20
    rst = 'd0;
  end
  always #10 clk = ~clk;
  initial begin
    #20
    X = 6;
    Y = -4;
    start = 'd0;
    #50
    start = 'd1;
    #20
    start = 'd0;
    #200
    X = 7;
    Y = -5;
    start = 'd1;
    #20
    start = 'd0;
    #200
    X = 7;
    Y = 5;
    start = 'd1;
    #20
    start = 'd0;
  end


booth_multiple inst_booth_multiple (
  .clk   (clk),
  .rst   (rst),
  .start (start),
  .X     (X),
  .Y     (Y),
  .Z     (Z),
  .valid (valid)
);

endmodule

仿真波形

分別進行有符號的乘法,6和-4、7和-5、7和5,可以看到仿真波形中,正確的得到了計算結果,并且有效標志信號也同步輸出。

驗證成功!

圖片

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5268

    瀏覽量

    119640
  • Verilog
    +關注

    關注

    28

    文章

    1335

    瀏覽量

    109844
  • 乘法器
    +關注

    關注

    8

    文章

    204

    瀏覽量

    36902
  • 累加器
    +關注

    關注

    0

    文章

    50

    瀏覽量

    9433
  • MSB
    MSB
    +關注

    關注

    0

    文章

    13

    瀏覽量

    8236
收藏 人收藏

    評論

    相關推薦

    基于EPF10K100EQ 240-132和Booth編碼實現(xiàn)位浮點陣列乘法器的設計

    陣列乘法器的設計, 采用了改進的Booth 編碼, 和Wallace樹結構, 在減少部分積的同時, 使系統(tǒng)具有高速度, 低功耗的特點, 并且結構規(guī)則, 易于VLSI的實現(xiàn)
    發(fā)表于 11-06 12:47 ?1927次閱讀
    基于EPF10K100EQ 240-132和<b class='flag-5'>Booth</b>編碼<b class='flag-5'>實現(xiàn)</b>位浮點陣列<b class='flag-5'>乘法器</b>的設計

    fpga中定點乘法器設計(中文)

    …………………………………………………………………………………………… 51、 無符號數(shù)一位乘法 …………………………………………………………………………… 72、 符號數(shù)一位乘法 ……………………………………………………………………………… 83、
    發(fā)表于 08-12 11:59

    Verilog中用*實現(xiàn)乘法和用乘法器ip核實現(xiàn)乘法的區(qū)別?

    Verilog中用*實現(xiàn)乘法和用乘法器ip核實現(xiàn)乘法綜合結果有哪些不同?
    發(fā)表于 03-18 09:35

    怎么實現(xiàn)32位浮點陣列乘法器的設計?

    本文介紹了32 位浮點陣列乘法器的設計, 采用了改進的Booth 編碼, 和Wallace樹結構, 在減少部分積的同時, 使系統(tǒng)具有高速度, 低功耗的特點, 并且結構規(guī)則, 易于VLSI的實現(xiàn)
    發(fā)表于 05-08 07:44

    基于跳躍式Wallace樹的低功耗32位乘法器

    為了提高乘法器的綜合性能,從3個方面對乘法器進行了優(yōu)化設計。采用改進的Booth算法生成各個部分積,利用跳躍式Wallace樹結構進行部分積壓縮,通過改進的LING加
    發(fā)表于 04-17 09:35 ?27次下載

    基于Verilog HDL設計實現(xiàn)乘法器性能研究

    本文在設計實現(xiàn)乘法器時,采用了4-2 和5-2 混合壓縮器對部分積進行壓縮,減少了乘法器的延時和資源占用率;經(jīng)Xilinx ISE 和Quartus II 兩種集成開發(fā)環(huán)境下的綜合仿真測試,與用
    發(fā)表于 09-17 11:13 ?27次下載

    一種用于SOC中快速乘法器的設計

    本文設計了適用于 SOC(System On Chip)的快速乘法器內核。通過增加一位符號位,可以支持24×24 無符號和有符號乘法。在乘法器的設計中,采用了改進的Booth
    發(fā)表于 09-21 10:40 ?20次下載

    數(shù)字陣列乘法器算法及結構分析

    對數(shù)字陣列乘法器的移位加算法、Pezaris 算法、Baugh-Wooley 算法的性能進行了分析,討論其各自的特點;指出進一步提高并行快速乘法器
    發(fā)表于 12-14 09:28 ?41次下載

    基于FPGA 的單精度浮點數(shù)乘法器設計

    設計了一個基于FPGA的單精度浮點數(shù)乘法器.設計中采用改進的帶偏移量的冗余Booth3算法和跳躍式Wallace樹型結構,并提出對Wallace樹產(chǎn)生的2個偽和采用部分相加的方式,提高了乘法器
    發(fā)表于 09-29 16:46 ?44次下載

    乘法器的基本概念

    乘法器的基本概念 乘法器是一種完成兩個互不相關的模擬信號相乘作用的電子器件。理想乘法器的輸出特性方程可由下式表示: UO
    發(fā)表于 05-18 14:03 ?1.4w次閱讀
    <b class='flag-5'>乘法器</b>的基本概念

    基于FPGA的高速流水線浮點乘法器設計與實現(xiàn)

    設計了一種支持IEEE754浮點標準的32位高速流水線結構浮點乘法器。該乘法器采用新型的基4算法,改進的4:2壓縮結構和部分積求和電路,完成Carry Save形式的部分積壓縮,再
    發(fā)表于 02-29 11:20 ?3467次閱讀

    8乘8乘法器verilog源代碼

    8乘8乘法器verilog源代碼,有需要的下來看看
    發(fā)表于 05-23 18:21 ?24次下載

    一種高速流水線乘法器結構

    設計了一種新穎的3232位高速流水線乘法器結構.該結構所采用的新型Radix-16 Booth算法吸取了冗余Booth編碼與改進Booth
    發(fā)表于 03-15 13:34 ?6次下載
    一種高速流水線<b class='flag-5'>乘法器</b>結構

    使用verilogHDL實現(xiàn)乘法器

    VerilogHDL語言實現(xiàn)的兩位陣列乘法器和傳統(tǒng)的 Booth編碼乘法器進行了性能比較,得出用這種混合壓縮的器乘法器要比傳統(tǒng)的4-2壓縮器
    發(fā)表于 12-19 13:30 ?1.1w次閱讀
    使用verilogHDL<b class='flag-5'>實現(xiàn)</b><b class='flag-5'>乘法器</b>

    乘法器原理_乘法器的作用

    乘法器(multiplier)是一種完成兩個互不相關的模擬信號相乘作用的電子器件。它可以將兩個二進制數(shù)相乘,它是由更基本的加法器組成的。乘法器可以通過使用一系列計算機算數(shù)技術來實現(xiàn)。
    發(fā)表于 02-18 15:08 ?2.6w次閱讀
    <b class='flag-5'>乘法器</b>原理_<b class='flag-5'>乘法器</b>的作用