FPGA定點運算

2021-07-24 12:46:40 字數 2045 閱讀 6995

1、定點小數運算

所謂定點小數,實際上就是用整數來進行小數運算。以16bit的儲存單位最多可以表示0x0000到0xffff,65536種狀態,如果表示無符號整數的話,就是從0到65535.如果需要表示負數的話,那麼最高位就是符號位,而剩下的15位就可以表示32768種狀態。對於計算機來說,符號並沒有特殊的儲存形式,其實是和數字一起儲存的。為了使得無論是無符號還是有符號數都可以用同樣的加法減法規則,符號數中的負數用正數的補碼表示。

補碼 :計算機中符號數有三種表示方法,原碼、反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示正,用1表示負,而數值部分,三種表示方法各有不同

在計算機系統中,數值一律用補碼來表示和儲存。原因是,使用補碼,可以將符號位和數值域統一處理;同時加法和減法也可以統一處理。此外,補碼和原碼相互轉換,其運算過程是相同的,不需要額外的硬體電路

特性1、乙個負整數(或原碼)與其補碼相加,和為模

2、對乙個整數的補碼再求補碼,等於該整數自身。

3、補碼的正零和負零表示方法相同

模是指乙個計量系統的計數範圍,表示n位的計算機計量範圍是0~2^(n)-1,模=2^(n)。補碼系統的0只有乙個表示方式,這點和一補數系統不同(在一補數系統中,0有二種表示方式),因此在判斷數字是否為0時,只要比較一次即可。特別的數字有兩個數字的補碼等於本身,乙個是0,另乙個為該位元可表示最大絕對值負數(即1000...)。在fpga綜合電路的時候最底層都是以補碼的形式在運算,正數的補碼是本身,負數的補碼要取反加1。所以,有符號數的定點運算是這個進行的:

module fixmulti#(

parameter int_width = 16,

parameter fix_point_width = 16)(

input clk,

input rstn,

input signed [(int_width+fix_point_width)-1 : 0] ia,

input signed [(int_width+fix_point_width)-1 : 0] ib,

output signed [(int_width+fix_point_width)*2-1 : 0] out

);(* multstyle = "dsp" *) wire signed [int_width*2+fix_point_width*2 -1: 0] long;

assign long = ia * ib;

assign out = long>>>fix_point_width;

endmodule

運算結果也是以補碼的形式給出,即正數是本身,負數需要再做一次補碼轉換。比如:
initial begin

// initialize inputs

clk = 0;

rstn = 0;

ia = 0;

ib = 0;

// wait 100 ns for global reset to finish

#100;

rstn = 1;

//ia = 5.1125; ib = -156.1567

//ia_multi = 5.1125*65536 = 335052; ib = -156.1567*65536 = 10233885

ia = 32'h0005_1ccc;

ib = 32'h809c_281d;

#100;

ia = 32'h8004_0000;

ib = 32'h8005_0000;

#100;

ia = 32'h0004_0000;

ib = 32'h8005_0000;

#100;

ia = 32'h0004_0000;

ib = 32'h0005_0000;

其**結果如下:

對結果再除以(2^n+1)(n就是定點數),即可得到需要的結果。

FPGA定點小數運算

謂定點小數,就是小數點的位置是固定的。我們是要用整數來表示定點小數,由於小數點的位置是固定的,所以就沒有必要儲存它 如果儲存了小數點的位置,那就是浮點數了 既然沒有儲存小數點的位置,那麼計算機當然就不知道小數點的位置,所以這個小數點的位置是我們寫程式的人自己需要牢記的。先以10進製為例。如果我們能夠...

FPGA定點小數計算

首先,說明一下,這一系列的博文是對之前一段時間寫的幾篇文章的乙個整理,在原有文章的基礎上新增一些基本的理論。優化文章結構等。fpga定點小數計算 verilog版 第一篇 加法運算 fpga定點小數計算 verilog版 第二篇 乘法運算 fpga定點小數計算 verilog版 第三篇 除法運算 f...

定點運算小貼士

工作中遇到了需要將浮點運算轉化為定點運算的情況。現在把我這幾天研究拿出來和大家分享。1.如何表示乙個既有整數部分也有小數部分的數?使用定點表示這樣的數需要固定小數點的位置。用n位元表示該數,則小數點位置在某個位置,小數點左邊用來表示整數,小數點右邊表示小數。如 1110.1010 0011.0010...