0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

XILINX FPGA IP之DDS Compiler_ip例化仿真

CHANBAEK 来源: FPGA自学笔记分享 作者: FPGA自学笔记分享 2023-09-07 18:31 次阅读

之前的文章对dds ip 的结构、精度、参数接口进行了详细的说明,本文通过例化仿真对该IP的实际使用进行演示。本文例化固定模式和可配置模式两种模式分别例化ip并仿真,说明该IP的应用。

1、固定模式:

该模式下IP的参数设置如下图,时钟频率设置为100Mhz,两个通道时分复用,SFDR 60dB.

图片

然后相位、相位偏差全部选择固定模式,

图片

输出频率配置为1Mhz和2Mhz:

图片

设置完之后再summary这里可以看到该IP的实现细节,输出位宽10bit,2ch,没ch的时钟速率是50Mhz,使用一个M18K的BROM实现查找表等等的一些细节。

图片

additional summary里边可以看到相应的频率控制字和实际精度,因为当前设置的时标准模式不是栅格(rasterized)模式,所以输出是有频偏的。

图片

上述设置生成的IP端口如下,输入端口为时钟复位信号,输出sin cos和phase值。

dds_compiler_0 your_instance_name (
  .aclk(aclk),                                // input wire aclk
  .aresetn(aresetn),                          // input wire aresetn
  .m_axis_data_tvalid(m_axis_data_tvalid),    // output wire m_axis_data_tvalid
  .m_axis_data_tdata(m_axis_data_tdata),      // output wire [31 : 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 [31 : 0] m_axis_phase_tdata
);

这个IP的tb就非常简单了,只有提供时钟复位即可,但是输出时时分复用的,所以tb对输出信号进行了处理将两路输出分开了,方便波形观察,如下:

`timescale 1ns/100ps
module tb_dds_fix_normal ;


reg             aclk                = 'd0;
reg             aresetn             = 'd0;
wire            m_axis_data_tvalid  ;
wire [31 : 0]   m_axis_data_tdata   ;
wire            m_axis_phase_tvalid ;
wire [31 : 0]   m_axis_phase_tdata  ;


always #1 aclk = ~aclk;




initial
    begin
        #100;
        aresetn =1'b1;
    end




dds_compiler_0 dds_compiler_0 (
  .aclk                     (aclk                   ), // input wire aclk
  .aresetn                  (aresetn                ), // input wire aresetn
  .m_axis_data_tvalid       (m_axis_data_tvalid     ), // output wire m_axis_data_tvalid
  .m_axis_data_tdata        (m_axis_data_tdata      ), // output wire [31 : 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 [31 : 0] m_axis_phase_tdata
);


reg             S_ch0_valid ;
reg   [15:0]    S_ch0_cos   ;
reg   [15:0]    S_ch0_sin   ;
reg   [31:0]    S_ch0_pha   ;
reg   [15:0]    S_ch1_cos   ;
reg   [15:0]    S_ch1_sin   ;
reg   [31:0]    S_ch1_pha   ;


always @(posedge aclk)
    if(!aresetn)
        S_ch0_valid <= 1'b1;
    else if(m_axis_data_tvalid)
        S_ch0_valid <= ~S_ch0_valid;


always @(posedge aclk)
    if(S_ch0_valid)
        begin
            S_ch0_cos <= m_axis_data_tdata[15:0]  ;
            S_ch0_sin <= m_axis_data_tdata[31:16] ;
            S_ch0_pha <= m_axis_phase_tdata       ;
            S_ch1_cos <= S_ch1_cos                ;
            S_ch1_sin <= S_ch1_sin                ;
            S_ch1_pha <= S_ch1_pha                ;
        end
    else
        begin
            S_ch0_cos <= S_ch0_cos                ;
            S_ch0_sin <= S_ch0_sin                ;
            S_ch0_pha <= S_ch0_pha                ;
            S_ch1_cos <= m_axis_data_tdata[15:0]  ;
            S_ch1_sin <= m_axis_data_tdata[31:16] ;
            S_ch1_pha <= m_axis_phase_tdata       ;
        end
    
endmodule

仿真波形如下:

图片

2、相位可配置模式:

该模式将相位偏差和相位步进设置为axi配置模式,如下图,其它配置保持不变:

图片

生成的端口如下,该模式下增加了config端口,用于phase信息的配置:

dds_compiler_cfg your_instance_name (
  .aclk(aclk),                                                        // input wire aclk
  .aresetn(aresetn),                                                  // input wire aresetn
  .s_axis_config_tvalid(s_axis_config_tvalid),                        // input wire s_axis_config_tvalid
  .s_axis_config_tdata(s_axis_config_tdata),                          // input wire [31 : 0] s_axis_config_tdata
  .s_axis_config_tlast(s_axis_config_tlast),                          // input wire s_axis_config_tlast
  .m_axis_data_tvalid(m_axis_data_tvalid),                            // output wire m_axis_data_tvalid
  .m_axis_data_tdata(m_axis_data_tdata),                              // output wire [31 : 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
  .event_s_config_tlast_missing(event_s_config_tlast_missing),        // output wire event_s_config_tlast_missing
  .event_s_config_tlast_unexpected(event_s_config_tlast_unexpected)  // output wire event_s_config_tlast_unexpected
);

这时,需要对tb进行相应的修改,增加config的配置,如下,新增一个11bit的计数器,计满后对两个通道的phase值进行翻倍:

reg             aclk                = 'd0;
reg             aresetn             = 'd0;
reg             s_axis_config_tvalid= 'd0;
reg  [31 : 0]   s_axis_config_tdata = {{16'd1310},{16'd1310}};
reg             s_axis_config_tlast = 'd0;


wire            m_axis_data_tvalid  ;
wire [31 : 0]   m_axis_data_tdata   ;
wire            m_axis_phase_tvalid ;
wire [15 : 0]   m_axis_phase_tdata  ;


always #1 aclk = ~aclk;




initial
    begin
        #100;
        aresetn =1'b1;
    end


reg  [10:0] S_clk_cnt   ;


always @(posedge aclk)
    if(!aresetn)
        S_clk_cnt <= 'd3;
    else
        S_clk_cnt <= S_clk_cnt + 'd1;


always @(posedge aclk)
    s_axis_config_tvalid <= ((S_clk_cnt==0)||(S_clk_cnt==1));


always @(posedge aclk)
    s_axis_config_tlast <= (S_clk_cnt==1);


always @(posedge aclk)
    if(s_axis_config_tvalid)
        s_axis_config_tdata <= s_axis_config_tdata + s_axis_config_tdata;




dds_compiler_cfg your_instance_name (
  .aclk                             (aclk                           ), // input wire aclk
  .aresetn                          (aresetn                        ), // input wire aresetn
  .s_axis_config_tvalid             (s_axis_config_tvalid           ), // input wire s_axis_config_tvalid
  .s_axis_config_tdata              (s_axis_config_tdata            ), // input wire [31 : 0] s_axis_config_tdata
  .s_axis_config_tlast              (s_axis_config_tlast            ), // input wire s_axis_config_tlast
  .m_axis_data_tvalid               (m_axis_data_tvalid             ), // output wire m_axis_data_tvalid
  .m_axis_data_tdata                (m_axis_data_tdata              ), // output wire [31 : 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
  .event_s_config_tlast_missing     (event_s_config_tlast_missing   ), // output wire event_s_config_tlast_missing
  .event_s_config_tlast_unexpected  (event_s_config_tlast_unexpected)  // output wire event_s_config_tlast_unexpected 
);

仿真结果如下如,可以看到随着phase步进的不断累加,两个通道的输出频率也在不断增加.

图片

好了,本文就写的这里,希望通着这一系列的文章能帮助大家深入理解并正确使用DDS IP,详细的仿真过程可参考B站视频

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1602

    文章

    21320

    浏览量

    593194
  • Xilinx
    +关注

    关注

    70

    文章

    2121

    浏览量

    119373
  • 仿真
    +关注

    关注

    50

    文章

    3872

    浏览量

    132160
  • DDS
    DDS
    +关注

    关注

    21

    文章

    614

    浏览量

    151731
收藏 人收藏

    评论

    相关推荐

    IP core调用DDS

    ISE软件,使用IP core调用DDS,产生正弦载波,使用调频200M时钟做为DDS输入,功能仿真没问题,但后仿真却不显示波形,只是一根红
    发表于 03-20 20:37

    基于FPGAIP核的DDS信号发生器如何用IP

    我毕业设计要做一个基于FPGAIP核的DDS信号发生器,但是我不会用DDSIP核,有没有好人能发我一份资料如何用
    发表于 03-10 11:46

    Xilinx FPGA入门连载34:超声波测距终极结果显示除法器IP解析

    `Xilinx FPGA入门连载34:超声波测距终极结果显示除法器IP解析特权同学,版权所有配套例程和更多资料下载链接:http://pan.baidu.com/s/1jGjAhEm
    发表于 12-09 12:22

    FPGA连载31:PLL配置与LEDPLL的IP核配置

    `FPGA连载31:PLL配置与LEDPLL的IP核配置特权同学,版权所有配套例程和更
    发表于 09-12 17:31

    xilinx FPGA的FFT IP核的调用

    有没有大神可以提供xilinx FPGA的FFT IP核的调用的verilog 的参考程序,最近在学习FFT的IP核的使用,但是仿真结果有问
    发表于 12-25 17:05

    如何使用DDS IP核生成任意波形?

    一个DDS应用,我想使用Xilinx DDS IP内核生成任意波形,但我看到的是DDS只能生成正弦或余弦波形数据。你知道如何用其他数据替换正
    发表于 02-12 08:07

    请问DDS ip是否允许控制生成波形的相移?

    的MSB来使用Xilinx DDS IP内核? DDS ip是否允许控制生成波形的相移?谢谢您的回答最好的祝福以上来自于谷歌翻译以下为原文H
    发表于 04-04 14:20

    如何使用Xilinx DDS Compiler IP并把它运行在Ultra96板上的可编程逻辑中?

    中实现它可能有点挑战,这就是为什么我想创建这个项目作为一个简单的示例,说明如何使用Xilinx DDS Compiler IP并把它运行在 Ultra96 板上的可编程逻辑中。
    发表于 02-08 15:39

    基于FPGADDS IP核设计方案

    以Altera公司的Quartus Ⅱ 7.2作为开发工具,研究了基于FPGADDS IP核设计,并给出基于Signal Tap II嵌入式逻辑分析仪的仿真测试结果。将设计的
    发表于 04-05 16:04 85次下载
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>DDS</b> <b class='flag-5'>IP</b>核设计方案

    Xilinx DDR控制器MIG IP核的例化及仿真

    DDR对于做项目来说,是必不可少的。一般用于数据缓存和平滑带宽。今天介绍下Xilinx DDR控制器MIG IP核的例化及仿真FPGA芯片:XC7K325T(KC705) 开发工具
    的头像 发表于 11-26 15:02 7527次阅读
    <b class='flag-5'>Xilinx</b> DDR控制器MIG <b class='flag-5'>IP</b>核的例化及<b class='flag-5'>仿真</b>

    解析Vivado如何调用DDSIP进行仿真

    本次使用Vivado调用DDSIP进行仿真,并尝试多种配置方式的区别,设计单通道信号发生器(固定频率)、Verilog查表法实现DDS、AM调制解调、DSB调制解调、可编程控制的信号
    的头像 发表于 04-27 16:33 5700次阅读
    解析Vivado如何调用<b class='flag-5'>DDS</b>的<b class='flag-5'>IP</b>进行<b class='flag-5'>仿真</b>

    关于XilinxDDS IP的运用与讲解

    本次项目我们主要是为了讲解DDS,所以我们使用了混频这个小项目来讲解。DDS自己手写是比较简单且灵活,但是Xilinx给我们提供了相应的IP核,那么这次我们将直接讲解使用
    的头像 发表于 04-27 16:00 6394次阅读
    关于<b class='flag-5'>Xilinx</b>中<b class='flag-5'>DDS</b> <b class='flag-5'>IP</b>的运用与讲解

    关于Ultra96的Xilinx DDS编译器IP教程

    电子发烧友网站提供《关于Ultra96的Xilinx DDS编译器IP教程.zip》资料免费下载
    发表于 12-13 10:17 1次下载
    关于Ultra96的<b class='flag-5'>Xilinx</b> <b class='flag-5'>DDS</b>编译器<b class='flag-5'>IP</b>教程

    Xilinx Vivado DDS IP使用方法

    DDS(Direct Digital Frequency Synthesizer) 直接数字频率合成器,本文主要介绍如何调用XilinxDDS IP核生成某一频率的Sin和Cos信号
    的头像 发表于 07-24 11:23 2136次阅读
    <b class='flag-5'>Xilinx</b> Vivado <b class='flag-5'>DDS</b> <b class='flag-5'>IP</b>使用方法

    XILINX FPGA IP之FIFO Generator例化仿真

    上文XILINX FPGA IP之FIFO对XILINX FIFO Generator IP的特性和内部处理流程进行了简要的说明,本文通过实
    的头像 发表于 09-07 18:31 903次阅读
    <b class='flag-5'>XILINX</b> <b class='flag-5'>FPGA</b> <b class='flag-5'>IP</b>之FIFO Generator例化<b class='flag-5'>仿真</b>