DDS直接數字頻率合成器

本文介绍了一个FPGA实现的DDS模块,通过输入的频率控制字和相位控制字,产生相应的输出数据。DDS核心包括相位累加器、相位平移和ROM查表,用于生成所需频率的信号。在测试模块中,设置了不同参数来验证DDS的功能。

                                                    

  1. module DDS(
  2.      clk,           //50M Hz
  3.      rst_n,
  4.      en,            //使能
  5.      F_word,   //頻率控制字
  6.      P_word,   //相位控制字
  7.      DA_data  //輸出數據
  8. );
  9. input clk;         
  10. input rst_n;
  11. input en;
  12. input [31:0] F_word; 
  13. input [11:0] P_word; 
  14. output [11:0] DA_data;
  15. reg [31:0] fre_acc;
  16. reg [31:0] F_word_reg;
  17. reg [11:0] P_word_reg;
  18. reg [11:0] rom_addr;
  19. always@(posedge clk or negedge rst_n)
  20. begin
  21. if(!rst_n)
  22.    F_word_reg <= 32'd0;
  23. else
  24.    F_word_reg <= F_word;
  25. end
  26. always@(posedge clk or negedge rst_n)
  27. begin
  28. if(!rst_n)
  29.    P_word_reg <= 12'd0;
  30. else
  31.    P_word_reg <= P_word;
  32. end
  33. always@(posedge clk or negedge rst_n)   //相位累加器
  34. begin
  35. if(!rst_n)
  36.    fre_acc <= 32'd0;
  37. else if(en)
  38.    fre_acc <= fre_acc + F_word_reg;
  39. else
  40.    fre_acc <= 32'd0;
  41. end
  42. always@(posedge clk or negedge rst_n)   //相位平移
  43. begin
  44. if(!rst_n)
  45.    rom_addr <= 12'd0;
  46. else if(en)
  47.    rom_addr <= fre_acc[31:20] + P_word_reg;
  48. else
  49.    rom_addr <= 12'd0;
  50. end
  51. rom rom(                        //4096*12              
  52.    .address(rom_addr),  
  53.    .clock(clk),
  54.    .q(DA_data)
  55. );
  56. endmodule


  1. `timescale 1ns/100ps
  2.  
  3. module DDS_test1;
  4. reg  clk;
  5. reg  en;
  6. reg  rst_n;
  7. reg  [31:0] F_word;  
  8. reg  [11:0] P_word;  
  9. wire [11:0] DA_data;
  10.  
  11. DDS  DDS(
  12.      .clk(clk),
  13.      .en(en),
  14.      .rst_n(rst_n),
  15.      .F_word(F_word),
  16.      .P_word(P_word),
  17.      .DA_data(DA_data)
  18. );
  19.  
  20. initial
  21. begin 
  22.      clk = 1'b0;
  23.      forever #20 clk = ~clk;
  24. end
  25.  
  26. initial
  27. begin
  28.      #0  
  29.      rst_n = 1'b0;
  30.      F_word = 32'd20000000;  //F_word=2^N*(Fout/Fclk), Fout為欲輸出頻率
  31.      P_word = 12'd1024;          //P_word=平移角度/(2*PI/2^M), 取平移角度為PI/2
  32.      #40  
  33.      rst_n = 1'b1;
  34.      en = 1'b1
  35.      #5000000  
  36.      #10 $stop;
  37.      #10 $finish;
  38. end
  39.  
  40. endmodule


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值