基於FPGA的DDS設計(二)


  在DDS設計中,如果相位累加器每個時鍾周期累加1,就會輸出頻率為195.313KHz的波形。如果每個時鍾周期累加2,就會輸出頻率為2*195.313KHz的波形·······,如果每兩個時鍾周期累加1,就會輸出195.313/2KHz的波形······,如果按照這樣來設計話,不太方便並且輸出波形的頻率是不連續的,只能輸出一些特殊的頻率。

  首先我們可以一起考慮一個問題,如果我們想要得到一個累加數字0~9,但是想要每次累加的數字有可能是整數也有可能是小數,那么此時整個計算又不讓出現小數,應該怎么做呢?我們可以做一個三位數,然后把百位當作我們的輸出,然后每次累加的數字自己可以隨意調整,也就是相當於之前可以累加小數,小數最小精度為兩位小數。000+011=011,123+001=124。如果按照此中方式,讓數字一直不斷的累加,數字會從最小到最大,不斷循環。但是最高位依然是0~9的變化,只不過0~9變化的周期是受到每次累加的值的影響。如果每次累加001,那么百位0~9的循環就需要1000個累加(不要僅僅想0~900,要不斷循環),如果每次累加010,那么百位0~9的循環就需要100個累加。

  如果考慮明白上述的問題,那么在DDS中,我們做了一個相位累加器,但是累加器只是負責ROM地址的輸出也就是8位的。如果按照上述思想我們可以設計一個位寬為32位的計數器,把計數器的高八位當作ROM的地址。讓計數器每個時鍾周期累加1,地址從0增長到255,也就是8‘b00000000~8’b11111111,需要整個32位從全0到全1,一共需要2的32次冪個時鍾周期,而這個也就是輸出整個波形用的時間----波形周期。我們可以算出周期:2的32次冪*20ns,頻率為0.01164153218Hz(這個數字太長了,用f0代替)。每次加1,頻率為f0,如果每次加2,頻率為2倍的f0。那么我們可以任意整數倍的f0,如果f0足夠小(此時f0已經足夠小),我們認為可以得到任意頻率。如果f0的頻率不夠小,可以通過增加計數器的位寬來實現。

  建議讀者不要每次加1去仿真,仿真時間太長,並且有可能導致整個仿真器卡主。筆者在此仿真每次累加100K。

 1 module addr_ctrl (
 2 
 3     input    wire                clk_50m,
 4     input    wire                rst_n,
 5     
 6     output    wire    [7:0]        addr
 7 );
 8 
 9     reg                [31:0]        cnt;
10     
11     assign     addr = cnt[31:24];
12     
13     always @ (posedge clk_50m, negedge rst_n) begin
14         if (rst_n == 0)
15             cnt <= 0;
16         else
17             cnt <= cnt + 100_000;
18     end
19 
20 endmodule 

仿真結果如圖8。

圖8

  每次累加100K,仿真測試頻率為1.164KHz。每次累加1,得出的頻率為0.01164153218Hz。正好擴大了100K倍。現在我們只要知道做每次累加多少,就能夠通過算基礎這個頻率的多少倍就能算出來頻率,但是這么算是會有誤差,因為上述得到的頻率就是一個近似值。我們可以按照公式去計算頻率,假如每次增加N,那么輸出波形的周期應該是2的32次冪除以N乘以時鍾周期(20ns),用1s除以周期就可以得到頻率(如圖9)。

圖9

  通過上面的方法,我們可以輕易知道,累加N所對應的頻率。但是在實際應用中,往往是想要某一個頻率的波形,而不是有了波形算波形的頻率是多少。根據外部要求頻率,算出來每次累加N的具體數值,這就是頻率控制器。其實也是比較簡單的,我們把上述公式轉換以下就可以了(如圖10)。

圖10

  把圖10當中的公式在FPGA實現,輸入F得到N就是頻率控制器。在計算中會有可能存在一些誤差,因為有可能計算的數值為12345.24,但是在累加時,會按照12345來進行累加,.24會被忽略,往往會帶來一個誤差,但是此誤差一般都是可以接受的。

  好了DDS的設計到此結束了,但是如果想要真正輸出一個模擬的波形還要驅動一個DAC器件,來達到真正的模擬波形的輸出。

  筆者水平有限,如果設計中,有什么不妥的地方,懇請大佬們指出來。

  歡迎加好友探討QQ:746833924,QQ群:173560979。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM