在c/c++裡,是通過變數型別+變數名+數值,來對乙個變數初始化,同樣,對於任意精度的資料型別,我們也可以採用這種方式來進行變數初始化。在vivado hls裡是支援copy initialization(y)和direct initialization(y)這兩種方式來進行初始化,但不支援uniform initialization,同時,對於任意精度的資料型別,還可以採用基數符號+數值+基數,例如:
int data_i = 5;
ap_int<8> a_8bit_data_c = 18;
ap_int<8> a_8bit_data_d (18);
ap_int<8> a_8bit_data_r2("0b010010",2);
ap_int<8> a_8bit_data_r8("0o22",8);
ap_int<8> a_8bit_data_r10("18",10);
ap_int<8> a_8bit_data_r16("0x12",16);
注意:上面的基數符號是可以去掉的,在初始化的時候,盡可能每一行只初始化乙個變數,避免在一行初始化多個變數
前面我們提到ap_[u]fixed< w,i,q,o>,這裡w代表整個資料的字長,i代表整數部分的字長,那麼小數部分被的字長就是w-i,q表示量化模式(針對低位部分),o表示溢位模式,針對高位部分,例如:
ap_fixed<3,2> data1 = 1.25;
ap_fixed<3,2,ap_rnd> data1 = 1.25
此時的結果分別為1(等價於01.0)和1.5(等價於01.1)
ap_fixed<4,4> data3 = 20
ap_fixed<3,2,ap_rnd,ap_sat> data1 = 20
此時的結果分別為4(等價於0100)和7(等價於0111)
對於單精度型別浮點需要有字尾f,對於雙精度則可以省略,例如:
double data1(2.0)
flout data2(2.0f)
vivado hls對這些資料型別都是支援的,並且還提供乙個數學庫hls_math.h,它對c語言(math.h)和c++(cmath.h)都是支援的,這種支援包括單精度,雙精度浮點的一些函式,還包括對資料型別本身的支援。
隱式資料型別轉換包括numeric promotion和numeric conversion。
numeric promotion是一種安全模式,它把資料型別從小型別向大型別的資料轉換,對於有符號資料型別,就是進行資料位的擴充套件,對於無符號資料型別來說,就是進行高位0擴充套件,例如:
ap_uint<8> data;
ap_int<4> x1 = -4;
ap_uint<4> x2 = 4;
data1 = x1;
data2 = x2;
這裡得到的data1為252(0b11111100),由於x1為有符號,所以進行符號位的擴充套件,而data2為4(0b00000100),由於x2為無符號,所以進行高位0的擴充套件。
numeric conversion是把大型別向小型別的資料轉換,這種轉換可能導致資料的損失或者結果的錯誤,例如:
ap_int<2> data;
ap_int<4> x3 = -3;
ap_uint<4> x4= 3;
data3 = x3;
data4 = x4;
這裡得到的data3為-1(0b11),data4為-1(0b11),這是由於data為有符號資料型別,導致結果錯誤。
ap_fixed<4,2> data5 = 1.25;
ap_fixed<3,2,ap_rnd> data6 = data5
這裡得到的data6為1.5(0b01.1),導致資料精度的損失。
顯式資料型別的轉換有兩種方式,一種是通過「( )」操作,另一種是在c++中通過類似呼叫函式的方式進行轉換,例如:
`ap_uint<3> i1 = 2;
ap_uint<4> i2= 7;
ap_ufixed<6,4> i3 = i2 / i1;
cout << 「the result of i3 :\t」 << i3 <<』\n』;
ap_ufixed<6,4> i4 =(ap_ufixed<6,4>) i2 / i1;
cout << 「the result of i4 :\t」 << i4 <<』\n』;
ap_ufixed<6,4> i5 = ap_ufixed<6,4> (i2 )/ i1;
cout << 「the result of i5 :\t」 << i5 <<』\n』;`
這裡得到的i3為3,而i4和i5為3.5,3.5才是我們要的結果,因此對於顯式資料型別的轉換,可以(括號資料型別型別)+變數名 和 資料型別+(變數名)來完成轉換。
注意:在vivado hls 中常用的二進位制運算有+,-,*,/ , %這五種。兩個數相加,為防止溢位,位寬會增加一位。兩個數相乘,最終位寬為兩個數字寬之和。我們的原則是,大資料不溢位(否則導致結果錯誤),小資料不損失(否則導致精度損失)。當我們想要獲取變數的資料型別,我們可以使用typeid(變數名),相應的我們需要宣告typeinfo.h這個標頭檔案。
本文介紹了資料型別的轉化,在vivado hls中,我們要根據演算法的型別來確定合理的位寬,這對運算的結果至關重要,此外,我們在完成資料轉換時,可以採用顯式資料轉換的兩種方式。
資料型別轉化
自己寫的,可能有某些bug,希望大家提出來 函式介紹 進製轉換 函式說明 10進製轉換16進製制 輸入引數 需要轉換的10進製數data 輸出引數 無 int value convert 10 16 int m data return m value 函式介紹 數值轉換 函式說明 對大於10的數進行...
資料型別的轉化
1.基本資料型別 布林型別 數值型別 字串型別 undefined null 2.引用資料型別 陣列 物件 函式 1.布林值 真 true 假 flase 英文 boolean bool 2.字串型別 由字元 數字 符號等組成的一串資料型別 string str 由單引號或者雙引號包裹 字串的拼接 ...
C 的資料型別 資料型別的轉化
一 c 有15個預定義型別,其中13個是值型別,兩個是引用型別 string 和 object 這裡主要說明整型 浮點型 布林型以及引用型 1 整型資料 2 浮點型 浮點型從精度有低到高有float double decimal。他們的命名規則如下 1 float資料型別用於較小的浮點數,因為它要求...