歡迎您光臨本站 登入註冊首頁

FPGA實現DDS的設計

admin @ 2014-03-26 , reply:0

概述

   隨著科技的發展,對信號發生器各方面的要求越來越高。傳統的信號發生器由於波形精度低、頻率穩定性差等缺點,已經不能滿足許多實際應用的需要,所以必須研究新的信號發生器以滿……

    隨著科技的發展,對信號發生器各方面的要求越來越高。傳統的信號發生器由於波形精度低、頻率穩定性差等缺點,已經不能滿足許多實際應用的需要,所以必須研究新的信號發生器以滿足實際應用的要求。近年來,直接數字頻率合成器(DDS)由於其具有頻率解析度高、頻率變換速度快、相位可連續變化等特點,在數字通信系統中已被廣泛採用。隨著微電子技術的發展,現場可編程門陣列( FPGA)器件得到了飛速發展。由於該器件具有速度快、集成度高和現場可編程的優點,因而在數字處理中得到廣泛應用,越來越得到硬體電路設計工程師的青睞。

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

    圖1中, fc 為時鐘頻率, K為頻率控制字, N 為相位累加器的字長, m 為ROM地址線位數, n為ROM的數據線寬度(一般也為D/A轉換器的位數) , fo 為輸出頻率, 輸出頻率fo 由fC 和K共同決定: fo = fC×K/2N 。又因為DDS遵循奈奎斯特(Nyquist)取樣定律:即最高的輸出頻率是時鐘頻率的一半,即fo = fC/2。實際中DDS的最高輸出頻率由允許輸出的雜散水平決定,一般取值為fo ≤40% fC。
    對DDS進行優化設計,目的是在保持DDS原有優點的基礎上,盡量減少硬體複雜性,降低晶元面積和功耗,提高晶元速度等。

2 優化構想
    為了減小DDS的設計成本, 對其結構進行優化,優化后DDS的核心結構框圖如下所示。
 
圖2 優化后的DDS核心框圖
    其中的地址轉換器是根據adri[14]的數值判斷數值是增長(0~π/2)或減少(π/2~π) ,數據轉換器是根據adri[15]的數值判斷生成波形的前半個周期(0~π)或者後半個周期(π~2π) 。

2. 1 流水線結構
    將32位累加器分成4條流水線,每條流水線完成8位的加法運算,流水線的進位進行級聯, 運用流水線結構可以提高累加器的運算速度3倍多。為了提高運算速度,加法器採用的是目前速度最快的預先進位演算法;為了避免因預先進位傳輸鏈過長而影響速度,每8位加法器由兩個4位加法器實現。如圖3所示:
 
圖3 流水線加法器框圖

    採用流水線結構可以提高器件的運算速度。但是缺點是數據需要保持4個時鐘周期,降低了系統跳頻的跳變頻率。
2. 2 加法器最低位的修正
    提取相位累加器的高16位輸出作為ROM的查找地址,輸出截位減少了ROM的容量,損失的低16位對生成波精度造成的誤差可以忽略不計;但因此產生的截位誤差卻會對頻譜純度和輸出帶寬產生影響。實驗表明當頻率控制字K和截位誤差2(32-16) 在為互質數的情況下可以將影響減到最小。解決的辦法是在相位累加器的最低位加入c0,相位累加器的字長變為32 +1位,截位誤差為2(32-16)+1 ,即頻率控制字(奇數)和截位誤差(偶數)之間互質。這樣帶來地址上1/2LSB的誤差影響,但是在實際應用中可以忽略。

