Xilinx DDS IP使用

关注、星标公众号,精彩内容每日送达
来源:网络素材

前言

用RAM实现一个DDS,从原理上来说很简单,在实际使用的时候,可能没有直接使用官方提供的IP核来的方便。这个博客就记录一下,最近使用到的这个DDS IP。

1 基于相位截断的DDS

DDS IP核的内部的基本结构如下图所示,主要是一个基于相位截断的DDS。在数字信号处理中,经常会使用到DDS,其内部主要有一个相位累加器,一个ROM存储这正弦波的查找表。相位累加器在时钟的作用下对相位进行累加,每次的累加值是通过phase increment 来指定的。累加得到的结果,通过量化器,取其高位,低位舍去,再将这个量化后的相位值,输出到查找表,从查找表中得到最终的波形。

7c4568c77c1c40a1a8a501bdbe443b97.png

DDS的最终输出的信号的频率和系统时钟,相位宽度和相位自增量之间满足如下关系:

其中ΔΘ 是相位自增量,BΘ(n)是相位的位宽,也就对应这查找表的深度为2^BΘ(n)

d3be3b5c1d5b8104f8bcbaf5b43f09b0.png

手册中也给出了一个例子,来举例说明DDS的输出频率和这几个系统参数之间的关系,其中系统时钟120MHz,相位宽度为10bit,相位增量为12,输出的频率通过上面的式子就可以计算出来。

da892f0803b42fd8834d7f7b6fce46f5.png

在实际的工程中,一般希望DDS能够生成不停频率的信号,例如在DDC或者DUC中,希望产生一个高频的载波频率,通常使用DDS来产生一个高频的正弦信号。因此在实际使用的时候更加关注DDS的相位增量。因为通过控制相位增量就能过后产生不同的频率。相位增量的计算公式如下。

5a66485984655ce392fee0500d6be39a.png

下面以一个具体的例子来说明DDS是如何工作的。

2 DDS IP的使用和参数配置

在配置这一TAB,需要设置系统的时钟,这个时钟也就是上面公式当中的参考时钟,然后可以选通道数和模式,这里就保持默认就可以了。

再之后就是期望最终生成的信号的一些参数的设置。可选选择系统参数模式,或者选择硬件参数模式,一般都选择系统参数模式,直接方便。

在系统参数中,动态范围最终对应这输出信号的幅度,其计算公式如下:20lg(Amp),其中AMP就是信号的幅度。比如下图中,动态范围为72,那么他就可以表示幅度为4096的一个正弦信号。[20lg(4096)] = 72dB;

在下面是频率分辨率,对应这最小的频率变化,是由系统时钟和相位深度计算得到的,比如系统时钟40MHz,相位宽度为32bit,那么计算的频率分辨率就是[40*106/(232)] = 0.01。

a931046ccd411b767b42d56c390f7ceb.png

在实现这一TAB,可以设置相位增量是固定的还是可以更改的,相位增量能够控制输出的正余弦信号的频率,这里选择可更改的,便于在之后的使用中生成不同频率的信号。需要注意的时候,生成的信号需要满足奈奎斯特抽样定理,也就是抽样时钟必须是被采样信号频率的两倍。以这个例子来说,系统时钟为40M,那么,最多可以生成频率为20MHz的正余弦信号。

除了相位自增量外,初始的相位也是可以通过参数来修改的,在这里就默认不修改了。

在输出信号的时候,可以同时输出正余弦信号,这在正交调制解调的过程中十分有用。

除此之外,还可以输出当前的相位。

020c1193964caf858d6d7283430dc4ef.png

在具体实现这一TAB中,保持默认就可以,是用来配置接口。根据手册上描述的,可以选择这些信号来生成不同类型的接口。这些接口都是AXI-Stream 类型的接口,只需要满足AXIS的规则就好了。

3373531b2cc66647ba2ed30323a0db49.png 264c8ef6ec4d117dfe01f34e7cc09b76.png

在输出频率这一TAB,可以输入期望的输出频率,若有多个通道,可以选择给多个通道设定初始的频率输出值。这个期望频率在前面选择了相位增量式可编程的时候就没什么用了。因为最终输出的信号的频率是通过相位增量来控制的。

aae76beb977db6850b400979b76b2836.png

