FPGA 101:計(jì)算復(fù)雜數(shù)學(xué)函數(shù)
由于其靈活性與高性能,FPGA已經(jīng)在眾多需要計(jì)算復(fù)雜數(shù)學(xué)題或傳遞函數(shù)的工業(yè)、科研、軍事及其它應(yīng)用中找到用武之地。苛刻的精度要求與計(jì)算時(shí)延在更關(guān)鍵的應(yīng)用中并不少見。
本文引用地址:http://m.butianyuan.cn/article/201610/308461.htm在采用FPGA實(shí)現(xiàn)數(shù)學(xué)函數(shù)時(shí),工程師一般選擇定點(diǎn)數(shù)學(xué)(參見:賽靈思中國通訊第80期的《FPGA數(shù)學(xué)基礎(chǔ)》,http://issuu.com/xcelljournal/ docs/xcell80/44?e=2232228/2002872)。另外,您還可以采用CORDIC等許多算法計(jì)算超越函數(shù)(參見:賽靈思中國通訊第79期的《如何在FPGA中運(yùn)用CORDIC算法》,http://china.xilinx.com/ publications/archives/xcel l/Xcell79.pdf)。
不過,在遇到極為復(fù)雜的數(shù)學(xué)函數(shù)時(shí),與在FPGA之中實(shí)現(xiàn)精確需求函數(shù)相比,還有更高效的方法進(jìn)行處理。為了理解這些變通方法 – 尤其是其中的多項(xiàng)式近似法,我們首先需要定義相關(guān)問題。
設(shè)置問題
FPGA中負(fù)責(zé)監(jiān)控鉑電阻溫度計(jì)(PRT)并把PRT電阻轉(zhuǎn)換成溫度的復(fù)雜數(shù)學(xué)傳遞函數(shù)就是這樣一個(gè)例子。這種轉(zhuǎn)換一般采用Callendar-Van Dusen方程實(shí)現(xiàn)。通過以下該方程的簡化形式,可以確定溫度介于0°C~660°C之間。
式中,R0 為0°C時(shí)的電阻,a 與b 是PRT的系數(shù),而t 則是溫度。
現(xiàn)實(shí)中,我們希望從電阻轉(zhuǎn)換到溫度。為此,我們需要調(diào)整該方程,確保得出的結(jié)果是給定電阻下的溫度。大多數(shù)采用PRT的系統(tǒng)都會(huì)設(shè)計(jì)電子裝置、采用電子電路測量PRT的電阻,然后利用FPGA、通過調(diào)整后的下式計(jì)算溫度。
在FPGA中實(shí)現(xiàn)此方程即使是經(jīng)驗(yàn)豐富的FPGA工程師也會(huì)望而卻步。參考溫度繪制所獲得的電阻可以獲得圖1所示圖形。
從圖中可以清晰看出響應(yīng)的非線性。
溫度與電阻
圖1 – 傳遞函數(shù)圖
直接在FPGA中實(shí)現(xiàn)調(diào)整后的傳遞函數(shù)會(huì)在實(shí)際所需設(shè)計(jì)工作量以及驗(yàn)證方面面臨著巨大挑戰(zhàn)(確保精度以及跨邊界與極端條件函數(shù))。許多工程師會(huì)想方設(shè)法實(shí)現(xiàn)函數(shù),以便減少設(shè)計(jì)與驗(yàn)證工作量,從而控制項(xiàng)目進(jìn)度。一個(gè)可行的方法是采用查找表保存曲線中的一系列點(diǎn),同時(shí)提供LUT所含點(diǎn)之間的線性插值。
根據(jù)相關(guān)精度要求和保存在查找表中的元素?cái)?shù)量,這種方法有可能滿足需求。但是,您仍然需要在設(shè)計(jì)中包含線性插值函數(shù)。此函數(shù)在數(shù)學(xué)上非常復(fù)雜,而且往往包含一個(gè)非二次冪除法,其會(huì)進(jìn)一步增加復(fù)雜性。
利用FPGA資源
相反,您還可以利用另一種方法實(shí)現(xiàn)此類傳遞函數(shù),那就是利用FPGA的本身特性。賽靈思 Spartan-6與7系列Artix、Kintex與Virtex等新型FPGA不僅僅只包含傳統(tǒng)查找表和觸發(fā)器,還具有內(nèi)置DSP Slice、Block RAM、分布式RAM、PCIe®等眾多高級(jí)IP硬核以及以太網(wǎng)端點(diǎn)、高速串行鏈路等。
由于其提供的48位累加器,工程師通常把DSP Slice稱為DSP48s。不過,這些Slice還提供25 x 18位寬乘法器、加/減功能以及眾多其它功能。您可以利用這些內(nèi)部RAM結(jié)構(gòu)和DSP Slice更輕松實(shí)現(xiàn)傳遞函數(shù)。
多項(xiàng)式近似法
利用FPGA具有豐富DSP與RAM的結(jié)構(gòu)的一種方法是多項(xiàng)式近似法。為了使用此方法,您必須首先繪出數(shù)學(xué)函數(shù)圖,在MATLAB或Excel等數(shù)學(xué)程序中涵蓋輸入值范圍。然后您可以在相關(guān)數(shù)據(jù)集中添加多項(xiàng)式趨勢線,然后可以在FPGA中實(shí)現(xiàn)該趨勢線的等式,以取代復(fù)雜數(shù)學(xué)函數(shù),只要趨勢線等式符合精度要求。
如果一個(gè)多項(xiàng)式方程無法針對(duì)整個(gè)傳遞函數(shù)輸入范圍提供足夠精度,則可以添加更多方程。只要生成一系列在相關(guān)輸入范圍使用的多項(xiàng)式常數(shù),您就能夠繼續(xù)依賴此方法。
能夠添加多項(xiàng)式趨勢線的數(shù)學(xué)程序大部分都允許您選擇階次或多項(xiàng)式項(xiàng)的數(shù)量。階次越高,則配合越準(zhǔn)確——但是您需要在FPGA中實(shí)現(xiàn)更多的項(xiàng)。在針對(duì)傳遞函數(shù)示例實(shí)施此過程時(shí),我們是采用Microsoft Excel,我們已經(jīng)獲得了圖2所示趨勢線與等式。本例中采用4次多項(xiàng)式方程。
在獲得了適合我們希望實(shí)現(xiàn)的傳遞函數(shù)的多項(xiàng)式之后,我們可以采用相同分析工具(在本例中為Excel)針對(duì)原始傳遞函數(shù)仔細(xì)檢查精度。在所述監(jiān)控溫度的例子中,最終測量精度可能會(huì)是+/-1C,這并非苛刻的精度要求。盡管如此,根據(jù)測量范圍和您實(shí)現(xiàn)的傳遞函數(shù),可能證實(shí)仍然很難僅用一個(gè)多項(xiàng)式方程實(shí)現(xiàn)。我們?cè)撊绾谓鉀Q這個(gè)問題呢?
根據(jù)輸入值選擇的多條趨勢線
如果一個(gè)多項(xiàng)式方程無法針對(duì)整個(gè)傳遞函數(shù)輸入范圍提供足夠精度,則可以添加更多方程。只要生成一系列在相關(guān)輸入范圍使用的多項(xiàng)式常數(shù),您就能夠繼續(xù)使用此方法。因此,一旦輸入值超出特定范圍,則加載一個(gè)新的常數(shù)集合。
圖2 – 用于溫度傳遞函數(shù)的趨勢線與多項(xiàng)式方程
聚焦溫度與電阻
圖3 – 可提供更準(zhǔn)確結(jié)果的269C~300C繪圖
下面繼續(xù)探討溫度例子,第一個(gè)多項(xiàng)式方程可以在0C~268C范圍內(nèi)提供+/-1C的精度。對(duì)于許多應(yīng)用此精度已經(jīng)足夠。假設(shè)我們需要達(dá)到300C的更廣泛運(yùn)行范圍與容差,則意味著我們最初的方法無法滿足設(shè)計(jì)要求。利用分段方法我們能夠解決上述問題,即繪出269C~300C范圍的圖形并且獲得能夠?yàn)榇溯敵龇秶峁└呔鹊牟煌囗?xiàng)式方程(見圖3)。
總之,此實(shí)現(xiàn)方法采用第一套多項(xiàng)式常數(shù),直到輸入值超出與268C對(duì)應(yīng)的預(yù)先計(jì)算范圍。超出該范圍之后則采用第二套常數(shù)保持精度要求。
這樣您就能夠把傳遞函數(shù)分為一系列片段,以便達(dá)到預(yù)期精度。您可以選擇跨傳遞函數(shù)均勻分隔這些片段,也就是說,可以把它們分為均等于X的10分段。另外,您也可以不均勻分隔,而是按實(shí)現(xiàn)所需精度的要求進(jìn)行分段,集中精力關(guān)注較難達(dá)到精度的傳遞函數(shù)部分。
就決定您實(shí)現(xiàn)方案時(shí)需要考慮的利弊權(quán)衡而言,應(yīng)當(dāng)牢記的是均勻方法比非均勻方法會(huì)占用更大的內(nèi)存空間。根據(jù)您所實(shí)現(xiàn)的傳遞函數(shù),采用非均勻方法可能會(huì)節(jié)省大量資源。
如何對(duì)比?
當(dāng)然,如前所述,其它方法也可以用于實(shí)現(xiàn)傳遞函數(shù)。多項(xiàng)式近似法之外最常用的四種方法分別是軟件程序、查找表、帶插值的查找表以及CORDIC。
由于需要添加處理器(會(huì)相應(yīng)增加設(shè)計(jì)復(fù)雜性、材料清單成本等),采用軟件計(jì)算傳遞函數(shù)會(huì)使系統(tǒng)架構(gòu)復(fù)雜化。即使設(shè)計(jì)團(tuán)隊(duì)采用賽靈思Zynq-7000 All Programmable SoC等片上系統(tǒng)彌補(bǔ)上述缺陷,仍然會(huì)存在難題。對(duì)新手而言,用軟件計(jì)算傳遞函數(shù)比在邏輯電路中實(shí)現(xiàn)需要花費(fèi)多得多的時(shí)間,從而會(huì)降低系統(tǒng)響應(yīng)時(shí)間。事實(shí)上,傳遞函數(shù)(諸如我們示例設(shè)計(jì)中所用的)的計(jì)算是一個(gè)典型的例子,應(yīng)該由Zynq SoC可編程邏輯端負(fù)責(zé)處理。
第二種方法(即采用含有輸入預(yù)算值的查找表)的效果隨輸入值范圍與寬度變化而改變。有時(shí)會(huì)很快造成非常龐大的LUT,其會(huì)占用FPGA內(nèi)部大量的RAM容量。根據(jù)相關(guān)FPGA,此方法可能需要的資源供不應(yīng)求,也有可能造成與設(shè)計(jì)中其它模塊竟用資源。當(dāng)然,這種方法的有利之處是能夠很快算出結(jié)果。
第三種潛在方法(帶插值的查找表)是我們前面談到過的一種方法,它試圖減少整套LUT方法所需的內(nèi)存位置數(shù)量。此方法需要工程師在FPGA內(nèi)編寫線性插值函數(shù),而這項(xiàng)工作多少有點(diǎn)棘手。不過,它仍然比CORDIC這個(gè)最后選項(xiàng)簡單得多。
CORDIC算法能夠?qū)崿F(xiàn)超越函數(shù),如:正弦、余弦、乘法、除法、平方根等。因此,利用CORDIC算法與基本數(shù)學(xué)模塊的組合能夠準(zhǔn)確實(shí)現(xiàn)傳遞函數(shù)。此方法可以實(shí)現(xiàn)更高精度。但是,對(duì)于復(fù)雜的傳遞函數(shù),這種好處需要付出增加設(shè)計(jì)與驗(yàn)證時(shí)間的代價(jià)。當(dāng)然這對(duì)采用該方法實(shí)現(xiàn)的器件的工作頻率會(huì)有影響。
因此,多項(xiàng)式近似法是四種備選方案的折中,其能夠很好地平衡性能、精度與實(shí)現(xiàn)資源占用。
實(shí)現(xiàn)簡便性
每位工程師都希望創(chuàng)造出能夠最佳利益器件資源的FPGA。多項(xiàng)式近似法使您能夠受益于FPGA提供的豐富乘法器與RAM環(huán)境,同時(shí)能夠利用這些資源輕松實(shí)現(xiàn)看似極其復(fù)雜的數(shù)學(xué)傳遞函數(shù)。
評(píng)論