博文目录

  • 写在前面
  • 正文
    • 设计要求
    • IP核配置
      • 定制输出数据位宽
      • 定制相位位宽(或频率分辨率)
      • 输出频率
      • 输出正余弦选择以及数据格式
      • 其他设置
    • 电路设计
    • 行为仿真
  • 参考资料
  • 交个朋友

写在前面

数据手册
博客首页
花了几个小时了解并写了这篇博客,不得不说的是了解的还是皮毛而已,但尽力写的详细点,这比较适合新手,老手可以忽略繁琐的部分。
注:学习交流使用!

正文

本文来自于一个CSDN博友的求助,由于我以前也没做过,因此抽了点时间,参考数据手册PG141以及各大互联网资源,简单写了下这篇博文,仅供参考 。

设计要求

  • 生成4种基本波形,例如正弦波,方波等,波形形状和参数自定;
  • 输出4中基本波形的任意叠加结果,供16种波形可供选择;

虽然要求这么多,但本篇博文仅仅提供基础操作,其他的可以自行实现。

IP核配置


定制输出数据位宽

这里的输出数据指的是输出的波形数据,其位宽相关参数介绍如下:


可见,输出数据宽度和SFDR以及Noise Shaping有关,你可先不必知道Noise Shaping和SFDR是什么?只需要暂时知道在IP核定制时需要选择即可,如果Noise Shaping选择了None and Dithering,则输出数据宽度为:

如果为Taylor:

而Spurious Free Dynamic Range (SFDR)翻译为无杂散动态范围,和输出数据宽度以内部总线宽度以及各种实现策略有关;
假设我需求的数据宽度为10位,Noise Shaping选为None,则SFDR为60,输入IP定制页面:

查看输出是否为10bit:


定制相位位宽(或频率分辨率)

根据数据手册对频率分辨率的描述:

频率分辨率:以赫兹为单位指定,指定最小频率分辨率,用于确定相位累加器使用的相位宽度及其相关的相位增量(PINC)和相位偏移(POFF)值。较小的值可提供较高的频率分辨率,并且需要较大的累加器。较大的值会减少硬件资源。根据噪声整形的选择,可以增加相位宽度,并且频率分辨率高于指定的分辨率。对于光栅化模式(rasterized mode),频率分辨率由系统时钟、通道数和所选模数固定。
从这段描述,我们得出信息,频率分辨率可以用来控制相位位宽。
如果操作模式选择标准模式,如下IP 核定制页面:


频率分辨率可以这样计算:


我们先给定需求的相位宽度,又已知系统频率值,根据公式就可以算出频率分辨率;将频率分辨率代入IP核定制页面,即可自动得到相位宽度。
其实从上式也可以直接推出相位宽度:

本例我们的系统频率为100MHz,如果想要相位宽度为16位,则频率 分辨率为:

在IP核定制页面,如下图,我们输入频率分辨率的值:

查看相位宽度为16位:


上面选择的是标准模式,如果选择另一种模式呢?
Rasterized Mode of Operation:光栅化操作模式;
我们可以根据下面公式得到频率分辨率,但和相位宽度没有直接关系,为了知识完整性,简介如下:


在IP核定制页面提现如下:


输出频率

本示例选择的是单通道,也即通道数为1,因此输出频率也只能选择一个:

输出频率值也不是随便选择的,而是有其范围的,例如我输入105MHz,则通过不了:

提示超出范围,范围为(0,100).

输出正余弦选择以及数据格式

可以在IP核定制页面选择输出正弦还是余弦还或者是都输出:

本示例选择输出正余弦,由于输出采用的是axi总线,因此输出数据位于M_AXIS_DATA_TDATA中,那么正余弦输出结果是如何组合成M_AXIS_DATA_TDATA的呢?

数据手册给出解释:

输出DATA通道TDATA结构将正弦和余弦输出字段符号扩展到下一个字节边界,然后以最低有效部分的余弦进行连接,以创建m_axis_data_tdata。如果仅选择正弦或余弦之一,则将其符号扩展并放入m_axis_data_tdata的最低有效部分。

下图显示了这三种配置的TDATA的内部结构。正交输出,仅余弦和仅正弦。例如,在图中显示了11位输出,符号扩展到16位。 <<<表示符号扩展名:

因此我们可以这么认为,由于存在扩展符号位的关系,我们可以提取低一半的数据为COS,高一半的数据未SIN。

其他设置

有了上面的定制参数,输出波形是没有问题了,至于其他的定制参数,本文选择默认:




点击OK,等待IP核定制完成。

电路设计

本示例设计十分简单,就是单纯例化下IP核:

复制例化模板:

给出设计文件:

`timescale 1ns / 1ps
//
// Company:
// Engineer: Reborn Lee
// Module Name: waveform_gen
// Additional Comments:
//
//`timescale 1ns / 1ps
//
// Company:
// Engineer: Reborn Lee
// Module Name: waveform_gen
// Additional Comments:
//
//module waveform_gen(input i_clk,output o_data_valid,output [31 : 0] o_data,output o_phase_valid,output [15 : 0] o_phase);dds_compiler_0 inst_dds (.aclk(i_clk),                                // input wire aclk.m_axis_data_tvalid(o_data_valid),    // output wire m_axis_data_tvalid.m_axis_data_tdata(o_data),      // output wire [31 : 0] m_axis_data_tdata.m_axis_phase_tvalid(o_phase_valid),  // output wire m_axis_phase_tvalid.m_axis_phase_tdata(o_phase)    // output wire [15 : 0] m_axis_phase_tdata
);endmodule

