基于DDS的任意波形发生器
实验原理
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的任意波形发生器的更多相关文章
- 基于FPGA的DDS任意波形发生器设计
一.简介 DDS技术最初是作为频率合成技术提出的,由于其易于控制,相位连续,输出频率稳定度高,分辨率高, 频率转换速度快等优点,现在被广泛应用于任意波形发生器(AWG).基于DDS技术的任 ...
- 《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 ...
- 制作任意波形发生器MAX038
- 国产CPLD(AGM1280)试用记录——做个SPI接口的任意波形DDS [原创www.cnblogs.com/helesheng]
我之前用过的CPLD有Altera公司的MAX和MAX-II系列,主要有两个优点:1.程序存储在片上Flash,上电即行,保密性高.2.CPLD器件规模小,成本和功耗低,时序不收敛情况也不容易出现.缺 ...
- loto仪器_如何模拟输出凸轮轴和曲轴波形_用任意波形信号源SIG852?
loto仪器_如何模拟输出凸轮轴和曲轴波形_用任意波形信号源SIG852? 在汽车传感器的波形检测应用中,有时候需要模拟各种汽车传感器的输出信号,用来驱动和监测对应的执行机构或者电路是否正常,这其中, ...
- (DDS)正弦波形发生器——幅值、频率、相位可调(二)
(DDS)正弦波形发生器--幅值.频率.相位可调(二) 主要关于调相方面 一.项目任务: 设计一个幅值.频率.相位均可调的正弦波发生器. 频率每次增加10kHz 相位每次增加 PI/2 幅值每次增加两 ...
- (DDS)正弦波形发生器——幅值、频率、相位可调(一)
(DDS)正弦波形发生器--幅值.频率.相位可调 一.项目任务: 设计一个幅值.频率.相位均可调的正弦波发生器. 频率每次增加1kHz. 相位每次增加 2*PI/256 幅值每次增加两倍 二.文章内容 ...
- STM32 基DMA的DAC波形发生器
DAC是STM32系列的一个基本外设,可以将数字信号转化成模拟信号,这次我将使用DAC来输出一个特定波形. 首先确定工作方法,由于我目前在做的简易示波器在输出波形的同时还需要显示输入信号,所以不能占用 ...
- 基于FPGA(DDS)的正弦波发生器
记录背景:昨晚快下班时,与同事rk聊起怎么用FPGA实现正弦波的输出.我第一反应是利用高频的PWM波去滤波,但感觉这样的波形精度肯定很差:后来想起之前由看过怎么用FPGA产生正弦波的技术,但怎么都想不 ...
随机推荐
- Remote Desktop File Format
转自:http://engrmosaic.uncc.edu/mosaic-anywhere/remote-desktop-file-format The new Terminal Services c ...
- linux下怎么查看ssh的用户登录日志
linux下登录日志在下面的目录里: cd /var/log 查看ssh用户的登录日志: less secure linux日志管理: 1. 日志简介 日志对于安全来说,非常重要,他记录了系统每天发生 ...
- Java魔法堂:找外援的利器——Runtime.exec详解
一.前言 Java虽然五脏俱全但总有软肋,譬如获取CPU等硬件信息,当然我们可以通过JNI调用C/C++来获取,但对于对C/C++和Windows API不熟的码农是一系列复杂的学习和踩坑过程.那能不 ...
- 怎么使PUTTY一直连接
如何才能保证PUTTY一直连接,即使我们好长时间不去敲命令,也让它一直连接着? PuTTY的设置方法是:在Connection里面有个Seconds between keepaliaves.这里就是每 ...
- MT7620a openwrt barrier_breaker编译后wan口dhcp无法获得地址
前言 我司准备使用openwrt barrier_breaker版本做二次开发.在烧入固件后发现wan口,dhcp无法获得地址.经如下修改后,mt7620a的路由器可以正常获得地址. 修改dts文件 ...
- Windows Azure HDInsight 使用技巧
Windows Azure HDInsight是一个面向大数据的PaaS服务,是PaaS版本的Hadoop.HDInsight是微软与Hortonworks合作的产物.可以理解为Hortonworks ...
- C++浅析——虚函数的动态和静态绑定
源自一道面试题,觉得很有意思 class CBase { public: virtual void PrintData(int nData = 111); }; void CBase::PrintDa ...
- 关于电磁场中的E.B.D.H的理解
电磁场理论中存在四个基本物理量,电场强度E,磁场强度H,电场通量密度D,磁场通量密度B. E:其中E和H最简单,电场中的电荷受到电场力的作用,单位电荷受的力称为电场强度,这种定义得到E的单位为N/C, ...
- 翻译《Writing Idiomatic Python》(五):类、上下文管理器、生成器
原书参考:http://www.jeffknupp.com/blog/2012/10/04/writing-idiomatic-python/ 上一篇:翻译<Writing Idiomatic ...
- Teredo 是一项 IPv6/IPv4 转换技术
Teredo 是一项 IPv6/IPv4 转换技术,能够实现在处于单个或者多个 IPv4 NAT 后的主机之间的 IPv6 自动隧道.来自 Teredo 主机的 IPv6 数据流能够通过 NAT,因 ...