RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

XILINX FPGA IP之DDS Compiler_ip例化仿真

CHANBAEK ? 來源: FPGA自學(xué)筆記分享 ? 作者: FPGA自學(xué)筆記分享 ? 2023-09-07 18:31 ? 次閱讀

之前的文章對dds ip 的結(jié)構(gòu)、精度、參數(shù)、接口進(jìn)行了詳細(xì)的說明,本文通過例化仿真對該IP的實(shí)際使用進(jìn)行演示。本文例化固定模式和可配置模式兩種模式分別例化ip并仿真,說明該IP的應(yīng)用。

1、固定模式:

該模式下IP的參數(shù)設(shè)置如下圖,時(shí)鐘頻率設(shè)置為100Mhz,兩個(gè)通道時(shí)分復(fù)用,SFDR 60dB.

圖片

然后相位、相位偏差全部選擇固定模式,

圖片

輸出頻率配置為1Mhz和2Mhz:

圖片

設(shè)置完之后再summary這里可以看到該IP的實(shí)現(xiàn)細(xì)節(jié),輸出位寬10bit,2ch,沒ch的時(shí)鐘速率是50Mhz,使用一個(gè)M18K的BROM實(shí)現(xiàn)查找表等等的一些細(xì)節(jié)。

圖片

additional summary里邊可以看到相應(yīng)的頻率控制字和實(shí)際精度,因?yàn)楫?dāng)前設(shè)置的時(shí)標(biāo)準(zhǔn)模式不是柵格(rasterized)模式,所以輸出是有頻偏的。

圖片

上述設(shè)置生成的IP端口如下,輸入端口為時(shí)鐘復(fù)位信號,輸出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
);

這個(gè)IP的tb就非常簡單了,只有提供時(shí)鐘復(fù)位即可,但是輸出時(shí)時(shí)分復(fù)用的,所以tb對輸出信號進(jìn)行了處理將兩路輸出分開了,方便波形觀察,如下:

