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

1 DDS IP核的配置

创建工程,在IP核配置页面选择DDS compiler 6.0。对IP核进行配置。

如图所示配置参数。

Configuration(配置)页面,Configuration Options 有三个选项,分别是相位产生器和SIN COS查找表、单独的相位产生器、单独的sin/cos,一般选择第一个,利用IP核生成一个频率相位可调的正余弦发生器。

将System Clock系统时钟设置为250MHz,Number of Channels通道数设为1,Parameter Selection(参数选择)主要分为Hardware Parameter 和 System Parameter两种。

在System Parameter模式下,配置页面需要配置系统参数设置。共有Spurious Free Dynamic Range(SFDR)、Frequency Resolution(频率分辨率)、Noise Shaping(需不需要整形噪声选择自动模式就行)三项。其中SFDR与输出数据位宽相关,见手册表格。

Hardware Parameter模式下,Noise Shaping噪声整形选项一般选择None。Phase width指的是输出的相位宽度信息,output width 指的是输出的数据位宽;相位位宽选择32位,数据位宽采用16位。

Implementation页面,Phase Increment Programmability与Phase Offset Programmability,相位增量(即频率控制字)和相位偏移量(即相位控制字)控制模式选择,一般选择可编程模式,该模式下在valid有效时可对相位增量和相位偏移量进行配置;Output sin、cos、sin&cos根据需要选择即可。如图所示:

在Summary中检查配置无误:

2 单路正弦信号的产生

事实上,任何周期信号都可以分解为一系列正弦或余弦信号之和,正弦信号是关于相位的一个周期函数。相位和幅值的一一对应关系就好比存储器中地址和存储内容的关系,如果把一个周期内每个相位对应的幅度值存入存储器当中,那么对于任意频率的正弦信号,在任意时刻,只要已知相位Φ(t),也就知道地址,就可通过查表得到s(t)。

相位累加器在每个时钟脉冲输入时,把频率控制字累加一次,相位累加器的输出数据就是信号的相位,用输出的数据作为波形存储器(ROM)的相位取样地址,这样就可以把存取在波形存储器内的波形抽样值经查找表查处,完成相位到幅值的转换。频率控制字相当于Φ(t)中的2πfc,相位控制字相当于Φ(t)中的θ0。

由于相位累加器字长的限制,相位累加器累加到一定值后,其输出将会溢出,这样波形存储器的地址就会循环一次,即意味着输出波形循环一周。故改变频率控制字即相位增量,就可以改变相位累加器的溢出时间,在时钟频率不变的条件下就可以改变输出频率。改变查表寻址的时钟频率,同样也可以改变输出波形的频率。

为了获得较高的频率分辨率,则只有增加相位累加器的字长N。

这部分参考了部分CSDN内容。

原文链接:https://blog.csdn.net/u014586651/article/details/88830115

相位累加器的字长为N,就将一个完整周期的正弦波的相位均匀分割为个离散相位。如果想将频率提高到2倍 = 点数变为1/2(隔一个点输出一个波形)。事实上,DDS满足:

其中,fout是输出频率,fclk是系统工作时钟的频率,FTW是频率控制字,N是相位累加器的位数。对于一个IP核生成一路信号,其满足:

其中,fout为输出频率,fclk为输入ip的时钟。Δθ为相位增量(频率控制字),Bθ(n)为频率精度位数、输出相位数据的宽度(Phase Width),计算公式满足:

其中Δf为频率精度,对应IP核中Frequncy Resolution。

相位控制字满足:

其中θ为相位偏移量,N为相位累加器的位数。

在IP Symbol中检查IP核的端口,对IP核进行配置和例化。

代码如下所示:

module simu();reg clk;reg [63:0]pinc_sin;reg en_pinc;initial beginpinc_sin={32'd715827883,32'h0fffffff};en_pinc=1; //必须为1才有效clk=0;endalways #2 clk=~clk;wire [15:0]dout_dds;wire data_tvalid;dds_compiler_0 name(.aclk(clk),.s_axis_config_tvalid(en_pinc),//控制字有效信号,为1时控制字才有用。.s_axis_config_tdata(pinc_sin),.m_axis_data_tvalid(data_tvalid),.m_axis_data_tdata(dout_dds));endmodule

其中,pinc_sin采用位拼接的方式配置频率控制字和相位控制字,本实验初相偏差π/3,根据相位控制字计算公式,poff=(π/3)*2^32/2π= 32'd715827883,频率控制字选择32'h0fffffff,仿真可以输出正弦波形。

3 多相DDS

在第二节中已经实现了输出250MHz的正弦波形,现在将使用多相处理,用四路250MHz的正弦波形构建一个1GHz的正弦波形。

