1 DDS的基本原理
DDS的主要思想是從相位的概念出發(fā)合成所需的波形,其結(jié)構(gòu)由相位累加器,相位—幅值轉(zhuǎn)換器, D/A轉(zhuǎn)換器和低通濾波器組成,是Tierney, Rader和Gold于1971年提出。它的基本原理框圖如圖1所示。

圖1 DDS的原理框圖
圖1中, fc 為時(shí)鐘頻率, K為頻率控制字, N 為相位累加器的字長(zhǎng), m 為ROM地址線位數(shù), n為ROM的數(shù)據(jù)線寬度(一般也為D/A轉(zhuǎn)換器的位數(shù)) , fo 為輸出頻率, 輸出頻率fo 由fC 和K共同決定: fo = fC×K/2N 。又因?yàn)镈DS遵循奈奎斯特(Nyquist)取樣定律:即的輸出頻率是時(shí)鐘頻率的一半,即fo = fC/2。實(shí)際中DDS的輸出頻率由允許輸出的雜散水平?jīng)Q定,一般取值為fo ≤40% fC。
對(duì)DDS進(jìn)行優(yōu)化設(shè)計(jì),目的是在保持DDS原有優(yōu)點(diǎn)的基礎(chǔ)上,盡量減少硬件復(fù)雜性,降低芯片面積和功耗,提高芯片速度等。
2 優(yōu)化構(gòu)想
為了減小DDS的設(shè)計(jì)成本, 對(duì)其結(jié)構(gòu)進(jìn)行優(yōu)化,優(yōu)化后DDS的核心結(jié)構(gòu)框圖如下所示。

圖2 優(yōu)化后的DDS核心框圖
其中的地址轉(zhuǎn)換器是根據(jù)adri[14]的數(shù)值判斷數(shù)值是增長(zhǎng)(0~π/2)或減少(π/2~π) ,數(shù)據(jù)轉(zhuǎn)換器是根據(jù)adri[15]的數(shù)值判斷生成波形的前半個(gè)周期(0~π)或者后半個(gè)周期(π~2π) 。
2. 1 流水線結(jié)構(gòu)
將32位累加器分成4條流水線,每條流水線完成8位的加法運(yùn)算,流水線的進(jìn)位進(jìn)行級(jí)聯(lián), 運(yùn)用流水線結(jié)構(gòu)可以提高累加器的運(yùn)算速度3倍多。為了提高運(yùn)算速度,加法器采用的是目前速度快的預(yù)先進(jìn)位算法;為了避免因預(yù)先進(jìn)位傳輸鏈過(guò)長(zhǎng)而影響速度,每8位加法器由兩個(gè)4位加法器實(shí)現(xiàn)。如圖3所示:

圖3 流水線加法器框圖
采用流水線結(jié)構(gòu)可以提高器件的運(yùn)算速度。但是缺點(diǎn)是數(shù)據(jù)需要保持4個(gè)時(shí)鐘周期,降低了系統(tǒng)跳頻的跳變頻率。
2. 2 加法器位的修正
提取相位累加器的高16位輸出作為ROM的查找地址,輸出截位減少了ROM的容量,損失的低16位對(duì)生成波精度造成的誤差可以忽略不計(jì);但因此產(chǎn)生的截位誤差卻會(huì)對(duì)頻譜純度和輸出帶寬產(chǎn)生影響。實(shí)驗(yàn)表明當(dāng)頻率控制字K和截位誤差2(32-16) 在為互質(zhì)數(shù)的情況下可以將影響減到小。解決的辦法是在相位累加器的位加入c0,相位累加器的字長(zhǎng)變?yōu)?2 +1位,截位誤差為2(32-16)+1 ,即頻率控制字(奇數(shù))和截位誤差(偶數(shù))之間互質(zhì)。這樣帶來(lái)地址上1/2LSB的誤差影響,但是在實(shí)際應(yīng)用中可以忽略。
2. 3 ROM的壓縮:三角近似法
三角近似法是利用三角恒等式近似的方法對(duì)ROM容量進(jìn)行壓縮:因?yàn)閟in(A+B+C) = sin(A+B)cosC + cosAcosBsinC + sinAsinBsinC,當(dāng)A 遠(yuǎn)大于B 和C時(shí),則利用三角近似cosB≈1, sinC≈0 ,上式可以簡(jiǎn)化為: sin(A+B+C) = sin(A+B) + cosAsinC 。這樣可以將ROM轉(zhuǎn)化為兩個(gè)較小的ROM,分別存儲(chǔ)sin (A+B)和cosAsinC的值,這兩個(gè)ROM的總?cè)萘繛?A(2B+2C) 。從頻譜和ROM容量?jī)煞矫孢M(jìn)行考慮,對(duì)于14位地址的分割是: A=5,B=4,C=5。
對(duì)ROM表的壓縮,是利用相位累加器的次高位來(lái)判斷象限,將正弦合成波合成到0~π范圍;位作為符號(hào)位, 將正弦波合成到0~2π范圍。對(duì)于余弦波,符號(hào)位是由位與次高位異或得到,因?yàn)橛嘞也ㄐ伪日也ㄐ翁崆?pi;/2相位。但是因?yàn)檎液瘮?shù)和余弦函數(shù)關(guān)于π/4對(duì)稱(chēng),因此可以只存儲(chǔ)(0~π/4)的正弦和余弦函數(shù)值,這樣存儲(chǔ)器大小將減小一半。相位累加器的次次高位可以在0~π/4和π/4~π/2之間選擇。實(shí)際電路實(shí)現(xiàn)時(shí),次次高位是與次高位異或產(chǎn)生這個(gè)信號(hào)。另外,為了完成正交輸出,還要增加兩個(gè)2:1多路選擇器電路。
3 DDS的Verilog HDL實(shí)現(xiàn)
Verilog HDL語(yǔ)言專(zhuān)門(mén)面向硬件與系統(tǒng)設(shè)計(jì),可以在芯片算法、功能模塊、結(jié)構(gòu)層次、測(cè)試向量等方面進(jìn)行描述,是當(dāng)前ASIC設(shè)計(jì)的主要語(yǔ)言之一。
3. 1 四位超前進(jìn)位加法器的主要源程序:
g[i] = a[i]&b[i]; p[i] = a[i] | b[i];
always@ ( a or b or gnd or g or p )
begin
carrychain[0] = g[0] | p[0]&cin;
sum[0] = p[0] ^cin;
for (j= 4'1;j<4;j=j+4'b1)
begin
carrychain[j] = g[j] | p[j]&carrychain[j-1];
sum[j] = p[j] ^carrychain[j-1];
end
cout = carrychain[3];
end
3. 2 流水線加法器陣列及位修正的實(shí)現(xiàn)
claadd8s U_add1 (pipe1, SYNCFREQ[7:0], gnd,add1,c1);
claadd8s U_add2 (pipe2, SYNCFREQ[15:8],pipec1,add2,c2);
claadd8s U_add3 (pipe3, SYNCFREQ[23:16],pipec2,add3,c3);
claadd8s U_add4 (pipe4, SYNCFREQ[31:24],pipec3,add4,c4);
在此調(diào)用了8 位超前進(jìn)位加法器,用VerilogHDL 的結(jié)構(gòu)描述方法實(shí)現(xiàn),對(duì)應(yīng)于用電路圖輸入邏輯。四個(gè)加法器在不同的時(shí)鐘控制下工作,實(shí)現(xiàn)流水線結(jié)構(gòu); pipe1、pipe2、pipe3、pipe4分別為各自加法器的和; SYNCFREQ 是32 位頻率控制字, gnd、pipec1、pipec2、pipec3是加法器的輸入進(jìn)位位, c1、c2、c3、c4是加法器的輸出進(jìn)位位。
3. 3 波形折疊和抬高算法
3.3.1 波形折疊(地址轉(zhuǎn)換器)
always@ (adri)
if (adri[14] )
adro = 14'h1ff^adri[13:0];
else
adro = adri;
end
endmodule
3.3.2 抬高算法(數(shù)據(jù)轉(zhuǎn)換器)
always@ ( data or adri[15] ) begin
if (!adri[15] ) sindata = 9'h1ff^data;
else sindata= data - 9'h001;
end
result = {!adri[15] , sindata};
end
根據(jù)adri[14]的數(shù)值判斷地址碼是否需對(duì)π/2進(jìn)行折疊。用^(按位異或) 實(shí)現(xiàn)對(duì)地址碼對(duì)π/2 的折疊:用全1減去adri的數(shù)值,因?yàn)楸粶p數(shù)是確定的而且是全1,所以用異或?qū)崿F(xiàn)減法,比用減法器節(jié)省門(mén)數(shù)。
根據(jù)adri[15]的數(shù)值判斷波形的正負(fù):若是正,則用全1和從ROM中取出的值相加,相當(dāng)于原數(shù)據(jù)減1后再在位拼接1,以1LSB 的偏移量為代價(jià),省略減法器;若是負(fù),則用按位異或?qū)崿F(xiàn)減法,得到經(jīng)過(guò)抬高處理的數(shù)據(jù)。抬高處理是為了使DAC的輸入全為正數(shù)。
3. 4 壓縮sin值ROM查值表
rom1 U_rom1 (QWAVESIN , MODPHASE , SYSCLK , RESETN) ;
rom2 U_rom2 (product , QWAVESIN2 , QWAVESIN1 , SYSCLK , RESETN) ;
其中rom1 是sin(A+B) 值的存儲(chǔ)表rom2 是cosAsinC值的存儲(chǔ)表。QWAVESIN是rom1表的輸出,MODEPHASE是從累加器輸出的量化正弦值。p roduct是rom2 的輸出, QWAVESIN2 , QWAVESIN1 分別是cosA和sinC 的值。再由9 位加法器將rom1 和rom2的輸出相加,就可得到正弦查值表的完整輸出。在MAX + PLUSII下的正弦查值表的輸出如下圖所示。

圖4 DDS在k = 02時(shí)的仿真時(shí)序圖
實(shí)驗(yàn)表明,所設(shè)計(jì)的DDS在滿足性能的條件下,提高了芯片工作速度,節(jié)約了芯片面積,改善了頻譜性能。
4 結(jié)束語(yǔ)
本文給出了利用Altera 公司的FLEX10K設(shè)計(jì)DDS的方法,并得到了一些改進(jìn):使用流水線算法和輸入寄存器可以在不過(guò)多增加門(mén)數(shù)的條件下,大幅度提高芯片的工作速度;修正加法器位帶來(lái)3dB左右的頻譜性能提高,提高了輸出波形的頻譜純度;壓縮ROM的容量,可以使芯片在滿足性能的基礎(chǔ)上節(jié)約了芯片資源。