FPGA浮點小數與定點小數的換算及應用

2021-08-13 03:49:03 字數 3217 閱讀 8232

有些fpga中是不能直接對浮點數進行操作的,只能採用定點數進行數值運算。

所謂定點小數就是把小數點的位置固定,我們要用整數來表示小數。

先以10進製為例。如果我們能夠計算12+34=46的話,當然也就能夠計算1.2+3.4 或者 0.12+0.34了。所以定點小數的

加減法和整數的相同,並且和小數點的位置無關。乘法就不同了。 12*34=408,而1.2*3.4=4.08。這裡1.2的小數點在第1位之前,而4.08的小數點在第2位之前,小數點發生了移動。所以在做乘法的時候,需要對小數點的位置進行調整?!可是既然我們是做定點小數運算,那就說小數點的位置不能動!!怎麼解決這個矛盾呢,那就是捨棄最低位。

也就說1.2*3.4=4.1,這樣我們就得到正確的定點運算的結果了。所以在做定點小數運算的時候不僅需要牢記小數點的位置,還需要記住表達定點小數的有效位數。上面這個例子中,有效位數為2,小數點之後有一位。

現在進入二進位制。我們的定點小數用16位二進位制表達,最高位是符號位,那麼有效位就是15位。小數點之後可以有0 - 15位。我們把小數點之後有n位叫做qn,例如小數點之後有12位叫做q12格式的定點小數,而q0就是我們所說的整數。

q12的正數的最大值是 0 111 . 111111111111,第乙個0是符號位,後面的數都是1,那麼這個數是十進位制的多少呢,很好運算,就是 0x7fff / 2^12 = 7.999755859375。對於qn格式的定點小數的表達的數值就它的整數值除以2^n。在計算機中還是以整數來運算,我們把它想象成實際所表達的值的時候,進行這個運算。

反過來把乙個實際所要表達的值x轉換qn型的定點小數的時候,就是x*2^n了。例如 0.2的q12型定點小數為:0.2*2^12 = 819.2,由於這個數要用整數儲存, 所以是819 即 0x0333。因為捨棄了小數部分,所以0x0333不是精確的0.2,實際上它是819/2^12 =0.199951171875。

我們用數學表示式做一下總結:

x表示實際的數(*乙個浮點數), q表示它的qn型定點小數(乙個整數)。

q = (int) (x * 2^n)

x = (float)q/2^n

驗證:由於/ 2^n和* 2^n可以簡單的用移位來計算,所以定點小數的運算比浮點小數要快得多。下面我們用乙個例子來驗證一下上面的公式:

用q12來計算2.1 * 2.2,先把2.1 2.2轉換為q12定點小數:

2.1 * 2^12 = 8601.6 = 8602

2.2 * 2^12 = 9011.2 = 9011

(8602 * 9011) >> 12 = 18923

18923的實際值是18923/2^12 = 4.619873046875 和實際的結果 4.62相差0.000126953125,對於一般的計算已經足夠精確了。

採用定點數進行數值運算,其運算元一般採用整型數來表示。乙個整型數的最大表示範圍取決於dsp晶元所給定的字長,一般為16位或24位。顯然,字長越長,所能表示的數的範圍越大,精度也越高。

對於fpga而言,fpga對小數是無能為力的,一種解決方法是採用定標,就是將運算的浮點數擴大很多倍,然後取整,再用這個數進行運算,運算結束後再縮小相應的倍數。

通過設定小數點在16位數中的不同位置,就可以表示不同大小和不同精度的小數了。數的定標有q表示法和s表示法兩種。表1.1列出了乙個16位數的16種q表示、s表示及它們所能表示的十進位制數值範圍。

同樣乙個16位數,若小數點設定的位置不同,它所表示的數也就不同。例如:

16進製制數2000h=8192,用q0表示

16進製制數2000h=0.25,用q15表示

