一、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基礎入門到專案應用培訓教程
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/542693.html
標籤:其他