基本原理如上图所示,在一个上升沿内并行产生四个相位,再进行相应的相幅转换。图中1-4分别代表四路信号。由图可知,对于一路信号而言,其频率控制字FTW’=4FTW,每一路信号之间有一个FTW的相位差。

配置四个与第二节完全相同的DDS核:

simu代码如下所示:

module simu();reg clk;reg [63:0]pinc_sin_0;reg [63:0]pinc_sin_1;reg [63:0]pinc_sin_2;reg [63:0]pinc_sin_3;reg en_pinc_0;reg en_pinc_1;reg en_pinc_2;reg en_pinc_3;reg [15:0]q0;//存储波形数据输出为csv文件integer file_0;integer file_1;integer file_2;integer file_3;initial begin//对四个dds赋值,每个间隔dds相差FTW。频率控制字FTW'=4FTWpinc_sin_0={32'd715827883,32'h03fffffc};  //h0fffffff=d268435455;h00ffffff=16777215;h03fffffc=d67108860pinc_sin_1={32'd732605098,32'h03fffffc};pinc_sin_2={32'd749382313,32'h03fffffc};pinc_sin_3={32'd766159528,32'h03fffffc};en_pinc_0=16'd1;en_pinc_1=16'd1;en_pinc_2=16'd1;en_pinc_3=16'd1; //必须为1才有效clk=16'd0;q0=16'd0;file_0=$fopen("E:/study2022/dds2/data_0.csv","w");file_1=$fopen("E:/study2022/dds2/data_1.csv","w");file_2=$fopen("E:/study2022/dds2/data_2.csv","w");file_3=$fopen("E:/study2022/dds2/data_3.csv","w");endalways #2 clk=~clk;wire [15:0]dout_dds_0;wire [15:0]dout_dds_1;wire [15:0]dout_dds_2;wire [15:0]dout_dds_3;wire data_tvalid_0;wire data_tvalid_1;wire data_tvalid_2;wire data_tvalid_3;always @(posedge clk)beginif(q0 < 16'd4000)begin$fwrite(file_0,"%h\n",dout_dds_0);$fwrite(file_1,"%h\n",dout_dds_1);$fwrite(file_2,"%h\n",dout_dds_2);$fwrite(file_3,"%h\n",dout_dds_3);q0 <= q0 + 16'd1;endelse beginq0 <= q0;$fclose(file_0);$fclose(file_1);$fclose(file_2);$fclose(file_3);endenddds_compiler_0 name0(.aclk(clk),.s_axis_config_tvalid(en_pinc_0),     //相位控制字有效信号,同。.s_axis_config_tdata(pinc_sin_0),.m_axis_data_tvalid(data_tvalid_0),.m_axis_data_tdata(dout_dds_0));dds_compiler_1 name1(.aclk(clk),.s_axis_config_tvalid(en_pinc_1),     //相位控制字有效信号,同。.s_axis_config_tdata(pinc_sin_1),.m_axis_data_tvalid(data_tvalid_1),.m_axis_data_tdata(dout_dds_1));dds_compiler_2 name2(.aclk(clk),.s_axis_config_tvalid(en_pinc_2),     //相位控制字有效信号,同。.s_axis_config_tdata(pinc_sin_2),.m_axis_data_tvalid(data_tvalid_2),.m_axis_data_tdata(dout_dds_2));dds_compiler_3 name3(.aclk(clk),.s_axis_config_tvalid(en_pinc_3),     //相位控制字有效信号,同。.s_axis_config_tdata(pinc_sin_3),.m_axis_data_tvalid(data_tvalid_3),.m_axis_data_tdata(dout_dds_3));  Endmodule

代码中对频率控制字、相位控制字进行了相关配置,并将输出的四路信号的相关点的数据存为csv文件。

实验波形图如图所示:

计算验证一下,FTW’=4TFW=67108860,fclk=250*10^6,N=32。

理论上的fout=FTW’*fclk/2^N=67108860*250*10^6/2^32=3.9062*10^6Hz。

观察波形图,输出信号周期为500ns-244ns=256ns,fout=1/256ns=3.9062*10^6Hz,相吻合,频率控制字设置无误。

相位初相能观察到π/3的初相,不同信号之间能观察到一个FTW的相差,频率控制字设置无误。

将保存的信号csv文件导入Matlab,对其进行交叉拼接处理,并绘制拼好后的正弦数组的频谱图。

相关Matlab代码如下所示:

%读取波形数值%num_0 = xlsread('E:/study2022/dds/data_0.xlsx',1,'B1:B511')%num_1 = xlsread('E:/study2022/dds/data_1.xlsx',1,'B1:B511')%num_2 = xlsread('E:/study2022/dds/data_2.xlsx',1,'B1:B511')%num_3 = xlsread('E:/study2022/dds/data_3.xlsx',1,'B1:B511')%16进制转化为10进制数data_0=hex2dec(data0)data_1=hex2dec(data1)data_2=hex2dec(data2)data_3=hex2dec(data3)%交叉合并(拼接)merge=[data_0'data_1'data_2'data_3'];merge=reshape(merge,[],1); %[]=length(data_0)+length(data_1)+length(data_2)+length(data_3)%把矩阵merge转化为csv文件csvwrite('E:/study2022/dds2/merge.csv',merge);%画图for i=1:15960if merge(i)>32768merge(i)=merge(i)-65536;  %将elsei=i+1;endendplot(merge)%对画出的图像做FFT观察频谱ff=20*log10(abs(fft(merge(1:15960))));%ff2=abs(fft(merge(1:15960)));plot(ff)%plot(ff2)

其中,读取波形数值部分可以用MATLAB自带的导入工具:

绘图结果如下图所示:

N个采样点经过FFT变换后得到N个点的以复数形式记录的FFT结果。

假设采样频率为Fs,采样点数为N。那么FFT运算的结果就是N个复数(或N个点),每一个复数就对应着一个频率值以及该频率信号的幅值和相位。

第一个点对应的频率为0Hz(即直流分量),最后一个点N的下一个点对应采样频率Fs。其中任意一个采样点n所代表的信号频率:Fn=(n-1)*Fs/N。

对实验数据进行验证,理论上输出频率为fout=3.9062MHz,根据图可观察后计算,真实输出频率fout=10^6*63/16000=3.9375MHz,考虑到绘图误差,数据在可控范围内,整体实验成功。

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

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

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

  2. vivado dds IP核笔记

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

  3. xilinx DDS ip 核测试使用

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

  4. 弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩

    弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩 IP核:知识产权核,指某一方提供的.形式为逻辑单元的可重用模块.IP核通常已经通过了设计验证,设计人员以IP核为基础进行设计,可以 ...

  5. modelsim 独立仿真vivado fifo IP核

    1.前言 vivado内自带仿真器,或者可以通过vivado启动第三方仿真工具,联合仿真.但是很多时候,我们希望脱离vivado,利用modelsim或者vcs等第三方仿真工具,高效地仿真.本文介绍如 ...

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

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

  7. 【FPGA】 十二、Vivado DDS IP核实现扫频信号

    文章目录 前言 一.DDS IP核概述 二.DDS IP核配置 三.调用DDS IP核 总结 前言 在我前面的工程中,都是一些比较通用的设计工程,没有用到哪一家的IP核,所以代码具有很好的移植性:今天 ...

  8. vivado调用IP核详细介绍

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

  9. vivado ROM IP核简单使用

    vivado ROM IP核简单使用 vivado配置 下面选择数据的存储深度和数据的位宽 ROM内存储的数据由coe文件初始化 下面是初始化coe文件的内容 memory_initializatio ...

最新文章

  1. 如何创建共享文件夹?2009.6.10 三 紧张后 高兴
  2. 平行志愿计算机录取顺序,2020平行志愿的录取顺序你知道吗?
  3. Mysql 中的事件//定时任务
  4. Flask爱家租房--订单支付(支付过程)
  5. Python enumerate 函数 - Python零基础入门教程
  6. 2021十大金融科技趋势
  7. java对图像的解压_java – 将图像解压缩到blobstore中
  8. Available Packages检索框里显示为nothing to show的解决办法
  9. 什么是http协议??
  10. android 修复工具,安卓手机修复工具下载 牛学长安卓手机修复工具(安卓手机修复助手) v2.4.0.15 官方免费安装版 下载-脚本之家...
  11. java网络编程 - TCP/IP四层模型
  12. x99 芯片服务器,X99果然是支持PCI-E拆分的啊
  13. openGL学习之旅(一)DEV-C++安装GLUT
  14. 【web前端面试题整理07】我不理解表现与数据分离
  15. APS供应链计划管理有何功能?其目的和意义又是什么?
  16. MarkdownPad2注册码——亲测有效
  17. 奶茶封口膜-市场现状及未来发展趋势
  18. 会解方程会画图的超级计算器
  19. 移动通信中的信道编码基础
  20. Java干货的“聚宝盆”!各种细节!!

热门文章

  1. ASCII码中不同字符分类、含义及相关技巧
  2. 用Python做了一个 盯盘机器人,股票价格实时监控,还能邮件通知你!
  3. 线性颜色空间与伽马颜色空间
  4. Symantec更新服务器
  5. 权威解释----如何选择羽毛球?(摘自《羽毛球竞赛规则问答》北京体育大学出版社
  6. 修改win7开机登陆界面背景图片
  7. Anaconda Navigator Applications 缺少Notebook等应用
  8. 电路图中R1,D1有什么作用 ?
  9. 读《消失的真实》有感
  10. 2018年互联网生死场,京东网易ofo知乎等公司裁员,没有一丝防备