黃 瑋,崔喬冬,王堂勝,周彭宇,謝 帥,杜濱媛
(江蘇信息職業(yè)技術(shù)學(xué)院,江蘇 無(wú)錫 214000)
DDS即直接數(shù)字頻率合成技術(shù),由美國(guó)學(xué)者J.Tiercy,M.Rader和B.Gold于1971年首次提出[1]。其結(jié)構(gòu)主要包括相位累加器、只讀存儲(chǔ)器、數(shù)模轉(zhuǎn)換器和低通濾波器等。相對(duì)于第一代直接模擬頻率合成技術(shù)和第二代間接頻率合成技術(shù)來(lái)說(shuō),DDS技術(shù)具有頻率分辨率高、低功耗、速度快等優(yōu)點(diǎn)。
DDS的設(shè)計(jì)方法有多種[2]。傳統(tǒng)的查找表法結(jié)構(gòu)簡(jiǎn)單,易實(shí)現(xiàn),但精度較低,需要較大的ROM容量。多項(xiàng)式近似法對(duì)存儲(chǔ)容量的要求較低,精度較高,但電路結(jié)構(gòu)復(fù)雜,工作速度較慢。CORDIC算法采用簡(jiǎn)單的移位操作替代了原來(lái)復(fù)雜的計(jì)算,提升了計(jì)算速度,并能在存儲(chǔ)容量要求不高的情況下獲得較高精度。
DDS可以裝載并寄存用戶存入的頻率控制碼,根據(jù)控制碼進(jìn)行相位累加,根據(jù)相位大小得到不同的電壓幅度,實(shí)現(xiàn)相位-幅度轉(zhuǎn)換。此時(shí)得到的一般是數(shù)字化的正弦波,還需要通過(guò)數(shù)模轉(zhuǎn)換器和低通濾波器得到可應(yīng)用的模擬信號(hào),即用戶所需的頻率。
一個(gè)典型的DDS系統(tǒng)結(jié)構(gòu)(如圖1所示)通常包括四個(gè)部分[3],分別為相位累加器(PA)、相幅轉(zhuǎn)換器(ROM)、數(shù)模轉(zhuǎn)換器(DAC)和低通濾波器(LPF)。其中,相幅轉(zhuǎn)換器是系統(tǒng)中最核心的部分,可以將相位轉(zhuǎn)換為幅度,對(duì)整個(gè)DDS的影響最大,是本次設(shè)計(jì)的重點(diǎn)。
實(shí)現(xiàn)相幅轉(zhuǎn)換器的方法有很多,包括查找表法、泰勒級(jí)數(shù)近似法等[4],但其對(duì)存儲(chǔ)容量、計(jì)算精度等方面的需求無(wú)法滿足。CORDIC(Coordinate Rotation Digital Computer)算法采用坐標(biāo)旋轉(zhuǎn),可以計(jì)算三角函數(shù)、雙曲函數(shù)等基本功能函數(shù)。其通過(guò)加法運(yùn)算、數(shù)據(jù)移位和迭代等基本操作實(shí)現(xiàn)函數(shù)計(jì)算。由于不需要乘法、除法等相對(duì)復(fù)雜的運(yùn)算,因此不需要太多的存儲(chǔ)空間,且相應(yīng)的電路結(jié)構(gòu)不復(fù)雜,完全適用于DDS系統(tǒng)設(shè)計(jì)。

圖1 DDS結(jié)構(gòu)原理
CORDIC算法有兩種運(yùn)算模式[5],即旋轉(zhuǎn)模式和向量模式。本文中采用旋轉(zhuǎn)模式,設(shè)定基數(shù),再通過(guò)一系列運(yùn)算,實(shí)現(xiàn)角度的不斷調(diào)整,進(jìn)而不斷逼近設(shè)定的旋轉(zhuǎn)角度。
傳統(tǒng)的CORDIC算法實(shí)現(xiàn)主要有循環(huán)迭代結(jié)構(gòu)和流水線迭代結(jié)構(gòu)兩種。循環(huán)迭代結(jié)構(gòu)借助二選一的數(shù)據(jù)選擇器,不斷將計(jì)算結(jié)果輸入迭代結(jié)構(gòu),通過(guò)多次循環(huán)獲得所需值,所需存儲(chǔ)容量小,但每次只能進(jìn)行一個(gè)運(yùn)算,工作速度慢。而流水線結(jié)構(gòu)可以使電路在時(shí)鐘周期內(nèi)執(zhí)行運(yùn)算,運(yùn)算量大,大大提升了工作效率。
為了達(dá)到簡(jiǎn)化電路結(jié)構(gòu)、節(jié)省存儲(chǔ)空間的目的,在傳統(tǒng)CORDIC算法的基礎(chǔ)上進(jìn)行了改進(jìn),采用三角函數(shù)近似變換,使傳統(tǒng)CORDIC算法計(jì)算每次迭代的存儲(chǔ)角度時(shí)更為簡(jiǎn)單。混合CORDIC算法結(jié)構(gòu)圖如圖2所示。

