摘??? 要:本文介紹了一種利用矢量旋轉(zhuǎn)CORDIC(COordination Rotation DIgital Computer)算法實現(xiàn)正交數(shù)字混頻器中的數(shù)控振蕩器(NCO)的方法。首先推導(dǎo)了CORDIC算法產(chǎn)生正/余弦信號的實現(xiàn)過程,然后給出了在FPGA中設(shè)計數(shù)控振蕩器的頂層電路結(jié)構(gòu),并根據(jù)算法特點在設(shè)計中引入流水線結(jié)構(gòu)設(shè)計。
關(guān)鍵詞:軟件無線紓皇卣竦雌鰨?SPAN lang=EN-US>CORDIC算法;FPGA
?
引言
數(shù)控振蕩器是正交數(shù)字混頻器的部分,具有頻率分辨率高、頻率變化速度快、相位可連續(xù)線性變化和生成的正/余弦信號正交特性好等特點。而且NCO的相位、幅度均已數(shù)字化,可以直接進行高的數(shù)字調(diào)制/解調(diào)。隨著數(shù)字通信技術(shù)的發(fā)展,傳送的數(shù)據(jù)速率越來越高。如何得到一個可數(shù)控的高頻載波信號是實現(xiàn)高速數(shù)字通信系統(tǒng)必須解決的問題。本文將介紹如何在FPGA中實現(xiàn)高速正交數(shù)字混頻器中的數(shù)控振蕩器設(shè)計。
數(shù)控振蕩器的實現(xiàn)原理
數(shù)控振蕩器的作用是產(chǎn)生正交的正弦和余弦樣本, 傳統(tǒng)做法是采用查表法(LUT),即事先根據(jù)各個正/余弦波相位計算好相位的正/余弦值,并按相位角度作為地址在存儲器中對其進行尋址,構(gòu)成一個幅度/相位轉(zhuǎn)換電路(即波形存儲器),通過該轉(zhuǎn)換電路進行查表獲得正/余弦信號樣本。為了提高數(shù)控振蕩器的頻率分辨率,往往需要擴大波形存儲器的容量,造成存儲資源的大量消耗。而且,如果需要外掛RAM來存儲波形,由于受到RAM讀取速度的影響,數(shù)控振蕩器的輸出速率必然受到制約。因此,當設(shè)計高速、高的數(shù)控振蕩器時,查表法就不適合采用。
為了避免使用大容量存儲器,可以考慮利用算法來產(chǎn)生正/余弦樣本?;谑噶啃D(zhuǎn)的CORDIC算法正好滿足了這一需求, 該算法有線性的收斂域和序列的特性,只要迭代次數(shù)足夠,即可保證結(jié)果有足夠的。統(tǒng)一的CORDIC形式的基本原理是,初始向量V1(x1,y1)旋轉(zhuǎn)角度?后得到向量V2(x2,y2):
?
x2=x1·cos?-y1·sin?,
y2=y1·cos?+x1·sin??????????? (1)
即:
x2=(x1-y1·tan?)·cos??
y2=(y1+x1·tan?)·cos?????????(2)
若每次旋轉(zhuǎn)角度?的正切值為2的整數(shù)次冪,即:?i=arctan(2-i),則,假設(shè)以?i代表矢量的旋轉(zhuǎn)方向,+1表示逆時針旋轉(zhuǎn),-1表示順時針旋轉(zhuǎn),故第i步旋轉(zhuǎn)可用以下兩式表示:
,
(3)
其中為模校正因子。對于字長一定的運算,該因子是一個常數(shù),用K表示,以16bit字長為例,則
??梢姡\算不能使幅值比例因子恒為1。為了抵消迭代對比例因子的影響,可將每級迭代的輸入數(shù)據(jù)X、Y校正后再參與運算,以避免在迭代運算中增加校正運算,降低CORDIC算法的速度。由此運算迭代式可以簡化成:
,
????????????????? (4)
可見,以上兩式運算僅通過加法器及移位器就可以實現(xiàn)。另外,若用zi表示第i次旋轉(zhuǎn)時與目標角度之差,則:
?????????? (5)
經(jīng)過n次旋轉(zhuǎn)后,(4)式經(jīng)n次迭代可以得到以下結(jié)果:
?????? (6)
本文介紹的數(shù)控振蕩器的設(shè)計就是在(6)式的基礎(chǔ)上,給定,,則迭代結(jié)果為:
,,。(7)
所以,將所需產(chǎn)生的角度值作為z0輸入,通過(4)、(5)兩式的迭代運算,迭代結(jié)果輸出的xn和yn就是所需要的三角函數(shù)值。
?
數(shù)控振蕩器的FPGA實現(xiàn)
數(shù)控振蕩器的頂層電路結(jié)構(gòu)。可以看到,頻率控制字寄存器將接收到的的頻率控制字送入相位累加器,相位累加器對系統(tǒng)時鐘進行計數(shù),每到達輸入頻率控制字的值即對相位進行累加,隨后將累加值送入相位相加器,與相位控制字寄存器接收到的初始相位相加,得到當前的相位值。其中,相位累加器是決定NCO性能的一個關(guān)鍵模塊,可以利用FPGA器件的進位鏈實現(xiàn)快速、高效的電路結(jié)構(gòu)。然而, 由于進位鏈必須位于臨近的邏輯陣列塊CLB和邏輯單元LC內(nèi),所以長的進位鏈會減少其它邏輯使用的布線資源;同時,過長的進位鏈也會制約整個系統(tǒng)速度的提高。因此,設(shè)計中采用進位鏈和流水線技術(shù)相結(jié)合的辦法。采用以上做法實現(xiàn)的相位累加器既能保證具有較高的資源利用率, 又能大幅提高系統(tǒng)的性能和速度。
經(jīng)過上述相位處理之后,即可獲得具有所設(shè)定初始相位的正/余弦相位序列,將此序列送入基于CORDIC算法的波形發(fā)生器,終獲得兩路正交的正/余弦輸出序列。
CORDIC迭代算法的一種直接的實現(xiàn)方法是:只設(shè)計CORDIC運算迭代單元,然后在系統(tǒng)時鐘的驅(qū)動下,將本級的輸出作為本級的輸入,通過同迭代完成運算。這種方法雖然很直觀, 但是為了將計算結(jié)果提供給下運算,會占用大量的寄存器資源,帶來許多額外的資源消耗。而且其的缺點是運算速度較慢(需要n-1個時鐘周期才能輸出一個數(shù)據(jù)),不利于數(shù)據(jù)的高速實時處理。
因此在實際設(shè)計中,采用的是由16級CORDIC運算單元組成的流水線結(jié)構(gòu),正常工作時只需一個時鐘周期就能輸出一個數(shù)據(jù),為數(shù)據(jù)實現(xiàn)高速實時處理提供了保障。每實現(xiàn)的功能是根據(jù)(4)式進行迭代,移位的位數(shù)等于當前的迭代級數(shù),加減法選擇由該級中Z的位(符號位)決定,得到下的X、Y 和Z的值。經(jīng)過16級流水線運算后,Z的值變?yōu)?,X和Y的值則為初始值z0的余弦和正弦值。每電路結(jié)構(gòu)主要包括兩個移位器和三個加(減)法器,級與級之間直接相連,不需要額外的寄存器。?i的值為arctan(2-i),可將該小數(shù)轉(zhuǎn)換為二進制數(shù)后,保存于存儲單元中,為每流水線提供查找表。對于16級的流水線結(jié)構(gòu),i的范圍是0~15。
設(shè)計中還應(yīng)該注意迭代序列所能覆蓋的角度范圍,若直接采用n級迭代序列:0,1,2,L,n-1,則迭代所能覆蓋的角度范圍僅有-99.9麀+99.9?。迸f杓仆ü黽擁問蠢┐蠼嵌雀哺欠段В叢黽恿礁鰅=0的迭代,將迭代序列擴展為0,0,0,1,2,L, n-1,從而使角度覆蓋范圍也擴大到。
?
數(shù)控振蕩器的
仿真結(jié)果及性能分析
本設(shè)計利用Altera公司的Quartus II軟件,采用VHDL對上述數(shù)控振蕩器結(jié)構(gòu)進行描述,在Modlesim上通過功能仿真,結(jié)果正確后綜合出電路網(wǎng)表,將程序至Stratix器件EP1S20B780C6中實現(xiàn)。
由于設(shè)計中采用了Stratix器件,該器件的32位加減器工作頻率可以達到90MHz以上,從而為產(chǎn)生高速的正交信號提供高速可靠的工作時鐘??紤]到NCO的工作時鐘瓶頸是在相位累加器,因此可以根據(jù)具體需要縮減相位累加器的位數(shù)來提高NCO的工作時鐘頻率。本文設(shè)計的NCO工作時鐘為100MHz,相位累加器的位數(shù)為16位,輸入的頻率控制字為4CCCH,根據(jù)公式: ,,其中為輸入的頻率控制字,fclk為工作時鐘, N為相位累加器位數(shù),可算出NCO輸出的正/余弦信號的頻率fout=30MHz,頻率分辨率1.5kHz。頻率分辨率說明:通過輸入頻率控制字來改變輸出正/余弦信號的頻率時,可以達到1.5kHz的步進。另外,也可以根據(jù)實際需要的頻率改變輸入頻率控制字值。當然,NCO輸出頻率的上限要受到Nyquist定律的限制,即fout的值為fclk/2,實際設(shè)計一般不大于0.4fclk。
?
結(jié)語
本文研究了正交數(shù)字混頻器中數(shù)控振蕩器的設(shè)計與實現(xiàn)方法,著重分析了如何在FPGA器件中利用CORDIC迭代算法產(chǎn)生正/余弦信號。可以看到,該數(shù)控振蕩器不但省去了傳統(tǒng)NCO龐大的存儲器資源,僅用移位寄存器和加法器就可產(chǎn)生正/余弦信號,結(jié)構(gòu)簡單,非常適用于在正交數(shù)字混頻器中進行高速高的數(shù)字調(diào)制/解調(diào)。
?
(張進 蘇凱雄)
參考文獻:
[1]. n-1 datasheet http://m.58mhw.cn/datasheet/n-1_1997158.html.
關(guān)鍵詞:基于FPGA的正交數(shù)字混頻器中數(shù)控振蕩器的設(shè)計與實現(xiàn)