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
    +关注

    关注

    1629

    文章

    21735

    浏览量

    603175
  • Xilinx
    +关注

    关注

    71

    文章

    2167

    浏览量

    121367
  • 仿真
    +关注

    关注

    50

    文章

    4080

    浏览量

    133584
  • DDS
    DDS
    +关注

    关注

    21

    文章

    634

    浏览量

    152649
收藏 人收藏

    评论

    相关推荐

    XILINX FPGA IPClocking Wizard详解

    锁相环基本上是每一个fpga工程必不可少的模块,之前文档xilinx 7 系列FPGA时钟资源对xilinx fpga的底层时钟资源做过说明
    发表于 06-12 17:42 5620次阅读
    <b class='flag-5'>XILINX</b> <b class='flag-5'>FPGA</b> <b class='flag-5'>IP</b><b class='flag-5'>之</b>Clocking Wizard详解

    XILINX FPGA IPMMCM PLL DRP时钟动态重配详解

    上文XILINX FPGA IPClocking Wizard详解说到时钟IP的支持动态重配的,本节介绍通过DRP进行MMCM PLL的重
    发表于 06-12 18:24 1.1w次阅读
    <b class='flag-5'>XILINX</b> <b class='flag-5'>FPGA</b> <b class='flag-5'>IP</b><b class='flag-5'>之</b>MMCM PLL DRP时钟动态重配详解

    Xilinx FPGA IPBlock Memory Generator仿真

    上文对BMG ip的基本情况进行了简单的描述,本文通过仿真来实际使用功能一下这个IP
    的头像 发表于 11-14 18:24 1797次阅读
    <b class='flag-5'>Xilinx</b> <b class='flag-5'>FPGA</b> <b class='flag-5'>IP</b><b class='flag-5'>之</b>Block Memory Generator<b class='flag-5'>仿真</b>

    IP core调用DDS

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

    xilinx FPGA的FFT IP核的调用

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

    如何使用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核的仿真
    的头像 发表于 11-26 15:02 8516次阅读
    <b class='flag-5'>Xilinx</b> DDR控制器MIG <b class='flag-5'>IP</b>核的<b class='flag-5'>例</b><b class='flag-5'>化</b>及<b class='flag-5'>仿真</b>

    IP和几个基于FPGA芯片实现的Demo工程

    本文接续上一篇《FPGA杂记基础篇》,继续为大家分享IP和几个基于FPGA芯片实现的Demo工程。I
    的头像 发表于 12-24 12:58 1286次阅读

    关于XilinxDDS IP的运用与讲解

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

    XILINX FPGA IPFIFO Generator仿真

    上文XILINX FPGA IPFIFO对XILINX FIFO Generator IP的特
    的头像 发表于 09-07 18:31 1930次阅读
    <b class='flag-5'>XILINX</b> <b class='flag-5'>FPGA</b> <b class='flag-5'>IP</b><b class='flag-5'>之</b>FIFO Generator<b class='flag-5'>例</b><b class='flag-5'>化</b><b class='flag-5'>仿真</b>

    如何申请xilinx IP核的license

    在使用FPGA的时候,有些IP核是需要申请后才能使用的,本文介绍如何申请xilinx IP核的license。
    的头像 发表于 10-25 16:48 336次阅读
    如何申请<b class='flag-5'>xilinx</b> <b class='flag-5'>IP</b>核的license

    Xilinx DDS IP核的使用和参数配置

    用RAM实现一个DDS,从原理上来说很简单,在实际使用的时候,可能没有直接使用官方提供的IP核来的方便。这个博客就记录一下,最近使用到的这个DDS IP
    的头像 发表于 10-25 16:54 860次阅读
    <b class='flag-5'>Xilinx</b> <b class='flag-5'>DDS</b> <b class='flag-5'>IP</b>核的使用和参数配置