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

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

3天内不再提示

数字信号处理-DDS IP应用实例

CHANBAEK 来源:FPGA and ICer 作者:Vuko 2023-05-24 10:46 次阅读

前言

本文根据DDS的相关手册构建仿真工程,包括单通道工程、多通道工程、使用DDS进行混频操作。

单通道IP配置

新建一个空白工程,FPGA型号任意,添加DDS IP到工程中,双击打开配置项界面。 该界面可以配置DDS的相关配置选项和基本的一些参数。 这里重点说下常配置的参数。

  • 系统时钟:为DDS工作的系统时钟。
  • 通道数量:根据设计需求选择通道数量。
  • 无杂散动态范围(SFDR):这里输入对应数值可以进行计算出输出DDS数据的位宽,N代表DDS输出的位宽数。 利用下面公式可以对45进行换算,经过计算N=7.47,向上取整得到输出位宽为8。
  • 频率分辨率 :频率分辨率用于控制最小的分辨辨精度。

图片

配置完成基本信息配置下一页,基本保持默认即可,这里只想查看波形,所以相位输出就关闭。

图片

第三页配置保持默认即可。

图片

第四页输出频率配置,这里设置输出10M

图片

在总结也中可以看到输出信号的相关信息,这里可以简要计算下phase width的28Bits如何来的。 该参数和DDS的工作频率以及启用通道,还有频率分辨率有关。 通过下述式子,可以变形求得当前设置下Frequency Resolution。 DDS时钟为100MHz,通道为1,相位位宽28Bits,换算得到频率分辨率为0.37252902984619140625。 向上取整数,则得到当前设置的0.4Hz的分辨率。 已知频率分辨率也可以换算位宽,不过此时得到的位宽是按2的次方去取整。

图片

同时根据前面的相关参数可以计算向量增量。 带入设置的参数可计算到增量的数值大小。

图片

单通道实例

顶层调用

按上述IP配置配置完成后在top层进行实例化,然后即可完成单通道DDS的调用使用。 顶层模块调用代码如下:

module top(
    input clk
    );

    wire m_axis_data_tvalid_ch1;
    wire [7:0] m_axis_data_tdata_ch1;
    //单通道测试
    dds_compiler_0 ch1_dds(
    .aclk(clk),                              // input wire aclk
    .m_axis_data_tvalid(m_axis_data_tvalid_ch1),  // output wire m_axis_data_tvalid
    .m_axis_data_tdata(m_axis_data_tdata_ch1)    // output wire [7 : 0] m_axis_data_tdata
    );
endmodule

编写仿真

编写testbench,由于顶层只给了一个时钟的输入端口,所以只需要对时钟进行仿真设计,单通道DDS测试如下:

