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

一、简介

DDS技术最初是作为频率合成技术提出的,由于其易于控制,相位连续,输出频率稳定度高,分辨率高, 频率转换速度快等优点,现在被广泛应用于任意波形发生器(AWG)。基于DDS技术的任意波形发生器用高速存储器作为查找表,通过高速D/A转换器来合成出存储在存储器内的波形。所以它不仅能产生正弦、余弦、方波、三角波和锯齿波等常见波形,而且还可以利用各种编辑手段,产生传统函数发生器所不能产生的真正意义上的任意波形。

二、原理

根据傅立叶变换定理可知,任何周期信号都可以分解为一系列正弦或余弦信号之和,不失一般性,以正弦信号的产生为例详细说明直接数字频率合成技术的原理。比如一个频率为fc的正弦信号,其时域表达式为:

其相位表达式为:

从两式可以看出,正弦信号是关于相位的一个周期函数,下图更加直观的描述相位与幅度的关系,16个相位与16个幅度值相对应,即每一个相位值对应一个幅度值,比如1100对应的相位为3π/2,对应的幅度值为-1.

相位和幅值的一一对应关系就好比存储器中地址和存储内容的关系,如果把一个周期内每个相位对应的幅度值存入存储器当中,那么对于任意频率的正弦信号,在任意时刻,只要已知相位Φ(t),也就知道地址,就可通过查表得到s(t)。下图是DDS的基本结构框图:

相位累加器在每个时钟脉冲输入时,把频率控制字累加一次,相位累加器的输出数据就是信号的相位,用输出的数据作为波形存储器(ROM)的相位取样地址,这样就可以把存取在波形存储器内的波形抽样值经查找表查处,完成相位到幅值的转换。频率控制字相当于Φ(t)中的2πfc,相位控制字相当于Φ(t)中的θ0。

由于相位累加器字长的限制,相位累加器累加到一定值后,其输出将会溢出,这样波形存储器的地址就会循环一次,即意味着输出波形循环一周。故改变频率控制字即相位增量,就可以改变相位累加器的溢出时间,在时钟频率不变的条件下就可以改变输出频率。改变查表寻址的时钟频率,同样也可以改变输出波形的频率。

为了获得较高的频率分辨率,则只有增加相位累加器的字长N,故一般N都取值较大。但是受存储器容量的限制,存储器地址线的位数w不可能很大,一般都要小于N。这样存储器的地址线一般都只能接在相位累加器输出的高w位,而相位累加器输出余下的(N-W)个低位则只能被舍弃,这就是相位截断误差的来源。

    DDS模块的输出频率fout是系统工作频率fc、相位累加器位数N及频率控制字K满足如下关系

频率分辨率,即频率的变化间隔

三、实现代码

       利用matlab或者Guagle_wave工具生成波形文件,存入ROM。基于Quartus II平台,并且调用了ROM核。

  1. module DDS (
  2. sys_clk,
  3. sys_rst_n,
  4. freq_word,
  5. phase_word,
  6. wave_out
  7. );
  8. input sys_clk ; //系统工作时钟
  9. input sys_rst_n ; //复位,低有效
  10. input [31:0] freq_word ; //频率控制字,控制输出波形频率
  11. input [11:0] phase_word ; //相位控制字,控制初始相位
  12. output[9:0] wave_out ; //输出波形,位宽10bit
  13. reg [31:0] freq_word_reg ;
  14. reg [11:0] phase_word_reg ;
  15. reg [31:0] phase_adder ; //相位累加器
  16. reg [9:0] rom_address ; //存储深度2^10
  17. always @(posedge sys_clk or negedge sys_rst_n) begin
  18. if (sys_rst_n ==1‘b0) begin
  19. freq_word_reg <= 32‘h0000;
  20. end
  21. else
  22. freq_word_reg <= freq_word;
  23. end
  24. always @(posedge sys_clk or negedge sys_rst_n) begin
  25. if (sys_rst_n ==1‘b0) begin
  26. phase_word_reg <= 12‘h0000;
  27. end
  28. else
  29. phase_word_reg <= phase_word;
  30. end
  31. always @(posedge sys_clk or negedge sys_rst_n) begin
  32. if (sys_rst_n ==1‘b0) begin
  33. phase_adder <= 32‘h0000;
  34. end
  35. else
  36. phase_adder <= phase_adder + freq_word_reg; //对频率控制字进行累加
  37. end
  38. always @(posedge sys_clk or negedge sys_rst_n) begin
  39. if (sys_rst_n ==1‘b0) begin
  40. rom_address <= 32‘h0000;
  41. end
  42. else
  43. rom_address <= phase_adder[31:20] + phase_word_reg;
  44. end
  45. sin_rom DDS_ROM_U0 (
  46. .address (rom_address) ,
  47. .clock (sys_clk) ,
  48. .q (wave_out)
  49. );
  50. endmodule

