目录

DDS实现原理

DDS整体设计框图​

Quartus II 仿真​

modelsim仿真

顶层代码

DDS实现原理

DDS(Direct Digital  Frequency Synthesizer)直接数字频率合成器,也可叫DDFS。 

DDS是从相位的概念直接合成所需波形的一种频率合成技术。 不仅可以产生不同频率的正弦波,而且可以控制波形的初始相位。  主要构成:  内部:相位累加器,正弦查找表  外围:DAC,LPF(低通滤波器) 工作过程 1、将存于ROM中的数字波形,经DAC,形成模拟量波形。  2、改变寻址的步长来改变输出信号的频率。 步长即为对数字波形查表的相位增量。由累加器对相位增量进行累加,累加器的值作为查表地址。  3、DAC输出的阶梯形波形,经低通滤波,成为模拟波形。

DDS整体设计框图Quartus II 仿真

modelsim仿真图

顶层代码

(代码较长,完整工程免费获取请关注公众号:FPGA设计苑)

module DDS(

clk, //时钟输入

dds_data_out, //DDS数据输出

set_waveform, //设置输出的波形

set_f, //设置频率

set_a, //设置幅值

set_p //设置频率

);

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; //低位可以设置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));

/***********************设置波形和设置频率***************************/

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;//设置范围为100Hz到20KHz

end

2'b01://三角波

begin

dds_data_reg<=tri_data;

set_f_reg<=set_f;//设置范围为100Hz到20KHz

end

2'b10:

begin

dds_data_reg<=squ_data;//方波

set_f_reg<=set_f;//设置范围为100Hz到20KHz

end

default:

begin

dds_data_reg<=sin_data;//正弦波

set_f_reg<=set_f;//设置范围为100Hz到20KHz

end

endcase;

end

/***********************设置电压幅值***************************/

assign dds_data_out=dds_data_reg*set_a/10;//设置电压幅值

endmodule

参考文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: