黃 俊
(合肥工業(yè)大學(xué) 儀器與光電工程學(xué)院,安徽 合肥 230009)
有很多應(yīng)用程序需要數(shù)字波形信號(hào)發(fā)生器,特別是在高精度測(cè)量領(lǐng)域,穩(wěn)定的正余弦波的發(fā)生是一個(gè)研究熱點(diǎn)。一個(gè)測(cè)量系統(tǒng)允許基于單一硬件平臺(tái)執(zhí)行許多函數(shù),因此信號(hào)處理的高度可重構(gòu)是必須的。CORDIC算法,也被稱為Volder算法,首次應(yīng)用在袖珍計(jì)算器上,目前也較為廣泛地用于設(shè)計(jì)協(xié)處理器、建立離散傅里葉和余弦變換等數(shù)學(xué)處理上[1-4]。
CORDIC算法有兩種操作,即向量和旋轉(zhuǎn)模式。在向量模式中,坐標(biāo)(x0,y0)旋轉(zhuǎn)直到y(tǒng)0收斂到零;在旋轉(zhuǎn)模式中,初始矢量(x0,y0)開始與x軸對(duì)齊,每一個(gè)周期旋轉(zhuǎn)角度θi,所以n次迭代后獲得角θn。旋轉(zhuǎn)模式被用來(lái)近似正弦和余弦函數(shù),其主要思想是采取一個(gè)一元向量連續(xù)旋轉(zhuǎn),直至達(dá)到所需的角度。這個(gè)旋轉(zhuǎn)向量是一元的,所以當(dāng)經(jīng)過(guò)n次迭代之后將分別得到sinθn和cosθn,如果初始向量接近一固定值K,可以簡(jiǎn)化這個(gè)過(guò)程。將初始向量定義為v0=(x0,y0),經(jīng)過(guò)n次迭代后,向量(xn,yn)為:
在每個(gè)迭代中,向量執(zhí)行一個(gè)微旋轉(zhuǎn)θi,并得到新向量:
提取cosθi+1,式(3)和式(4)可重新表述為:
為了能夠在硬件上方便實(shí)現(xiàn),作如下約定:tanθi+1的值為±2-i(其中i為整數(shù))。所以基于此可將乘法運(yùn)算轉(zhuǎn)換成算術(shù)右移,且有cosθi+1=cos(arctan2-i),定義如下變量:
根據(jù)余弦函數(shù)的性質(zhì),cosα=cos(-α)。所以式(5)、式(6)可以被轉(zhuǎn)化成:
如果執(zhí)行n次迭代,那么K的定義為每一個(gè)Ki連乘,即:
從式(9)和式(10)中可以看出,Ki可以被作為初始向量,v0=(|K|,0)。微旋轉(zhuǎn)與K補(bǔ)償如圖1所示,最后的n旋轉(zhuǎn),向量的長(zhǎng)度為1,由于正余弦幅度值也為1,因此迭代之后可以將其看做是由正余弦部分組成。
圖1 微旋轉(zhuǎn)與K補(bǔ)償
作為向量初始化常數(shù)K,向量組件對(duì)于每次迭代都可簡(jiǎn)化為:
在每次迭代中需要決定di=1或di=-1。為了作出判斷,考慮理想的角度和當(dāng)前角度差異,所以定義一個(gè)新變量:
為了判斷di的正負(fù),使用下面的規(guī)則:
旋轉(zhuǎn)角度之和為:可以預(yù)先計(jì)算arctan2-i來(lái)避免在FPGA中實(shí)現(xiàn)反正切函數(shù)。當(dāng)i=0時(shí),20=1,角度旋轉(zhuǎn)的收斂范圍在[-π/2,π/2],初始值坐標(biāo)為(1,0)。設(shè)置初始z值為所需要值,經(jīng)過(guò)n級(jí)迭代后使得zn→0時(shí),可以得到,從而實(shí)現(xiàn)正弦和余弦。
CORDIC的實(shí)現(xiàn)過(guò)程不需要從內(nèi)存中調(diào)用正弦或者余弦值,而是通過(guò)一步步迭代來(lái)接近它的結(jié)果。在本文中,一個(gè)發(fā)生器需要連續(xù)計(jì)算正弦和余弦值,所設(shè)計(jì)的數(shù)字波發(fā)生器以CORDIC模塊為核心。圖2為CORDIC迭代,它主要由3個(gè)加法減法器和兩個(gè)算術(shù)移位器構(gòu)成,每個(gè)加法減法器關(guān)聯(lián)到一個(gè)變量向量的分量和累積的角,記做x,y,z。在CORDIC的迭代實(shí)現(xiàn)過(guò)程中,對(duì)于相應(yīng)的迭代,進(jìn)程控制模塊必須適應(yīng)移位過(guò)程的要求。第一次迭代只有一個(gè)移位的變化,而第二次將會(huì)有兩個(gè)或以上移位變化,圖2中的j表示移位次數(shù)。
CORDIC流水線操作的實(shí)現(xiàn)使用的是基本的CORDIC模塊描述。流水線階段開始之后,每個(gè)脈沖都會(huì)獲得一個(gè)對(duì)應(yīng)的輸出,每個(gè)流水線階段都會(huì)花費(fèi)一個(gè)完整的脈沖來(lái)完成,如圖3所示,在CORDIC流水線化整個(gè)過(guò)程中寄存器都將被使用到。
圖2 CORDIC迭代
圖3 CORDIC流水線
由于第一次迭代時(shí)旋轉(zhuǎn)了arctan(20)=45°,而旋轉(zhuǎn)角度總和在-π/2~π/2之間,這就使得當(dāng)所計(jì)算的角度絕對(duì)值大于π/2時(shí),需要增加旋轉(zhuǎn)。如要實(shí)現(xiàn)輸出相位范圍為-π~π,就需要對(duì)其采取相應(yīng)變換。
CORDIC是給定一個(gè)角度來(lái)計(jì)算正弦和余弦的模塊,因此有必要給它一個(gè)時(shí)序的CORDIC收斂的角度范圍。它不是一個(gè)簡(jiǎn)單的序列的角度,必須能夠由CORDIC改變頻率信號(hào)。鑒于CORDIC只有收斂于第一和第四象限,這就需要角度從0到π/2,然后從π/2到-π/2,最后從-π/2到0變化。為解決此問(wèn)題,需要構(gòu)建一個(gè)鋸齒波發(fā)生器,它從0開始,增加其輸出值直到2n,一旦達(dá)到2n的信號(hào),會(huì)從正最大值到最低負(fù)值,接著又會(huì)增加并且重復(fù)此循環(huán)。如圖4所示,鋸齒波需要變成一個(gè)三角波來(lái)適用于CORDIC模塊,三角波必須存在于第一和第四象限之中。鋸齒波的速度決定了正弦和余弦波的頻率,事實(shí)上,與三角波相比,正弦和余弦波將會(huì)有相同的頻率。
圖4 鋸齒波轉(zhuǎn)化為三角波
在CORDIC的流水線設(shè)計(jì)中所使用的模塊可在ALTERA系列中進(jìn)行硬件語(yǔ)言(VHDL)描述,并且在ModelSim軟件環(huán)境下進(jìn)行模擬??蛇x用CycloneⅣGX系列EP4CGX22CF19C8芯片在QUARTUSⅡ軟件中進(jìn)行合成和實(shí)現(xiàn)架構(gòu),并測(cè)試其速度和優(yōu)化面積。通過(guò)建立JTAG庫(kù)來(lái)執(zhí)行硬件聯(lián)合仿真和繪制正弦和余弦波圖形,合成后可以有效優(yōu)化速度,以滿足較高頻率的需要。
本文描述了一個(gè)基于CORDIC流水線架構(gòu)的正弦和余弦波發(fā)生器。傳統(tǒng)的生成數(shù)字正弦和余弦波的方法有多種,例如計(jì)算表法,但是這種方法需要過(guò)多的內(nèi)存。相比于計(jì)算表法等方法,CORDIC算法不需要乘法或劃分區(qū)塊,而只需要加法減法器和移位寄存器,顯示了較好的優(yōu)越性,提供了一個(gè)非常好的替代選擇,該算法能比較有效地應(yīng)用于對(duì)低頻率信號(hào)的處理上。
[1] 李滔,韓秋月.基于流水線CORDIC算法的三角函數(shù)器[J].電子技術(shù)應(yīng)用,1999(6):45-49.
[2] 胡國(guó)榮,孫允恭.CORDIC算法及其應(yīng)用[J].信號(hào)處理,1991,12(5):229-242.
[3] 鞠建波,別慶,杜愛國(guó).基于CORDIC算法的QDDS的實(shí)現(xiàn)及精度分析[J].電視技術(shù),2007,47(1):112-116.
[4] Javier Valls, Martin Kuhlmann, Keshab K Parhi.Evaluation of CORDIC algorithms for FPGA design[J].Journal of VLSI Signal Processing,2002,32(3):207-222.