FPGA實現數字信號處理的基本運算(定點運算)

背景

首先,我們要明確的是不管是什麼數字,一切數字在計算機中都是採用二進制表示的,就算你是小數點數。所以,這些概念,我們一定要屢清楚。下面,我們馬上就來看看。聲明,請不要轉載博主的任何文章,歡迎點評,一旦發現轉載,博主直接撤銷所有文章,並以後不再發布。

定點數的表示與計算

定點數具有三種表示的形式,原碼、反碼、以及補碼。

  • 原碼

關於原碼,例如二進制 0△110 表示+0.75;1△110表示的是-0.75.這一點很好理解,因爲0.75*2^3(定點三位)=6 也就是二進制110.
簡單的說如何將小數轉換爲十進制數呢。利用matlab提供的整轉二進制函數dec2bin很容易獲得轉換結果。即需要先將十進制小數乘以一個比例因子2^B-1,並進行四捨五入操作取整。轉換函數的表達式子是:

dec2bin(round(abs(D)*2^(B-1)+(2^(B-1))*(d<0)),B)

需要說明的是十進制的小數轉換爲二進制存在誤差,其誤差大小由二進制數的位數決定的。

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.164
256 = 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的.

總結:
module fixpmul
#(
    parameter IW = 8,
    parameter FW = 8 
)(
    input signed [IW+FW-1 : 0] a,
    input signed [IW+FW-1 : 0] b,
    output signed [IW+FW-1 : 0] o
);
    (* multstyle = "dsp" *) wire signed [IW*2+FW*2-1 : 0] long;
    assign long = a * b;
    assign o = long >>> FW;
endmodule

浮點數運算

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章