当前位置:   article > 正文

DDS的理解及IP核的使用_dds ip核

dds ip核

目录

DDS基本原理

 关于DDS IP核的理解

DDS IP 数字波形合成

程序设计

 Matlab分析验证

 遇到的问题

 参考资料

DDS基本原理

DDS,直接数字频率合成(Direct Digital Synthesis,简称DDS)技术,其作原理是基于数字取样及数模恢复的处理,基本框图如图1所示

如图所示,DDS技术根据奈奎斯特采样定理,基于连续正弦波的相位信息,对其进行采样量化编码形成正弦查找表存在ROM中,在合成波形时,将输入的地址相位信息映射成幅值信息,其主要过程如下:

在系统时钟fc的控制下,N位相位累加器,以Fw的步长(即频率控制字F_{cw})在0-2^{N} 内增加,结果存于相位寄存器中,相位寄存器输出与相位控制字相加,结果即为正余弦查找表的地址,正弦查找表包含一个周期即0-2\pi的正弦波的数字幅度信息,则每一位地址对应0-2\pi 内的一个相点共2^{N} 个相点,正弦查找表将输入地址的相位信息映射为输出正弦波的幅度信息(相码-幅码变换),利用DAC输出模拟正弦信号,通过低通滤波器对信号进行平滑滤波得到得到由频率控制字控制的模拟正弦信号。

 由DDS基本原理,可以得到主要参数如下:

设相位累加器字长为N位,则一个完整周期的相位分割成最小相位增量为\Delta =2\pi /2^{N}2^{N}个离散相位。参考时钟为fc,频率控制字为K

输出频率f_{0}=K*f_{c}/2^{N} ,频率分辨率f_{0}=f_{c}/2^{N},最高输出频率小于f_{c}/2

关于DDS IP核的理解

vivado版本:vivado 2019.2

①Configuration Options,有如下三种模式

Phase Generator and SIN/COS LUT (DDS):
在IP核内部集成好相位累加器与sin/cos模块,只需要在GUI中配置好需要生成的频率即可,可选择单独输出sin,或cos,也可以两个曲线正交输出。

Phase Generator only:

例化的 IP 核只有一个相位累加器,IP核不断输出相位累加的结果
SIN/COS LUT only模式:
例化的IP核只有一个sin/cos模块,需要外部不断的输入累加的相位

②System clock 系统时钟(同时也是采样频率),直接影响DDS输出波形的频率

③Number of channels 通道数,一般默认为1

④Mode of operation 分为两种模式,详情可翻阅Xilinx的官方手册,一般选择标准operation模式

标准operation模式下,输出频率频率=已知时钟频率*频率控制字(相位增量)/2^相位累加器位宽。
rasterized模式下,把分母换成可直接调控的M,方便输出一些整数频率波形。

⑤Parameter selection分为两种模式,Hardware Parameter 和 System Parameter

Hardware Parameter模式下需要选择是否需要整形噪声Noise Shaping以及输出的相位位宽核数据位宽

System Parameter模式包含Spurious Free Dynamic Range(SFDR)、Frequency Resolution(频率分辨率)、Noise Shaping三种需要配置的参数,SFDR与输出的数据位宽有关,Frequency Resolution与相位位宽有关,如下图所示,根据期望得到的数据位宽与相位位宽利用公式设定SFDR及Frequency Resolution的值,详情可参考Xilinx的官方手册

Implementation需要配置的参数如下:

①Phase Increment Programmability与Phase Offset Programmability,相位增量(即频率控制字)和相位偏移量(即相位控制字)控制模式选择,一般选择可编程模式,该模式下在valid有效时可对相位增量和相位偏移量进行配置

②Output sin、cos、sin&cos根据需要选择即可,在输出的output_data数据线上,sin\cos的位置关系如图,需要注意的是sin&cos模式下输出数据位宽增大一倍

 其余参数保持默认即可

在Summary页面上可以查看DDS IP核配置的所有信息 

DDS IP 数字波形合成

实验要求如下:

  1. 使用 Vivado的IPI工具,例化DDS IP
  2. DDS需要能够配置频率字(相位增量)
  3. DDS工作时钟使用PL的板载50MHz时钟
  4. 使用ILA工具观察波形, 使用VIO设定频率字
  5. 在ILA的波形窗口里,观察你设定的波形的周期,验证你频率字设定的正确性
  6. 把ILA波形导出到CSV文件,波形样点长度不小于2048点,在Matlab里分析波形的频谱,验证你生成波形的正确性。
  7. 使用VIO更改频率字,分别生成1MHz和3MHz的正弦波形。使用以上流程,验证你输出波形的正确性。

程序设计

DDS IP核设置如上所示

顶层模块top如下,包括DDS 、ILA、VIO三个IP核以及自行编写的Fword_set模块的例化

  1. `timescale 1ns / 1ps
  2. module top(
  3. input sys_clk,
  4. input rst_n
  5. );
  6. // -----------0、VIO按键控制频率控制字(key_PINC)-----------//
  7. wire [1:0] key_PINC;
  8. vio_0 vio_0_inst (
  9. .clk(sys_clk), // input wire clk
  10. .probe_out0(key_PINC) // output wire [1 : 0] probe_out0
  11. );
  12. // -----------1、信号频率控制模块-----------//
  13. wire [15:0] Fword;
  14. Fword_set Fword_set_inst(
  15. .clk (sys_clk),
  16. .rst_n (rst_n),
  17. .key_PINC (key_PINC),
  18. .Fword (Fword)
  19. );
  20. // -----------2、DDS模块-----------//
  21. wire [0:0] fre_ctrl_word_en ;
  22. //output
  23. wire [0:0] m_axis_data_tvalid ;
  24. wire [7:0] m_axis_data_tdata ;
  25. wire [0:0] m_axis_phase_tvalid ;
  26. wire [15:0] m_axis_phase_tdata ;
  27. assign fre_ctrl_word_en=1'b1;
  28. dds_compiler_0 dds_compiler_0_inst (
  29. .aclk(sys_clk), // input wire aclk
  30. .s_axis_config_tvalid(fre_ctrl_word_en), // input wire s_axis_config_tvalid
  31. .s_axis_config_tdata(Fword), // input wire [15 : 0] s_axis_config_tdata
  32. .m_axis_data_tvalid(m_axis_data_tvalid), // output wire m_axis_data_tvalid
  33. .m_axis_data_tdata(m_axis_data_tdata), // output wire [7 : 0] m_axis_data_tdata
  34. .m_axis_phase_tvalid(m_axis_phase_tvalid), // output wire m_axis_phase_tvalid
  35. .m_axis_phase_tdata(m_axis_phase_tdata) // output wire [15 : 0] m_axis_phase_tdata
  36. );
  37. ila_0 ila_0_inst (
  38. .clk(sys_clk), // input wire clk
  39. .probe0(key_PINC), // input wire [1:0] probe0
  40. .probe1(Fword), // input wire [15:0] probe1
  41. .probe2(m_axis_data_tdata) // input wire [7:0] probe2
  42. );
  43. endmodule

Fword_set代码如下

  1. `timescale 1ns / 1ps
  2. //通过按键来选择对应的频率控制字,进而选择对应的信号频率
  3. module Fword_set(
  4. input clk,
  5. input rst_n,
  6. input [1:0] key_PINC,
  7. output reg [15:0] Fword
  8. );
  9. // 根据IP核的summery, phase width=16bits Frequency per channel=50MHz
  10. // 输出频率的计算公式f_out=f_clk*deta_theta/(2^B)=50M* 3,932/(2^16 )= 3M
  11. always @(*)begin
  12. case(key_PINC)
  13. 0: Fword <= 'h51e; //1Mhz 1310 每次相位增加的值 deta_theta
  14. 1: Fword <= 'hf5c; //3Mhz 3,932
  15. endcase
  16. end
  17. endmodule

添加约束文件top.xdc

  1. set_property PACKAGE_PIN U18 [get_ports sys_clk]
  2. set_property IOSTANDARD LVCMOS33 [get_ports sys_clk]
  3. set_property PACKAGE_PIN N15 [get_ports rst_n]
  4. set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
  5. #时序约束
  6. create_clock -period 20.000 -name sys_clk -waveform {0.000 10.000} [get_ports sys_clk]

对该工程进行synthesis及implementation,生成比特流下载验证,本次实验用到的是ALINX黑金FPGA开发板Xilinx ZYNQ7020系列开发板

key_PINC=0,ILA抓取的波形

 key_PINC=1,ILA抓取的波形

 Matlab分析验证

导出ILA抓取的波形,利用matlab分析验证频率,代码如下:

  1. filename = 'C:\zynq\project_1\project_1.srcs\csv\iladata.csv';
  2. M = readmatrix(filename,'Range','E3:E4098'); %读取4096个数据
  3. fs = 50000000; %采样率
  4. N = length(M); %采样点数
  5. n = 0:N-1;
  6. t = n/fs; %时间序列
  7. f = n*fs/N; %频率序列
  8. Y = fft(M); %对M进行FFT变换
  9. fshift = (-N/2:N/2-1)*fs/N;
  10. y = fftshift(Y); %以0为中心循环平移
  11. y_abs = abs(y);
  12. figure;
  13. subplot(2,1,1);
  14. plot(t,M); %时域波形
  15. title('时域波形');xlabel('时间/s');ylabel('幅值');
  16. subplot(2,1,2);
  17. plot(fshift,y_abs); %频域波形
  18. title('频域波形');xlabel('频率/s');ylabel('幅值');

key_PINC=0,由图可知输出频率为1Mhz

 key_PINC=1,由图可知输出频率为3Mhz

 由上述可知,输出频率正确

遇到的问题

问题:VIVADO中调用ILA IP核进行数据抓取分析,硬件上电运行程序ILA无法运行,[Labtools 27-3361] The debug hub core was not detected.

vivado给出了如下解决方案

Resolution:

1. Make sure the clock connected to the debug hub (dbg_hub) core is a free running clock and is active.

2.Make sure the BSCAN_SWITCH_USER_MASK device property in Vivado Hardware Manager reflects the user scan chain setting in the design and refresh the device.  To determine the user scan chain setting in the design, open the implemented design and use 'get_property C_USER_SCAN_CHAIN [get_debug_cores dbg_hub]'.

For more details on setting the scan chain property, consult the Vivado Debug and Programming User Guide (UG908).

参考资料

[1]高泽溪,高成.直接数字频率合成器(DDS)及其性能分析[J].北京航空航天大学学报,1998(05):121-124.

[2]https://www.xilinx.com/support/documentation/ip_documentation/dds_compiler/v6_0/pg141-dds-compiler.pdf

[3]dds学习笔记

[4]vivado VIO IP的用法

[5]Zynq FPGA实验

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

闽ICP备14008679号