基于DDS的基本信号发生器.docx
- 文档编号:2398696
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:10
- 大小:178.29KB
基于DDS的基本信号发生器.docx
《基于DDS的基本信号发生器.docx》由会员分享,可在线阅读,更多相关《基于DDS的基本信号发生器.docx(10页珍藏版)》请在冰豆网上搜索。
基于DDS的基本信号发生器
一、设计目标:
1、利用FPGA完成DDS波形产生的核心电路;
2、输出信号波形:
正弦、方波、三角波波;
3、输出波形的频率48828.15Hz~4882815Hz;
4、完成波形的仿真测试;
二、设计思路
采用直接数字合成器(DDS),可用硬件或软件实现。
即用累加器按频率要求对相应的相位增量进行累加,再以累加相位值作为地址码,取存放于ROM中的波形数据,经D/A转换,滤波即得到所需波形。
以EDA技术为基础,用FPGA实现DDS模型的设计。
电路的规模大小和总线宽度可以由设计者根据自己的需要而设定可将波形数据存入FPGA的ROM中。
同时外部控制逻辑单元也可在FPGA中实现。
方法简单,易于程控,便于集成。
用该方法设计产生的信号频率范围广,频率稳定度高,精度高,频率转换速度快。
在本设计中,用FPGA完成DDS核心电路模块设计,以quartusII软件为开发环境,使用VerilogHDL硬件描述语言完成硬件电路的设计,采用分块设计的思想,整个DDS模块框图如下:
图1系统框图
系统RTL电路图如下:
图2DDS模块RTL视图
各模块功能及设计思路:
1、控制模块
控制模块是从外部接收,实现DDS系统的控制功能,接收外部时钟信号、复位信号、10位频率控制字信号、10相位控制字信号,两位的波形选择字信号。
控制模块通过这些信号控制下层模块各种功能的实现。
顶层模块中以一个10位的累加器产生地址,实现对对底层模块正弦、方波、三角ROM模块的的访问。
2、正弦信号模块功能
该模块式调用FPGA内部的M4K存储器,以宏模块定制一个ROM存储块,存储正弦信号数据。
其中,通过MATLAB软件编程产生,产生的数据生成以个后缀为.Hex的文件,用来初始化ROM模块。
正弦信号模块接收来自控制模块的地址信号,访问内部的ROM模块,并将正弦信号波形数据输出到波形选择模块。
3、方波信号模块
该模块式调用FPGA内部的M4K存储器,以宏模块定制一个ROM存储块,存储方波信号数据。
其中,通过MATLAB软件编程产生,产生的数据生成以个后缀为.Hex的文件,用来初始化ROM模块。
方波信号模块接收来自控制模块的地址信号,访问内部的ROM模块,并将方波信号波形数据输出到波形选择模块。
4、三角波信号模块
该模块式调用FPGA内部的M4K存储器,以宏模块定制一个ROM存储块,存储三角信号数据。
其中,通过MATLAB软件编程产生,产生的数据生成以个后缀为.Hex的文件,用来初始化ROM模块。
三角信号模块接收来自控制模块的地址信号,访问内部的ROM模块,并将三角信号波形数据输出到波形选择模块。
5、波形选择模块
波形选择模块主要多路选择器构成,在接收到来自控制模块的复位信号,波形控制字和正弦、方波、三角模块传来的数据时,通过多路选择器的控制,输出我们想要的波形。
6、顶层模块
顶层模块将个顶层模块封装好,做成DDS的基本函数信号发生器。
三、源代码清单:
顶层模块
/****************************顶层模块********************************模块功能:
按设计要求输入10位频率控制字,10位的相位控制字,2位的波形控制字输出10位并行的波形幅度*********************************************/
moduleDDS(rst,clk,con_f,con_p,sec_w,out_addr,wave_data);
inputrst,//复位信号
clk,//时钟信号
con_f,//频率控制字输入端口
con_p,//相位控制字输入端口
sec_w;//波形选择输入端口
outputwave_data;//波形数据输出
outputout_addr;//测试管脚,观测地址变化
wire[9:
0]con_f;
wire[9:
0]con_p;
wire[1:
0]sec_w;
wire[9:
0]out_addr;
wire[9:
0]link_addr;
wire[9:
0]link_sin;
wire[9:
0]link_tri;
wire[9:
0]link_squ;
wire[9:
0]wave_data;
assignout_addr=link_addr;
controlU1(
.clk(clk),
.rst(rst),
.con_f(con_f),
.con_p(con_p),
.addr(link_addr)
);
sinU2(
.clk(clk),
.addr(link_addr),
.sin_data(link_sin)
);
triangularU3(
.clk(clk),
.addr(link_addr),
.tri_data(link_tri)
);
squareU4(
.clk(clk),
.addr(link_addr),
.squ_data(link_squ)
);
sec_waveU5(
.clk(clk),
.sec_w(sec_w),
.wsin(link_sin),
.wtri(link_tri),
.wsqu(link_squ),
.wave_data(wave_data)
);
Endmodule
控制模块
/************************control.vstart***********************************按设计要求,输入10位的频率控制字,10位的相位控制字,并输出10位二进制的信号幅值数据以累加器产生产生ROM访问地址,频率控制字、相位控制字和累加器输出数据之和形成最终10位地址数据,用来访问ROM*************************/
modulecontrol(clk,rst,con_f,con_p,addr);
inputclk;
inputrst;//复位信号
inputcon_f;//频率控制字输入端口
inputcon_p;//相位控制字输入端口
outputaddr;//ROM访问地址输出端口
wire[9:
0]con_f;
wire[9:
0]con_p;
reg[9:
0]addr;
reg[9:
0]frebuf;//频率控制字数据缓存
reg[9:
0]phebuf;//相位控制字数据缓存
reg[9:
0]count;//累加器数据存储
always@(posedgeclk)//将频率控制字,相位控制字存进缓存器中
begin
if(rst)
begin
frebuf<=0;
phebuf<=0;
end
else
begin
frebuf<=con_f;
phebuf<=con_p;
end
end
//------通过累加器产生ROM访问地址,并实现频率,相位的控制----------------
always@(posedgeclk)
begin
if(rst)
begin
count<=0;
addr<=0;
end
else
begin
count<=count+frebuf;
addr<=count+phebuf;
end
end
endmodule
正弦波形数据模块:
modulesin(
clk,
addr,
sin_data
);
inputwireclk;
inputwire[9:
0]addr;
outputwire[9:
0]sin_data;
sin_datab2v_inst(
.clock(clk),
.address(addr),
.q(sin_data));
endmodule
方波波形数据模块:
modulesquare(
clk,
addr,
squ_data
);
inputwireclk;
inputwire[9:
0]addr;
outputwire[9:
0]squ_data;
squ_datab2v_inst(
.clock(clk),
.address(addr),
.q(squ_data));
Endmodule
三角波波形数据模块:
moduletriangular(
clk,
addr,
tri_data
);
inputwireclk;
inputwire[9:
0]addr;
outputwire[9:
0]tri_data;
tri_datab2v_inst(
.clock(clk),
.address(addr),
.q(tri_data));
endmodule
波形选择模块:
/**************波形选择模块******************************************按照波形控制字,对波形输出进行选择,输出正弦波,方波和三角***************/
modulesec_wave(clk,rst,sec_w,wsin,wtri,wsqu,wave_data);
inputclk,//时钟信号
rst,//复位信号
sec_w,//波形选择输入端口
wsin,//正弦波幅度数据
wtri,//三角波幅度数据
wsqu;//方波波幅度数据
outputwave_data;//波形幅值数据输出端口
wire[1:
0]sec_w;
wire[9:
0]wsin;
wire[9:
0]wtri;
wire[9:
0]wsqu;
wire[9:
0]wave_data;
reg[9:
0]secbuf;//波形数据缓存
assignwave_data=secbuf;//将波形数据送到输出端口
//---------------通过三选一多选择路器实现波形的选择------------------------------
always@(posedgeclk)
begin
if(rst)
begin
//wave_data<=0;
secbuf<=0;
end
else
begin
case(sec_w)
2'b00:
secbuf<=wsin;
2'b01:
secbuf<=wtri;
2'b10:
secbuf<=wsqu;
default:
secbuf<=0;
endcase
end
end
endmodule
四、仿真波形
图3正弦波仿真图
图4三角波仿真图
图5方波仿真图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 DDS 基本 信号发生器