【HDL系列】乘法器(7)——Booth中的符號位擴展技巧

目錄

一、無符號乘法符號位擴展原理

二、有符號位乘法符號位擴展原理

三、Verilog設計


文介紹了基4 Booth乘法器,並且設計了具有基本功能的Booth乘法器,其中在文末留下了幾個有待優化的問題,本文將優化“生成部分和”與“符號位擴展”兩部分,參考:https://zhuanlan.zhihu.com/p/143802580

本文原理部分意譯自《Sign Extension in Booth Multipliers》,需要說明的是其中的表述存在多處歧義,且Booth編碼表負數認定有誤,請注意鑑別,其中位寬的問題更值得注意。對於有符號數乘法,其實在用如下符號位擴展時無需自動擴展部分和的符號位,這在參考的文檔中是致命的誤導,但好在可以通過圖片獲得該符號位擴展算法的啓發。

先給出符號位擴展算法如下(算法有效,已驗證):

    (1)將每個部分和的最高比特位取反;

    (2)對第一個部分和的最高比特位加“1”;

    (3)在所有部分和的最高位前增加1比特數“1”。

依據以上3條規則,我總結爲“取反”“加一”“再加一”

以4*4有符號乘法器爲例,A=4‘b1111=-1,B=4‘b0100=4,P=A*B=-4,如下圖爲使用符號位擴展技巧前後的陣列式:

圖1. 符號位擴展技巧

上圖中(1),僅僅將每一部分的符號位進行擴展,之後按列相加;而在(2)中使用符號位擴展技巧,將不必對每一個部分和進行符號位擴展,首先對部分和符號位取反,然後在第一個部分符號位加1,最後在每個部分和前加1,按列相加即可,得到結果與之前的結果相同。

對於以上4比特位寬有符號數相乘,符號位擴展技術帶來的受益不多,但對於多比特數相乘且部分和較多的情況下可以節省大量的面積和功耗,同時對於後級的Wallace,也可以使用更少的CSA。

如果你對以上方法好奇的話,可以從以下一二部分獲得一些啓發。

一、無符號乘法符號位擴展原理

假設16*16無符號乘法器的所有部分和均爲正數,如圖2所示。在基4 Booth編碼中有乘2操作,所以除了底部的部分和爲16比特,其他部分和的位寬均爲17比特。無符號乘數需在高位補充2位以確保得到一個正的部分和,所以最底部的部分和始終爲正,且其位寬爲16比特。

圖2. 基4 Booth部分和全爲正的陣列圖

圖3表示部分和全爲負數,以二進制補碼形式表示,最低比特加1。由於被乘數是無符號數,所以乘數的booth編碼爲負數。

圖3. 基4 Booth部分和全爲負的陣列圖

將圖3中左上角擴展的符號位全部相加,可以得到如圖4所示。

圖4. 基4 Booth部分和全爲負,擴展位求和結果

假設其中某個部分和不是負數,則該部分和末尾加1的操作將會使連續的1被變換回連續的0。而實際上末尾加1只發生在乘數和與負數相乘的時候,即booth編碼爲100,101,110的時候。圖5顯示了這種做法,S表示當前部分和的符號(注意:因爲是無符號數相乘,所以此處部分和的符號由booth編碼決定,也就是說S是booth碼的符號)。

當S=0時,即符號和爲正數,最低位不會加1;

當S=1時,即符號位爲負數,最低爲加1,即對被乘數取反後的加1。

圖5. 無符號數乘法,基4 Booth乘法陣列

對S取反的操作加入到第一部分和上,可以減少部分和的個數,降低列高。

當S=0時,~S=1,第一個部分和的最高3比特位100;

當S=1時,~S=0,第一個部分和的最高3比特位001;

所以變換後的結果如圖6所示:

圖6. 無符號數乘法,基4 Booth乘法陣列,降低列高

 

二、有符號位乘法符號位擴展原理

基於以上無符號乘法,以下是幾點對於有符號乘法需要修改的。

(1)最底部的部分和,在無符號數乘法中用於保證結果是正數,對於有符號乘法是不需要的。對於16*16有符號乘法器,相比無符號乘法器減少一個部分和。

(2)當Booth乘法表選擇+Multiplicand或者-Multiplicand時,部分和的第17比特是被乘數的符號位擴展,且該擴展發生在求補碼前。

(3)在假設部分和全爲負數時,擴展位中連續1的清除與之前稍有不同。當部分和爲0是時,部分和中連續的1可以被還原爲連續的0。對於有符號數乘法發生在以下情況:被乘數與Booth編碼同符號即可。被乘數的符號和乘數編碼符號使用同或符號,產生信號“E”,用於當部分和爲0時清除假設的連續1。

圖7. 16*16有符號乘法陣列

 

三、Verilog設計

本文中將在基於上期文章設計的Booth乘法器(基4 Booth編碼、Wallace樹、CSA以及行波進位加法器,16比特位寬,有符號數乘法)中使用符號位擴展技巧,以節省符號位擴展帶來的不必要的面積和功耗消耗,同時將省去生成部分和中的加法器,僅供參考。

圖8是符號位擴展方法,限定8個部分和的位寬大小,不再採用之前固定的32位位寬。

同時修改上期中Booth編碼表,只限定編碼爲100,101,110爲負數,neg=1,其他編碼neg爲0。如果乘數的編碼爲負數,對被乘數取反後的加1操作將與下個部分和末尾結合成新的部分和。另外,二維數組端口請使用支持sv的綜合器。

圖8. 符號位擴展方法

 

圖9.更新Booth top頂層

 

圖10. 隨機驗證測試結果打印

 

謝謝您的閱讀!

原創不易,如果對您有幫助,記得點贊關注哦。歡迎批評指正,謝謝鼓勵!

一起“紙上談芯”,共同學習:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章