一、DDS工作原理 以正弦信號為例,DDS大概就是將M個點的一個周期的正弦序列存入ROM中,序列數據的地址就是正弦信號的相位; 通過修改頻率控制字(Fword)來改變每隔多少個地址取ROM里的數據進行輸出。頻率控制字越大,從ROM取出的數據點就越少,點數越少,輸出一個周期信號的時間就越短,從而改變了 ...
一、DDS工作原理
- 以正弦信號為例,DDS大概就是將M個點的一個周期的正弦序列存入ROM中,序列數據的地址就是正弦信號的相位;
- 通過修改頻率控制字(Fword)來改變每隔多少個地址取ROM里的數據進行輸出。頻率控制字越大,從ROM取出的數據點就越少,點數越少,輸出一個周期信號的時間就越短,從而改變了輸出信號的頻率;
- 通過修改相位控制字(Pword)來改變讀取ROM里的數據的初地址(就是給ROM地址增加偏移量),從而改變輸出信號的初相。
DDS的基本結構圖如下圖所示:
輸出信號的頻率的公式為:
其中\(F_{CLK}\)為模塊的時鐘頻率,\(F_{Word}\)為頻率控制字,N為頻率控制字的位寬。
二、模塊代碼
關於ROM的配置可以點擊此處。
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: GDUT
// Engineer: Lclone
//
// Create Date: 2023/01/30 19:11:43
// Design Name: DDS_Base
// Module Name: DDS_Base
// Project Name: DDS_Base
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module DDS_Base(
input Clk,
input Rst_n,
input [31:0] Fword,
input [11:0] Pword,
output [ 7:0] Signal_data
);
reg [31:0] Fword_r;
always @(posedge Clk or negedge Rst_n) begin
if(Rst_n == 0)
Fword_r <= 0;
else
Fword_r <= Fword_r + Fword;
end
reg [11:0] ROM_addr;
always @(posedge Clk or negedge Rst_n) begin
if(Rst_n == 0)
ROM_addr <= 0;
else
ROM_addr <= Fword_r[31:20] + Pword + 1'b1;
end
ROM_Sinwave ROM_Sinwave_inst(
.clka (Clk),
.addra (ROM_addr),
.douta (Signal_data)
);
endmodule
三、模擬
1、模擬代碼
在分析頻率的時候例化一個該模塊分析就行,在分析相位時候例化兩個模塊進行對比即可
下麵給出分析相位時候的模擬文件:
`timescale 1ns / 1ps
module DDS_Base_tb();
reg clk_50m;
initial clk_50m <= 0;
always #10 clk_50m <= ~clk_50m;
reg rst_n;
initial begin
rst_n <= 0;
#200
rst_n <= 1;
end
reg [31:0] FwordA;
reg [11:0] PwordA;
wire[ 7:0] Signal_dataA;
reg [31:0] FwordB;
reg [11:0] PwordB;
wire[ 7:0] Signal_dataB;
initial begin
FwordA <= 0;
PwordA <= 0;
FwordB <= 0;
PwordB <= 0;
#300
FwordA <= 1024*1024*2; //情況1
PwordA <= 0;
FwordB <= 1024*1024*2;
PwordB <= 4096/4 - 1; //相移90°
#163840
FwordA <= 1024*1024*4; //情況2
PwordA <= 0;
FwordB <= 1024*1024*4;
PwordB <= 4096/2 - 1; //相移180°
#163840
FwordA <= 1024*1024*0.5;//情況3
PwordA <= 0;
FwordB <= 1024*1024*0.5;
PwordB <= 4096/2 - 1; //相移180°
#163840
#100
$stop;
end
DDS_Base DDS_Base_A(
.Clk (clk_50m),
.Rst_n (rst_n),
.Fword (FwordA),
.Pword (PwordA),
.Signal_data (Signal_dataA)
);
DDS_Base DDS_Base_B(
.Clk (clk_50m),
.Rst_n (rst_n),
.Fword (FwordB),
.Pword (PwordB),
.Signal_data (Signal_dataB)
);
endmodule
3、模擬分析
頻率分析
整體波形如下圖所示:
情況1:
此時頻率控制字設置為102410242,根據公式算得頻率為24,414Hz,周期為40.96us,與模擬結果41us相近。
情況2:
此時頻率控制字設置為102410244,根據公式算得頻率為48,828.125Hz,周期為20.48us,與模擬20.4889us結果相近。
情況3:
此時頻率控制字設置為102410240.5,根據公式算得頻率為6,103.51Hz,周期為163.84us,與模擬163.8405us結果相近。
相位分析
結論:模擬通過,該DDS模塊能夠調節輸出信號的頻率和初相。
四、參考資料
[1]【零基礎輕鬆學習FPGA】小梅哥Xilinx FPGA基礎入門到項目應用培訓教程