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

这篇具有很好参考价值的文章主要介绍了Vivado DDS IP核使用、仿真、多相处理和相关计算验证。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

1 DDS IP核的配置

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

vivado中ddsip核详解,tcp/ip,fpga开发,学习

如图所示配置参数。

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与输出数据位宽相关,见手册表格。

vivado中ddsip核详解,tcp/ip,fpga开发,学习

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

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

vivado中ddsip核详解,tcp/ip,fpga开发,学习

在Summary中检查配置无误:

vivado中ddsip核详解,tcp/ip,fpga开发,学习

2 单路正弦信号的产生

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

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

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

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

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

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

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

vivado中ddsip核详解,tcp/ip,fpga开发,学习

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

vivado中ddsip核详解,tcp/ip,fpga开发,学习

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

vivado中ddsip核详解,tcp/ip,fpga开发,学习

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

相位控制字满足:

vivado中ddsip核详解,tcp/ip,fpga开发,学习

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

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

代码如下所示:

module simu(
  );
  
  reg clk;
  reg [63:0]pinc_sin;
  reg en_pinc;
  
  initial begin
  pinc_sin={32'd715827883,32'h0fffffff};
  en_pinc=1; //必须为1才有效
  clk=0;
  end
  
  always #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,仿真可以输出正弦波形。

vivado中ddsip核详解,tcp/ip,fpga开发,学习

3 多相DDS

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

vivado中ddsip核详解,tcp/ip,fpga开发,学习

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

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

