当前位置:   article > 正文

基于FPGA的DDS设计及仿真_如何设计一个dds系统?

如何设计一个dds系统?

一、DDS的基本概念

        DDS(Direct Digital Synthesizer),直接数字频率合成器,是一项关键的数字化技术。与传统的频率合成技术相比,其具有低成本、低功耗、高分辨率以及相位连续性好等优点,被广泛的应用于通信领域。利用DDS可以合成相位、频率以及幅度可控的信号波形。

二、DDS原理

        上图为DDS的基本结构图,可以看出,DDS主要由相位累加器、相位加法器、波形查找表以及D/A转换等构成。

        波形查找表一般是一个ROM,里边存放了信号的采样值,本次存放的是正弦信号,但其也支持方波以及三角波等信号的波形。对于波形查找表,给定一个地址,便可以读出该地址对应的波形数据,而这一系列离散的数据便形成了目标波形,然后再进行数模转换,就可以得到连续的波形。

        假设相位累加器的位数为N位(本次实验N=32),那么相当于把正弦信号的相位分为了2^{N}份,其分辨率便为1/2^{N}

        频率控制字fword,它用来控制行为控制字每次自增的步长,当其为1时,每个时钟周期相位加1,输出频率F_{out}=F_{clk}/2^{N},若fword=B时,那每个时钟周期的相位自加步长为B,其输出频率为F_{out}=B*F_{clk}/2^{N},这里的B必须是整数。

        在相位控制字pword为0的情况下,通过在相位累加器中将频率控制字fword累加起来,便可以获得波形查找表ROM的地址,然后再取出这个地址对应的值,便可以得到输出波形数据。但为了相位的可控,我们在相位累加器的输出结果上再直接加上相位控制字pword的值,相当于对ROM的地址整体做了一个偏移,这样便完成了相位的改变。

        而在实际应用中,为了合理的控制ROM的容量,在将相位累加器与相位控制字相加的结果转化为ROM的查询地址时,我们采用截断式,只采用32位相位累加器的高M位,在本次实验中,M=32。即ROM的地址为16位,其深度为2^{16}=65536

三、DDS的设计

        在清晰了DDS的构成之后,我们照图施工,便可以完成DDS的硬件描述。

        首先是频率控制字的同步寄存器,我们使用一个寄存器将频率控制字fword的值保存一个时钟周期;接下来是相位累加器,这里也是一个寄存器,每次让相位累加器的结果加上频率控制字的值即可;相位控制字的同步寄存器与前者相同,将其结果加在相位累加器的输出结果上,就可以实现初相的改变,即对ROM的查询地址做出了偏移;最后将相位累加器结果的高16位与相位累加器求和,作为ROM的地址,将该地址送给ROM便可以输出响应的目标波形。

     

  1. `timescale 1ns / 1ps
  2. module DDS(
  3. //input
  4. clk ,
  5. rst_n,
  6. fword,
  7. pword,
  8. hword,
  9. //output
  10. wave_out,
  11. read_addr
  12. );
  13. input clk ;
  14. input rst_n;
  15. input [31:0] fword;
  16. input [15:0] pword;
  17. input [1:0 ] hword;
  18. output reg signed [15:0] wave_out;
  19. output [15:0] read_addr;
  20. //幅度定义:1,1/2,1/4,1/8,
  21. parameter h1 = 2'b00 ;
  22. parameter h2 = 2'b01 ;
  23. parameter h3 = 2'b10 ;
  24. parameter h4 = 2'b11 ;
  25. //频率控制字同步寄存器
  26. reg [31:0] fword_r;
  27. always@(posedge clk or negedge rst_n)
  28. if(!rst_n)
  29. fword_r <= 32'd0;
  30. else
  31. fword_r <= fword;
  32. //相位控制字同步寄存器
  33. reg [15:0] pword_r;
  34. always@(posedge clk or negedge rst_n)
  35. if(!rst_n)
  36. pword_r <= 16'd0;
  37. else
  38. pword_r <= pword;
  39. //相位累加器
  40. reg [31:0] p_sum;
  41. always@(posedge clk or negedge rst_n)
  42. if(!rst_n)
  43. p_sum <= 16'd0;
  44. else
  45. p_sum <= p_sum + fword_r;
  46. //波形查找表ROM的地址
  47. reg [15:0] read_addr;
  48. always@(posedge clk or negedge rst_n)
  49. if(!rst_n)
  50. read_addr <= 16'd0;
  51. else
  52. read_addr <= p_sum[31:16] + pword_r;
  53. wire [15:0] wave;
  54. blk_mem_gen_0 blk_mem_gen_0(
  55. .clka (clk),
  56. .ena (rst_n),
  57. .addra(read_addr),
  58. .douta(wave)
  59. );
  60. always@(posedge clk or negedge rst_n)
  61. if(!rst_n)
  62. wave_out <= 16'd0;
  63. else
  64. case(hword)
  65. h1:wave_out = wave - 16'd32767 ;
  66. h2:wave_out = (wave - 16'd32767)/2;
  67. h3:wave_out = (wave - 16'd32767)/4;
  68. h4:wave_out = (wave - 16'd32767)/8;
  69. default:wave_out = wave - 16'd32767;
  70. endcase
  71. endmodule

        ROM的配置如下:

        ROM的初始化文件为正弦波形,可以使用工具生成,也可以直接使用我使用的文件。(6条消息) ROM的初始化文件,正弦波形资源-CSDN文库icon-default.png?t=N4P3https://download.csdn.net/download/qq_57541474/87886533

 四、仿真

Fclk=50MHZFo=B*Fclk/2^32,ROMwidth=16,depth=65536=2^16

1. fword =2048=2^11,pword=0,T=41.94304ms,=>f=23.84185 Fo = Fclk /2^21=23.8418579.
2. fword =8192=2^13,pword=0,T=10.48576ms,=>f=95.3674 Fo = Fclk /2^19=95.3674.
3. fword =16384=2^14,pword=0,T=5.22428ms,=>f=190.7377 Fo = Fclk /2^18=190.7377.

对三种不同的频率进行仿真,结果符合预期。

 

1.waveA:fword=8192=2^13,pword=0°,T=10.48576msf=95.3674,Fo=Fclk/2^19=95.3674

2.waveB: fword=8192=2^13,pword1=16384=90°fword2=32768=180°,T=10.48576msf=95.3674,Fo=Fclk/2^19=95.3674

信号AB频率相同,A路的相位不变,B路的信号相位先为1/4的深度,即90°,之后再变为1/2的深度,即180°,从仿真结果可看出相差正确,频率与上边第二次相同。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号