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...