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