FPGA定點數解析及運算


  由於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 }   

 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM