实验原理

DDS的原理

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

  • DDS是从相位的概念直接合成所需波形的一种频率合成技术。

不仅可以产生不同频率的正弦波,而且可以控制波形的初始相位。

DDS原理框图

整体框架及其说明

框架说明:该模块的主要功能为产生任意信号,这里的任意信号为:正弦波、三角波、方波、锯齿波这四种波形。整个工程主要分为五个模块:按键消抖、按键编码、DDS信号发生器(在做这个实验前一定要先把DDS的原理弄懂!!!)DAC TLC5615驱动、低通滤波器(硬件板上已经有了)。

按键消抖模块:由于需要控制波形、幅值、频率、相位三个参数,所以该模块需要三个按键,由于按键为机械按键,在按下的时候会产生抖动,为了达到控制比较稳定,在按键的输入端我们采用软件对按键进行消抖,这里采用的消抖方法为状态机消抖,具体的过程可以看教程的按键消抖那个章节。

/********************************版权声明**************************************

** 大西瓜团队

**

**----------------------------文件信息--------------------------

** 文件名称: key.v

** 创建日期:

** 功能描述:按键消抖

** 硬件平台:大西瓜第三代开发板,http://daxiguafpga.taobao.com

** 版权声明:本代码属个人知识产权,本代码仅供交流学习.

**---------------------------修改文件的相关信息----------------

** 修改人:

** 修改日期:

** 修改内容:

*******************************************************************************/

module key(clk,key,key_out);

input clk,key;//时钟输入,按键输入

output key_out;//经消抖后的按键信号输出

wire clk;

wire key;

reg key_out;

parameter s0=2'b00,s1=2'b01,s2=2'b10,s3=2'b11;

] state;

always@(posedge clk)

begin

case(state)

s0:

begin

key_out<=1'b1;

if(key==1'b0)

state<=s1;

else

state<=s0;

end

s1:

begin

if(key==1'b0)

state<=s2;

else

state<=s0;

end

s2:

begin

if(key==1'b0)

state<=s3;

else

state<=s0;

end

s3:

begin

if(key==1'b0)

begin

key_out<=1'b0;

state<=s3;

end

else

begin

key_out<=1'b1;

state<=s0;

end

end

default:

state<=s0;

endcase

end

endmodule

按键编码:即是对已经经过按键消抖后的按键信号进行编码,通过按键的按下控制幅值控制变量、频率控制变量、相位控制变量的大小。该模块采用的方法是每按下按键一次相对应的控制变量的值便会增加,最后的相应的输出也会变化。

/********************************版权声明**************************************

** 大西瓜团队

**

**----------------------------文件信息--------------------------

** 文件名称: key_coding.v

** 创建日期:

** 功能描述:按键编码

** 硬件平台:大西瓜第三代开发板,http://daxiguafpga.taobao.com

** 版权声明:本代码属个人知识产权,本代码仅供交流学习.

**---------------------------修改文件的相关信息----------------

** 修改人:

** 修改日期:

** 修改内容:

*******************************************************************************/

module key_coding(

reset,

set_waveform_key,

set_f_key,

set_a_key,

set_p_key,

set_waveform,

f_control,

a_control,

p_control

);

input reset;

input set_waveform_key;

input set_f_key,set_a_key,set_p_key;

] set_waveform;

] f_control;

] a_control;

] p_control;

wire reset;

wire set_waveform_key;

wire set_f_key,set_a_key,set_p_key;

] set_waveform;

] f_control;

] a_control;

] p_control;

/******************波形设置****************************************/

always@(negedge set_waveform_key ornegedge reset)

begin

if(!reset)

set_waveform<=2'b00;

else

begin

if(!set_waveform_key)//判断按键是否按下

begin

set_waveform<=set_waveform+1'b1;

end

end

end

/****************频率设置*******************************************/

always@(negedge set_f_key ornegedge reset)

begin

if(!reset)

f_control<=16'b0100001100011011;//200Hz

else

begin

if(!set_f_key)//判断按键是否按下

begin