`timescale 1ns / 1ps
module tb_top;

// top Parameters
parameter PERIOD  = 10;

// top Inputs
reg   clk                                  = 0 ;

// top Outputs

initial
begin
    forever #(PERIOD/2)  clk=~clk;
end

top  u_top (
    .clk(clk)
);

initial
begin
  #10000;
    $finish;
end

endmodule

编写完成后直接点击运行仿真测试即可。

测试结果

运行仿真查看波形结果,将顶层例化模块的波形添加到波形窗口,可以得到数字模式下的十六进制显示的数值,可将数值转化为波形显示方便观察。

图片

设置下数据的进制格式和显示模式,这里修改通道数据为analog 模式,进制修改为有符号十进制。

图片

图片

修改后添加游标,可以观察到输出波形周期为100ns,也即10MHz,输出波形频率和设置一致。

图片

多通道实例

重新打开IP配置界面或者新建一个DDS IP,修改通道数,这里设置为3。 使能相位输出信号,查看下相位变化情况。 因为DDS的IP核多通道之间是分时复用的,所以在细节实现配置界面最好使能通道ID以供进行正常输出单个通道的信号波形。 其余可以保持默认。

图片

配置输出频率为10MHz、3MHz、4MHz。

图片

配置完成点击OK,对模块进行例化。

顶层调用

顶层模块调用代码如下:

module top(
    input clk
    );

    wire m_axis_data_tvalid_ch1;
    wire [7:0] m_axis_data_tdata_ch1;
    
    wire          m_axis_data_tvalid_ch3;
    wire [7 : 0]  m_axis_data_tdata_ch3;
    wire [1 : 0]  m_axis_data_tuser_ch3;
    wire          m_axis_phase_tvalid_ch3;
    wire [31 : 0] m_axis_phase_tdata_ch3;
    wire [1 : 0]  m_axis_phase_tuser_ch3;

    //多通道测试
    dds_compiler_1 multi_ch_dds(
    .aclk(clk),                                // input wire aclk
    .m_axis_data_tvalid(m_axis_data_tvalid_ch3),    // output wire m_axis_data_tvalid
    .m_axis_data_tdata(m_axis_data_tdata_ch3),      // output wire [7 : 0] m_axis_data_tdata
    .m_axis_data_tuser(m_axis_data_tuser_ch3),      // output wire [1 : 0] m_axis_data_tuser
    .m_axis_phase_tvalid(m_axis_phase_tvalid_ch3),  // output wire m_axis_phase_tvalid
    .m_axis_phase_tdata(m_axis_phase_tdata_ch3),    // output wire [31 : 0] m_axis_phase_tdata
    .m_axis_phase_tuser(m_axis_phase_tuser_ch3)    // output wire [1 : 0] m_axis_phase_tuser
    );

仿真测试

仿真文件可以保持单通道测试不变,点击运行行为级仿真,添加信号波形可观察到下面的情况。 数据并不是直接得到的正弦波形,而是杂乱无章的。

图片

放大tuser信号可观察到,数据和相位通道的tuser信号是周期变化的,这里的tuser信号是代表IP设置中的chen ID,所以是分时复用输出3个通道的信号所以要编写简单逻辑对信号进行分选。

图片

顶层模块修改

可根据tuser为判断条件对输出数据进行一步寄存,从而得到三个通道的波形数据。 代码如下:

module top(
    input clk
    );

    //多通道测试
    dds_compiler_1 multi_ch_dds(
    .aclk(clk),                                // input wire aclk
    .m_axis_data_tvalid(m_axis_data_tvalid_ch3),    // output wire m_axis_data_tvalid
    .m_axis_data_tdata(m_axis_data_tdata_ch3),      // output wire [7 : 0] m_axis_data_tdata
    .m_axis_data_tuser(m_axis_data_tuser_ch3),      // output wire [1 : 0] m_axis_data_tuser
    .m_axis_phase_tvalid(m_axis_phase_tvalid_ch3),  // output wire m_axis_phase_tvalid
    .m_axis_phase_tdata(m_axis_phase_tdata_ch3),    // output wire [31 : 0] m_axis_phase_tdata
    .m_axis_phase_tuser(m_axis_phase_tuser_ch3)    // output wire [1 : 0] m_axis_phase_tuser
    );
    reg [7 : 0] data10MHz;
    reg [7 : 0] data3MHz;
    reg [7 : 0] data4MHz;
    always @(posedge clk) begin
        case(m_axis_data_tuser_ch3)
            0:data10MHz<=m_axis_data_tdata_ch3;
            1:data3MHz<=m_axis_data_tdata_ch3;
            2:data4MHz<=m_axis_data_tdata_ch3;
        endcase
     end
    reg [31 : 0] phase10MHz;
    reg [31 : 0] phase3MHz;
    reg [31 : 0] phase4MHz;
    always @(posedge clk) begin
        case(m_axis_data_tuser_ch3)
            0:phase10MHz<=m_axis_phase_tdata_ch3;
            1:phase3MHz<=m_axis_phase_tdata_ch3;
            2:phase4MHz<=m_axis_phase_tdata_ch3;
        endcase
    end

波形如下,从图中可看出,经过逻辑分选后,三个通道的波形输出正常,这里可看到相比单通道输出10MHz信号的正弦波,此时输出的波形不能从时域中看出正弦波形的周期,原因是当启用多个通道后,系统钟要除以通道数量才是对应通道的参考钟,此时设置了100MHz为工作时钟,使能3个通道, 所以单个通道的参考钟为33.333MHz,对于10MHz的信号来说,相当于一个周期仅有三个点,所以无法正常观察到时域特性,但是频域特性依旧存在。

图片

混频实例

混频原理

在对输入中频信号需要进行频谱搬移, 需要使用混频操作, 将频谱搬移到高频或者低频, 其实就好比一辆车开在高速路还是低速路, 高频低频就是载波, 承载信息的载体。 在数字信号处理中, 频谱的搬移就是将一个本震信号和一个输入信号, 进行混频, 这样就可以得到一个复合的信号, 这里通过公式开看这个复合信号。

图片

这里的α和β就是指的两个频率信号,当互相相乘得到两个频率信号,一个是α + β,另一个是α – β。 上图的标识的 fout 信号应该是 f1+f2 和 f1-f2 的复合信号 。

使用多通道实例中输出的3MHz和4Mhz,进行混频操作,得到1MHz和7MHz的混合信号。 调用乘法器进行混频乘法操作。

顶层模块

module top(
    input clk
    );
    
    wire          m_axis_data_tvalid_ch3;
    wire [7 : 0]  m_axis_data_tdata_ch3;
    wire [1 : 0]  m_axis_data_tuser_ch3;
    wire          m_axis_phase_tvalid_ch3;
    wire [31 : 0] m_axis_phase_tdata_ch3;
    wire [1 : 0]  m_axis_phase_tuser_ch3;

    //多通道测试
    dds_compiler_1 multi_ch_dds(
    .aclk(clk),                                // input wire aclk
    .m_axis_data_tvalid(m_axis_data_tvalid_ch3),    // output wire m_axis_data_tvalid
    .m_axis_data_tdata(m_axis_data_tdata_ch3),      // output wire [7 : 0] m_axis_data_tdata
    .m_axis_data_tuser(m_axis_data_tuser_ch3),      // output wire [1 : 0] m_axis_data_tuser
    .m_axis_phase_tvalid(m_axis_phase_tvalid_ch3),  // output wire m_axis_phase_tvalid
    .m_axis_phase_tdata(m_axis_phase_tdata_ch3),    // output wire [31 : 0] m_axis_phase_tdata
    .m_axis_phase_tuser(m_axis_phase_tuser_ch3)    // output wire [1 : 0] m_axis_phase_tuser
    );
    reg [7 : 0] data10MHz;
    reg [7 : 0] data3MHz;
    reg [7 : 0] data4MHz;
    always @(posedge clk) begin
        case(m_axis_data_tuser_ch3)
            0:data10MHz<=m_axis_data_tdata_ch3;
            1:data3MHz<=m_axis_data_tdata_ch3;
            2:data4MHz<=m_axis_data_tdata_ch3;
        endcase
     end
    reg [31 : 0] phase10MHz;
    reg [31 : 0] phase3MHz;
    reg [31 : 0] phase4MHz;
    always @(posedge clk) begin
        case(m_axis_data_tuser_ch3)
            0:phase10MHz<=m_axis_phase_tdata_ch3;
            1:phase3MHz<=m_axis_phase_tdata_ch3;
            2:phase4MHz<=m_axis_phase_tdata_ch3;
        endcase
    end
    //混频测试
    wire [15 : 0]  mixer_singal;
    mult_gen_0 mult_mixer (
        .CLK(clk),  // input wire CLK
        .A(data3MHz),      // input wire [7 : 0] A
        .B(data4MHz),      // input wire [7 : 0] B
        .P(mixer_singal)      // output wire [15 : 0] P
    );
endmodule

仿真测试

仿真文件可以保持单通道测试不变,点击运行行为级仿真,添加信号波形修改波形设置,可得到混频后的信号效果。

图片

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

    关注

    15

    文章

    539

    浏览量

    45680
  • 仿真
    +关注

    关注

    50

    文章

    3964

    浏览量

    132932
  • 分辨率
    +关注

    关注

    2

    文章

    1008

    浏览量

    41734
  • 时钟
    +关注

    关注

    10

    文章

    1665

    浏览量

    130934
  • DDS
    DDS
    +关注

    关注

    21

    文章

    625

    浏览量

    152272
收藏 人收藏

    评论

    相关推荐

    labview在数字信号中的应用实例

    labview在数字信号中的应用实例
    发表于 04-20 21:25

    数字信号处理(DSP)

    数字信号处理           数字信号处理是20世纪60年代,随着信息学科和计算
    发表于 01-07 08:10 5109次阅读

    数字信号处理器(DSP)

    数字信号处理器(DSP) 数字信号处理器(digital signal processor, 简写 DSP)是一种专用于(通常为实时的)数字信号
    发表于 01-04 10:54 3471次阅读

    FPGA和DDS信号源中的应用

    DDS同DSP(数字信号处理)一样,是一项关键的数字化技术。DDS是直接数字式频率合成器(Dir
    发表于 06-02 09:23 4138次阅读
    FPGA和<b class='flag-5'>DDS</b>在<b class='flag-5'>信号</b>源中的应用

    基于FPGA数字信号处理

    基于FPGA数字信号处理,本文主要探讨了基于FPGA数字信号处理的实现
    发表于 10-30 10:39 34次下载

    数字信号处理及应用_王华奎_部分答案

    。这是数字信号处理中的经典内容,也是进一步学习和掌握更多 信号处理理论的基础。为便于数字信号处理
    发表于 11-17 15:22 25次下载

    数字信号处理的FPGA实现

    本书比较全面地阐述了fpga在数字信号处理中的应用问题。本书共分8章,主要内容包括典型fpga器件的介绍、vhdl硬件描述语言、fpga设计中常用软件简介、用fpga实现数字信号处理
    发表于 12-23 11:07 45次下载

    数字信号处理

    数字信号处理基础知识 有需要的朋友下来看看
    发表于 12-30 15:08 15次下载

    数字信号处理教程

    数字信号处理教程(第二版) 有需要的朋友下来看看
    发表于 12-30 15:07 19次下载

    数字信号处理实验指导书(MATLAB版)

    本书是数字信号处理的必备书籍,里面有大量的信号处理的MATLAB实例
    发表于 04-18 10:28 0次下载

    基于FPGA数字信号处理

    基于FPGA数字信号处理
    发表于 12-14 22:08 20次下载

    数字信号处理

    数字信号处理实验报告
    发表于 12-17 16:18 5次下载

    数字信号处理选型和介绍

    本文开始对数字信号处理数字信号处理的选型进行了介绍,其次介绍了数字信号处理芯片的选型参数,最后
    的头像 发表于 02-05 14:02 7366次阅读
    <b class='flag-5'>数字信号</b><b class='flag-5'>处理</b>选型和介绍

    数字信号的产生及处理

    数字信号的产生及处理
    发表于 04-09 15:10 10次下载
    <b class='flag-5'>数字信号</b>的产生及<b class='flag-5'>处理</b>

    数字信号处理器概论

    作为数字信号处理的一个实际任务就是要求能够快速、高效、实时完成处理任务,这就要通过通用或专用的数字信号处理器来完成。因此,
    的头像 发表于 08-07 16:58 3582次阅读