DDS函数信号发生器的设计_dds函数信号发生器

2020-02-28 其他范文 下载本文

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,坚持不懈,不管它有多难。

《DDS函数信号发生器的设计.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
DDS函数信号发生器的设计
点击下载文档
相关专题 dds函数信号发生器 设计 函数 信号发生器 dds函数信号发生器 设计 函数 信号发生器
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文