if(f_control==16'hffff)

f_control<=16'h0;

else

f_control<=f_control+16'd50;

end

end

end

/***************幅值控制****************************************/

always@(negedge set_a_key ornegedge reset)

begin

if(!reset)

a_control<=4'd1;

else

begin

if(!set_a_key)//判断按键是否按下

begin

if(a_control==4'd10)

a_control<=4'd1;

else

a_control<=a_control+4'd1;

end

end

end

/***************相位设置******************************************/

always@(negedge set_p_key ornegedge reset)

begin

if(!reset)

p_control<=10'b00_0000_0000;//0度

else

begin

if(!set_p_key)//判断按键是否按下

begin

if(p_control==10'b11_1111_1111)

p_control<=10'b0;

else

p_control<=p_control+10'd100;

end

end

end

endmodule

DDS信号发生器:这里的采用DDS来产生四种波形:正弦波、三角波、方波、锯齿波,采用的位数为10位,因为我们的DAC芯片是10位分辨率的。这四种波形通过一个按键进行控制,同时我们需要调用4个ROM来存放这四个波形。而这四ROM里面的数据通过寻址来调用,这里需要一个加法器和一个累加器来产生ROM 的地址。同过不断让地址累加,从而不断地从ROM中读取波形数据,然后将数据送往DACTLC5615的驱动模块中,这样最终便输出模拟的波形。DDS的具体过程这里不详讲,具体看"嵌入式逻辑分析仪的调用相关章节"。

频率累加器和相位累加器,通过改变频率累加器的频率控制字就可以控制输出的波形频率,通过改变相位累加器的相位控制字就可以控制输出波形的相位。而幅值的改变是通过将通过ROM里面读出的数据就行等比例的缩减,通过改变缩减倍数就可以改变输出波形的幅值(0~3.3V),而改变的过程是通过外部的按键进行改变。

/********************************版权声明**************************************

** 大西瓜团队

**

**----------------------------文件信息--------------------------

** 文件名称: DDS.v

** 创建日期:

** 功能描述:DDS信号发生与嵌入式逻辑分析仪的调用

** 硬件平台:大西瓜第三代开发板,http://daxiguafpga.taobao.com

** 版权声明:本代码属个人知识产权,本代码仅供交流学习.

**---------------------------修改文件的相关信息----------------

** 修改人:

** 修改日期:

** 修改内容:

*******************************************************************************/

module DDS(clk,dds_data_out,set_waveform,set_f,set_a,set_p);

input clk;//时钟输入

] set_waveform;

] set_f;

] set_a;

] set_p;

] dds_data_out;

wire clk;

] set_waveform;

] set_f;

] set_a;

] set_p;

] dds_data_out;

/**************连接线***************/

] f32_bus;//AC频率控制字输入

] reg32_out;//32位寄存器输出

] reg32_in;//32位寄存器输入

] reg10_in;

] reg10_out_address;

/************************************/

] sin_data;

] tri_data;

] squ_data;

] saw_data;

] dds_data_reg;

] f32_bus_init=16'b0000_0000_0000_0000;

]=f32_bus_init;//初始化,高位置低

]=set_f;//低位可以设置DDS的输出频率

//1010011111000100(500Hz)

//1000011000110110(400Hz)

//0100001100011011(200Hz)

//0010000110001001(100Hz)

//0000011010110101(20Hz)

/*********************元件例化************************************/

adder_32 u1(.data1(f32_bus),.data2(reg32_out),.sum(reg32_in));

reg32 u2(.clk(clk),.data_in(reg32_in),.data_out(reg32_out));

]),.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,saw_data)

begin

case(set_waveform)

2'b00: dds_data_reg<=sin_data;

2'b01: dds_data_reg<=tri_data;

2'b10: dds_data_reg<=squ_data;

2'b11: dds_data_reg<=saw_data;

default:dds_data_reg<=sin_data;

endcase;

end

;

endmodule

DAC TLC5615驱动: 参考进阶实验的相关章节;

硬件原理图

实验效果

每日推送不同科技解读,原创深耕解读当下科技,敬请关注微信公众号“科乎”。

