赞
踩
目录
DDS,直接数字频率合成(Direct Digital Synthesis,简称DDS)技术,其作原理是基于数字取样及数模恢复的处理,基本框图如图1所示
如图所示,DDS技术根据奈奎斯特采样定理,基于连续正弦波的相位信息,对其进行采样量化编码形成正弦查找表存在ROM中,在合成波形时,将输入的地址相位信息映射成幅值信息,其主要过程如下:
在系统时钟fc的控制下,N位相位累加器,以Fw的步长(即频率控制字)在0- 内增加,结果存于相位寄存器中,相位寄存器输出与相位控制字相加,结果即为正余弦查找表的地址,正弦查找表包含一个周期即0-2的正弦波的数字幅度信息,则每一位地址对应0-2 内的一个相点共 个相点,正弦查找表将输入地址的相位信息映射为输出正弦波的幅度信息(相码-幅码变换),利用DAC输出模拟正弦信号,通过低通滤波器对信号进行平滑滤波得到得到由频率控制字控制的模拟正弦信号。
由DDS基本原理,可以得到主要参数如下:
设相位累加器字长为N位,则一个完整周期的相位分割成最小相位增量为的个离散相位。参考时钟为fc,频率控制字为K
输出频率 ,频率分辨率,最高输出频率小于
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核设置如上所示
顶层模块top如下,包括DDS 、ILA、VIO三个IP核以及自行编写的Fword_set模块的例化
- `timescale 1ns / 1ps
- module top(
- input sys_clk,
- input rst_n
- );
-
- // -----------0、VIO按键控制频率控制字(key_PINC)-----------//
- wire [1:0] key_PINC;
- vio_0 vio_0_inst (
- .clk(sys_clk), // input wire clk
- .probe_out0(key_PINC) // output wire [1 : 0] probe_out0
- );
-
- // -----------1、信号频率控制模块-----------//
- wire [15:0] Fword;
- Fword_set Fword_set_inst(
- .clk (sys_clk),
- .rst_n (rst_n),
- .key_PINC (key_PINC),
- .Fword (Fword)
- );
- // -----------2、DDS模块-----------//
-
- wire [0:0] fre_ctrl_word_en ;
- //output
- wire [0:0] m_axis_data_tvalid ;
- wire [7:0] m_axis_data_tdata ;
- wire [0:0] m_axis_phase_tvalid ;
- wire [15:0] m_axis_phase_tdata ;
-
- assign fre_ctrl_word_en=1'b1;
- dds_compiler_0 dds_compiler_0_inst (
- .aclk(sys_clk), // input wire aclk
- .s_axis_config_tvalid(fre_ctrl_word_en), // input wire s_axis_config_tvalid
- .s_axis_config_tdata(Fword), // input wire [15 : 0] s_axis_config_tdata
- .m_axis_data_tvalid(m_axis_data_tvalid), // output wire m_axis_data_tvalid
- .m_axis_data_tdata(m_axis_data_tdata), // output wire [7 : 0] m_axis_data_tdata
- .m_axis_phase_tvalid(m_axis_phase_tvalid), // output wire m_axis_phase_tvalid
- .m_axis_phase_tdata(m_axis_phase_tdata) // output wire [15 : 0] m_axis_phase_tdata
- );
- ila_0 ila_0_inst (
- .clk(sys_clk), // input wire clk
- .probe0(key_PINC), // input wire [1:0] probe0
- .probe1(Fword), // input wire [15:0] probe1
- .probe2(m_axis_data_tdata) // input wire [7:0] probe2
- );
- endmodule
Fword_set代码如下
- `timescale 1ns / 1ps
- //通过按键来选择对应的频率控制字,进而选择对应的信号频率
- module Fword_set(
- input clk,
- input rst_n,
- input [1:0] key_PINC,
- output reg [15:0] Fword
- );
-
- // 根据IP核的summery, phase width=16bits Frequency per channel=50MHz
- // 输出频率的计算公式f_out=f_clk*deta_theta/(2^B)=50M* 3,932/(2^16 )= 3M
- always @(*)begin
- case(key_PINC)
- 0: Fword <= 'h51e; //1Mhz 1310 每次相位增加的值 deta_theta
- 1: Fword <= 'hf5c; //3Mhz 3,932
- endcase
- end
-
- endmodule
添加约束文件top.xdc
- set_property PACKAGE_PIN U18 [get_ports sys_clk]
- set_property IOSTANDARD LVCMOS33 [get_ports sys_clk]
-
-
- set_property PACKAGE_PIN N15 [get_ports rst_n]
- set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
-
-
- #时序约束
- 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抓取的波形
导出ILA抓取的波形,利用matlab分析验证频率,代码如下:
- filename = 'C:\zynq\project_1\project_1.srcs\csv\iladata.csv';
- M = readmatrix(filename,'Range','E3:E4098'); %读取4096个数据
- fs = 50000000; %采样率
- N = length(M); %采样点数
- n = 0:N-1;
- t = n/fs; %时间序列
- f = n*fs/N; %频率序列
- Y = fft(M); %对M进行FFT变换
- fshift = (-N/2:N/2-1)*fs/N;
- y = fftshift(Y); %以0为中心循环平移
- y_abs = abs(y);
- figure;
- subplot(2,1,1);
- plot(t,M); %时域波形
- title('时域波形');xlabel('时间/s');ylabel('幅值');
- subplot(2,1,2);
- plot(fshift,y_abs); %频域波形
- 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。