摘 要:本文研究了一種運用FPGA進行數據處理的方法,包括:提取輸入數據的高log2M個比特位的數據,作為高有效位,根據預先設置的目標函數的計算表格,查找所述高有效位對應的目標函數值y(n)以及高有效位+1對應的目標函數值y(n+1);提取輸入數據的剩余比特位數據,作為低有效位,并將所述低有效位與y(n)和y(n+1)的差值相乘,得到偏移值off(n),將該偏移值與所述高有效位對應的目標函數值y(n)相加,將計算結果作為所述輸入數據對應的目標函數值。本方法具有控制簡單、結構規則、單運算周期、計算精度較高的特點,適合于FPGA的數據處理實現。
引言
現場可編程門陣列(FPGA)芯片在許多領域均有廣泛的應用,尤其是在無線通信領域。FPGA具有極強的實時性和并行處理能力,這使其對信號進行實時處理成為可能。FPGA內部一般都包含邏輯單元(查找表/觸發器)、存儲單元(BRAM)、乘加單元(MAC)和一些其他的時鐘、引腳單元等[1-3]。
現代數字信號處理的主要發展趨勢是:算法結構日趨復雜,計算量大,實時性要求高,并且包含大量的三角函數、開方、對數等復雜函數的計算。但FPGA內部的乘加單元并不適合直接進行此類函數的計算,需要把各種復雜函數分解為簡單的移位、加法和乘法結構,進而在FPGA中實現[4]。
當前,在FPGA上實現三角函數、開方、對數等復雜函數的計算,技術領域最常見的是除法,其次為開方和三角函數,很少涉及對數和其他復雜一些的函數。而在FPGA具體的實現上,此類函數一般采用直接查表法或冪級數展開法,對于三角函數和開方的計算,也會采用CORDIC的計算方法,但這三種方法的應用都有一定的局限性[4]。
1 現有的FPGA實現方法
(1)在FPGA上采用直接查表方法,來實現函數的計算,具有:
優點——通用性強、結構簡單;
缺點——隨著輸入位寬的增加,內部存儲量的消耗呈指數性增長。
表1給出了不同輸入輸出位寬所需要的存儲單元(BRAM)。
表1 不同輸入輸出位寬所需要的存儲單元
可以看出,輸入輸出位寬較小時,直接查表法可以滿足實現要求,但在數字信號處理領域,輸入輸出一般都在16bits以上,這時采用直接查表法就很難滿足實現需求。
這里以開方算法為例進行說明。采用直接查表法進行開方計算有2種方式。
方式一:在完全保證精度的條件下,采用直接查表法。若開方為16bits輸入16bits輸出,在完全保證精度的條件下,FPGA就需要存儲216深度的數據,需要64塊18k BRAM的存儲空間。而一片中等FPGA一般包含幾十塊到幾百塊的18k BRAM存儲單元,此時計算就要用掉大部分的存儲單元,顯然不滿足實現的資源需求。
方式二:降低精度,減少輸入位寬,采用直接查表法。
表2 直接查表法開方誤差表
可以看出,隨著實際有效輸入的增加,計算精度變大,很難滿足計算的誤差要求。
(2)在FPGA上采用冪級數展開法計算函數。
優點——計算精度可控,多級展開可以達到較高的計算精度;
缺點——冪級數展開法為了達到較高的精度,需要多級展開,這樣就需要采用較多的資源來實現。
以exp為例(0~π/4范圍內),采用三角函數冪級數展開法:
?
若輸入為16bits,采用冪級數展開法的計算框圖如圖1。
從資源方面考慮,三角函數冪級數展開法在FPGA中的實現需要5級乘法和3級加法,考慮每級乘法位寬需要擴展,實際需要FPGA的12個乘法器
(18bits×18bits)資源。此外從誤差方面考慮,0~π/4范圍內,cosΦ的最大誤差為0.046%, sinΦ的最大誤差為0.35%。
?
圖 1 冪級數展開法實現exp計算
此外冪級數展開法的應用范圍也比較有限,開方、倒數、對數、三角函數的計算可以采用冪級數展開法,但對于等較復雜的函數計算就不再適合用此方法進行計算。
(3)在FPGA上采用CORDIC法來實現函數的計算。
優點:將復雜的運算分解為簡單移位、加迭代
運算,結構規則,運算周期可以預測,比較適合于FPGA實現;
缺點:一般使用多周期方式,單周期方式資源消耗較高,并且計算僅限于向量旋轉、開方等有限的范圍。
采用CORCIC計算三角函數,16bits輸入,在多周期條件下需要500個左右的LUT/FFs,在單周期條件下,需要1000個左右的LUT/FFs。
2 本文提出的方法
本文在FPGA上采用兩級方法進行函數計算:第一級,直接利用輸入數據的高有效位確定計算結果的有效范圍;第二級,直接利用輸入數據的低有效位進行計算結果的誤差調整。本研究方法充分利用FPGA內部的各種邏輯資源、乘加器(或乘法器)資源和BRAM資源:可以根據FPGA內部BRAM資源的大小采用相應深度的數據表存儲第一級數據的有效范圍;采用FPGA內部的乘加器(或乘法器)資源進行乘加操作。此方法具有控制簡單,結構規則,單運算周期,計算精度較高的特點,適合于FPGA的算法實現。
此外,采用本研究方法的兩級計算的方法,不同函數的計算實現方法一致,只要修改第一級計算高有效位數據表格中的數據,就可以復用設計,有利于資源共享和模塊化實現。
圖2 FPGA兩級法進行函數的計算
同現有方案的比較分析:
(1)同直接查表法比較
以開方為例進行,資源和誤差的列表如表3。可以看出,在資源和誤差方面,本研究方法在FPGA上實現函數計算優勢明顯。此外,FPGA可以通過增加存儲單元和擴展輸出位寬來進一步提高計算精度。
表3 兩級計算法開方同直接查表法誤差比較表
(2)同冪級數展開法的比較
首先,本問題出的新方法比冪級數展開法的應用范圍更廣泛。其次,在同樣的函數下,以exp的計算為例,本文提出的新方法資源更好,誤差更小。在資源方面,FPGA上采用的兩級計算方法, 同時計算只需要2個乘法器即可,遠遠少于冪級數展開法的資源消耗;在誤差方面,0~π/4范圍內,16bits輸入,cosΦ和sinΦ的最大誤差都小于10-5,因此此方法誤差比冪級數展開法誤差要小。
(3)同CORDIC方法比較
首先,本文提出的新方法比冪級數展開法的應用范圍更廣泛。其次,在同樣的函數下,以exp的計算為例,新方法資源消耗相對較少,cosΦ和sinΦ同時計算只需要300個左右的LUT/FFs即可。而且,新方法采用的是單運算周期模式,運算速度更高。
評論
查看更多