基于DDS的任意波形发生器的更多相关文章

  1. 基于FPGA的DDS任意波形发生器设计

    一.简介       DDS技术最初是作为频率合成技术提出的,由于其易于控制,相位连续,输出频率稳定度高,分辨率高, 频率转换速度快等优点,现在被广泛应用于任意波形发生器(AWG).基于DDS技术的任 ...

  2. 《GK101任意波形发生器》任意波文件格式说明

    详见PDF 文档: http://files.cnblogs.com/xiaomagee/GK101%E4%BB%BB%E6%84%8F%E6%B3%A2%E6%95%B0%E6%8D%AE%E6%A ...

  3. 制作任意波形发生器MAX038

  4. 国产CPLD(AGM1280)试用记录——做个SPI接口的任意波形DDS [原创www.cnblogs.com/helesheng]

    我之前用过的CPLD有Altera公司的MAX和MAX-II系列,主要有两个优点:1.程序存储在片上Flash,上电即行,保密性高.2.CPLD器件规模小,成本和功耗低,时序不收敛情况也不容易出现.缺 ...

  5. loto仪器_如何模拟输出凸轮轴和曲轴波形_用任意波形信号源SIG852?

    loto仪器_如何模拟输出凸轮轴和曲轴波形_用任意波形信号源SIG852? 在汽车传感器的波形检测应用中,有时候需要模拟各种汽车传感器的输出信号,用来驱动和监测对应的执行机构或者电路是否正常,这其中, ...

  6. (DDS)正弦波形发生器——幅值、频率、相位可调(二)

    (DDS)正弦波形发生器--幅值.频率.相位可调(二) 主要关于调相方面 一.项目任务: 设计一个幅值.频率.相位均可调的正弦波发生器. 频率每次增加10kHz 相位每次增加 PI/2 幅值每次增加两 ...

  7. (DDS)正弦波形发生器——幅值、频率、相位可调(一)

    (DDS)正弦波形发生器--幅值.频率.相位可调 一.项目任务: 设计一个幅值.频率.相位均可调的正弦波发生器. 频率每次增加1kHz. 相位每次增加 2*PI/256 幅值每次增加两倍 二.文章内容 ...

  8. STM32 基DMA的DAC波形发生器

    DAC是STM32系列的一个基本外设,可以将数字信号转化成模拟信号,这次我将使用DAC来输出一个特定波形. 首先确定工作方法,由于我目前在做的简易示波器在输出波形的同时还需要显示输入信号,所以不能占用 ...

  9. 基于FPGA(DDS)的正弦波发生器

    记录背景:昨晚快下班时,与同事rk聊起怎么用FPGA实现正弦波的输出.我第一反应是利用高频的PWM波去滤波,但感觉这样的波形精度肯定很差:后来想起之前由看过怎么用FPGA产生正弦波的技术,但怎么都想不 ...

随机推荐

  1. 工作中常用的Linux命令:ipcs/ipcrm命令

    本文链接:http://www.cnblogs.com/MartinChentf/p/6057100.html (转载请注明出处) ipcs 1. 命令格式 ipcs [resource-option ...

  2. MySQL字符集的修改和查看

    1.关于MySQL字符集 MySQL的字符集支持(Character Set Support)有两个方面: 字符集(Character set)和排序方式(Collation). MySQL对于字符集 ...

  3. stm32 中断几个库函数实现过程分析

    感谢原文作者:鱼竿的传说,这篇文章写得不错,转载自 http://www.cnblogs.com/chineseboy/archive/2013/03/14/2956782.html 前题: 闭门造车 ...

  4. MySQL版本介绍

    MySQL 的官网下载地址:http://www.mysql.com/downloads/ 在这个下载界面会有几个版本的选择. 1. MySQL Community Server 社区版本,开源免费, ...

  5. FineReport集成到AWS系统中的方案

    本人实施了北京炎黄盈动的BPM及OA系统,主要目标是对业务流程进行控制和管理,加快Oracle JDE的业务前端录单速度和弥补JDE在流程控制方面的不足,实现BPM数据能与JDE无缝互相结合,经过3个 ...

  6. 清除MAC OS X上的流氓软件 - advance mac cleaner

    自3721开天辟地以来,流氓软件从来就没有消停过,连MAC OS X都难逃流氓软件的骚扰. 近日,因为从SourceForge上下载了一个软件安装包,结果中招了——莫名其妙被安装了advance ma ...

  7. 初探网络编程--TCP套接字编程演示

    今天看了一下<计算机网络:自顶向下方法>,也就是计算机网络的教材的应用层一章,决定实现以下后面的Java C/S应用程序的例子,用来演示TCP和UDP套接字编程. 程序流程如下: 1.一台 ...

  8. unity3d 的Quaternion.identity和transform.rotation区别是什么

    Quaternion.identity就是指Quaternion(0,0,0,0),就是每旋转前的初始角度,是一个确切的值,而transform.rotation是指本物体的角度,值是不确定的,比如可 ...

  9. ubuntu不能登录图形用户界面,游客身份可登陆,命令行可登陆

    ubuntu是13.04版本,我猜其他的版本解决办法大概也一样.当开机进入登陆界面后我们输入密码后并没有进入应该进入的图形用户界面,而是进入一个命令行界面并且一闪而过又回到了登录界面,而已游客的身份却 ...

  10. 使用PLSQL导入导出数据库

    Oracle如何实现创建数据库.备份数据库及数据导出导入的一条龙操作 Oracle中对数据对象和数据的管理,无疑都是使用PL/SQL Developer来进行管理,该工具也提供给我们很多方便.快捷的操 ...