测试文件代码

  1. `timescale 1 ns/ 1 ns
  2. module DDS_tb();
  3. reg [31:0] freq_word ;
  4. reg [11:0] phase_word ;
  5. reg sys_clk ;
  6. reg sys_rst_n ;
  7. wire [9:0] wave_out ;
  8. DDS i1 (
  9. .freq_word(freq_word),
  10. .phase_word(phase_word),
  11. .sys_clk(sys_clk),
  12. .sys_rst_n(sys_rst_n),
  13. .wave_out(wave_out)
  14. );
  15. initial
  16. begin
  17. sys_clk = 0;
  18. sys_rst_n = 0;
  19. freq_word = 0;
  20. phase_word = 0;
  21. #2000;
  22. sys_rst_n = 1;
  23. freq_word = 32‘d1024; //25M
  24. phase_word = 32‘d0; //相位0度
  25. #200000000;
  26. freq_word = 32‘d2048; //50M
  27. phase_word = 32‘d512; //相位90度
  28. #200000000;
  29. $stop;
  30. end
  31. always sys_clk = #20 ~sys_clk; //系统时钟25M
  32. endmodule

仿真波形如下:

改变ROM中的波形数据就可以输出相对应的波形。

参考资料:A Technical Tutorialon Digital Signal Synthesis

无线通信FPGA设计

来自为知笔记(Wiz)

时间: 2024-10-22 21:16:00

基于FPGA的DDS任意波形发生器设计的相关文章

数字化仪与任意波形发生器的混合模式选项现已开启

--背负式模块新增16条数字线路 德国汉斯多尔夫,2019年9月18日讯--德国Spectrum仪器今日宣布旗下最新系列的16位数字化仪与任意波形发生器(AWG)均开启可选模块,该模块为模拟数据新增了16条同步数字线.新增的数字线使数字化仪和任意波形发生器卡的4条多功能XIO线得到了充分的扩展.这将意味着高达20条可完全编程的XIO线能够作为数字化仪的同步数字输入和任意波形发生器的同步数字输出,或异步I/O线.状态行(status line)甚至额外的触发器输入. 数字化仪与任意波形发生器的混合

基于FPGA的VGA可移植模块终极设计【转】

本文转载自:http://www.cnblogs.com/lueguo/p/3373643.html 略过天涯 基于FPGA的VGA可移植模块终极设计 一.VGA的诱惑 首先,VGA的驱动,这事,一般的单片机是办不到的:由于FPGA的速度,以及并行的优势,加上可现场配置的优势,VGA的配置,只有俺们FPGA可以胜任,也只有FPGA可以随心所欲地配置(当然ARM也可以,应用比较高吧). 初学者就是喜欢看炫的效果,往往会忍不住想玩.尤其玩FPGA的,没玩VGA就感到跟单片机没啥提升,因此VGA的驱动

基于FPGA的VGA显示设计(二)

上一篇:基于FPGA的VGA显示设计(一)     参照 CrazyBingo 的 基于FPGA的VGA可移植模块终极设计代码  的工程代码风格,模块化处理了上一篇的代码,并增加了一点其它图形. 顶层模块: 1 /**************************************************** 2 * Module Name : VGA_color_all.v 3 * Author : yllinux 博客:http://www.cnblogs.com/yllinux/

使用任意波形(或函数)发生器产生想要的任意信号

使用任意波形(或函数)发生器产生想要的任意信号 1.说明 本文主要记述,本人使用Tektronix(泰克)公司的  AFG3101 型号的任意函数发生器(Arbitrary Function Generator,AFG) 和 AWG520 型号的任意波形发生器(Arbitrary Waveform Generator,AWG)的一些经验方法,如有不当,还请指出,谢谢! 2.生成任意波形 主要有两种方法生成,一是使用 Tektronix(泰克)提供的 ArbExpress 软件创建生成波形,二是使

基于FPGA的数字频率计(设计全过程)

小序: 前几天看全国大学生电子设计竞赛历年试题,无意间发现了一道题目<简易数字频率计>,跟之前我用verilog写的一个频率计差不多,于是想尝试做一下,题目具体要求如下图中所示,我所用的开发板为 xilinx spartan 3ES, 最后结果还算理想,在要求的范围内的频率测量精度比较高,但是由于板子的限制没能实现脉冲宽度测量等功能,但是其原理比较简单,下文中将会给出设计过程,结果展示图片以及整个工程代码的下载链接. 数字频率计总体设计采用分块的思想,自底向上设计方向,三个子模块包括频率测量模

基于FPGA的高速图像处理平台设计_爱学术

[摘要]针对传统图像处理平台采集.处理速度慢,显示分辨率低,不方便携带等问题,设计了一个基于FPGA的高速图像处理平台,包含高速图像的采集.处理.及显示.图像采集通过Camera Link接口采集图像,图像处理部分利用乒乓操作对图像数据进行高速存储,FPGA完成图像预处理,DSP进行运算复杂的图像处理,图像显示部分输出标准的视频信号进行DVI显示.实验结果表明,平台完成了对图像的高速处理,体积小,处理数据量大,可以替代传统图像处理平台,并应用到多种图像处理领域. [作者] 陈序  卿粼波  何小

基于FPGA的VGA显示静态图片

终于熬到暑假了,记过三四周的突击带考试,终于为我的大二画上了一个完整的句号,接下来终于可以静心去做自己想做的事情了,前一阵子报了一个线上培训班,学学Sobel边缘检测,之前一直在学习图像处理,但是因为一直看人家的代码,到后来难免有点空虚.所以说自己狠下心来,报了一个线上培训班,重新学习一下,自己设计Sobel边缘检测,势要摆脱抄别人代码的魔咒.所以这次图像显示部分和在彩色条纹中显示一副图片的代码,全部是我自己设计的,虽然不是什么大工程,但是还是满满的成就感,这次用的时间比较久,因为使用的是新板子

基于FPGA的音频信号的FIR滤波(Matlab+Modelsim验证)

1 设计内容 本设计是基于FPGA的音频信号FIR低通滤波,根据要求,采用Matlab对WAV音频文件进行读取和添加噪声信号.FFT分析.FIR滤波处理,并分析滤波的效果.通过Matlab的分析验证滤波效果后,将叠加噪声信号的音频信号输出到txt文件里.然后使用Matlab语言编写滤波器模块和测试模块,通过Modelsim软件读取txt文件的数据,将数据送入滤波模块,最后将滤波的结果输出到txt文件里,最后用Matlab将处理的结果从txt文件读出.显示.FFT分析用Verilog设计的FIR滤

基于FPGA的飞机的小游戏

基于FPGA的飞机的小游戏 实验原理 ????该实验主要分为4个模块,采用至上而下的设计方法进行设计.由50M的晶振电路提供时钟源,VGA显示控制模块.图形显示控制模块.移动模块的时钟为25M,由时钟分频电路产生获得.时钟分频模块采用PLL进行设计,由50M时钟进行2分频获得25M时钟. ????移动模块,控制我方飞机和敌方飞机.子弹的移动,移动的速度可以通过时钟的频率进行控制,操作我方飞机的移动和子弹的发射由外部按键进行控制,控制的方式有发射子弹.左移.右移. ????图像显示控制模块,用于控