• 基于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设计
     




  • 相关阅读:
    操作系统(生产者、消费者问题)
    Hibernate——离线查询
    计算机网络(物理层习题)
    Mysql(笛卡尔积、等值连接、自然连接、外连接)
    vim文本编辑器——文件导入、命令查找、导入命令执行结果、自定义快捷键、ab命令、快捷键的保存
    vim文本编辑器——替换、保存退出
    CT107D电路解析
    vim文本编辑器——删除、复制、剪切、更改某一个字符、替换、撤销、关键字搜索
    文本编辑器vim——三种模式、显示行号、插入命令、行快速定位、行内定位
    关机、重启、退出登录命令
  • 原文地址:https://www.cnblogs.com/yfwblog/p/4515375.html
Copyright © 2020-2023  润新知