摘要:在級數(shù)的基礎上,設計一種基于FPGA的多項式運算器。利用該運算器可以在數(shù)字系統(tǒng)設計中更好地處理和應用各種函數(shù)。首先實現(xiàn)基于FPGA的多項式運算器,利用這個基本單元,進而實現(xiàn)了比較復雜的函數(shù)。經過驗證,該運算器結構簡單,運算實時性和準確性都能很好地滿足需要,最后對數(shù)據進行了誤差分析。
關鍵詞:多項式;運算器;FPGA;電路設計
0 引言
傳統(tǒng)的DSP都基于CPU結構,是一種基于特定指令系統(tǒng)的處理器,但隨著運算時鐘越來越接近電子器件可以接受的極限,這種DSP的處理能力也在接近它的極限;另一方面隨著EDA技術的發(fā)展,尤其像FPGA和CPLD器件的成熟和應用,可以通過直接設計電路來實現(xiàn)并行的運算,這樣運算的效率從本質上得到了提高,而且目前能實時地實現(xiàn)非常復雜的運算,所以基于FPGA的運算器被提上議事日程,并受到越來越多的重視。一種便于用電路實現(xiàn)而且通用性強的算法,可以幫助工程師簡單高效地完成一個能在FPGA上工作的運算器的設計。
1 數(shù)字電路實現(xiàn)運算的優(yōu)缺點
初步的FPGA設計是用硬件描述語言完成器件邏輯功能的描述,一個好的設計必須考慮數(shù)字電路的特點。CPU是一個典型的數(shù)字電路,因為其只能做加法運算,所以需要通過程序將各種運算都轉換為加法來完成。傳統(tǒng)的“數(shù)值分析”正是在這種程序設計的基礎上形成的,不但復雜而且效率不高,不能實現(xiàn)真正的實時運算,而FPGA本身除了能做加法運算外,做無符號數(shù)的減法和乘法也很方便。目前兩大FPGA生產商推出的集成開發(fā)軟件中,都有集成的加、減法和乘法的IP核,運算效率非常高,對于無符號數(shù)的運算一般只要1個時鐘,甚至是不需要時鐘的組合邏輯電路,文獻中也有這些運算器的詳細介紹。但是直接做除法則不同,雖然也有除法IP核,但是需要許多個時鐘,而且占用邏輯資源很多,無論設計還是應用都不方便。電路運算的另一個缺點是表示有符號數(shù)和小數(shù),以及做有符號小數(shù)間的運算也很麻煩。所以在設計DSP時總是希望能夠找到一種方法盡量的趨易避難。
2 麥克勞林級數(shù)和多項式
運算器的作用是對數(shù)據進行各種運算,這個過程可以用一個函數(shù)來表示:y=f(x)。任何一個在零附近連續(xù)的函數(shù)都可以展開為麥克勞林級數(shù):
大部分常用函數(shù)的高階導數(shù)項很小或者為零,所以在精度允許的范圍內取其中的有限項就可以,即用一個多項式做近似運算,多項式運算的特點在文獻中有詳細介紹。用FPGA實現(xiàn)多項式的運算,處理很多復雜的函數(shù)將會十分方便。
y=a0+a1×x+a2×x2+…+an×xn (2)
本文討論的是一種可以用FPGA或CPLD實現(xiàn)多項式(2)運算的運算器。對于簡單的多項式可以是一個組合邏輯電路,不需要時鐘,所以運算效率很高。這樣許多運算都可以簡單而且高效的完成。
[!--empirenews.page--]
3 運算器設計
3.1 四則運算電路
文獻中瞄述了各種無符號整數(shù)間的運算電路。雖然也可以進行用反碼表示的符號數(shù)的運算,但不傾向于使用。因為需要做四則混合運算;反碼易于做加、減法,但不易做乘、除法。而用非反碼的帶符號位的數(shù)據,符號位做單獨計算,其余數(shù)據做無符號運算,整個計算結構是最簡單的。另外即便是無符號數(shù)做除法也很復雜,不過考慮到有種特殊的除法運算除外,那就是對于二進制數(shù)去掉最末位就相當于除以2。所以運算時可以盡量避免除以非2倍數(shù)的數(shù),以此來簡化計算。
表示小數(shù)在計算中是必須的。文獻中介紹了二進制定點小數(shù),比如需要保留數(shù)的2位二進制小數(shù)位,可以將二進制小數(shù)“…b3b2b1.a1 a2”表示為:
運算中還是可以視為對整數(shù)的計算。這樣用無符號的定點數(shù)進行計算,配合獨立的符號位表示正負,就可以用簡單的無符號運算器進行復雜的運算。
3.2 多項式的變換
式(4)為一個3次多項式,以它為例來介紹設計方法:
y=a0+a1×x+a2×x2+a3×x3 (4)
首先將式(4)中所有的數(shù)都用一個符號位加無符號二進制形式表示。分別用N1,N2表示y和x中包含的小數(shù)位數(shù),可以將式(4)寫成:
式中:X,Y是x,y去掉小數(shù)點后的整數(shù)(注:這里和式(3)一樣只是去掉小數(shù)點,不是去掉小數(shù)位)。A0,A1,A2,A3作為系統(tǒng)的常數(shù)也是一樣;n0,n1,n2,n3分別是a0,a1,a2,a3二進制形式的小數(shù)位數(shù)??梢赃M一步變換式(5)為:
不難發(fā)現(xiàn)式(6)是很容易實現(xiàn)的。先進行各項符號位的計算,然后就只剩下無符號整形數(shù)據計算;而且除法全是除以2的倍數(shù)。最后各項之間根據符號位做加、減運算就得到輸出Y,是帶符號有N1位小數(shù)的定點數(shù)。[!--empirenews.page--]
3.3 設計實例
以設計余弦函數(shù)為例,用6次多項式可以很好地擬合(0,π/2)上的余弦函數(shù)。先用麥克勞林級數(shù)計算得到6次擬合多項式:
考慮到三角函數(shù)只有小數(shù)部分有效,所以數(shù)據只用1個整數(shù)位、另8個小數(shù)位和一個符號位表示。另外需要說明的是常數(shù)保留的小數(shù)位是可以調節(jié)的,選擇保留合適的常數(shù)小數(shù)位可以盡量在保證精確度的情況下簡化運算。
確定數(shù)據格式后式(7)可以寫成式(8)的形式,進一步可將式(8)變化為式(9),并在XILINX公司的ISE中完成設計。
設計中考慮到純粹的異步組合邏輯電路容易出現(xiàn)“競爭-冒險”,所以加入了同步時鐘,這里利用同步時鐘分三步完成運算,同時為了使每一步的運算保持同步還需要加入延時模塊,這樣雖然犧牲了一些時間,但是保證了運行的穩(wěn)定性。圖1是將多項式(9)用ISE編譯出的RTL電路圖,其中“input”為式(9)中的X,“×”為乘法器,“FD”為延時模塊,“output”為式(9)中的Y。
[!--empirenews.page--]
將設計下載到芯片XC2VP30,并用Chipscope進行片內邏輯分析,外部時鐘和采樣時鐘都是100 MHz,得到電路的輸入/輸出曲線(見圖2)。圖2中虛線是輸入變量x,實線是輸出變量y??v坐標的數(shù)值顯示的是Y=y×28的值,即顯示時沒有考慮小數(shù)點。
從圖2中可以看到,輸出有大約3~4個時鐘的延時,對比CPU執(zhí)行1條指令就需要3~4個時鐘,運算效率已經很高,而且這里使用的邏輯資源很少。
4 實驗結果分析
多項式擬合函數(shù)會有誤差。這里只分析運算器相對多項式的誤差。因為數(shù)據位寬有限,會出現(xiàn)截斷誤差。設計實例采用8位小數(shù)位,最大表示誤差是±2-9。由于常數(shù)也有數(shù)據截斷,實際運算誤差會更大。
減小誤差的惟一辦法是增加數(shù)據的位數(shù)。在本例中將數(shù)據上傳電腦并測算,最大誤差在x=π/2處,絕對值是0.0063,相對值是0.63%。對于一些特殊的輸入如x=0或x=0.5等,運算沒有誤差。
5 結語
通信系統(tǒng)的仿真與硬件實現(xiàn)涉及到很多復雜的函數(shù),直接實現(xiàn)會造成資源浪費,而且實現(xiàn)難度比較大。采用FPGA實現(xiàn)多項式運算,實現(xiàn)起來比較簡單,為之后實現(xiàn)復雜函數(shù)提供了基礎,大大提高了運算速度和實現(xiàn)效率,在通信系統(tǒng)的硬件實現(xiàn)上有很廣闊的應用前景。