歡迎您光臨本站 登入註冊首頁

FPGA算法設計

klacds @ 2020-06-06 , reply:0

概述

介紹FPGA是純粹的硬件設計,當進行算法設計時,Verilog綜合後的就是硬件邏輯電路。因此,進行算法設計時,算法設計中需要表示的數字用到的小數、符號、無窮大、整數、浮點數等等對應硬件來說都是一串0和……

介紹
FPGA是純粹的硬件設計,當進行算法設計時,Verilog綜合後的就是硬件邏輯電路。因此,進行算法設計時,算法設計中需要表示的數字用到的小數、符號、無窮大、整數、浮點數等等對應硬件來說都是一串0和1組合的數字。因此,當FPGA工程師設計算法時,需要對這些數字轉換。一般轉換為定點數值表示方式,在FPGA中實現定點數運算。具體用多長的位數表示定點,以及定點小數點放在那裡,都需要根據具體設計中數值大小、需要表示的精度來確定。
這裡主要介紹一下算法設計的主要過程和知識點,主要闡述下設計過程和用到的知識。不做具體深入細化,主要目的是記錄下自己的學習過程,為想本人一樣的初學者指個道,有不妥之處見諒,本人也是菜鳥。
一.算法設計基本知識
數字的表示
知道數值的表示方式是最基本的要求。主要的數值表示方式有原碼、反碼、補碼;定點數、浮點數(單精度和雙精度)。注意這些表示方式需要的位數和不同位中的具體實際含義。
二.算法設計前進行浮點仿真
為啥要浮點仿真呢。因為浮點是表示精度很高。而且matlab中默認的運算是雙精度浮點型(double),這樣浮點仿真得到的結果是最精確的。在以後的定點仿真和Verilog代碼設計中的每一步結果都是以浮點對應步驟結果為參照進行的。
浮點仿真一般在MATLAB和C語言中進行。
##2.1浮點數表示方法
上面方框中表示的浮點數大小是:X=(-1)^sign * 1.fraction * 2^(exponent - bias)。
初學者這樣看其實比較蒙圈,其實就是算術式X中sign和fraction直接由上圖的fraction填充,1是固定的。Exponent轉換為10進制放到X式子中。Bias在單精度表示法中是127,雙精度中是1023。
對於32位單精度浮點數(float),sign是1位,exponent是8位(指數偏移量是127),fraction是23位。對於64位雙精度浮點數(double),sign是1為,exponent是11位(指數偏移量是1023),fraction是52位。以32位單精度浮點數為例(float),其具體的轉換規則是:首先把二進制小數(補碼)用二進制科學計數法表示,比如上面給出的例子 1111101.001=1.111101001×26。符號位sign表示數的正負(0為正,1為負),故此處填0。exponent表示科學計數法的指數部分,請務必注意的是,這裡所填的指數並不是前面算出來的實際指數,而是等於實際指數加上一個數(指數偏移),偏移量為2^(e-1)-1,其中e是exponent的寬度(位數)。對於32位單精度浮點數,exponent寬度為8,因此偏移量為127,所以exponent的值為133,即10000101。之後的fraction表示尾數,即科學計數法中的小數部分11110100100000000000000(共23位)。因此32位浮點數125.125D在計算機中就被表示為01000010111110100100000000000000。
2.2浮點仿真
最簡便的浮點仿真是在MATLAB中進行,MATLAB默認數據是雙精度,可以把需要計算的數據公式直接換成MATLAB程序,然後輸入測試數據,觀察輸出的雙精度結果用來指導下面的設計。
三.算法設計前進行定點仿真
在這一步驟需要將前面的MATLAB浮點仿真程序變換為MATLAB定點仿真程序。並逐步對照各個階段的定點仿真結果,看偏差是多大。
3.1 定點表示
定點數:一種是規定小數點位置固定不變,稱為定點數。
定點數的表示有Q、S兩種方法。
Q格式
小數點位置不同,同一個二進制數可以表示不同的值。為了編程方便,我們通常在同一算法中使用固定的小數點位置。Q格式是用來表達一個二進制數中整數、小數分別有多少bit的一種表示格式。例如,我們用3bit表述整數部分,4bit表示小數部分,則這個數的格式為Q3.4格式。
對於一個字長固定的處理器,另一種可行的表示格式是隻表示小數部分。例如,當我們使用一個字長為16bit的處理器的時候,我們可以簡單是說我們是使用Q15格式來表示小數。這裡的Q15表示小數點右邊有15bit,左邊有1bit。同時Q15也等效於Q1.15。
3.2定點數轉換
假設存在浮點數x和定點數xq,則二者轉化公式如下:
x轉換為xq:xq = (int)x*2^Q;<下取整>
xq轉換為x:x = (float)xq*2^(-Q)
Q表示從Q0-Q15之間的定標
舉例: x = 0.5,Q = Q1,則xq = 0.5*2^1 = 1;
x = 0.5,Q = Q15,則xq = 16384。
假設xq = 100,Q=Q1,則x = 100*2^(-1) = 50.0;
xq = 512,Q = Q15,則x = 0.015625
3.3定點數運算的對標概念
定標的大小,影響著整數部分和小數部分的位數,定標的過程其實是在操作數動態範圍和精度之間做權衡的過程。
設一個變量可能出現的最大絕對值為|max|,n為正整數,滿足2^(n-1) < |max| < 2^n,則定標Q按如下規則選取最合適:
Q = 有效數據位 – n
對於32位的有符號數,數據有效位=31。如|max| = 2.75,選Q = 31 – 2 =29是最合適的。
兩個定點數進行運算,它們的定標可能相同也可能不同,定標就是需要確定定點數加減乘除之前和之後的小數點位置。
我們知道,用十進制做兩個數的加減和乘除過程如下:
加減法:先對位,後加減;
乘除法:先乘除,後取小數點。
而定點數之間的加減乘除,撇開符號位不談,其過程是一樣一樣的:
加減法:先對標,後加減;
乘除法:先乘除,後定標。
3.2 MATLAB定點仿真
在這裡,博文主要介紹一下MATLAB定點仿真用到的知識。MATLAB中有fixed-point-designer工具箱為設計者帶來很大方便。大家可以閱讀對應知識點。

