目錄
DDS實現(xiàn)原理
DDS整體設(shè)計框圖?
Quartus II 仿真?
modelsim仿真
頂層代碼
DDS實現(xiàn)原理
DDS(Direct Digital ?Frequency Synthesizer)直接數(shù)字頻率合成器,也可叫DDFS。?
- DDS是從相位的概念直接合成所需波形的一種頻率合成技術(shù)。?
- 不僅可以產(chǎn)生不同頻率的正弦波,而且可以控制波形的初始相位。?
-
主要構(gòu)成:?
內(nèi)部:相位累加器,正弦查找表?
外圍:DAC,LPF(低通濾波器)
工作過程
1、將存于ROM中的數(shù)字波形,經(jīng)DAC,形成模擬量波形。?
2、改變尋址的步長來改變輸出信號的頻率。?步長即為對數(shù)字波形查表的相位增量。由累加器對相位增量進(jìn)行累加,累加器的值作為查表地址。?
3、DAC輸出的階梯形波形,經(jīng)低通濾波,成為模擬波形。
-
DDS整體設(shè)計框圖Quartus II 仿真
modelsim仿真圖
文章來源:http://www.zghlxwxcb.cn/news/detail-762165.html
頂層代碼
(代碼較長,完整工程免費獲取請關(guān)注公眾號:FPGA設(shè)計苑)文章來源地址http://www.zghlxwxcb.cn/news/detail-762165.html
module DDS(
clk, //時鐘輸入
dds_data_out, //DDS數(shù)據(jù)輸出
set_waveform, //設(shè)置輸出的波形
set_f, //設(shè)置頻率
set_a, //設(shè)置幅值
set_p //設(shè)置頻率
);
input clk;
input [1:0] set_waveform;
input [20:0] set_f;
input [4:0] set_a;
input [8:0] set_p;
output [9:0] dds_data_out;
wire clk;
wire [1:0] set_waveform;
wire [20:0] set_f;
wire [4:0] set_a;
wire [9:0] set_p;
wire [9:0] dds_data_out;
/**************連接線***************/
wire [31:0] f32_bus;//AC頻率控制字輸入
wire [31:0] reg32_out;//32位寄存器輸出
wire [31:0] reg32_in;//32位寄存器輸入
wire [8:0] reg10_in;
wire [8:0] reg10_out_address;
/**************緩存寄存器******************/
wire [9:0] sin_data;
wire [9:0] tri_data;
wire [9:0] squ_data;
//wire [9:0] saw_data;
reg [9:0] dds_data_reg;
reg [20:0] set_f_reg;
/***********************************/
assign f32_bus[31:21]=11'b000_0000_0000;//初始化,高位置低
assign f32_bus[20:0]=set_f_reg; //低位可以設(shè)置DDS的輸出頻率
/*********************元件例化************************************/
adder_32 u1(.data1(f32_bus),.data2(reg32_out),.sum(reg32_in));
reg32 u2(.clk(clk),.data_in(reg32_in),.data_out(reg32_out));
adder_10 u7(.data1(set_p),.data2(reg32_out[31:23]),.sum(reg10_in));
reg_10 u8(.clk(clk),.data_in(reg10_in),.data_out(reg10_out_address));
/*****************波形選擇*******************************************/
sin_rom u3(.address(reg10_out_address),.clock(clk),.q(sin_data));//正弦
tri_rom u4(.address(reg10_out_address),.clock(clk),.q(tri_data));
squ_rom u5(.address(reg10_out_address),.clock(clk),.q(squ_data));
// saw_rom u6(.address(reg10_out_address),.clock(clk),.q(saw_data));
/***********************設(shè)置波形和設(shè)置頻率***************************/
always @(set_waveform,sin_data,tri_data,squ_data)
begin
case (set_waveform)
2'b00://正弦波
begin
dds_data_reg<=sin_data;
set_f_reg<=set_f;//設(shè)置范圍為100Hz到20KHz
end
2'b01://三角波
begin
dds_data_reg<=tri_data;
set_f_reg<=set_f;//設(shè)置范圍為100Hz到20KHz
end
2'b10:
begin
dds_data_reg<=squ_data;//方波
set_f_reg<=set_f;//設(shè)置范圍為100Hz到20KHz
end
default:
begin
dds_data_reg<=sin_data;//正弦波
set_f_reg<=set_f;//設(shè)置范圍為100Hz到20KHz
end
endcase;
end
/***********************設(shè)置電壓幅值***************************/
assign dds_data_out=dds_data_reg*set_a/10;//設(shè)置電壓幅值
endmodule
到了這里,關(guān)于基于FPGA的信號發(fā)生器(三角波、方波、正弦波)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!