項目當中須要正弦信號與餘弦信號,首先想到了DDS芯片,例如AD983三、AD9834。因爲還須要用FPGA 作一些數據處理,後來乾脆直接用FPGA 內部的DDSIP核,同時根據IP核內部的相位累加端口,設置觸發信號,使得觸發信號更加準時,而且經過PSD 算法計算有效值,相位差更小,精度更高。
首先了解DDS的原理:
一、 DDS技術是根據奈奎斯特取樣定律,從連續信號的相位出發,將正弦信號取樣,編碼,量化,造成一個正弦函數表,存在EPROM中,合成時,經過改變相位累加器的頻率字來改變相位增量,也就是咱們所稱的步長。相位增量的不一樣致使一個週期內取樣點的不一樣,在時鐘頻率即採樣頻率不變的狀況下,經過相位的改變來改變頻率。
二、 DDS 以數控振盪器的方式,產生頻率、相位可控制的正弦,電路包括了基準時鐘源、相位累加器、相位調製器、正弦ROM 查找表、D/A 轉換 器和低通濾波器等。 頻率控制字N 和相位控制字M 分別控制DDS 所輸出的正弦波的頻率和相 位。DDS 系統的核心是相位累加器,它由一個N 位累加器與N 位相位寄存器構成。時鐘脈衝每觸發一次, 累加器便將頻率控制數據與相位寄存器輸出的累加相位數據相加, 而後把相加後的結果送至相位寄存器的數據輸入端。 相位寄存器將累加器在上一個時鐘做用後所產生的新相位數據反饋到累加器的輸入端, 以使加法器在下一個時鐘的做用下繼續與頻率控制數據相加。 這樣, 相位累加器在參考時鐘的做用下將進行線性相位累加, 當相位累加器累加滿時, 就會產生一次溢出, 以完成一個週期性的動做, 這個週期就是DDS 合成信號的一個頻率週期, 相位累加器的溢出頻率就是DDS 輸出的信號頻率。 相位寄存器的輸出與相位控制字相加, 結果做爲正弦查找表的地址。 查找表由ROM 構成, 其內部存有一個完整週期正弦波的數字幅度信息, 每一個查找表的地址對應正弦波中的一個相位點。 查找表把輸入地址信息映射成正弦波幅度信號, 同時輸出到D/A 轉換器的輸入端, 經過D/A 可將數字量形式的波形幅值轉換成所要求的合成頻率模擬量形式信號。 低通濾波器用於衰減和濾除不須要的取樣份量, 以便輸出頻譜純淨的正弦波信號。算法
ISE DDS IP核設置以下圖,輸出正弦信號爲12位,爲了實現頻率的高分辨率,須要將相位增長足夠的小,所以相位寬度爲33位。函數
有DDS IP核datasheet當中,能夠 看到分辨率計算公式、相位增量公式以下:編碼
當輸出38Khz正弦信號,頻率分辨爲0.01Hz,獲得相位增量位寬爲33位(50M/0.01=5000000000~~~~~~~BIT=33)
相位增量爲38k*8589934592/50M=6528350。
wire [31:0] phase_out;
wire [32:0] poff_in;
assign poff_in = 33'd0;
wire [32:0] data_in; //DDS相位增量
assign data_in = 33'd6528350;
dds dds_inst_M0 (
.clk(clk), // input clk
.pinc_in(data_in), // input [32 : 0] pinc_in
.poff_in(poff_in), // input [32 : 0] poff_in
.cosine(cosine), // output [11 : 0] cosine
.sine(sine), // output [11 : 0] sine
.phase_out(phase_out) // output [32 : 0] phase_out
);
使用ModelSim仿真以下圖3d