參考博文: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。每一組按下表編碼,並形成一個部分積。
乘法器——booth算法設計過程2
這里講解一下BOOTH算法的計算過程,方便大家對BOOTH的理解。
上圖是BOOTH算法的數學表達。由於FPGA擅長進行並行移位計算,所以BOOTH算法倒也好實現。
上圖是對乘數的加碼過程,具體可以見下面的例子。
7 x (-3),其中R1表示被乘數 7, R2 表示乘數 -3,那么二者對應的補碼,為 R1 0111,R2 1101,
P代碼最終結果容量,應該為 2x 4 + 1 = 9位,其中一位作為輔助位。計算過程如下:
上述的計算過程需要注意,在進行右移時,需要將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。