<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

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

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

布斯算法介紹

Booth 的算法檢查有符號二的補碼表示中 'N'位乘數 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 的最終值為有符號結果。

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

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

計算步驟

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

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

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

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

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

第4步: 執行 A = A - M。

第5步: 執行 {A,Q,Qres} 的算術位移和遞減計數。

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

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

計算流程圖

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

圖片

舉個栗子

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

圖片

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

Verilog 實現

設計思想

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

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

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*參數和信號申明                                                              */
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
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;             //右移次數計數信號  
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*三段狀態機                                                                  */
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//狀態機第一段,狀態初始化,時序邏輯非阻塞賦值
always @(posedge clk or posedge rst) begin
  if (rst) begin
    state <= IDLE;
  end
  else begin
    state <= next_state;
  end
end
//狀態機第二段,狀態跳轉,組合邏輯阻塞賦值
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

//狀態機第三段,結果輸出,時序邏輯非阻塞賦值
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,可以看到仿真波形中,正確的得到了計算結果,并且有效標志信號也同步輸出。

驗證成功!

圖片

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

    關注

    30

    文章

    5164

    瀏覽量

    118133
  • Verilog
    +關注

    關注

    28

    文章

    1328

    瀏覽量

    109464
  • 乘法器
    +關注

    關注

    8

    文章

    194

    瀏覽量

    36654
  • 累加器
    +關注

    關注

    0

    文章

    50

    瀏覽量

    9378
  • MSB
    MSB
    +關注

    關注

    0

    文章

    13

    瀏覽量

    8219
收藏 人收藏

    評論

    相關推薦

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

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

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

    …………………………………………………………………………………………… 51、 無符號數一位乘法 …………………………………………………………………………… 72、 符號數一位乘法 ……………………………………………………………………………… 83、
    發表于 08-12 11:59

    Verilog中用*實現乘法和用乘法器ip核實現乘法的區別?

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

    怎么實現32位浮點陣列乘法器的設計?

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

    硬件乘法器是怎么實現的?

    硬件乘法器是怎么實現
    發表于 09-22 06:53

    基于Verilog HDL設計實現乘法器性能研究

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

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

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

    基于FPGA 的單精度浮點數乘法器設計

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

    1/4平方乘法器

    1/4平方乘法器 這種乘法器是根據數學關系設計而成的,因此稱為1/4平方乘法電路,或稱1/4平方乘法器。其
    發表于 05-18 14:08 ?1843次閱讀
    1/4平方<b class='flag-5'>乘法器</b>

    N象限變跨導乘法器

    N象限變跨導乘法器 為了克服圖5.4-25所示的乘法器的缺點,在基電路的基礎上,采用了雙重差分放大式結構,設計出如圖5.4-27所示的N象限變跨導乘法器。
    發表于 05-18 15:24 ?1611次閱讀
    N象限變跨導<b class='flag-5'>乘法器</b>

    變跨導乘法器

    變跨導乘法器 這種乘法器現在已經成為一種工業上的標準方法,是應用極為廣泛的優質乘法器。
    發表于 05-18 16:00 ?1137次閱讀

    基于IP核的乘法器設計

    實驗目的 1、熟悉Xilinx的ISE 軟件的使用和設計流程; 2、掌握Modelsim仿真軟件的使用方法; 3、用乘法運算符實現一個16*16 乘法器模塊; 4、用IP核實現一個16
    發表于 05-20 17:00 ?68次下載
    基于IP核的<b class='flag-5'>乘法器</b>設計

    8乘8乘法器verilog源代碼

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

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

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

    使用verilogHDL實現乘法器

    ,與用VerilogHDL語言實現的兩位陣列乘法器和傳統的 Booth編碼乘法器進行了性能比較,得出用這種混合壓縮的器乘法器要比傳統的4-2
    發表于 12-19 13:30 ?1.1w次閱讀
    使用verilogHDL<b class='flag-5'>實現</b><b class='flag-5'>乘法器</b>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>