3.2.1 MATLAB浮點轉定點函數—fi、quantizer函數
這裡,1、 浮點數轉換為定點數:
有兩種方法:
(1)先量化再轉化為二進制:a = 2.1345; b = quantizer([8 5]); c = num2bin(b, a);
(2)先確定定點數的格式再轉換:a = 2.1345; b = numerictype(1,8,5); c = fi(a,b);用c.bin就可以查看c的二進制形式了。
2、 定點數(二進制)轉化為浮點數(十進制):
先確定定點數的表示方式在用bin2num轉換為十進制:d = quantizer([8 5]); e = bin2num(d,c),其中c為浮點轉定點輸出的數據。
3.2.2 整個程序的定點轉換
通過上面的形式,將整個浮點下的算法轉換為定點數對應的算法程序。並進行仿真驗證。
四.講定點仿真代碼轉換為Verilog語言
用Verilog實現定點運算是,需要做到小數點為在程序員心中。用Verilog語言實現加減乘除、對數、指數、開方、三角函數、雙曲線函數運算等。
在這一節設計中,廣大FPGA開發者可以參考下面網站很多很好的設計。

同時,MATLAB中有System Generator 2016.2工具和HLS(高層次綜合可以直接將C語言轉換為HDL語言),遺憾,這兩個方法筆者也是初學。
五.對Verilog進行仿真
最後一步,就是對Verilog代碼進行仿真。將前面定點MATLAB程序的定點數據輸入到Verilog程序中,對應進行仿真,進行數據比對。

[klacds via 研發互助社區 ] FPGA算法設計已經有1087次圍觀

http://cocdig.com/docs/show-post-45678.html