vivado中ddsip核详解,tcp/ip,fpga开发,学习

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'=4FTW

  pinc_sin_0={32'd715827883,32'h03fffffc};  
  //h0fffffff=d268435455;h00ffffff=16777215;h03fffffc=d67108860

  pinc_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");

  end



  always #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)begin

    if(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;

    end

    else begin

        q0 <= q0;

        $fclose(file_0);

        $fclose(file_1);

        $fclose(file_2);

        $fclose(file_3);

    end

  end



dds_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文件。

实验波形图如图所示:

vivado中ddsip核详解,tcp/ip,fpga开发,学习

计算验证一下,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的相差,频率控制字设置无误。

vivado中ddsip核详解,tcp/ip,fpga开发,学习

vivado中ddsip核详解,tcp/ip,fpga开发,学习

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

vivado中ddsip核详解,tcp/ip,fpga开发,学习

相关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:15960

    if merge(i)>32768

        merge(i)=merge(i)-65536;  %将

    else

    i=i+1;

    end

end

plot(merge)



%对画出的图像做FFT观察频谱

ff=20*log10(abs(fft(merge(1:15960))));

%ff2=abs(fft(merge(1:15960)));



plot(ff)

%plot(ff2)

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

vivado中ddsip核详解,tcp/ip,fpga开发,学习

绘图结果如下图所示:

vivado中ddsip核详解,tcp/ip,fpga开发,学习

 vivado中ddsip核详解,tcp/ip,fpga开发,学习

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,考虑到绘图误差,数据在可控范围内,整体实验成功。文章来源地址https://www.toymoban.com/news/detail-785964.html

到了这里,关于Vivado DDS IP核使用、仿真、多相处理和相关计算验证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

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

    基于Vivado DDS ip核的DDS信号发生器: 在Vivado软件中调出DDS ip核进行设置,很多参数可以参考xilinx官方手册,比较重要的是System Clock系统时钟和Phase Widh相位宽度的设置,这是最终得到波形的频率和相位所需要的基础参数,在这里我分别设置为50Mhz和16bit。 在implementation页面设置频

    2024年02月12日
    浏览(38)
  • 【FPGA】 十二、Vivado DDS IP核实现扫频信号

    文章目录 前言 一、DDS IP核概述 二、DDS IP核配置 三、调用DDS IP核 总结     在我前面的工程中,都是一些比较通用的设计工程,没有用到哪一家的IP核,所以代码具有很好的移植性;今天我就来讲一下基于Xilinx厂家的芯片做一期DDS的设计与验证,这里我所采用的EDA工具是Viva

    2024年02月03日
    浏览(47)
  • Vivado关于dds IP核实现任意频率的正余弦波输出

    目录 一、dds IP核的创建与参数配置 1、创建dds IP核 2、参数配置 3、可编程输入设置 4、详细的设置 5、输出频率设置 6、配置总结 7、输出增量和对应频率总结 二、相关数据计算 1、DDS输出波形频率fout、相位增量∆Θ、频率分辨率∆f、相位位宽BΘ(n)相关函数计算 2、举例 三、

    2024年02月02日
    浏览(47)
  • 手把手教你在Vivado创建一个RAM的IP核并使用ILA工具验证

    RAM的英文全称是Random Access Memory,即随机存取存储器,它可以随时把数据写入任一指定地址的存储单元,也可以随时从任一指定地址中读出数据,其读写速度是由时钟频率决定的。RAM主要用来存放程序及程序执行过程中产生的中间数据、运算结果等。 单端口:只有一个端口,

    2024年01月25日
    浏览(57)
  • 关于FPGA(Vivado)后仿真相关问题的探讨

            FPGA后仿真时,相比于功能仿真增加了门延时和布线延时,相对于门级仿真增加了布线延时,因此后仿真相比于功能仿真具有不同的特点。         下面所示的代码在功能仿真时是正确的的,但在后仿真时,似乎是有问题的。功能很简单,当delay为高电平时,a与

    2024年02月08日
    浏览(49)
  • 多相滤波器MATLAB仿真---抽取&插值

    多相滤波器MATLAB仿真---抽取插值 目录 前言 一、什么是多相滤波器? 二、抽取 1.不考虑滤波器延时下的抽取 2.考虑滤波器延时下的抽取 三、插值 参考文献 总结    语音信号多相滤波器是我上学期末做的一个课设,过了许久,在此仅仅简单记录一下,以特定的D值和I值展示一

    2024年02月01日
    浏览(55)
  • xilinx FPGA 除法器ip核(divider)的学习和仿真(Vivado)

    在设计中,经常出现除法运算, 实现方法 : 1、移位操作 2、取模取余 3、调用除法器IP核 4、查找表 简单学习除法器IP。 网上很多IP翻译文档,不详细介绍,记录几个重要的点: 1、三种算法模式(不同模式所消耗的资源类型不同) 2、分清除数和被除数;余数模式的选择 3、延

    2024年04月28日
    浏览(196)
  • FPGA学习笔记(五):DDS IP核的使用

     1. 打开VIVADO,点击IP Catalog    2.搜索DDS,选择DDS Compiler    3. 配置参数 (1) 设置主频频率 50MHz   (2) 选择sine,并且勾选Has Phase Out(相位输出)    (3) 勾选Output TREDAY  (4) 输入频率    (5) 同上述步骤,再加一个DDS IP核 4. 测试文件   5. 结果展示        

    2024年02月11日
    浏览(58)
  • 具于xilinx FPGA的可动态配置DDS频率控制字的DDS IP核使用例程详解

    本文用于讲解xilinx IP 的dds ip examples(动态配置频率)的功能说明,方便使用者快速上手。 本examples 是月隐编写的针对DDS的使用demo,实现通过vio控制频率控制字来调整DDS的输出频率,为大家演示一个可动态配置DDS频率的例程。 例程的平台: 1) 硬件平台:XC7Z020CLG484-2 2) FP

    2024年02月02日
    浏览(43)
  • vivado CORDIC ip核计算arctan记录

    本文主要记录自己使用vivado CORDIC ip 核计算arctan的过程。 下面是我测试工程的具体配置。 要计算arctan需要在 Functional Selection 选择为“Arc Tan”,结构默认为并行结构。 Pipelining Mode 可以设置为最大值(Maximum)、最优值(Optimal)和不设置流水线(No pipelining即纯组合逻辑实现)

    2024年02月07日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包