首先,把下圖的三個式子依次稱為【1】【2】【3】。
一個有符號的二進位制數的補碼用式子【1】來表示,可以等價地寫成式子【2】和【3】。
布斯編碼可以減少部分積的數目,用來計算有符號乘法,提高乘法運算的速度。
下圖是二進位制乘法的過程:
例如假設有一個8位乘數(Multiplier):0111_1110,它將產生6行非零的部分積。如果把該數字記成另一種形式,1000_00-10(可以驗證是同一個數字,-1是負1),其實就是式子【1】重寫為式子【2】,則可以大大減少非零行的數目。採用這一形式,我們只需相加兩個部分積,但最終的加法器必須也能執行減法。這種形式的變換稱為Booth Encoding,它保證了在每兩個連續位中最多隻有一個是1或-1。部分積數目的減少意味著相加次數的減少,從而加快了運算速度(並減少了面積)。從形式上來說,這一變換相當於把乘數變換成一個四進位制形式。
但最經常使用的是改進的布斯編碼。乘數按三位一組進行劃分,相互重疊一位。其實就是把式子【1】重寫為式子【3】。每一組按下表編碼,並形成一個部分積。
知道了這個過程,這時你再看布斯演算法應該很容易理解了。我覺得最重要的是那三個式子!
另外,大(即位數較多的)乘法器可以採用高基(high radix)的布斯編碼。
首先,把下圖的三個式子依次稱為【1】【2】【3】。
一個有符號的二進位制數的補碼用式子【1】來表示,可以等價地寫成式子【2】和【3】。
布斯編碼可以減少部分積的數目,用來計算有符號乘法,提高乘法運算的速度。
下圖是二進位制乘法的過程:
例如假設有一個8位乘數(Multiplier):0111_1110,它將產生6行非零的部分積。如果把該數字記成另一種形式,1000_00-10(可以驗證是同一個數字,-1是負1),其實就是式子【1】重寫為式子【2】,則可以大大減少非零行的數目。採用這一形式,我們只需相加兩個部分積,但最終的加法器必須也能執行減法。這種形式的變換稱為Booth Encoding,它保證了在每兩個連續位中最多隻有一個是1或-1。部分積數目的減少意味著相加次數的減少,從而加快了運算速度(並減少了面積)。從形式上來說,這一變換相當於把乘數變換成一個四進位制形式。
但最經常使用的是改進的布斯編碼。乘數按三位一組進行劃分,相互重疊一位。其實就是把式子【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就是移位。所以布斯演算法僅涉及加法,減法和移位操作。知道了這個過程,這時你再看布斯演算法應該很容易理解了。我覺得最重要的是那三個式子!
另外,大(即位數較多的)乘法器可以採用高基(high radix)的布斯編碼。