
FPGA中最常用的還是定點化數據處理方法,本文對定點化數據處理方法進行簡要探討,并給出必要的代碼例子。
1、一般擴位原則:
1) 加減法運算:擴位位寬=ceil(log2(加法個數))
(資料圖片)
如:兩個加法擴1位,三個四個加法擴2位…
2)乘法運算:結果擴位位寬=兩個乘數位寬的和
如:15bit數與14bit相乘結果位寬應為29bit。
3)除法運算:結果擴位位寬=被除數位寬與除數位寬的差
擴位時對于有符號數,高位擴展時擴展符號位,對于無符號數高位擴展時直接補零。因為有符號數高位是符號位,擴位補零會將負數擴展為錯誤的正數,而無符號數沒有符號位,對位最高bit為1的無符號數,擴展符號位同樣會導致數據異常。
符號位擴展:
2、高位截位,分為飽和截位和直接截位:
1)高位直接截位,直接拋掉高位保留低位,在確認信號不會溢出的模塊使用直接截位的方法,節省資源;
2)高位飽和截位:對計算后的數據進行判斷,如果超出位寬,正數輸出為最大值,負數輸出為最小值;判斷方法就是看高位是否完全相同。
3、低位截位:
1)直接截位:功率計算等統計模塊會使用,數字信號處理中不會使用,因為這種方式,頻域會出現直流。
2)四舍五入:如下所示,上一篇文章中說了數據的表示(FPGA數字信號處理之數據的表示),看一看到對于補碼,verilog中只針對負數的0.5進行特殊處理即可。
代碼如下,代碼中會判斷信號是否是-n.5,進行處理。
3)近似四舍五入,對于真四舍五入來說,對-0.5的判斷邏輯較為復雜,而且有的數據處理對-0.5的要求也不高,此時可以采用近似四舍五入的方法,之前的代碼中最常出現的就是這種處理方式:
可以看到這種處理方式下-0.5的值是偏大的。
另外,要注意上一篇文章中多次提到的IEEE 754浮點數標準里面,對于浮點數取整的規定如下
1.就近舍入Round to nearest (even)
2. 向零舍入(Truncate)
3.朝正無窮舍入Round up (toward +∞)
4.朝負無窮舍入Round down (toward ?∞)
python等默認使用的就是 就近舍入Round to nearest (even) 處理方法,python中的計算結果為:
round(0.5)= 0
round(1.5)=2
這一點大家做算法時要注意一下。
標簽: