当前位置:   article > 正文

FPGA-DDS原理及实现_fpga上的dds

fpga上的dds

DDS(Direct Digital Synthesizer)即数字合成器,是一种新型的频率合成技术,具有相对带宽大,频率转换时间短、分辨率高和相位连续性好等优点。较容易实现频率、相位以及幅度的数控调制,广泛应用于通信领域。

  

相位累加器是由N位加法器与N位寄存器构成,每个时钟周期的上升沿,加法器就将频率控制字与累加寄存器输出的相位数据相加,相加的结果又反馈至累加器的数据输入端,以使加法器在下一个时钟脉冲作用下继续与频率控制字相加。这样,相位累加器在时钟的作用下,不断对频率控制字进行线性相位累加。即在每一个时钟脉冲输入时,相位累加器便把频率控制字累加一次。

相位累加器的输出数据就是合成信号的相位。相位累加器的溢出频率,就是相位累加器的输出数据,作为波形存储器的相位采样地址,这样就可以把存储在波形存储器里的波形采样值经查表找出,完成相位到幅度的转换。波形储存器送到D/A转换器,再由D/A转换器将数字信号转换成模拟信号输出。

分析建模

然后我们来编写DDS逻辑程序

首先先创建ROM IP核  分别存放正弦波 方波 三角波数据

如下是正弦波的创建步骤:

三角波,方波创建步骤如以上正弦波类似,

然后编写程序

  1. module DDS_AD9767(
  2. Clk,
  3. Reset_n,
  4. Mode_Sel,
  5. Fword,
  6. Pword,
  7. Data);
  8. input Clk;
  9. input Reset_n;
  10. input [1:0]Mode_Sel;
  11. input [31:0]Fword;
  12. input [11:0]Pword;
  13. output reg [13:0]Data;
  14. //频率控制字同步寄存器
  15. reg [31:0]Fword_r;
  16. always@(posedge Clk)
  17. Fword_r <= Fword;
  18. //相位控制字同步寄存器
  19. reg [31:0]Pword_r;
  20. always@(posedge Clk)
  21. Pword_r <= Pword;
  22. //相位累加器
  23. reg[31:0]Freq_ACC;
  24. always@(posedge Clk or negedge Reset_n)
  25. if(!Reset_n)
  26. Freq_ACC <= 0;
  27. else
  28. Freq_ACC <= Freq_ACC + Fword_r;
  29. //波形数据变地址
  30. wire [11:0]Rom_Addr;
  31. assign Rom_Addr = Freq_ACC[31:20] + Pword_r;
  32. wire [13:0]Data_sine,Data_square,Data_triangular;
  33. rom_sine rom_sine (
  34. .clka(Clk), // input wire clka
  35. .addra(Rom_Addr), // input wire [11 : 0] addra
  36. .douta(Data_sine) // output wire [13 : 0] douta
  37. );
  38. rom_square rom_square (
  39. .clka(Clk), // input wire clka
  40. .addra(Rom_Addr), // input wire [11 : 0] addra
  41. .douta(Data_square) // output wire [13 : 0] douta
  42. );
  43. rom_triangular rom_triangular (
  44. .clka(Clk), // input wire clka
  45. .addra(Rom_Addr), // input wire [11 : 0] addra
  46. .douta(Data_triangular) // output wire [13 : 0] douta
  47. );
  48. always@(*)
  49. case(Mode_Sel)
  50. 0:Data = Data_sine;
  51. 1:Data = Data_square;
  52. 2:Data = Data_triangular;
  53. 3:Data = 8192;
  54. endcase
  55. endmodule

编写测试文件

  1. `timescale 1ns / 1ps
  2. module DDS_AD9767_tb;
  3. reg Clk;
  4. reg Reset_n;
  5. reg [1:0]Mode_SelA,Mode_SelB;
  6. reg [31:0]FwordA,FwordB;
  7. reg [11:0]PwordA,PwordB;
  8. wire [13:0]DataA,DataB;
  9. DDS_AD9767 DDS_AD9767A(
  10. .Clk(Clk),
  11. .Reset_n(Reset_n),
  12. .Mode_Sel(Mode_SelA),
  13. .Fword(FwordA),
  14. .Pword(PwordA),
  15. .Data(DataA)
  16. );
  17. DDS_AD9767 DDS_AD9767B(
  18. .Clk(Clk),
  19. .Reset_n(Reset_n),
  20. .Mode_Sel(Mode_SelB),
  21. .Fword(FwordB),
  22. .Pword(PwordB),
  23. .Data(DataB)
  24. );
  25. initial Clk = 1;
  26. always #10 Clk = ~Clk;
  27. initial begin
  28. Reset_n = 0;
  29. FwordA = 65536;
  30. PwordA = 0;
  31. FwordB = 65536;
  32. PwordB = 1024;
  33. Mode_SelA = 2'B00;
  34. Mode_SelB = 2'B00;
  35. #201;
  36. Reset_n = 1;
  37. #5000000;
  38. FwordA = 65536*1024;
  39. PwordA = 0;
  40. FwordB = 65536*1024;
  41. PwordB = 2048;
  42. #1000000;
  43. $stop;
  44. end
  45. endmodule

仿真波形如下:

将仿真波形调为模拟量输出

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/355868
推荐阅读
相关标签
  

闽ICP备14008679号