Booth算法-乘法器設計


參考博文:https://blog.csdn.net/weixin_33847182/article/details/85779067 和 https://www.cnblogs.com/wangkai2019/p/11144367.html

乘法器——booth算法設計過程1

 

可以證明的是,這三個公式是相等的,一個有符號的二進制數的補碼用公式1來表示,可以等價地寫成公式2和公式3。

布斯編碼可以減少部分積的數目(即減少乘數中1的個數),用來計算有符號乘法,提高乘法運算的速度。

    

    如上圖所示為二進制乘法的過程,也是符合我們正常計算時的邏輯,我們假設有一個8位乘數(Multiplier),它的二進制值為0111_1110,它將產生6行非零的部分積,因為它有6個非零值(即1)。如果我們利用公式2將這個二進制值改為1000_00-10,其中低四位中的-1表示負1,可以證明兩個值是相等的。可以這樣簡單理解,那就是現在原值得末尾加輔助位0,變為0111_1110_0,然后利用低位減去高位,即得到1000_00-10。這樣一變換可以減少0的數目,從而減少加的次數,我們只需相加兩個部分積,但是終的加法器必須也能執行減法。這種形式的變換稱為booth encoding(即booth編碼),它保證了在每兩個連續位中最多只有一個是1或-1。部分積數目的減少意味着相加次數的減少,從而加快了運算速度(並減少了面積)。從形式上來說,這一變換相當於把乘數變換成一個四進制形式。

    最經常使用的是改進的booth編碼。乘數按三位一組進行划分,相互重疊一位。其實就是把公式1重寫為公式3。每一組按下表編碼,並形成一個部分積。

    再考慮前面提及的8位二進制數0111_1110。從msb到lsb,可以把它分為 三位一組首尾重疊的四組:01(1),11(1),11(1),10(0),末尾補了一個輔助位0。根據上表編碼得到:10(2),00(0),00(0),-10(-2),或者表示為1000_000-10,這與前面得到結果是一樣的。這時,乘2就是移位。所以布斯算法僅涉及加法,減法和移位操作。
    這樣一來就很容易理解了。

乘法器——booth算法設計過程2

這里講解一下BOOTH算法的計算過程,方便大家對BOOTH的理解。

image       上圖是BOOTH算法的數學表達。由於FPGA擅長進行並行移位計算,所以BOOTH算法倒也好實現。

       image

       上圖是對乘數的加碼過程,具體可以見下面的例子。

       7 x (-3),其中R1表示被乘數 7, R2 表示乘數 -3,那么二者對應的補碼,為 R1 0111,R2 1101,

P代碼最終結果容量,應該為 2x 4 + 1 = 9位,其中一位作為輔助位。計算過程如下:

      image

      image

        上述的計算過程需要注意,在進行右移時,需要將P = {R0,R2},當作整體看待,若P[8]最高位為0,則

移位之后的結果R0的最高位就補0,若是1就補1,由上圖的第7步到第8步的變換,{R0,R2} =

{1001,,0001},那么P的最高位是1,則以后之后,R0的高位需要補1,所以得到移位之后的結果{R0,R2} =

{1100,1000},並且輔助位由於乘數的低位是1,所以輔助位為1,輔助位和乘數的移調的位的邏輯值有關,比

如乘數是0010,則四次操作的輔助為 0, 1, 0, 0。

 


免責聲明!

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



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