行为仿真

仿真程序也仅仅例化设计文件,设计下系统频率即可:

`timescale 1ns / 1ps
//
// Company:
// Engineer: Reborn Lee
// Create Date: 2020/06/03 17:25:26
// Module Name: waveform_gen_tb
//module waveform_gen_tb();reg clk;wire o_data_valid;wire [15 : 0] o_data;wire o_phase_valid;wire [31 : 0] o_phase;initial beginclk = 0;forever begin# 5 clk = ~clk;endendwaveform_gen inst_waveform_gen(.i_clk         (clk),.o_data_valid  (o_data_valid),.o_data        (o_data),.o_phase_valid (o_phase_valid),.o_phase       (o_phase));endmodule

执行行为仿真:

注意,仿真时间可以在此确定:

仿真波形:

正余弦拆开:


选择高16位作为sin。
下面选择有符号数显示:

同时选择模拟显示:

之后你会发现正余弦显示波形相对于整体太平坦,以致于看起来像是直线,这是因为显示范围太大了导致的:

改下显示的坐标幅度范围:


显示正常了。

就这样吧,提供了基本操作,更多的原理以及实现,举一反三吧!

参考资料

参考资料1
参考资料2
参考资料3

交个朋友

FPGA/IC技术交流2020

FPGA设计心得(9)基于DDS IP核的任意波形发生器设计相关推荐

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

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

  2. 74ls390设计任意进制计数器_利用数字频率合成技术设计高速任意波形发生器(上)...

    波形发生器为常用器件,正因如此,波形发生器具备较强现实意义.对于波形发生器,诸多朋友均存在一定兴趣.此外,小编在往期带来诸多波形发生器相关文章,热爱波形发生器的朋友可翻阅哦.本文中,小编对于波形发生器 ...

  3. 频谱仪的更改ip_【正点原子FPGA连载】第五十一章 基于FFT IP核的音频频谱仪-摘自【正点原子】开拓者 FPGA 开发指南 (amobbs.com 阿莫电子论坛)...

    本帖最后由 正点原子 于 2020-10-24 15:19 编辑 203429z6c3os33t8albi33.png (66.36 KB) 2019-7-28 15:14 上传 第五十一章 基于FF ...

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

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

  5. 11,基于JESD204 IP核的设计实现方法

    本篇博主参考了xilinx官方JESD204 IP核的数据手册PG066,具体介绍基于该IP核的JESD204B数据传输实现方法~ 第一次设计 在vivado开发软件中例化JESD204 IP核时,x ...

  6. 基于vivado DDS ip核的DDS信号发生器(可调频调相)

    基于Vivado DDS ip核的DDS信号发生器: 在Vivado软件中调出DDS ip核进行设置,很多参数可以参考xilinx官方手册,比较重要的是System Clock系统时钟和Phase W ...

  7. FPGA之道(14)IP核介绍

    前言 IP核是FPGA开发者的老朋友了,可以这么说,只要是做FPGA开发的,都会利用FPGA的IP核进行开发设计,这不像IC设计,什么都要自己设计,使用IP可以加快产生开发进程. 下面摘自<FP ...

  8. 征战FPGA之使用clk_wiz的IP核获取任意频率时钟

    一.前言 clk时钟在FPGA开发中具有举足轻重的作用,不管是串口UART,HDMI还是对各种视频编码芯片的驱动等都用到了clk.最近也在学习FPGA的跨时钟域,因此想着先学习一下FPGA的时钟生成. ...

  9. xilinx DDS ip 核测试使用

    参考博客:数字信号处理(一):Xilinx Vivado DDS IP核设计实例 DDS ip 0设置方法,其他默认设置. DDS 1  设置情况,其他默认设置. 频率控制字: 主程序: `times ...

最新文章

  1. [转] L1 L2范数
  2. linux shell写服务,Linux shell编写系统服务脚本
  3. VM虚拟机常见问题之五--网络相关的问题
  4. /proc/asound详细介绍
  5. apache php显示成列表,centos中设置apache显示目录列表
  6. android listview 向上自动滚动效果,Android通过代码控制ListView上下滚动的方法
  7. 分布式系统关联查询_一文详解分布式系统 | 留言送书
  8. C# lambda与表达式树
  9. 脏数据-数据量纲差异
  10. 元素(Element)
  11. C语言实现去掉字符串中重复的字符
  12. java 盲水印_3步搞定图像盲水印?试试云开发扩展能力
  13. 计算机网络常见面试题总结
  14. 学校计算机组管理制度,校园一卡通管理结算中心机房管理制度
  15. KingbaseES R6 集群手工配置VIP案例
  16. 用自己的APP打开微信和支付宝付款码和扫一扫界面
  17. java解密pdf文档,用于加密/解密pdf文件的Java API
  18. 2018春招总结(Java后端),干货满满
  19. 工业交换机堆叠技术的优缺点
  20. JavaScript中常用数组方法总结

热门文章

  1. XAMPP 相关设置(linux下的)
  2. cod cash on delivery
  3. 使用diamond2的一些问题的解决
  4. 以咨询顾问为我终生职业(转)
  5. python中module用法_Python学习之module用法
  6. python自动登录教程_python实现校园网自动登录的示例讲解
  7. python下载不下来_Python不能下载zip文件,而Browser/Selenium可以下载,这是为什么?...
  8. dataframe iloc_DataFrame
  9. visual studio installer正在提取文件_并非危言耸听,赶紧检查自己网盘内的私密文件...
  10. timer 公司内部用法