2. 3 ROM的壓縮:三角近似法
    三角近似法是利用三角恆等式近似的方法對ROM容量進行壓縮:因為sin(A+B+C) = sin(A+B)cosC + cosAcosBsinC + sinAsinBsinC,當A 遠大於B 和C時,則利用三角近似cosB≈1, sinC≈0 ,上式可以簡化為: sin(A+B+C) = sin(A+B) + cosAsinC 。這樣可以將ROM轉化為兩個較小的ROM,分別存儲sin (A+B)和cosAsinC的值,這兩個ROM的總容量為2A(2B+2C) 。從頻譜和ROM容量兩方面進行考慮,對於14位地址的最佳分割是: A=5,B=4,C=5。
    對ROM表的壓縮,是利用相位累加器的次高位來判斷象限,將正弦合成波合成到0~π範圍;最高位作為符號位, 將正弦波合成到0~2π範圍。對於餘弦波,符號位是由最高位與次高位異或得到,因為餘弦波形比正弦波形提前π/2相位。但是因為正弦函數和餘弦函數關於π/4對稱,因此可以只存儲(0~π/4)的正弦和餘弦函數值,這樣存儲器大小將減小一半。相位累加器的次次高位可以在0~π/4和π/4~π/2之間選擇。實際電路實現時,次次高位是與次高位異或產生這個信號。另外,為了完成正交輸出,還要增加兩個2:1多路選擇器電路。

3 DDS的Verilog HDL實現
    Verilog HDL語言專門面向硬體與系統設計,可以在晶元演算法、功能模塊、結構層次、測試向量等方面進行描述,是當前ASIC設計的主要語言之一。
3. 1 四位超前進位加法器的主要源程序:
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 流水線加法器陣列及最低位修正的實現
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);
    在此調用了8 位超前進位加法器,用VerilogHDL 的結構描述方法實現,對應於用電路圖輸入邏輯。四個加法器在不同的時鐘控制下工作,實現流水線結構; pipe1、pipe2、pipe3、pipe4分別為各自加法器的和; SYNCFREQ 是32 位頻率控制字, gnd、pipec1、pipec2、pipec3是加法器的輸入進位位, c1、c2、c3、c4是加法器的輸出進位位。
3. 3 波形摺疊和抬高演算法
3.3.1 波形摺疊(地址轉換器)
always@ (adri)
if (adri[14] )
 adro = 14'h1ff^adri[13:0];
else
 adro = adri;
end
endmodule
3.3.2 抬高演算法(數據轉換器)
always@ ( data or adri[15] )   begin
 if (!adri[15] ) sindata = 9'h1ff^data;
 else  sindata= data - 9'h001;
end
result = {!adri[15] , sindata};
end
    根據adri[14]的數值判斷地址碼是否需對π/2進行摺疊。用^(按位異或) 實現對地址碼對π/2 的摺疊:用全1減去adri的數值,因為被減數是確定的而且是全1,所以用異或實現減法,比用減法器節省門數。
    根據adri[15]的數值判斷波形的正負:若是正,則用全1和從ROM中取出的值相加,相當於原數據減1后再在最高位拼接1,以1LSB 的偏移量為代價,省略減法器;若是負,則用按位異或實現減法,得到經過抬高處理的數據。抬高處理是為了使DAC的輸入全為正數。
3. 4 壓縮sin值ROM查值表
rom1 U_rom1 (QWAVESIN , MODPHASE , SYSCLK , RESETN) ;
rom2 U_rom2 (product , QWAVESIN2 , QWAVESIN1 , SYSCLK , RESETN) ;
    其中rom1 是sin(A+B) 值的存儲表rom2 是cosAsinC值的存儲表。QWAVESIN是rom1表的輸出,MODEPHASE是從累加器輸出的量化正弦值。p roduct是rom2 的輸出, QWAVESIN2 , QWAVESIN1 分別是cosA和sinC 的值。再由9 位加法器將rom1 和rom2的輸出相加,就可得到正弦查值表的完整輸出。在MAX + PLUSII下的正弦查值表的輸出如下圖所示。
 
圖4 DDS在k = 02時的模擬時序圖
    實驗表明,所設計的DDS在滿足性能的條件下,提高了晶元工作速度,節約了晶元面積,改善了頻譜性能。

4 結束語
    本文給出了利用Altera 公司的FLEX10K設計DDS的方法,並得到了一些改進:使用流水線演算法和輸入寄存器可以在不過多增加門數的條件下,大幅度提高晶元的工作速度;修正加法器最低位帶來3dB左右的頻譜性能提高,提高了輸出波形的頻譜純度;壓縮ROM的容量,可以使晶元在滿足性能的基礎上節約了晶元資源。


[admin via 研發互助社區 ] FPGA實現DDS的設計已經有3051次圍觀

http://cocdig.com/docs/show-post-43097.html