在FPGA設計過程中難免會碰到需要進行截位,那定點小數的計算過程中我們需要注意些什么呢?
首先,我們考慮如下計算式。
sin cos 數據形式是 FIX_32_30
X Y Z 數據形式是 FIX_32_20
φ 是角度 最后需要計算 exp(jπφ),可以看出來φ具有周期性,是可以-1~+1。要求的數據形式是 FIX_32_29
1、首先 分析 temp = sin*cos 結果
兩個FIX_32_30相乘得到的數據是 FIX_64_60,我們發現這個結果最大值為-1~+1,所以只需要保留兩位整數位即可(其中一位為符號位)即通過截位使其變成FIX_32_30,所以 temp 為 sin*cos [61:20]。
2、接着分析 X*temp y*temp的結果
一個FIX_32_20乘以FIX_32_30結果為FIX_64_50。
在一般情況下sin*cos結果為-1~+1之間,也就是說相乘之后X Y數只會變小,最大為其本身。所以一般情況下通過截位使得結果為FIX_32_20,即保留12位整數位,20位小數位即可。
但我們觀察到計算exp(jπφ)中,是存在周期性的φ的循環周期為-1~1,所以我們只需要截取成 FIX_32_31就可以(做了一個近似,類似exp(jπφ) = exp(-j0.9999999πφ)),以截取的部分為[50 : 19] ,結果為FIX_32_31
3、再分析Z*COS的結果
一個FIX_32_20乘以FIX_32_30結果為FIX_64_50,同樣的將其截取成FIX_32_31即可。
4、其次三個之和的計算過程中,因為周期性,不需要擴展高位,計算結果為FIX_32_31。
5、最后FIX_32_31算術左移兩位即可得到FIX_32_29。
總結,
1.定點小數計算過程中,需要注意小數點的位置。
2.不同小數點位置的數據是不能相加的。
3.可以通過數據計算本身的周期性質,進行截位可以保留更多的小數點位。