(學習Verilog)5. FPGA定點數截位基本準則

和 介紹了FPGA內部表示正負數,小數的規則。兩者相比之下,定點數實現簡單,表達更為直觀,所以在很多時候FPGA通常使用定點數表示小數。但在各種運算下,定點數的位寬會不斷增大,為了節省資源,這個時候必須進行取捨,進行一定的截位。

截位的規則比較簡單,但在FPGA內部使用廣泛。


首先,在講截位之前,我們需要了解FPGA定點數運算的擴位規則,規則如下:

  1. 兩個有符號定點數相加減,位寬大的數需要擴展一位符號位,位寬小的數擴展符號位至兩數位寬一致。然後再進行加減,防止溢出。

比如,兩個數,A數m位,C數n位,m > n;

A在最高位補充一個符號位,位寬變為m+1; B在最高位補充符號位,使位寬變為m+1,A+C最終運算結果為m+1位;


2. 兩個無符號定點數相加減,位寬大的數需要擴展一位,擴展位為0,;然後再進行加減,防止運算結果溢出。

比如,1111 + 1 轉變為:0 1111 + 1 = 1 0000;

A數m位,C數n位,m > n;

A在最高位補充一個符號位,位寬變為m+1; A+C最終運算結果為m+1位;


3. 兩個定點數做乘法,運算結果位寬為兩數位寬之和。

A數m位,C數n位,m > n;

A*C最終運算結果為m+n位;


經過一次乘法運算後,結果比原來的數據位寬大了許多,一個系統往往不止一次乘法,為了節省資源,這裡就引入了截位。截位不是隨便截,截位的優先級如下:

  1. 首先截取數據符號位

前面的文章提到,符號位不影響數據的大小,隻影響數據的正負,所以一個數據裡面只需要有一個符號位即可;

兩個有符號定點數相乘,符號位位數至少是乘數與被乘數的符號位數之和;這就說明了兩個1位符號位的定點數相乘,結果裡面至少有兩位小數。

這個時候我們可以放心的截取掉最高位,因為這個數里面不止一位符號位;

(學習Verilog)5. FPGA定點數截位基本準則

數據的符號位

一個正常的有符號定點數的最高位一定是符號位,從高往低,與其變化一致的都是符號位,當一個數在它最大的時候,有幾位數據與最高位保持一致,數據就有幾個符號位。

有符號定點數至少需要保持一位符號位,否則數據會失真。因此這意味著截取符號位的策略不能激進,需要保守。


2. 截取低位數據

這一步棄車保帥,損失一部分精度節省資源;很好理解,捨棄低位數據相比舍棄高位數據損失精度會更小。

(學習Verilog)5. FPGA定點數截位基本準則

捨棄低位

圖中框住的正是截位的過程,coef是一個位寬2W的值,截去了3位符號位,捨去了低W-3位數據。'2*W-4-:W'運算符代表從2*W-4位開始向下共W位數據。

截位還有些其他的作用,例如將某個數除8,可以將這個數的低三位截取,同時補充高三位的符號位,就達到了除8的作用。

例子:

0100 000 / 8 --> 0000 1000

原理是微機原理的知識,計算機內部的數據是二進制表達,左移一位數據代表數據乘以2,右移一位數據代表數據除以2;


至此,FPGA數據處理的數值內容基本講完,剩下的應用將在後續的BPSK實現系列接觸到,歡迎留言一起談論,歡迎大家點贊收藏留言討論交流。


分享到:


相關文章: