由於FPGA中存在的都是二進制數。 而外部(軟核)與FPGA通信數據為小數時,
首先需將小數轉換為定點數(二進制)。再寫入FPGA中,即可在FPGA內當作小數運算,並且其運算結果仍為定點數。
例如首先將小數轉換為二進制數,然后使用FPGA自帶浮點數轉換定點數IP核,轉換為定點數二進制數。寫入FPGA內。
0.0033203125(float)---------3FD9999A(hex)-------------6D(定點數 0.000_0000_0110_1101)
當一個定點數為正數時 ,其二進制 數 以源碼形式存在 ;當定點數為負數時 ,其二進制數以補碼形式存在。
補碼= 原碼符號位不變,數值位按位取反,末位再加1。當定點數進行加減運算時 ,小數點位置不變,還為定點數,
結果與轉換為小數再進行運算相同 。
下面程序為通過讀寫寄存器方式讀取FPGA內部數據phase_data.word,讀取該數據之后在Microblaze當中解析該數據。
1 union DEF_long 2 { 3 struct 4 { 5 unsigned char UH; 6 unsigned char H; 7 unsigned char L; 8 unsigned char UL; 9 }; 10 char byte[4]; 11 Xint32 word; 12 }def_long; 13 14 union DEF_long phase_data; 15 16 float VI_phase_int; //定點數整數部分 17 Xuint16 VI_phase_float_data; //定點數小數部分十進制 18 float VI_phase_float; //定點數小數部分 19 float VI_phase; //定點數 20 21 if(phase_data.UH ==0xFF) //負數 22 { 23 VI_phase_int = 0xFF - phase_data.H; 24 VI_phase_float_data = phase_data.L <<8; 25 VI_phase_float_data = VI_phase_float_data |phase_data.UL; 26 VI_phase_float_data = 0xFFFF -VI_phase_float_data; 27 VI_phase_float = VI_phase_float_data /65536.0; 28 VI_phase =(-1)*( VI_phase_int + VI_phase_float ); 29 } 30 else if(phase_data.UH ==0x00) //正數 31 { 32 VI_phase_int = phase_data.H; 33 VI_phase_float_data = phase_data.L <<8; 34 VI_phase_float_data = VI_phase_float_data |phase_data.UL; 35 VI_phase_float = VI_phase_float_data /65536.0; 36 VI_phase = VI_phase_int + VI_phase_float ; 37 }