DDS廣泛應(yīng)用于雷達(dá)系統(tǒng)、數(shù)字通信、電子對(duì)抗、電子測(cè)量等民用軍用設(shè)備中。
它的優(yōu)點(diǎn):
?工作頻率范圍很寬
?極高的頻率分辨率
?極短的頻率轉(zhuǎn)換時(shí)間
?數(shù)字調(diào)制性能好
?頻率轉(zhuǎn)換連續(xù)
DDS基本原理
1.原理框圖
圖1. FPGA產(chǎn)生DDS框圖
上圖就是DDS的的FPGA實(shí)現(xiàn)框圖,完整的DDS還應(yīng)該在外面有DAC和低通濾波器的,然而很多時(shí)候我們是不需要這兩個(gè)的,因?yàn)樯蠄D的DDS輸出的信號(hào)就在數(shù)字域,凡是數(shù)學(xué)域的信號(hào)都可以用它參與處理了,所以正弦ROM查找表出來后的信號(hào)可以直接給到其他的邏輯使用。只有要在模擬域參與處理才會(huì)把DDS的數(shù)字信號(hào)用DAC和低通濾波變換成模擬信號(hào)。
2.DDS正弦波產(chǎn)生原理
正弦ROM查找表里面就是按地址存放的一個(gè)周期的正弦波,可以根據(jù)幅值精度要求分成256,1024,等點(diǎn)數(shù),點(diǎn)數(shù)越多,波形越精細(xì),越接近真實(shí)的模擬正弦波。但是由于FPGA資源有限,選擇一個(gè)能夠滿足要求的點(diǎn)數(shù)就足夠了。
相位調(diào)整器是控制輸出波形的初相位,也就是波形輸出起點(diǎn)從哪里開始。
相位累加器是控制ROM地址跳變的。相位累加器在每個(gè)時(shí)鐘脈沖輸入時(shí),把頻率控制字累加一次,相位累加器的輸出數(shù)據(jù)就是信號(hào)的相位,也就是ROM的地址。由于相位累加器字長(zhǎng)的限制,相位累加器累加到一定值后,其輸出將會(huì)溢出,這樣波形存儲(chǔ)器的地址就會(huì)循環(huán)一次,即意味著輸出波形循環(huán)一周。故改變頻率控制字即相位增量,就可以改變相位累加器的溢出時(shí)間,在時(shí)鐘頻率不變的條件下就可以改變輸出頻率。改變查表尋址的時(shí)鐘頻率,同樣也可以改變輸出波形的頻率。
也就是說通過相位調(diào)整器和相位累加器就可以控制你輸出波形的相位和頻率!
DDS實(shí)例說明
1. 16點(diǎn)DDS舉例
下圖是一個(gè)16點(diǎn)的DDS ROM存取示意圖,橫軸是二進(jìn)制的ROM地址,縱軸是每個(gè)地址對(duì)應(yīng)的幅值。
如果頻率控制字K=1,相位控制字是0,那么ROM輸出就是從0開始+1,一直到15再次歸0,如此循環(huán)。如果DDS工作時(shí)鐘是Fc,那么這種情況下,輸出正弦波頻率Fout就是Fc/(2^4)=Fc/16。如果K=2,輸出則是一半的時(shí)間就輸出完成整個(gè)周期所以是Fc/(2^4)*2=Fc/8。以此類推可以得到如下公式,N是ROM地址位寬,也就是頻率控制字的二進(jìn)制位寬:
圖2. DDS輸出 波形示意圖
頻率分辨率,也就是頻率控制字每變化1,頻率變化的大小,公式如下:
本質(zhì)上也就是K=1和0的時(shí)候的輸出頻率之差,這個(gè)計(jì)算起來是最簡(jiǎn)單的。
2. 提高頻率分辨率的方法
根據(jù)公式2我們可以得到:N越大,也就是頻率控制字位寬越大,那么分辨率越高,我們?cè)O(shè)置的任意頻率都可以做到更接近,頻譜上就越看不出差別。而且我們可以知道,這和輸出波形的位寬是無關(guān)的,輸出位寬只和幅值精度有關(guān)。也就是說,我們可以用一個(gè)ROM存1024個(gè)點(diǎn),每個(gè)點(diǎn)16bit精度,但是頻率控制字是32bit,累加結(jié)果只用最高10bit,這樣,就可以讓ROM存儲(chǔ)少,但是頻率分辨率確很高。這種方法在實(shí)際中也是很實(shí)用的方法。
這里我寫了一個(gè)高分辨率的DDS的例程,僅供參考,百度云鏈接如下:
源碼:
鏈接:https://pan.baidu.com/s/18TSmRoSLG678bNnYYfZl5A
提取碼:loie
tb:
鏈接:https://pan.baidu.com/s/1K8pvF8i9N6KL935KmXcbGA
提取碼:ahig
仿真結(jié)果說明
如下圖所示,rst為高電平時(shí)復(fù)位整個(gè)模塊,en為高電平整個(gè)模塊才會(huì)工作,dout_vld為高電平的時(shí)候輸出數(shù)據(jù)才是有效的點(diǎn)。所以輸出可以根據(jù)dout_vld為1的時(shí)候打印到文件里面,用matlab分析頻譜。由于輸出數(shù)字信號(hào)一定是離散的所以一定會(huì)有高頻分量,只是占比多少的問題,后面的模擬濾波器如果設(shè)置合理是可以把基頻分量取出來的,這樣就可以實(shí)現(xiàn)DA功能。DDS輸出頻率越高,三角函數(shù)畸變也就越嚴(yán)重,但是實(shí)際處理過程中往往不需要他的波形多么接近正弦波,只要頻譜的譜線足夠干凈就可以。詳見下一節(jié)MATLAB分析。
matlab結(jié)果說明
tb默認(rèn)設(shè)置DDS工作在100M時(shí)鐘下,產(chǎn)生4M正弦波,輸出2048點(diǎn)后用這些點(diǎn)去做FFT,結(jié)果如下圖所示,結(jié)果顯示正弦波頻率是4.035M,和理論預(yù)測(cè)相差35KHz,準(zhǔn)確度為0.875%。然而按照32bit的位寬精度應(yīng)該比這個(gè)精確的多的。那么為什么會(huì)有這種差距呢?原因是100M的采樣率,1024點(diǎn)FFT分辨率只有0.1M左右,遠(yuǎn)遠(yuǎn)大于DDS的輸出頻率分辨率,所以,即便DDS輸出頻率很準(zhǔn)確,F(xiàn)FT也不會(huì)認(rèn)為有那么準(zhǔn)確,必須要FFT分辨率大于DDS分辨率的時(shí)候才能準(zhǔn)確的計(jì)算出DDS的頻譜。
那么按照以上理論,只需要提高FFT點(diǎn)數(shù),DDS的結(jié)果應(yīng)該更接近理想結(jié)果,于是我們輸出131072點(diǎn)之后我們做FFT,結(jié)果如下:
頻譜顯示為4.001MHz,準(zhǔn)確度為0.025%,確實(shí)比2048點(diǎn)精準(zhǔn)了很多倍。然而這里的FFT分辨率其實(shí)還是不夠的,只不過輸出太多點(diǎn)數(shù)需要花時(shí)間,有興趣的讀者可以繼續(xù)增大點(diǎn)數(shù)看看分辨率究竟有多高,可能會(huì)讓你嚇一跳哦!
這里其實(shí)也體現(xiàn)了DDS的優(yōu)點(diǎn),輸出頻率精度非常高,而且相位穩(wěn)定可靠,消耗資源又少!
-
Verilog
+關(guān)注
關(guān)注
28文章
1351瀏覽量
110124 -
DDS
+關(guān)注
關(guān)注
21文章
634瀏覽量
152690 -
調(diào)整器
+關(guān)注
關(guān)注
3文章
76瀏覽量
19736
原文標(biāo)題:verilog輕松實(shí)現(xiàn)高分辨率DDS
文章出處:【微信號(hào):HaveFunFPGA,微信公眾號(hào):玩兒轉(zhuǎn)FPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論