目录

DDS基本原理

关于DDS IP核的理解

DDS IP 数字波形合成

程序设计

Matlab分析验证

遇到的问题

参考资料

DDS基本原理

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

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

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

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

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

输出频率 ,频率分辨率,最高输出频率小于

关于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模块的例化

`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 @(*)begincase(key_PINC)0:  Fword <= 'h51e;     //1Mhz  1310  每次相位增加的值  deta_theta1:  Fword <= 'hf5c;     //3Mhz  3,932endcase
endendmodule

添加约束文件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抓取的波形

Matlab分析验证

导出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

[3]dds学习笔记

[4]vivado VIO IP的用法

[5]Zynq FPGA实验

DDS的理解及IP核的使用相关推荐

  1. VIVADO 自定义封装ip核(超详细)

    版本:vivado 2018.3 vivado 自定义封装ip核,可以将ip核封装成带AXI总线,也可将ip核封装成不带AXI总线. 本次设计介绍,如何将当前工程封装成ip核(不带AXI总线) 目录 ...

  2. FPGA设计中,Vivado 调用IP核详细操作步骤

    FPGA设计中,Vivado 调用IP核详细操作步骤 今天给大侠带来了FPGA设计中,Vivado 调用IP核详细操作步骤,话不多说,手把手教学,请往下看. 首先咱们来了解一下vivado的IP核,I ...

  3. modelsim仿真quartus软件IP核错误及解决办法

    本人作为萌新.在这个寒假第一次接触FPGA,并且在仿真的过程中遇到了很多问题,并且通过互联网发现csdn上有许多大佬分享的心得与资料.虽然很多大佬的思路给了我启发,但是实现过程不够细致,导致仿真过程出 ...

  4. 【FPGA】:ip核----cordic

    文章目录 一.概述 二.端口说明 三.ip核的生成 四.示例 五.参考资料 一.概述 cordic核主要用来求三角方程, 主要功能为:  rotate 旋转 --复数旋转  translate 变 ...

  5. vivado调用IP核详细介绍

    大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注FPGA技术江湖,在"闯荡江湖"."行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢. ...

  6. vivado dds IP核笔记

    vivado dds IP核笔记 DDS IP核在vivado提供的GUI界面中,可以选择三种配置: Phase Generator and SIN/COS LUT (DDS) SIN/COS LUT ...

  7. 【vivado IP核学习】DDS complier v6.0使用“SIN/COS LUT only”

    DDS complier v6.0使用 根据使用需求,设置dds格式为 "sin cos lut only",赛灵思官方dds IP的说明文档对该模式的描述如下: When con ...

  8. 浅谈DDS IP核之频率控制字与相位控制字

    1.概述 本文是用于记录vivado中DDS IP核输出任意频率,与任意相位的关键点,即频率控制字与相位控制字的设置. 2.参考文档 <pg141-dds-compiler> <基于 ...

  9. Vivado DDS IP核使用、仿真、多相处理和相关计算验证

    第一次学,查询了很多CSDN网页,也问了组里的技术专家,得到了很多指导.把我的个人学习笔记在这里保存记录分享,如果有问题欢迎大家批评指正.也欢迎大家点赞评论收藏,一起进步! 1 DDS IP核的配置 ...

最新文章

  1. 一分钟带你了解什么是“复杂度” 算法上的O(1)、O(n)、O(logn) 这些都是什么❓❓
  2. ITOO4.1之缓存—分布式缓存Memcached学习(理论篇)
  3. C#红包波动系数·高可用性,适合企业级开发
  4. BZOJ2535 [Noi2010]Plane 航空管制 【贪心 + 堆】
  5. java 控制台输入字符串_Java控制台输入字符串及字符串比较
  6. 12-容器之间link
  7. nagios客户端nrped服务方式启动脚本
  8. 2021年中国零售OMO研究报告
  9. php array 数组函数,php array数组函数
  10. 大数据在人工智能机器人的实践应用
  11. [导入]用户控件包装器
  12. 华中科技大学计算机基地班,华中科技大学基地班管理方法.doc
  13. GridView自动排序
  14. SQL Server 查询出金额转换为大写
  15. GitHut上最受关注的Objective-C项目
  16. 关于table固定宽高以及td内容过长换行的解决办法
  17. 用好你的Control键(针对类Unix系统用户)
  18. 游戏原画是怎样的?加班多么?
  19. 极路由php插件,极路由SDK
  20. 提高系统功率密度的技术-凯利讯半导体

热门文章

  1. 重新排列数组[数组] 给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,...,xn,y1,y2,...,yn] 的格式排列。请你将数组按 [x1,y1,x2,y2,...,x
  2. 快速打开电脑计算机的快捷键,电脑自带的计算器如何快速打开和快捷键的添加...
  3. 【计算机网络】吞吐量与瓶颈链路
  4. 第一次作业:阅读与准备工作
  5. Gym - 100543G Virus synthesis Gym
  6. ai自动生成字幕_使用AI对您的会议进行现场字幕
  7. 计算机怎么查询隐藏的字体,Win10怎么隐藏不使用的字体?隐藏字体的方法
  8. 有关lpk.dll病毒的清除方法
  9. qa158.cn kuais.php,qukuaigou.skhjcf.com
  10. django将返回json里的unicode转换为中文