FPGA实现数字信号处理的定点运算
文章目錄
- 背景
- 定點數的表示與計算
背景
首先,我們要明確的是不管是什么數字,一切數字在計算機中都是采用二進制表示的,就算你是小數點數。所以,這些概念,我們一定要屢清楚。下面,我們馬上就來看看。轉載需要與博主聯系。
作者:ciscomonkey
定點數的表示與計算
定點數具有三種表示的形式,原碼、反碼、以及補碼。
- 原碼
關于原碼,例如二進制 0△110 表示+0.75;1△110表示的是-0.75.這一點很好理解,因為0.75*2^3(定點三位)=6 也就是二進制110.
簡單的說如何將小數轉換為十進制數呢。利用matlab提供的整轉二進制函數dec2bin很容易獲得轉換結果。即需要先將十進制小數乘以一個比例因子2^B-1,并進行四舍五入操作取整。轉換函數的表達式子是:
需要說明的是十進制的小數轉換為二進制存在誤差,其誤差大小由二進制數的位數決定的。
x表示實際的數(一個浮點數), q表示它的Qn型定點小數(一個整數)。
- 反碼
正數的反碼與原碼相同,負數的反碼為原碼除符號位的所有位取反,及得到負數的反碼。例如說,十進制的-0.75的二進制原碼表示為x=1△110,其反碼為1△001 - 補碼
負數的補碼就是在反碼的最低位加1.補碼最重要的特性就是將減法用加法運算實現。同樣,將十進制數轉換成補碼形式的二進制數也可以用dec2bin函數實現。
`
dec2bin(round(D*2^(B-1))+ 2 ^ B*(D<0),B)我們用數學表達式總結一下如何將小數定點化
q = (int) (x * 2^n)x = (float)q/2^n 其中n代表實際的數中,小數點后保留的位數假設q1,q2,q3表達的值分別為x1,x2,x3
q3 = q1 + q2 若 x3 = x1 + x2
q3 = q1 - q2 若 x3 = x1 - x2
q3 = q1 * q2 / 2^n若 x3 = x1 * x2
q3 = q1 * 2^n / q2若 x3 = x1 / x2
對于加減法到比較簡單,對于乘除法,我們對/ 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,對于一般的計算已經足夠精確了。經常有人問, fpga里小數乘法怎么搞?
如果你樂意, 按照IEEE754標準做"浮點"型運算的ip當然最好(雖然面積上不太好).
不過,很多情況下,沒有這個必要.
一般我們就用"定點"了.
你得自己"定個點", 比如用16位, 分成8位整數8位小數(后面記為"(8.8)"), 即"定點"在第8位.
那么:
1 -> 16’h0100;
1.5 -> 16’h0180;
-1.5 -> -1.5256 + 65536(補碼) -> 16’hFE80(其實就是-16’sh0180, 讓綜合器給我們算補碼去~~);
1.164 -> 1.164256 = 298 = 16’h012A
所以 signed input [15:0] a (也是"8整.8小")和 1.164相乘給 signed output [15:0] mul (也是"8整.8小"), 直接寫:
assign mul = (a * 16’sh012A) >>>8;
就行了, 當然, 你的fpga里有dsp block最好, 不然也要幾百個LE的.
總結
以上是生活随笔為你收集整理的FPGA实现数字信号处理的定点运算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 独立于三大FPGA平台采用modelsi
- 下一篇: 那些生活中的应该知道的知识