`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、相位可配置模式:

該模式將相位偏差和相位步進(jìn)設(shè)置為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
);

這時(shí),需要對tb進(jìn)行相應(yīng)的修改,增加config的配置,如下,新增一個(gè)11bit的計(jì)數(shù)器,計(jì)滿后對兩個(gè)通道的phase值進(jìn)行翻倍:

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

仿真結(jié)果如下如,可以看到隨著phase步進(jìn)的不斷累加,兩個(gè)通道的輸出頻率也在不斷增加.

圖片

好了,本文就寫的這里,希望通著這一系列的文章能幫助大家深入理解并正確使用DDS IP,詳細(xì)的仿真過程可參考B站視頻。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1629

    文章

    21729

    瀏覽量

    602986
  • Xilinx
    +關(guān)注

    關(guān)注

    71

    文章

    2167

    瀏覽量

    121303
  • 仿真
    +關(guān)注

    關(guān)注

    50

    文章

    4070

    瀏覽量

    133552
  • DDS
    DDS
    +關(guān)注

    關(guān)注

    21

    文章

    633

    瀏覽量

    152630
收藏 人收藏

    評論

    相關(guān)推薦

    XILINX FPGA IPClocking Wizard詳解

    鎖相環(huán)基本上是每一個(gè)fpga工程必不可少的模塊,之前文檔xilinx 7 系列FPGA時(shí)鐘資源對xilinx fpga的底層時(shí)鐘資源做過說明
    發(fā)表于 06-12 17:42 ?5541次閱讀
    <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時(shí)鐘動態(tài)重配詳解

    上文XILINX FPGA IPClocking Wizard詳解說到時(shí)鐘IP的支持動態(tài)重配的,本節(jié)介紹通過DRP進(jìn)行MMCM PLL的重
    發(fā)表于 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時(shí)鐘動態(tài)重配詳解

    Xilinx FPGA IPBlock Memory Generator仿真

    上文對BMG ip的基本情況進(jìn)行了簡單的描述,本文通過仿真來實(shí)際使用功能一下這個(gè)IP。
    的頭像 發(fā)表于 11-14 18:24 ?1782次閱讀
    <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調(diào)用DDS

    ISE軟件,使用IP core調(diào)用DDS,產(chǎn)生正弦載波,使用調(diào)頻200M時(shí)鐘做為DDS輸入,功能仿真沒問題,但后仿真卻不顯示波形,只是一根紅
    發(fā)表于 03-20 20:37

    xilinx FPGA的FFT IP核的調(diào)用

    有沒有大神可以提供xilinx FPGA的FFT IP核的調(diào)用的verilog 的參考程序,最近在學(xué)習(xí)FFT的IP核的使用,但是仿真結(jié)果有問
    發(fā)表于 12-25 17:05

    如何使用Xilinx DDS Compiler IP并把它運(yùn)行在Ultra96板上的可編程邏輯中?

    中實(shí)現(xiàn)它可能有點(diǎn)挑戰(zhàn),這就是為什么我想創(chuàng)建這個(gè)項(xiàng)目作為一個(gè)簡單的示例,說明如何使用Xilinx DDS Compiler IP并把它運(yùn)行在 Ultra96 板上的可編程邏輯中。
    發(fā)表于 02-08 15:39

    基于FPGADDS IP核設(shè)計(jì)方案

    以Altera公司的Quartus Ⅱ 7.2作為開發(fā)工具,研究了基于FPGADDS IP核設(shè)計(jì),并給出基于Signal Tap II嵌入式邏輯分析儀的仿真測試結(jié)果。將設(shè)計(jì)的
    發(fā)表于 04-05 16:04 ?85次下載
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>DDS</b> <b class='flag-5'>IP</b>核設(shè)計(jì)方案

    Xilinx DDR控制器MIG IP核的仿真

    DDR對于做項(xiàng)目來說,是必不可少的。一般用于數(shù)據(jù)緩存和平滑帶寬。今天介紹下Xilinx DDR控制器MIG IP核的仿真。
    的頭像 發(fā)表于 11-26 15:02 ?8501次閱讀
    <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和幾個(gè)基于FPGA芯片實(shí)現(xiàn)的Demo工程

    本文接續(xù)上一篇《FPGA雜記基礎(chǔ)篇》,繼續(xù)為大家分享IP和幾個(gè)基于FPGA芯片實(shí)現(xiàn)的Demo工程。I
    的頭像 發(fā)表于 12-24 12:58 ?1278次閱讀

    關(guān)于XilinxDDS IP的運(yùn)用與講解

    本次項(xiàng)目我們主要是為了講解DDS,所以我們使用了混頻這個(gè)小項(xiàng)目來講解。DDS自己手寫是比較簡單且靈活,但是Xilinx給我們提供了相應(yīng)的IP核,那么這次我們將直接講解使用
    的頭像 發(fā)表于 04-27 16:00 ?6707次閱讀
    關(guān)于<b class='flag-5'>Xilinx</b>中<b class='flag-5'>DDS</b> <b class='flag-5'>IP</b>的運(yùn)用與講解

    關(guān)于Ultra96的Xilinx DDS編譯器IP教程

    電子發(fā)燒友網(wǎng)站提供《關(guān)于Ultra96的Xilinx DDS編譯器IP教程.zip》資料免費(fèi)下載
    發(fā)表于 12-13 10:17 ?1次下載
    關(guān)于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) 直接數(shù)字頻率合成器,本文主要介紹如何調(diào)用XilinxDDS IP核生成某一頻率的Sin和Cos信號
    的頭像 發(fā)表于 07-24 11:23 ?4924次閱讀
    <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的特
    的頭像 發(fā)表于 09-07 18:31 ?1896次閱讀
    <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的時(shí)候,有些IP核是需要申請后才能使用的,本文介紹如何申請xilinx IP核的license。
    的頭像 發(fā)表于 10-25 16:48 ?325次閱讀
    如何申請<b class='flag-5'>xilinx</b> <b class='flag-5'>IP</b>核的license

    Xilinx DDS IP核的使用和參數(shù)配置

    用RAM實(shí)現(xiàn)一個(gè)DDS,從原理上來說很簡單,在實(shí)際使用的時(shí)候,可能沒有直接使用官方提供的IP核來的方便。這個(gè)博客就記錄一下,最近使用到的這個(gè)DDS IP。
    的頭像 發(fā)表于 10-25 16:54 ?771次閱讀
    <b class='flag-5'>Xilinx</b> <b class='flag-5'>DDS</b> <b class='flag-5'>IP</b>核的使用和參數(shù)配置
    RM新时代网站-首页