不同的q所表示的數不僅範圍不同,而且精度也不相同。q越大,數值範圍越小,但精度越高;相反,q越小,數值範圍越大,但精度就越低。

例如,q0 的數值範圍是一32768到+32767,其精度為1,而q15的數值範圍為-1到0.9999695,精度為1/32768=0.00003051。因此,對定點數而言,數值範圍與精度是一對矛盾,乙個變數要想能夠表示比較大的數值範圍,必須以犧牲精度為代價;而想精度提高,則數的表示範圍就相應地減小。在實際的定點演算法中,為了達到最佳的效能,必須充分考慮到這一點。

浮點數與定點數的轉換關係可表示為:

浮點數(x)轉換為定點數(xq):xq=(int)x* 2^q

定點數(xq)轉換為浮點數(x):x=(float)xq*2^(-q)

例如,浮點數x=0.5,定標q=15,則定點數xq=l0.5*32768j=16384,式中lj表示下取整。反之,乙個用q=15表示的定點數16384,其浮點數為16384*2-15=16384/32768=0.5。浮點數轉換為定點數時,為了降低截尾誤差,在取整前可以先加上0.5。

q和s表示方法,如下表所示。

q表示 s表示 十進位制表示範圍

q15 s0.15 -1≤x≤0.9999695

q14 s1.14 -2≤x≤1.9999390

q13 s2.13 -4≤x≤3.9998779

q12 s3.12 -8≤x≤7.9997559

q11 s4.11 -16≤x≤15.9995117

q10 s5.10 -32≤x≤31.9990234

q9 s6.9 -64≤x≤63.9980469

q8 s7.8 -128≤x≤127.9960938

q7 s8.7 -256≤x≤255.9921875

q6 s9.6 -512≤x≤511.9804375

q5 s10.5 -1024≤x≤1023.96875

q4 s11.4 -2048≤x≤2047.9375

q3 s12.3 -4096≤x≤4095.875

q2 s13.2 -8192≤x≤8191.75

q1 s14.1 -16384≤x≤16383.5

q0 s15.0 -32768≤x≤32767

///一般在fpga中處理小數定點數,需要自己去定點,比如用16位,就可以分成8位整數和8位小數,即(8,8),即」定點」在第8位。那麼:

1 -> 16』h0100

1.5 -> 16』h0180

-1.5 -> -1.5*256 + 65536(補碼) -> 16』hfe80

1.164 -> 1.164*256 = 298 = 16』h012a

如果兩個小數相乘,即表示定點數相乘,比如,q15表示的4000h(浮點數0.5)乘以q15表示的4000h,4000h×4000h=1000 0000h,那麼乘完之後的q值為15+15=30.即浮點數表示0.25.

個人觀點,請大神賜教!!!

FPGA定點小數運算

謂定點小數,就是小數點的位置是固定的。我們是要用整數來表示定點小數,由於小數點的位置是固定的,所以就沒有必要儲存它 如果儲存了小數點的位置,那就是浮點數了 既然沒有儲存小數點的位置,那麼計算機當然就不知道小數點的位置,所以這個小數點的位置是我們寫程式的人自己需要牢記的。先以10進製為例。如果我們能夠...

FPGA定點小數計算

首先,說明一下,這一系列的博文是對之前一段時間寫的幾篇文章的乙個整理,在原有文章的基礎上新增一些基本的理論。優化文章結構等。fpga定點小數計算 verilog版 第一篇 加法運算 fpga定點小數計算 verilog版 第二篇 乘法運算 fpga定點小數計算 verilog版 第三篇 除法運算 f...

定點數與浮點數 小數

一 計算機中一共有兩種機器數型別 機器數就是計算機中參與運算的有符號二進位制數,其實,它與我們平時使用的十進位制一樣,有整數也有小數,但是關鍵在於,如果二進位制與我們平時書寫十進位制小數一樣,帶上乙個 那麼二進位制受困於儲存器中字長的限制,無法靈活地表示小數的小數點 所以,二進位制的小數在儲存器中的...