關注我的公衆號c137Lab獲取更多相關內容
非傳統定點數(一)
有符號數(Signed Digit Number,SD)
SD 和 SM(Signed-Magnitude)不同,具有三重值 其中 -1 也常寫成 .已經證明SD數應用在不用進位的加法器和乘法器中能夠降低複雜性。
SD碼編碼示例:
可以看出SD碼是不唯一的。事實上,要降低乘法的工作量,需要降低運算中非零元素的數量。我們稱擁有最少非零元素的SD碼爲CSD碼。
最佳CSD編碼
最佳CSD編碼:
- 從最低有效位開始,用 取代所有大於 2 的 1 序列。此外,還需要用 取代
- 從最高位開始,用 代替
該方法給出一個非零元素最少的SD碼,且其中的減法次數最少。
示例:
雖然第一步沒有減少非零元素的個數,但是它使用加法替代了減法。最終,這一算法將 3 次加法簡化爲了兩次減法。
觀察 ,如果將其轉換爲 ,那麼實際上是複雜化了運算,將一次加法變成了一次減法。這也就是最佳CSD編碼第二步操作的意義。
分數CSD編碼
使用整型數實現分數會導致很大的誤差,使用CSD編碼可以降低這一誤差。
例如,可以寫成以下幾種實現方式:
不難看出, 是普通二進制碼, 是CSD碼
使用Verilog實現上述代碼並觀察結果(iverilog):
module csd( input [4:0] x0, output [4:0] y0, output [4:0] y1, output [4:0] y2, output [4:0] y3 ); assign y0 = 7*(x0)/8; assign y1 = (x0/8)*7; assign y2 = x0/2+x0/4+x0/8; assign y3 = x0-x0/8; endmodule
`timescale 1ns/100ps module csd_tb; reg [4:0] x0; wire [4:0] y0; wire [4:0] y1; wire [4:0] y2; wire [4:0] y3; /*iverilog */ initial begin $dumpfile("wave.vcd"); //生成的vcd文件名稱 $dumpvars(0, csd_tb); //tb模塊名稱 end /*iverilog */ initial begin x0 = 1; #10 x0 = 3; #20 x0 = 6; #30 x0 = 9; #100 $stop; end csd cds_ut0 ( .x0(x0), .y0(y0), .y1(y1), .y2(y2), .y3(y3) ); endmodule
輸出結果如下:
可以看出CSD碼有效的降低了量化誤差。因爲實際上除以2的冪的除法是通過移位實現的,誤差最大的 實際上在第一步就已經損失了低3位。
自由進位加法器
SD編碼可以實現自由進位加法,通過LUT進行計算,表如下:
實現上表需要一個 的LUT,計算出 和 後將 左移一位與 相加即可得到結果。
乘法-加法器圖(Multiplier Adder Graph,MAG)
在最優CSD意義中,經常是先將係數分解成幾個因子,再實現具體因子效率比較高。
例如係數93的實現方式可以有以下幾種:
用流程圖表示如下:
對數系統(Logarithmic Number System,LNS)
對數系統與固定尾數和分數指數構成的浮點數制類似,使用如下方式表示:
其中 是數制的基數, 是對數數制的指數。
舉例說明其在計算機中的格式:
假設一個基數爲 2 的 9 位 LNS 數,其構成爲兩個符號位,三位整數精度和四位分數精度:00 011.0010,格式如下:
符號 指數符號 指數整數位 指數分數位 0 1 100 1110 其十進制表達式爲:
注意到指數部分使用補碼錶示。
9 位 LNS 能表示的最大數是 ,最小數是 ,和傳統定點數相比 LNS 在數字較小的時候採樣率更高,更加精細。
歷史上,LNS 的優勢在於能夠有效實現乘法、除法、求平方根或平方,因其可以將以上運算轉換爲加法、除法和乘法。但是加法和減法的複雜度會增加,加減法使用如下方式進行:
假設
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ C&=A+B=2^{e_a}…
可以得到 。同理,對於減法有 ,
參考文獻:Digital Signal Processing with Field Programmable Gate Arrays --U.Meyer-Baese