非傳統定點數(一)

關注我的公衆號c137Lab獲取更多相關內容

在這裏插入圖片描述

非傳統定點數(一)

有符號數(Signed Digit Number,SD)

​ SD 和 SM(Signed-Magnitude)不同,具有三重值 {0,1,1}\{0,1,-1\} 其中 -1 也常寫成 1\overline{1} .已經證明SD數應用在不用進位的加法器和乘法器中能夠降低複雜性。

SD碼編碼示例:
1410=1610210=10010 14_{10}=16_{10}-2_{10}=100\overline10

1410=810+410+210=01110 14_{10}=8_{10}+4_{10}+2_{10}=01110

​ 可以看出SD碼是不唯一的。事實上,要降低乘法的工作量,需要降低運算中非零元素的數量。我們稱擁有最少非零元素的SD碼爲CSD碼。

最佳CSD編碼

最佳CSD編碼:

  1. 從最低有效位開始,用 100110\cdots0\overline1 取代所有大於 2 的 1 序列。此外,還需要用 1101110\overline1 取代 10111011
  2. 從最高位開始,用 011011 代替 10110\overline1

該方法給出一個非零元素最少的SD碼,且其中的減法次數最少。

示例:
2710=11011CSD=11101CSD=10101CSD 27_{10}=11011_{CSD}=1110\overline1_{CSD}=10\overline10\overline1_{CSD}
雖然第一步沒有減少非零元素的個數,但是它使用加法替代了減法。最終,這一算法將 3 次加法簡化爲了兩次減法。

​ 觀察 0112011_2 ,如果將其轉換爲 10110\overline1 ,那麼實際上是複雜化了運算,將一次加法變成了一次減法。這也就是最佳CSD編碼第二步操作的意義。

分數CSD編碼

​ 使用整型數實現分數會導致很大的誤差,使用CSD編碼可以降低這一誤差。

例如y=7x/8y=7x/8,可以寫成以下幾種實現方式:
y0=(7x)/8 y0=(7x)/8

y1=(x/8)7 y1=(x/8)*7

y2=((4+2+1)x)/8=(x/2)+(x/4)+(x/8) y2=((4+2+1)x)/8=(x/2)+(x/4)+(x/8)

y3=((81)x)/8=x(x/8) y3=((8-1)x)/8=x-(x/8)

不難看出,y2y2 是普通二進制碼,y3y3 是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

輸出結果如下:

img1

可以看出CSD碼有效的降低了量化誤差。因爲實際上除以2的冪的除法是通過移位實現的,誤差最大的 y1y1 實際上在第一步就已經損失了低3位。

自由進位加法器

​ SD編碼可以實現自由進位加法,通過LUT進行計算,表如下:

img2

​ 實現上表需要一個 28×42^8\times4 的LUT,計算出 uku_kckc_k 後將 ckc_k 左移一位與 uku_k 相加即可得到結果。

乘法-加法器圖(Multiplier Adder Graph,MAG)

​ 在最優CSD意義中,經常是先將係數分解成幾個因子,再實現具體因子效率比較高。

例如係數93的實現方式可以有以下幾種:
93=3×31=(1+2)×(321) 93=3\times31=(1+2)\times(32-1)

93=64+324+1 93=64+32-4+1

用流程圖表示如下:
在這裏插入圖片描述

對數系統(Logarithmic Number System,LNS)

​ 對數系統與固定尾數和分數指數構成的浮點數制類似,使用如下方式表示:
x=±r±ex x=\pm r^{\pm e_x}
​ 其中 rr 是數制的基數,exe_x 是對數數制的指數。

舉例說明其在計算機中的格式:

假設一個基數爲 2 的 9 位 LNS 數,其構成爲兩個符號位,三位整數精度和四位分數精度:00 011.0010,格式如下:

符號 SxS_x 指數符號 SeS_e 指數整數位 II 指數分數位 FF
0 1 100 1110

其十進制表達式爲:
231/8=23.125 2^{-3-1/8}=2^{-3.125}
注意到指數部分使用補碼錶示。

​ 9 位 LNS 能表示的最大數是 281/162562^{8-1/16}\approx256,最小數是 28=0.00392^{-8}=0.0039,和傳統定點數相比 LNS 在數字較小的時候採樣率更高,更加精細。

​ 歷史上,LNS 的優勢在於能夠有效實現乘法、除法、求平方根或平方,因其可以將以上運算轉換爲加法、除法和乘法。但是加法和減法的複雜度會增加,加減法使用如下方式進行:

假設 A>BA>B
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ C&=A+B=2^{e_a}…
可以得到 ec=ea+log2(ϕ+(Δ))e_c=e^a+log_2(\phi^+(\Delta))。同理,對於減法有 ϕ(Δ)=12ebea\phi^-(\Delta)=1-2^{e_b-e_a}ec=ea+log2(ϕ(Δ))e^c=e^a+log_2(\phi^-(\Delta))

參考文獻:Digital Signal Processing with Field Programmable Gate Arrays --U.Meyer-Baese

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