DDS函数信号发生器的设计_dds函数信号发生器
DDS函数信号发生器的设计由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“dds函数信号发生器”。
DDS函数信号发生器的设计、仿真及下载
一、实验设计
① 利用DDS(Direct DIgital Frequency Synthesis,即直接数字频率合成)技术产生稳定的正弦波,三角波和方波输出,输出频率为10~1000kHz且频率可调,步进为10Hz,1kHz,10kHz,100kHz。
② 用VerilogHDL进行建模和模拟仿真,再利用FPGA进行实现D/A转换。
③ 下载到DE0板上利用VGA端口的一个四位孔进行A/D转换显示在示波器上。
二、实验原理
一个直接数字频率合成器由相位累加器、波形ROM、D/A转换器和低通滤波器构成。DDS的原理框图如下所示:
图 1 直接数字频率合成器原理图
其中K为频率控制字,fc为时钟频率,N为相位累加器的字长,D为ROM数据位及D/A转换器的字长。相位累加器在时钟 fc的控制下以步长K作为累加,输出N位二进制码作为波形ROM的地址,对波形ROM进行寻址,波形ROM输出的幅码S(n)经D/A转换器变成梯形波S(t),再经低通滤波器平滑后就可以得到合成的信号波形了。合成的信号波形形状取决于波形ROM中存放的幅码,因此用DDS可以产生任意波形。【来自百度】
本设计中直接利用DE0开发板通过D/A转换得到输出波形,省略了低通滤波器这一环节。
DDS工作流程示意图:
DDS的具体实现框图:
三、实验内容:
1、相位累加器和数据锁存器的设计
本设计采用模24的二进制累加器和寄存器,其中累加器和寄存器在一个模块中,只取锁存数据的高十位作为查表的地址值。//地址计数器模块;
module counter(clk,fre_word,addre);input clk;
//声明系统时钟为clk
input [23:0] fre_word;
//声明24为频率控制字
output reg [9:0] addre;
reg [23:0] phaseadder;always @(posedge clk)begin
phaseadder=phaseadder+fre_word;addre=phaseadder[23:14];//地址取输出锁存后十位(对应波形为一个周期取1024点)
end endmodule2、波形存储器设计
本设计要求DDS系统能输出方波、三角波及正弦波三种波形。可以调用FPGA的LPM_ROM模块制作三张ROM表,地址计数器可以同时访问这三张表,再使用数据选择器输出指定波形。实际上,方波,三角波的实现算法比较简单,所以只把正弦波的算法用ROM实现。//方波产生模块
module squwave(clk,addre,qsquare);
input clk;
//系统时钟;input [9:0] addre;
//10位地址输入信号;
output reg [7:0] qsquare;//输出方波幅度信号8位宽送至DAC
always @(posedge clk)
if(addre
//三角波产生模块
module triawave(clk,addre,qtriangle);input clk;
input [9:0] addre;output reg [7:0] qtriangle;always @(posedge clk)begin if(addre
//正弦波形文件制作(C语言)#include #include void main(){ int s;int i;FILE* fp;fp=fopen(“1024.mif”,“w+”);fprintf(fp,“--MAX+plusII-generated Memory Initialization Filen”);fprintf(fp,“--By 00022809nnnnn”);fprintf(fp,“WIDTH=8;nn”);fprintf(fp,“DEPTH=1024;nn”);fprintf(fp,“ADDRESS_RADIX=HEX;nn”);fprintf(fp,“DATA_RADIX=HEX;nn”);fprintf(fp,“CONTENT BEGINn”);for(i=0;i
s=128+sin(atan(1.0)*8/1024*i)*127;
fprintf(fp,“%xt:t%x;n”);} fprintf(fp,“END;n”);fclose(fp);} 生成mif格式文件,然后可以调用LPM_ROM模块实现正弦波产生模块。
3、波形的综合输出
DDS系统中产生了三种波形,但是在每种情况下只输出一种波形,因此要设计一个多路选择器完成这种功能。输出何种波形由外部开关控制。//boxing.v module boxing(clk,addre,wavemode,wavevalue);
input clk;
input [1:0] wavemode;
//波形模式信号
input [9:0] addre;
//十位地址输入信号
output [7:0] wavevalue;
//对应不同的波形输出
reg [7:0] wavevalue;wire [7:0] q,qsquare,qtriangle;sinwave a(addre,clk,q);
//调用正弦波产生模块
squwave b(clk,addre,qsquare);//调用方波产生模块
triawave c(clk,addre,qtriangle);//调用三角波产生模块 always @(posedge clk)case(wavemode)2'b01:wavevalue=q;//01代表正弦波
2'b10:wavevalue=qsquare;
//10代表方波
2'b11:wavevalue=qtriangle;
//11代表三角波
endcase endmodule
4、工作模式控制模块的设计
本设计包括了开关模块和工作状态转换模块。先将开关调好状态,每按一次键程序根据所选状态进行工作。(由于DE0板上时钟为50MHz则变化较快,所以增加一个控制键,工程模式状态由此键控制。)//控制模块
module control(clk1,keyin,wavemode,length,single_state,single_frc);
input [3:0] keyin;
//四位状态信号输入
input clk1;
//按键控制状态的输入
input [1:0]single_state;
//输入的波形模式信号
input [1:0]single_frc;
//频率及步进控制信号
output reg [1:0] wavemode;
//波形模式输出信号
output reg [23:0] length;
//输出波形控制字
reg [3:0] key;
always @(posedge clk1)
begin
key=keyin;case(key)4'b0001: begin wavemode=2'b01;length=24'd3;end
4'b0010: begin case(single_state)
2'b01:wavemode=2'b01;
2'b10:wavemode=2'b10;
2'b11:wavemode=2'b11;
default: begin wavemode=2'b01;end
endcase
end
4'b0100: begin case(single_frc)
1:length=24'd3;
//10~10kHz
2:length=24'd3355;//10kHz~100kHz
3:length=24'd33554;//100kHz~2000kHz
default: begin length=24'd671088;end //大于2000kHz
endcase
end
4'b1000: begin case(single_frc)
0:length=length+24'd33554;
//步进为100kHz
1:length=length+24'd3;
//
10Hz
2:length=length+24'd336;
//
1kHz
3:length=length+24'd3355;//
10kHz
endcase
end
endcase
end
endmodule5、DDS函数信号发生器顶层设计
顶层文件是将上述几个模块联系在一起就可以得到DDS核心实现模块。//顶层文件
module dds(clk,clk1,keyin,wavevalue,single_state,single_frc);input clk,clk1;
//系统时钟和控制按键
input [3:0] keyin;
//四位状态输入信号
input [1:0]single_frc;
//频率及步进输入模式信号
input [1:0]single_state;
//波形选择开关
output [7:0] wavevalue;
//输出波形信号
wire [9:0] addre;
wire [1:0] wavemode;wire [23:0] length;control u1(clk1,keyin,wavemode,length,single_state,single_frc);//调用其他三个模块
counter u2(clk,length,addre);boxing u3(clk,addre,wavemode,wavevalue);endmodule
五、实验操作
操作软件QuartusII9.1及Modelsim,这两种软件的用法在此不再细谈。下载后示波器显示如下:
六、实验总结:
做完这次实验,我感觉DDS对于我们这些初学者来说一时很难接受,但是我们需要通过自己以及他人的见解来不断消化知识,一点一点去理解。最后做出来波形的时候确实很高兴,这是对我们这几天的学习的肯定,以后还要不断的去学习去理解FPGA以及VerilogHDL,坚持不懈,不管它有多难。