fpga中浮點數的定點化筆記
關於基本相關知識參考該部落格
浮點數的定點化 fpga
1.基礎概念
浮點數:
簡單來說,就是小數點的位置不是固定的
定點數:
簡單來說,小數點的位置是固定的,也就是整數字寬與小數的位寬是固定的
以下部分內容摘自該博文
因為在普通的fpga晶元裡面,暫存器只可以表示無符號型,不可以表示小數,所以在計算比較精確的數值時,就需要做一些處理,不過在altera在arria 10
中增加了硬核浮點dsp模組,這樣更加適合硬體加速和做一些比較精確的計算。
浮點數和定點數的區別:定點數的小數點是固定的,而浮點數的小數點的位置不確定,舉個例子,定點數 1.11.1 = 1.2(定點一位小數),浮點數1.11.1=1.21,浮點數的小數點發生了移動,而定點數捨棄了一位,小數點的位置沒有變。
在verilog裡面,如果用用16位二進位制表達定點小數,最高位就是符號位。我們把小數點之後的n位叫做qn,例如小數點之後有12位叫做q12格式的定點小數
而q0就是我們所說的整數。
q12的最大正數是0111.1111_1111_1111,第乙個0是符號位,後面的數都是1,那麼這個數的十進位制就是0x7fff/212=7.99999…,為啥是除212呢,因為是
十二位小數,0.1111_1111_1111接近與整數1,這樣看有多少個1.
反過來,乙個實際的數轉換成qn型的定點小數就是就是乘上2^n
2.定點化過程
部分內容來自該博文
定點化的過程:
第一步:
確定好整數與小數的位寬,例如,整數3位,小數12位,符號位1位
第二步:
確定定點數最大值與最小值,用第一步的例子,最大值為32767,最小值為-32768
(整數字+小數字一起表示的最大最小值)
第三步:
將浮點數定點化,例如將3.1415926轉化為定點數
3.1415926/(8/(32768))=12867.9632896≈12867
12867就可以用於fpga處理的定點數
注:**1).其中8為3位整數,12位小數能表示最大的實際值。
即3位整數最大表示7,加上12位小數為最大值接近1,所以最大值整數+小數為8。
2) 32768為2的15(3+12位)次方,8/32768為精度,即將8分成32768份,令△=8/32768
3) 3.1415926/(8/(32768))即為3.1415926有多少個△
4)浮點數定點化有一定的誤差**
其中在此增加量化誤差的計算內容:根據以上3.1415926轉化為定點數為12867,那麼誤差有多少呢?
12867二進位制表示為0011_0010_0100_0011(一共16位),其中整數部分011表示為3,小數部分0010_0100_0011為580,
十進位制580轉換為小數為580/4096=0.1416015625
量化誤差:0.1415926-0.1416015625=0.0000089625
3.例子
以下內容摘自該部落格,對其中一些小瑕疵改正了
例:16位的定點數(max:16』d32767 min:-32768)
3位整數字寬,12位的小數字,最高位的符號位
取低15位,其中第14,13,12位最大能表示7,
小數最大12位能表示的最大精度:1/4096=0.000244140625
(0.000244140625*4095 = 0.999755859375)
極限最大值表示:7.999755859375
說明:判斷能否用12位精度表示(即:無損失定點化),看能否除盡:
比如:12.918
3位整數字寬最大只能表示7 所以整數12需要4位位寬
小數部分0.918 判斷:0.918/0.000244140625 = 3760.128 所以12位小數字能表示0.918
例:2.918進行定點化的過程:
8/32768 = 0.000244140625(最大精度)
2.918/0.000244140625 = 11952.128 ~=11952 表示2.918定點後的值
浮點數的乘法表示(注意相乘后位寬變化):
例:2.9183.1415926 ~= 1195212868
浮點結果 : 2.9183.1415926 = 9.1671672068
定點結果 : 1195212868 = 153798336 ~= 9.167095184326171875
153798336 = 0000 1001 0010 1010 1100 0110 1100 0000
整數部分表示: 001001 = 9
小數部分表示: 2803392/(2^24) = 0.167095184326171875
例:正數的定點化
5bit的正數字,8bit的小數字
11.11111定點數的結果
4.面試例題
以下解析為該部落格解釋
在fpga中做小數乘法時,一般需要對定點小數量化處理。
量化過程中首先需要確定量化的位寬,位寬越大量化的精度越高。比如10bit量化,表示的最大值為2^10-1 = 1023。如題所述,對12.918做無損定點化,首先需要確定對整數部分的量化位數。
整數為12,無損量化必須採用4bit;小數部分為0.918,假如採用12bit位寬,整數部分4bit,那麼小數部分只有8bit。8bit所能表達的最大的整數為255(注意,定點小數在fpga運算過程中是沒有小數點的,比如12.918,實際儲存的是12918的二進位制形式,所以8bit表示小數部分最大為255,在後續反量化時再除以256,相當於小數點右移8位即可)。0.918256 = 235.008,換算為整數為235,該值即為對0.918做8bit量化後的整數值。
下面需要對235進行反量化得到:235 / 256 = 0.91796875,和0.918相比誤差為0.00003125。因為做的是無損定點化,所以考慮的應該是有效位,0.918的有效位為3位,而誤差在小數點後面第三位為0,所以可以實現無損定點化。
再看位寬選擇11位時,小數部分用7位表示,按照上面所述方法得到:
(int)(0.918128)/128 = 0.921875,量化誤差為0.003875,可見在小數點後面第三位不為0,因此就不能實現無損量化,誤差為0.0039
但是我沒看明白,根據前面介紹的內容自己推導如下:
首先整數部分為12,整數字寬4bit,按題中所示若位寬為12bit,則小數部分位寬8bit,最大精度1/256=0.00390625;
0.918/0.00390625=235.008可以表示。
如果位寬11bit,則小數部分為7bit,最大精度為16/2048=0.0078125,12.918/0.0078125=1653.504~=1653,
1653二進位制為1100_1110101,小數部分1110101為117,117/128=0.9140625
則誤差為0.918-0.9140625=0.0039375,此時再根據上面解析說因為做的是無損定點化,所以考慮的應該是有效位,0.918的有效位為3位,而誤差在小數點後面第三位為0,所以可以實現無損定點化。
暫時到這裡,自己對這一方面理解的還是不夠深,如有錯誤,請指正。
FPGA浮點數定點化
因為在普通的fpga晶元裡面,暫存器只可以表示無符號型,不可以表示小數,所以在計算比較精確的數值時,就需要做一些處理,不過在altera在arria 10 中增加了硬核浮點dsp模組,這樣更加適合硬體加速和做一些比較精確的計算。浮點數和定點數的區別 定點數的小數點是固定的,而浮點數的小數點的位置不確...
浮點數定點化表示
例 12.918進行定點化,11位的位寬帶來的量化誤差是多少?4位用來表示整數,7位用來表示小數。解析度為 1 2 7 0.0078125 0.918 0.0078125 118 118 0.0078125 0.921875 量化誤差 0.921875 0.918 0.003875 0.5 解析度,...
浮點數定點化的初步認識
fpga只能處理定點數,alteral stratix 10可以支援硬浮點,如軍方雷達 機器視覺等硬體加速。浮點數 2.918 3.1415986 浮點轉定點 如16位,表示範圍32767 32768 定義小數需求多少位 如12位 整數需求多少位 如3位 最高位為符號位 針對有符號數,1位 對於低1...