到这里这个IP基本就配置完了。可以看一下总结,和最终输出信号的接口信息。需要特别注意的就是输出的正余弦信号在输出总线上所占据的bit‘位。DDS IP通过一个AXIS接口同时输出正弦信号和余弦信号。就比如在这个例子中,m_axis_data[11:0]传输的就是余弦信号,其中m_axis_data[11]是余弦信号的符号位。

m_axis_data[27:16]传输的是正弦信号,其中m_axis_data[27]是正弦信号的符号位。

6d8983e601e2d50486d1c2e5cfb9f4be.png

3 DDS IP测试

写个Testbench测试一下:

`timescale 1ns / 1ps
module tb_test_dds();

 reg clk;
 reg         [31:0]  frequency;
 reg                freq_vld;
 wire    m_axis_data_tvalid;
 wire     [31:0] m_axis_data_tdata;
 wire     dds_vld;
 wire   [11:0] dds_cos;
 wire   [11:0] dds_sin;

assign dds_vld = m_axis_data_tvalid;
assign dds_cos = m_axis_data_tdata[11:0];
assign dds_sin = m_axis_data_tdata[27:16];

// parameter   SYS_CLK = 40000000; //system clock 40M 
// parameter  CLK_6M  = 6000000;  //frequency 6M 
// parameter  CLK_400K = 400000;  //frequency 400K
// parameter  CLK_2M  = 2000000;  // frquency 2M
// parameter  PHASE_WIDTH = 32 ;  // 相位宽度为32bit

 // clock
 initial begin
  clk = 0;
  forever #(12.5) clk = ~clk; // 40M system clokc
 end

 initial begin
  frequency = 'd0;
  freq_vld = 1'b0;
  repeat(3000)@(posedge clk);

  // 产生一个频率为400KHz的复指数
  frequency = 32'd42949672; //CLK_400K * (2^PHASE_WIDTH)/SYS_CLK   
  freq_vld = 1'b1;
  @(posedge clk)
  freq_vld = 1'b0;

  repeat(3000)@(posedge clk);

  // 产生一个频率为4MHz的复指数
  frequency = 32'd214748364 ;//CLK_4M * (2^PHASE_WIDTH)/SYS_CLK
  freq_vld = 1'b1;
  @(posedge clk)
  freq_vld = 1'b0;

  repeat(3000)@(posedge clk);

  // 产生一个频率为6M的复指数
  frequency = 32'd644245094;// CLK_6M* (2^PHASE_WIDTH)/SYS_CLK
  freq_vld = 1'b1;
  @(posedge clk)
  freq_vld = 1'b0;


 end


dds_compiler_0 inst_dds (
  .aclk(clk),                                   // input wire aclk
  .s_axis_config_tvalid(freq_vld),     // input wire s_axis_config_tvalid
  .s_axis_config_tdata( frequency),       // input wire [31 : 0] s_axis_config_tdata
  .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
);
endmodule

可以看到生成了不同频率的正余弦信号。一开时的时候。没有给出相位增量,所以固定输出2M的信号,之后给出了相位增量后,输出了400K 信号。

4eb321d9ecc043c18051ce3e5685268c.png 598827848509e1d3611189c6035ed207.png b8dd6b846325a0b22ed2d9925dca2f77.jpeg

想要了解FPGA吗?这里有实例分享,ZYNQ设计,关注我们的公众号,探索

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vivado是一款由Xilinx开发的集成电路设计工具,用于设计和实现FPGA和SoC。DDS IP核是Vivado中的一个IP核,用于生成数字频率合成器。根据引用\[2\]中的代码,可以看出DDS IP核的配置是通过控制字来实现的。控制字的值决定了输出信号的频率和相位。在引用\[3\]中的tb文件中,可以看到控制字的值被设置为66和6666,这将影响DDS IP核生成的输出信号的频率。通过修改控制字的值,可以实现不同的频率输出。在Vivado中使用DDS IP核,需要将IP核添加到设计中,并根据需求配置IP核的参数,如控制字的值、时钟频率等。然后,将设计综合、实现和生成比特流文件,最后下载到目标设备中进行验证和测试。 #### 引用[.reference_title] - *1* *2* [Vivado DDS IP使用、仿真、多相处理和相关计算验证](https://blog.csdn.net/Popplio/article/details/126711613)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [FPGA自学笔记--DDS ip核的使用(vivado)](https://blog.csdn.net/lgk1996/article/details/123245246)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值