摘 要: 在對(duì)傳統(tǒng)CORDIC算法" title="CORDIC算法">CORDIC算法進(jìn)行改進(jìn)的基礎(chǔ)上,,討論了一種基于改進(jìn)型CORDIC算法的NCO實(shí)現(xiàn)方法,該設(shè)計(jì)占用資源少,、運(yùn)算速度快,、易于擴(kuò)展。仿真結(jié)果證明該設(shè)計(jì)具有較高的性價(jià)比,。
關(guān)鍵詞: CORDIC算法 數(shù)控振蕩器" title="數(shù)控振蕩器">數(shù)控振蕩器 FPGA
數(shù)控振蕩器(NCO)的作用是產(chǎn)生正交的正弦和余弦樣本,,應(yīng)具有頻率分辨率高、頻率變化速度快,、相位可連續(xù)線性變化及生成的正弦和余弦信號(hào)正交特性好等特點(diǎn),。傳統(tǒng)的數(shù)控振蕩器中,,相位到幅度的轉(zhuǎn)化是通過查找表(LUT)的方式來實(shí)現(xiàn)的。這種方法實(shí)現(xiàn)簡(jiǎn)單,,但是如果要提高頻率分辨率,,往往需要消耗大量的存儲(chǔ)資源。而且,,由于受到RAM讀取速度的影響,,使NCO輸出速率受到制約。CORDIC算法以其算法簡(jiǎn)單,、硬件實(shí)現(xiàn)方便等特點(diǎn)在很多方面得到了應(yīng)用,,其中之一就是用于NCO的設(shè)計(jì)。本文在傳統(tǒng)CORDIC算法的基礎(chǔ)上進(jìn)行了改進(jìn),,并將其運(yùn)用到一個(gè)NCO的設(shè)計(jì)當(dāng)中,,具有運(yùn)算速度快、資源占用少,、易于擴(kuò)展等優(yōu)點(diǎn),。
1 NCO實(shí)現(xiàn)原理
NCO可以看成是由相位累加器(PA)和函數(shù)發(fā)生器(FG)兩部分組成,如圖1所示,。其中相位累加器的設(shè)計(jì)較簡(jiǎn)單,,設(shè)計(jì)NCO的關(guān)鍵是設(shè)計(jì)正弦函數(shù)發(fā)生器。傳統(tǒng)的實(shí)現(xiàn)函數(shù)發(fā)生器的方法為查表法(LUT),,對(duì)于一個(gè)相位位數(shù)為n,,輸出信號(hào)幅度位數(shù)為M的NCO,所需查找表的大小為M×2n,。為了提高NCO的頻率分辨率,,往往需要擴(kuò)大查找表的容量,這會(huì)造成存儲(chǔ)資源的大量消耗,。而且,,由于受到RAM讀取速度的影響,NCO的輸出速率受到制約,??梢钥闯鯨UT是NCO設(shè)計(jì)的瓶頸。為了避免使用大容量的存儲(chǔ)器,,可以考慮通過計(jì)算來產(chǎn)生正余弦函數(shù)樣本,。基于矢量旋轉(zhuǎn)的CORDIC算法正好滿足了這一需求,。
2 CORDIC算法原理
CORDIC算法最初是由J.Volder于1959年提出,1971年J.Walther提出了統(tǒng)一的CORDIC形式,。用CORDIC算法求三角函數(shù)的基本原理如下:
如果P(x,,y)是直角坐標(biāo)系中單位圓上一點(diǎn), θ為向量OP和X軸正向之間夾角, 則有x=cosθ,,y=sinθ。因此若將單位向量OM(1,,0)旋轉(zhuǎn)n次得到向量OP(x,,y),讓旋轉(zhuǎn)角度的總和等于輸入的角度?茲,,則x,,y即為所需輸出值cosθ和sinθ,這就是CORDIC算法實(shí)現(xiàn)正交三角函數(shù)cosθ和sinθ的基本思路,。如圖2所示,。
向量x1+jy1旋轉(zhuǎn)角度θ到向量x2+jy2:
經(jīng)變換為:
為了便于硬件實(shí)現(xiàn),設(shè)旋轉(zhuǎn)n次,,令每一次旋轉(zhuǎn)的角度為θi,,并且θi滿足tanθi=2-i,則cosθi,,第i次的旋轉(zhuǎn)表示為:
其中,,第i次旋轉(zhuǎn)后的角度變化為zi,每次旋轉(zhuǎn)的方向?yàn)?delta;i,,由zi的符號(hào)位來決定,;δi=sign(zi),即δi=+1時(shí),,逆時(shí)針旋轉(zhuǎn),,δi=-1時(shí),順時(shí)針旋轉(zhuǎn),。為每一級(jí)的校正因子,,也就是每一級(jí)旋轉(zhuǎn)時(shí)向量模長(zhǎng)發(fā)生的變化,對(duì)于字長(zhǎng)一定的運(yùn)算,,總的校正因子是一個(gè)常數(shù),。若總的旋轉(zhuǎn)級(jí)數(shù)為N,則總校正因子用K表示為:
以16位為例,,K=0.607252935,。
可以先將輸入數(shù)據(jù)校正后再進(jìn)行運(yùn)算,這樣每一級(jí)的運(yùn)算可以簡(jiǎn)化成:
由上式可以看出所有運(yùn)算簡(jiǎn)化成了加減法和移位操作,。當(dāng)給定的初始輸入數(shù)據(jù)為x0=K,,y0=0時(shí),z0=θ,,經(jīng)過n次迭代結(jié)果為:
3 CORDIC算法及其改進(jìn)FPGA" title="FPGA">FPGA實(shí)現(xiàn)
考慮到迭代序列所能覆蓋的角度范圍:,,若直接采用n(n→∞)級(jí)迭代序列:0,1,2,,…,,n-1,則能覆蓋到的角度范圍是-99.9°~+99.9°,,不能達(dá)到NCO角度覆蓋范圍-π~π的要求,。 因此,需要在初次迭代前增加一個(gè)特定的“起始”步驟來擴(kuò)大角度覆蓋范圍,,即根據(jù)輸入相位的正負(fù)將向量先順時(shí)針或逆時(shí)針旋轉(zhuǎn)90°,,從而達(dá)到覆蓋要求。這個(gè)步驟的數(shù)學(xué)表達(dá)式如下:
其中δ=sign(z0),。
采用CORDIC算法取代查找表能夠節(jié)省大量的RAM資源,,但是同時(shí)卻帶來了更多的LE消耗,這就需要在設(shè)計(jì)中考慮如何減少LE的消耗,。
對(duì)于小角度的正弦和余弦值,,有:
而在CORDIC算法有限精度的迭代運(yùn)算中,到一定級(jí)數(shù)的坐標(biāo)旋轉(zhuǎn)角度也是接近于0的小角度值,。利用這個(gè)特性,,可以對(duì)CORDIC算法進(jìn)行改進(jìn)。下面以16位輸出寬度的CORDIC算法為例介紹本文對(duì)CORDIC算法的改進(jìn),。
注意到迭代9次以后,,余下的角度為:θ=0.003906,
其中,,z8為迭代9次后所余下的角度,。可以將前9次迭代采用常規(guī)的CORDIC算法,,對(duì)于后面幾級(jí),,直接采用初始角度旋轉(zhuǎn)變化計(jì)算公式:
已知z8<2-8,對(duì)于16位輸出精度來說,,cosz8=1,,sinz8=z8,則上式可以寫成:
由此可知,,對(duì)于16位輸出寬度的CORDIC運(yùn)算,,這里只需要9級(jí)迭代加1級(jí)初始的角度旋轉(zhuǎn)運(yùn)算。這種結(jié)構(gòu)可以有效地提高CORDIC運(yùn)算的效率,,大量節(jié)約實(shí)現(xiàn)所需的資源,。
圖3是用FPGA實(shí)現(xiàn)CORDIC算法的一個(gè)流水線結(jié)構(gòu)單元,由9個(gè)這樣的單元構(gòu)成前面9級(jí)的迭代流水線,,如圖4所示,。
對(duì)于(10)式中的乘法,,可以通過并行加法來計(jì)算,這樣就將多級(jí)級(jí)聯(lián)加法運(yùn)算變?yōu)榱艘患?jí)合成進(jìn)位存儲(chǔ)加法器,。合成進(jìn)位存儲(chǔ)加法器的表達(dá)式是:
當(dāng)δ8=1時(shí),,αi為z8的第i位;δ8=-1時(shí),,αi為z8二進(jìn)制反碼的第i位。結(jié)構(gòu)如圖5,。
加上預(yù)迭代,,采用傳統(tǒng)CORDIC算法實(shí)現(xiàn)16位輸出寬度CORDIC算法需要17級(jí)流水線。而采用改進(jìn)后的CORDIC算法只需要9級(jí)流水線加1級(jí)進(jìn)位存儲(chǔ)加法器,,改進(jìn)后的CORDIC算法總體結(jié)構(gòu)如圖6所示,。這種流水線結(jié)構(gòu)正常工作時(shí),在初始延遲之后,,每次新的循環(huán)完成就會(huì)生成一個(gè)新的輸出值,,即只需一個(gè)時(shí)鐘周期就可輸出一個(gè)數(shù)據(jù)。
如需提高精度, 可以在增加輸出位寬的同時(shí)相應(yīng)地增加流水線級(jí)數(shù)即可,。
4 仿真結(jié)果
圖7是在Quartus Ⅱ" title="Quartus Ⅱ">Quartus Ⅱ4.1中進(jìn)行仿真后的結(jié)果,,輸入輸出數(shù)據(jù)用16位補(bǔ)碼表示,首位為符號(hào)位,,第2,、3位為整數(shù)位,后13位為小數(shù)位,。表1列出了幾個(gè)典型相位的正弦仿真輸出值與理論值對(duì)比,。從表1中的仿真結(jié)果可以看出,采用改進(jìn)型的CORDIC流水線結(jié)構(gòu)實(shí)現(xiàn)的本地?cái)?shù)控震蕩器計(jì)算精度已趨近理論值,。表2是傳統(tǒng)CORDIC算法和改進(jìn)型CORDIC算法消耗硬件資源的比較,。可以看出,,采用改進(jìn)型CORDIC算法比傳統(tǒng)算法節(jié)約了約33.6%的資源,。
本文提出了基于改進(jìn)型CORDIC算法的NCO設(shè)計(jì)及硬件實(shí)現(xiàn),其簡(jiǎn)單的流水線結(jié)構(gòu)使得FPGA的資源耗費(fèi)大為減少,,能充分利用CORDIC算法的靈活性,,具有較好的實(shí)用價(jià)值。
參考文獻(xiàn)
[1] Hu Y H.CORDIC-based VLSI architecture for digital signal processing[C].IEEE SP Mag,,1992,,(7):17-35.
[2] Uwe Meyer Baese著,劉凌,,胡永生,,譯.Digital signal processing with field programmable gate arrays[M].北京:清華大學(xué)出版社,2003.