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