一、概念
1、浮點數:小數點位置是漂浮不定的。
例如:浮點數運算 1.1 * 1.1 = 1.21,小數點位置發生了變化。
IEEE 754 規定,浮點數的表示方法為:

最高的 1 位是符號位 s,接着的 8 位是指數E,剩下的 23 位為有效數字 M。
2、定點數:小數點的位置是確定的。
例如:定點數運算 1.1 * 1.1 = 1.2,小數點的位置沒有變化。
定點的意思是,小數點固定在 32 位中的某個位置,前面的是整數,后面的是小數。
小數點具體固定在哪里,可以自己在程序中指定。
二、Verilog表示定點數
FPGA 的寄存器只可以表示正整數,通過約定【最高位為符號位】則可以表達負整數了。同理,帶小數點的定點數也是可以通過一些約定來表示。
約定方法:確定小數點的位置。如下圖所示,Qn表示小數點的位置,n為多少表示有多少位小數,看看同樣的二進制數字“10101”會變成什么。
二進制數 小數點位置 對應定點數 10101 Q0 10101 10101 Q1 1010.1 10101 Q2 101.01 10101 Q3 10.101 10101 Q4 1.0101 10101 Q5 0.10101
因此我們只要定位了小數點位置后,就可以在FPGA中表達帶小數的定點數。
三、浮點數的定點化
兩個 16 位的浮點數運算,最高位是符號位: 2.918 * 3.1415926 = 9.1671672068,嘗試將浮點數進行定點化。
1、定點轉換(Qn=12)
符號1位,整數取3位(實際2位就夠),小數12位,可以看成把 1 分成了 212份,因此:
- 2.918 * 212 = 11952.168 = 11952;
- 3.1415926 * 212 = 12867.8632896 = 12868;
2、定點數相乘
11952 * 12868 = 153798336。
3、結果還原
相乘后,整數部分為 6 位,小數部分為 24 位。因此結果 = 153798336 / 224 = 9.167095184326171875,和原計算值差距非常小。
4、量化誤差和量化精度
小數點的位置不同帶來的量化誤差不同,例如上面定點轉換的過程中出現的小數點進行了四舍五入,這是因為 2.918 無法完全用 1/212來表示。小數位數越多,表示的量化精度越高,小數位為 Qn,最大量化精度為 1/2n。
5、無損定點化
所謂【無損定點化】只是數學概念,只要量化誤差小於精度的一半,就認為是“無損”的。按照這個標准,那對小數點采取四舍五入的結果必然是無損的。但是校招時很多題采取的是“量化后直接去除小數”,那么小數大於 0.5 則不是無損的了。
四、例題
1、【大疆】對 12.918 做無損定點化,需要的最小位寬是多少位?位寬選擇 11 位時的量化誤差是多少?
A 13位,0.0118 B 12位,0.0118 C 13位,0.0039 D 12位,0.0039
分析:(1)整數 12 需要 4bit。假設位寬選擇12位,即小數需要 8bit,12.918 * 28 = 3307.008,定點化后的小數小於0.5,可以看成是【無損定點化】,固答案為 12 位;(2)位寬選擇11位,即小數需要 7bit,12.918 * 27 = 1653.504,量化誤差為 0.504/27 = 0.0039375,固答案為0.0039。
答案:結合分析,得出答案為D。
2、【大疆】對12.758做無損定點化,需要的最小位寬是多少位?位寬選擇為8位時的量化誤差是多少?
A 11位,0.008 B 11位,0.08 C 12位,0.008 D 12位,0.08
分析:(1)整數 12 需要 4bit。假設位寬選擇11位,即小數需要 7bit,12.758 * 27 = 1633.024,定點化后的小數小於0.5,可以看成是【無損定點化】,固答案為 11 位;(2)位寬選擇 8 位,即小數需要 4bit,12.758 * 24 = 204.128,量化誤差為 0.128/24 = 0.008,固答案為0.008。
答案:結合分析,得出答案為A。
感覺這題的第一問有些毛病,位寬為 8 位時也符合【無損定點化】。我算了一下,位寬為 7 位(小數為3位)時仍然是【無損定點化】,位寬為 6 位時才不是【無損定點化】。但這是選擇題,只能選 A 了。
參考資料:
http://fpgabbs.com/thread-771-1-1.html