FPGA中常用到的計算轉換

2021-10-01 03:12:20 字數 2607 閱讀 9983

演算法經過軟體設計和除錯之後,需要對映到fpga中,由於軟硬體的區別,大部分演算法需要經過等效轉換,變成硬體容易實現的方式,才能對映。這裡記錄一下學習到的知識,以後忘記了也可以看看。

計算機中的數分為定點數和浮點數。定點數一般用二進位制補碼表示,對於乙個二進位制補碼表示的數,如果其小數點位置固定,則為定點數;特殊的,當小數點後面為0位時,表示乙個整數;當小數點前只有一位符號位時,表示純小數,歸一化的小數一般也也是這個形式。任意乙個數n的補碼可以用2^n + n表示,即模加上它本身。 定點數通常用qm.n的形式表示,m表示整數部分有多少個二進位制位(第一位為符號位),n表示小數部分有多少個二進位制位,其值用如下公式表示,精度1/2^n,範圍 -2^(m-1)~~~~~(2^(m+n-1) - 1)/(2^n),模為2^m。

上列式子可以計算任意補碼表示的定點數qm.n的十進位制值,那給定乙個十進位制數,如何轉換為二進位制形式的定點數呢?上列式子可以進一步化簡,如下圖所示。

首先需要確定qm.n中的m和n的位數。例如給定乙個數-12.367,那麼選定精度為0.001時,能較準確的表示這個數,即n等於10(精度為0.000977);然後根據範圍,選定m等於5;即用q5.10表示這樣乙個數,範圍在-16~~15.999。然後在計算具體的m和n。先用-12.367乘以1024(2的n次方),等於-12663.808,取其整數部分,即為-12664,然後計算其補碼(注意這裡模也應該乘1024)32768-12664 =20104(100111010001000),即最後的定點數為100111010001000,轉換回去為-12.3671875,較精確的表示了給定的數。

定點數加法比較簡單,只需要將符號位擴充套件一位(如果兩個數都定義為signed型別的數,那麼綜合器會自動按符號位擴充套件;如果存在乙個無符號數,那麼綜合器會按0擴充套件;因此,根據設計需要最好手動擴充套件),然後相加即可,小數點位置無需移動。例如兩個q4.4的數想加,0010_1000(2.5)與1000_1000(-7.5)。先將兩個數進行符號位擴充套件,如00010_1000與11000_1000,然後執行二進位制加法,即可得到最終數11011_0000(-5)。

定點數乘法推導比較複雜,具體可以搜尋關鍵字「二進位制補碼乘法」或者「補碼一位乘法」。在verilog中,如果被乘數和乘數都定義為signed,那麼乘法按二進位制補碼進行;如果兩個數中有乙個沒有定義為signed,則按無符號二進位制乘法進行。這一點與加法很相似,所以我們在計算的時候一定要注意。

另外,乘法運算會導致小數點增多,這時候考慮到儲存資源的問題,我們有時候會截斷資料。例如兩個數011.100(3.5)

與110.110(-1.25),如下圖所示,最終結果為1111011.101000(-4.375)。這時候擷取可以從兩方面入手,一是降低精度,將低位截斷,如去掉最低3位,此例為000;二是從高位入手,擷取掉符號位,這裡需要先預估一下最終結果的範圍,比如兩個q3.3的數相乘,完全可以用q5.3的數表示,那麼就可以把結果中的高符號位部分截掉,此例11,那麼最終的數為11011.101。

浮點數即小數點浮動的數,通常用符號位(s)+指數e+無符號尾部數m表示,故浮點數是不存在補碼形式的,其值可以用如下公式表示,e為指數e所占用的二進位制位數,浮點數的最小分度為1/(2^(e-(2^(e-1) - 1))),絕對值最大數即為各字段值都為1。

當乙個數的絕對值小於某規定的數的最小值,計算機會將它作為0處理,稱為下溢位;當乙個數的絕對值大於某規定的數的最大值,計算機將無法表示,稱為上溢位。

浮點數轉定點數。以float型資料為例,1符號位+8指數字+23位尾數字。具體思路是先將尾數最高位加一位1,構成24尾數,小數點就在這個1後面。然後判斷指數e與127的大小,如果e更大,則尾數左移,偏移量為e-127;如果e更小,則尾數右移,偏移量為127-e。最後將符號位加上即可,小數點的位置在23+(127-e)位的前面。但這樣得到的是定點數表示的原碼,還需要轉換為補碼。

定點數轉浮點數。還是以轉float為例。對於乙個qm.n的數,先將其轉換為原碼。最高位為符號位,即q[m+n-1]為符號位。然後確定指數部分,從符號位後開始,尋找第乙個1,記錄位置為q[m+n-x],那麼q就需要向右移m-x位,即有-(m-x)=e-127,即e=127+x-m。最後尾數部分即為移位後的q``[m+n-x-1:0],如果尾數不足23位,則在後面補0。

十進位制數轉二進位制數,整數部分,採用除2法,一直到商為0,然後倒著取餘數;小數部分,採用乘2法,然後順著取整數部分。

定常數轉換。即乙個訊號乘以或者除以乙個常數,這種通常轉換為移位和加法的形式,因為這是在fpga好實現的方式。如a*121=a*(2^7 - 2^2 - 2^1  - 1)。

又如a/25 = (a*2^10)/(25*2^10) = a*40.96*(2^-10) = a*(2^5 + 2^3 + 2^-1 + 2^-2 + 2^-3 + 2^-4 + 2^-6 + 2^-7)*(2^-10),具體精度根據設計需求而定,精度越高,消耗的資源也越高。

報表中常用到的日期計算方式

原文 htl258 tony 日期 09 21 02 30 declare dtdatetime set dt 2009 09 20 1.1 求本月的第天 select dateadd mm datediff mm 0,dt 0 2009 09 01 00 00 00.000 1.2 求本月的最後天...

網頁中常用到到

html按鈕button怎麼加超連結 1.如果讓本頁轉向新的頁面則用 2.如果需要開啟乙個新的頁面進行轉向,則用 3.將中文轉換成unicode碼 native2ascii d a.txt d b.txt 4.css 5.密碼核對 function checkpwd 6.性別的處理 integer....

Java中常用到的轉義字元

1.八進位制轉義序列 1到3位5數字 範圍 000 377 0 空字元 2.unicode轉義字元 u 四個十六進製制數字 0 65535 u0000 空字元 3.特殊字元 就3個 雙引號 單引號 反斜線 4.控制字元 5個 單引號字元 反斜槓字元 r 回車 n 換行 f 走紙換頁 t 橫向跳格 b...