圖2 混合CORDIC算法
CORDIC算法中總的輸入旋轉(zhuǎn)角度θ可以由一系列二進(jìn)制數(shù)近似線性表示:

其中,?i∈{-1,1},當(dāng)?i為1時(shí),角度沿逆時(shí)針?lè)较蛐D(zhuǎn);當(dāng)?i為-1時(shí),角度沿順時(shí)針?lè)较蛐D(zhuǎn),δ為角度近似誤差,滿足δ<2-i,且2-i應(yīng)盡可能小,以最大程度減小近似誤差。計(jì)算過(guò)程中,每次迭代存儲(chǔ)時(shí)的輸入角度為arctan2-k-1arctan2-k-1(其中k=0,1,2…)。當(dāng)k足夠小時(shí),arctan2-k-1≈2-k-1,如此一來(lái),為了獲得所需要的精度,CORDIC算法中最后一次旋轉(zhuǎn)的角度需要小于2-i。
迭代計(jì)算過(guò)程中,不需要每次重新輸入。利用正余弦函數(shù)的對(duì)稱(chēng)性,通過(guò)折疊象限,系統(tǒng)只需改變輸入角度區(qū)間內(nèi)的初始相位,便能得到整個(gè)2π象限的正余弦函數(shù)值,從而可以確定區(qū)間的輸入。各區(qū)間所對(duì)應(yīng)的輸入值如表1所示。
為了實(shí)現(xiàn)16位的系統(tǒng)精度,至少需要16位的字長(zhǎng),對(duì)于[0,π/4]內(nèi)任意輸入的16位精度的任意角θ,可用二進(jìn)制表示法表示:

其中,bi為符號(hào)位,bi∈{0,1},進(jìn)一步化簡(jiǎn)為:


表1 各區(qū)間所對(duì)應(yīng)的輸入值
其中,rk-1=2bi-1∈{-1,1}。由于精度要求16位,因此可將式(3)中的1/217項(xiàng)忽略,則為:

式(4)中,如果θ2所對(duì)應(yīng)部分的迭代次數(shù)超過(guò)5時(shí),可以用2-k代替arctan(2-k),采用加法運(yùn)算和移位等方式,從而輕松成多次迭代運(yùn)算,節(jié)省了系統(tǒng)的存儲(chǔ)資源。此外,θ1可改寫(xiě)為:


考慮到誤差需要進(jìn)行變換,將θ1改寫(xiě)為:

計(jì)算后發(fā)現(xiàn),5次迭代后的誤差較小,不影響運(yùn)算精度,如式(8)所示:

因此,可以直接轉(zhuǎn)換為二進(jìn)制系數(shù)表示之前的旋轉(zhuǎn)方向,但ε'表示的近似誤差不能忽略。一般可將誤差合成,形成新的θ2':

依據(jù)上述步驟進(jìn)行反復(fù)推導(dǎo),最終確定θ2部分的旋轉(zhuǎn)方向。但是,這種做法中的近似誤差需要進(jìn)行額外計(jì)算,電路復(fù)雜度較高。若根據(jù)前次迭代的旋轉(zhuǎn)方向,預(yù)測(cè)每次迭代后的結(jié)果,雖然可以預(yù)測(cè)所有迭代的旋轉(zhuǎn)方向,但是存在誤差,仍需設(shè)置專(zhuān)門(mén)的電路模塊,比如進(jìn)位保留加法器或超前進(jìn)位加法器,增加了系統(tǒng)電路的復(fù)雜度。
為此,本文進(jìn)行了以下改進(jìn),不再專(zhuān)門(mén)計(jì)算誤差,而是將前面迭代后的剩余角度都存入ROM,作為第5次迭代的角度輸入,與2-i(i≥6)進(jìn)行比較,如此就無(wú)需計(jì)算近似誤差值ε'。改進(jìn)后的結(jié)構(gòu)示意圖如圖3所示。
改進(jìn)算法根據(jù)輸入角度確定后續(xù)四次的迭代方向和相應(yīng)的剩余角度,并由2-k直接代替arctan(2-k)確定剩余迭代的旋轉(zhuǎn)方向,從而完成所有迭代運(yùn)算。

圖3 改進(jìn)后的CORDIC算法
相幅轉(zhuǎn)換器是DDS結(jié)構(gòu)的核心部分,本設(shè)計(jì)采用了CORDIC算法實(shí)現(xiàn)相幅轉(zhuǎn)換器,并且改進(jìn)了傳統(tǒng)的CORDIC算法,減少了部分角度存儲(chǔ),改善了傳統(tǒng)方法的局限性。