当前位置:   article > 正文

FPGA实现多路并行dds

FPGA实现多路并行dds
  • 目录

  1. 基本原理

    verilog代码

    仿真结果​

  2. 基本原理

    1.        多路并行dds,传统DDS的局限性在于输出频率有限。根据奈奎斯特采样定理,单路DDS的输出频率应小于系统时钟频率的一半。但是在很多地方,要使采样率保持一致,所以,为了提高采样率,可以采样多路并行dds技术,然后并转串输出,提高采样率。

       这里假设使用4个dds产生4路并行的dds,其中,4路dds的可以分别表示为:

  1. 可以从上式中看出,4路dds的pinc(频率控制字)是一样,差别是在其相位差(poff)DDS0的poff是0;DDS1的poff是fofs*1;,DDS2的poff是fofs*2;DDS3的poff是fofs*3

    假如fs是100MHz,调用4个并行的dds,然后按照顺序将4路并行的dds拼接成一路(并转串),这样就相当于采样率是4*fs,即400MHz采样率下的数据

  2. verilog代码

    1. 这里使用4路并行dds
    1. assign dds_pinc = 32'd107374182; //fs 100m.f_out =10M 30bit ;26843545 //107374182
    2. assign dds_poff = 32'd107374182*0; //fs 100m.f_out =10M 30bit ; 26843545
    3. //
    4. assign dds_pinc_1 = 32'd107374182; //fs 100m.f_out =10M 30bit ;
    5. assign dds_poff_1 = 32'd107374182*1; //fs 100m.f_out =10M 30bit ; //26843545
    6. //
    7. assign dds_pinc_2 = 32'd107374182; //fs 100m.f_out =10M 30bit ;
    8. assign dds_poff_2 = 32'd107374182*2; //fs 100m.f_out =10M 30bit ;
    9. //
    10. assign dds_pinc_3 = 32'd107374182; //fs 100m.f_out =10M 30bit ;
    11. assign dds_poff_3 = 32'd107374182*3; //fs 100m.f_out =10M 30bit ;
    12. assign dds_t_data = {dds_poff,dds_pinc};
    13. assign dds_t_data_1 = {dds_poff_1,dds_pinc_1};
    14. assign dds_t_data_2 = {dds_poff_2,dds_pinc_2};
    15. assign dds_t_data_3 = {dds_poff_3,dds_pinc_3};
    16. //
    17. always@(posedge clk) begin
    18. if(rst == 1'b1)begin
    19. gen_valid <= 1'b0;
    20. end else if(start == 1'b1)begin
    21. gen_valid <= 1'b1;
    22. end else begin
    23. gen_valid <= gen_valid;
    24. end
    25. end
    26. assign sin_0 = m_axis_data_tdata[31:16];
    27. assign cos_0 = m_axis_data_tdata[15:0];
    28. assign sin_1 = m_axis_data_tdata_1[31:16];
    29. assign cos_1 = m_axis_data_tdata_1[15:0];
    30. assign sin_2 = m_axis_data_tdata_2[31:16];
    31. assign cos_2 = m_axis_data_tdata_2[15:0];
    32. assign sin_3 = m_axis_data_tdata_3[31:16];
    33. assign cos_3 = m_axis_data_tdata_3[15:0];
    34. dds100m_0 dds100m_0_inst (
    35. .aclk(clk), // input wire aclk
    36. .s_axis_config_tvalid(gen_valid), // input wire s_axis_config_tvalid
    37. .s_axis_config_tdata(dds_t_data), // input wire [63 : 0] s_axis_config_tdata
    38. .m_axis_data_tvalid(dds_data_valid), // output wire m_axis_data_tvalid
    39. .m_axis_data_tdata(m_axis_data_tdata), // output wire [31 : 0] m_axis_data_tdata
    40. .m_axis_phase_tvalid(), // output wire m_axis_phase_tvalid
    41. .m_axis_phase_tdata() // output wire [31 : 0] m_axis_phase_tdata
    42. );
    43. dds100m_0 dds100m_1_inst (
    44. .aclk(clk), // input wire aclk
    45. .s_axis_config_tvalid(gen_valid), // input wire s_axis_config_tvalid
    46. .s_axis_config_tdata(dds_t_data_1), // input wire [63 : 0] s_axis_config_tdata
    47. .m_axis_data_tvalid(dds_data_valid), // output wire m_axis_data_tvalid
    48. .m_axis_data_tdata(m_axis_data_tdata_1), // output wire [31 : 0] m_axis_data_tdata
    49. .m_axis_phase_tvalid(m_axis_phase_tvalid), // output wire m_axis_phase_tvalid
    50. .m_axis_phase_tdata(m_axis_phase_tdata) // output wire [31 : 0] m_axis_phase_tdata
    51. );
    52. dds100m_0 dds100m_2_inst (
    53. .aclk(clk), // input wire aclk
    54. .s_axis_config_tvalid(gen_valid), // input wire s_axis_config_tvalid
    55. .s_axis_config_tdata(dds_t_data_2), // input wire [63 : 0] s_axis_config_tdata
    56. .m_axis_data_tvalid(dds_data_valid), // output wire m_axis_data_tvalid
    57. .m_axis_data_tdata(m_axis_data_tdata_2), // output wire [31 : 0] m_axis_data_tdata
    58. .m_axis_phase_tvalid(m_axis_phase_tvalid), // output wire m_axis_phase_tvalid
    59. .m_axis_phase_tdata(m_axis_phase_tdata) // output wire [31 : 0] m_axis_phase_tdata
    60. );
    61. dds100m_0 dds100m_3_inst (
    62. .aclk(clk), // input wire aclk
    63. .s_axis_config_tvalid(gen_valid), // input wire s_axis_config_tvalid
    64. .s_axis_config_tdata(dds_t_data_3), // input wire [63 : 0] s_axis_config_tdata
    65. .m_axis_data_tvalid(dds_data_valid), // output wire m_axis_data_tvalid
    66. .m_axis_data_tdata(m_axis_data_tdata_3), // output wire [31 : 0] m_axis_data_tdata
    67. .m_axis_phase_tvalid(m_axis_phase_tvalid), // output wire m_axis_phase_tvalid
    68. .m_axis_phase_tdata(m_axis_phase_tdata) // output wire [31 : 0] m_axis_phase_tdata
    69. );

    仿真结果

  3. 可以从上图中看出,输出的余弦波有明显的相位差,最后只需要将这4路并行的dds拼接起来(并转出),即可实现4*fs 采样率。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/646286
推荐阅读
相关标签
  

闽ICP备14008679号