一、简介
      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设计

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

  1. 基于FPGA的DDS设计(一)

    最近在学习基于FPGA的DDS设计,借此机会把学习过程记录下来,当作自己的学习笔记也希望能够帮助到学习DDS的小伙伴. DDS(Direct Digital Synthesizer)直接数字合成器,这 ...

  2. 文献翻译|Design of True Random Number Generator Based on Multi-stage Feedback Ring Oscillator(基于多级反馈环形振荡器的真随机数发生器设计)

    基于多级反馈环形振荡器的真随机数发生器设计 摘要 真随机数生成器(trng)在加密系统中起着重要的作用.本文提出了一种在现场可编程门阵列(FPGA)上生成真随机数的新方法,该方法以 多级反馈环形振荡器 ...

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

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

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

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

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

    本文转载自:http://www.cnblogs.com/lueguo/p/3373643.html 略过天涯   基于FPGA的VGA可移植模块终极设计 一.VGA的诱惑 首先,VGA的驱动,这事, ...

  6. 基于DDS的任意波形发生器

    实验原理 DDS的原理 DDS(Direct Digital Frequency Synthesizer)直接数字频率合成器,也可叫DDFS. DDS是从相位的概念直接合成所需波形的一种频率合成技术. ...

  7. 基于FPGA的DDS设计(二)

    在DDS设计中,如果相位累加器每个时钟周期累加1,就会输出频率为195.313KHz的波形.如果每个时钟周期累加2,就会输出频率为2*195.313KHz的波形·······,如果每两个时钟周期累加1 ...

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

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

  9. 基于FPGA的通信信号源的设计

    通信信号源设计原理 通过设计一个DDS信号源,然后将该信号作为载波信号,再对基带信号进行2ASK.2FSK.2PSK.2DPSK调制,进而产生多种通信信号. 设计框图如下: 将PN序列进行2ASK.2 ...

随机推荐

  1. RHEL6安装JDK7

    一.安装准备 1.操作系统:redhat-server-6.1-x86_64 下载地址: http://www.verycd.com/files/d39b97540497d24175340915244 ...

  2. freemaker宏的用法

    freemaker宏 定义:定义一个标签,标签体中可以包含参数,开始标签和结束标签可以包含内容,内容中可以通过${}方式引用标签体中定义的参数 用法:页面引入标签,通过标签可以直接输出标签的内容 He ...

  3. OrderBy和OrderByDescending排序

    昨天有练习对数字阵列进行排序,<C#阵列Array排序>https://www.cnblogs.com/insus/p/10825174.html 其实一切都弄得很复杂,array已经有2 ...

  4. AS负责人说不必用Kotlin重写,但OkHttp拿Kotlin重写了一遍,就发了OkHttp 4.0!

    虽然 Android Studio 的负责人 Jeffery 已经澄清,只是 Kotlin-First 而不是 Kotlin-Must,并不需要将 App 用 Kotlin 重写一遍.但是 OkHtt ...

  5. 洛谷P2285 [HNOI2004]打鼹鼠

    P2285 [HNOI2004]打鼹鼠 题目描述 鼹鼠是一种很喜欢挖洞的动物,但每过一定的时间,它还是喜欢把头探出到地面上来透透气的.根据这个特点阿牛编写了一个打鼹鼠的游戏:在一个n*n的网格中,在某 ...

  6. java使用Robot类在eclipse上实现自动编写代码

    运行时,把输入法关掉,切换成系统自带的输入法即可: 第二个类是自定义的键值Map集合,主要是为了方便输入字符串,有需要的可以自行添加: 主要的代码如下,会创建一个名称为Automaton.java的类 ...

  7. 剑指Offer的学习笔记(C#篇)-- 包含min函数的栈

    题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 一 . 题目该怎么想 1 . 定义栈的数据结构:实现Push.Pop.Top.Min方 ...

  8. 8.聚集函数 ---SQL

    一.AVG()函数 A VG()通过对表中行数计数并计算其列值之和,求得该列的平均值.A VG()可用来返回所有列的平均值,也可以用来返回特定列或行的平均值. 警告:只用于单个列 AVG()只能用来确 ...

  9. Python web前端 08 字符串 数组 json

    Python web前端 08 字符串 数组 json 一.string #string 字符串 #索引 下标 偏移量 ---从0开始 str[index]; #通过索引取字符串 可读不可写 str. ...

  10. NET Core 与 Vue.js 服务端渲染

    NET Core 与 Vue.js 服务端渲染 http://mgyongyosi.com/2016/Vuejs-server-side-rendering-with-aspnet-core/原作者: ...