使用IP核实现DDS

本文最后更新于:4 个月前

说明:

  1. 本文档由DuRuofu撰写,由DuRuofu负责解释及执行。

修订历史:

文档名称 版本 作者 时间 备注
使用IP核实现DDS v1.0.0 DuRuofu 2024-02-23 首次建立

使用IP核实现DDS

一、新建block design原理图

添加DDS IP核:

二、配置DDS IP核

第一页:基础配置

1:配置选项

三种模式可选(相位发生器+sin/cos波形发生器、仅有相位发生器、仅有sin/cos波形发生器);

2:运行时钟aclk;

100 MHz工作时钟,即100MHz采样率。

3:通道个数;

设为1,单通道模式,通道的采样频率等于采样时钟100MHz,当设为多个通道时,每个通道的采样率为工作时钟/通道数,比如4通道100MHz时钟,每个通道采样率25MHz。

4:操作模式;

Standard标准模式(常用)Rasterized栅格模式。两种情况下,输出的频率和频率分辨率、相位增量等参量的计算方式不同,具体参见Xilinx的PG141第14~18页。

Standard Mode 和 Rasterized Mode在实现指定频率、幅度的信号时,输出没有太大的差别,两者均能满足要求,一般使用Standard配置方便。

主要的区别

Standard模式下计算出来的相位增量可能是小数,而在FPGA中要对相位进行截断取整,存在相位误差,对噪声要求较高的场合,可以使用8处的噪声整形配置来弥补,使用相位抖动(Phase Dithering)或者泰勒级数纠正(Taylor Series Correct)补偿相位误差

Rasterized Mode配置下,相位增量一定是整数,不存在截断效应,没有Standard模式下的时间基抖动。

5:参数选项(System parameters、Hardware parameters)

(1) System parameters

(2) Hardware parameters

6、7、8处配置系统参数System parameters,其中:

6:配置SFDR无杂散动态范围

SFDR(Spurious Free Dynamic Range,无杂散动态范围),对应幅度,对应M_AXIS_DATA通道,SFDR越大,用于表示幅度的数据的位宽越大;

如下图所示计算输出位宽,当使用SFDR = 96 dB,配置8处的噪声整形位None或者Dithering时,输出位宽位96/6=16位,向上取整后为16位;使用SFDR = 95 dB,95/6=15.83,向上取整为16位。

7:配置频率分辨率

对应相位的增量配置、位宽,对应M_AXIS_PHASE通道,频率分辨率越小,用于表示相位的数据的位宽越大;

8:配置噪声整形

4处配置成Standard标准模式时才会使用噪声整形,Auto根据设计的SFDR参数自动选择是否使用整形;None不整形;Phase Dithering相位抖动,在使用相位截断技术时,产生随机的噪声来使得量化误差随机;Taylor Series Correct 泰勒级数校正;

4处配置成Rasterized时,不存在相位误差,只能配置None。

For virtually all applications, the preferred implementation is the dithered DDS.

对于绝大多数的应用,首选的是带有相位抖动补偿的DDS。

相位抖动用于提高SFDR,但代价是增加底噪。

9:Hardware parameters

这种模式下直接配置输出的位宽,但是具体输出对应的SFDR和频率分辨率会在Summary中体现,也可以自行计算。

10:最终配置如下:

第二页:具体实现

1:相位增量是否支持可编程配置

Fixed是固定相位增量,DDS运行过程中不可更改,即对应不可变频率;

Programmable可编程,选中后出现配置接口,可在DDS运行过程中随时写入频率控制字改变输出波形的频率,用于偶尔改变频率;

Streaming应用于频繁改变频率,或者FM频率调制

2:相位偏移是否支持可编程配置

None不支持;

Fixed固定相位偏移;

Programmable可编程配置(偶尔改变);

Streaming经常改变,应用于相位调制;

3:输出波形选择

Sine只输出sin波形;Cosine输出cos波形;两个的位宽均为第一页设置的数据位宽,Sine and Cosine同时输出sin和cos波形,其中高位表示sin,低位表示cos,总的数据位宽加倍

4:极性选择

sin和cos波形默认使用的是有符号数,勾选相应的选项后,正负取反;

5:幅度模式

Full Range:全精度(全范围),针对通信应用,需要最大振幅,但由于自动增益控制导致振幅的值不那么重要的场合,输出幅度接近1;

Unit Cycle:单位圆,用于对DDS输出振幅值要求很高的应用,比如产生FFT旋转因子。单位圆时,DDS输出幅值为半全量程(即取值范围为01000..(+ 0.5)。110000 . .(-0.5))。

6:是否输出相位信息

勾选后含有相位输出通道,不勾选时只输出幅度信息M_AXIS_DATA;

7:使用的存储资源类型

Auto由具体所需的资源决定,资源较少时使用DROM,资源多时选择BROM;Distribute ROM选择分布式ROM(DROM),Block ROM选择块ROM资源(BROM);

8:综合优化策略

Area是面积优先,尽可能节省资源用量(LUT、FF等),Speed速度优先,尽可能提升性能;

9:DSP48资源的使用策略

Minimal尽可能少用,节省资源,Maximal尽可能多用,提高性能;

10:最终配置如下:

第三页:总线配置

单通道模式下,总线的配置只包含可选的输出信号的Ready。多通道模式下,通道可选是否包含tlast等信号。

1:输出ready信号

选中则输出的2个通道中增加tready信号(可选),根据AXI_Stream总线协议的规则,由后级接收模块输入一个ready信号(高电平),表示已经准备好接收DDS输出,此时DDS才能输出

2:延时配置

第四页 输出频率配置

配置各通道的输出频率,在第一页中只使用了1个Channel,所以此处只能配置一个通道,直接配置输出频率,单位MHz,比如0.02MHz;

第五页:总结

三、生成项目文件

进行综合

生成顶层文件:

四、仿真测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
`timescale 1ns / 1ns

module tb_dds_ip();

// 定义信号
wire [15:0]M_AXIS_DATA_0_tdata;
reg M_AXIS_DATA_0_tready;
wire M_AXIS_DATA_0_tvalid;
wire [31:0]M_AXIS_PHASE_0_tdata;
reg M_AXIS_PHASE_0_tready;
wire M_AXIS_PHASE_0_tvalid;
reg aclk_0;


initial begin
aclk_0 = 0;
M_AXIS_DATA_0_tready = 1'b1; // 使能数据通道
M_AXIS_PHASE_0_tready = 1'b1;// 使能相位通道

#5000;
$stop;
end

// 时钟
always #5 aclk_0 = ~aclk_0; // 时钟周期为10ns 100MHz


// 例化DDS顶层模块
dds_wrapper dds_wrapper
(
.M_AXIS_DATA_0_tdata(M_AXIS_DATA_0_tdata),
.M_AXIS_DATA_0_tready(M_AXIS_DATA_0_tready),
.M_AXIS_DATA_0_tvalid(M_AXIS_DATA_0_tvalid),
.M_AXIS_PHASE_0_tdata(M_AXIS_PHASE_0_tdata),
.M_AXIS_PHASE_0_tready(M_AXIS_PHASE_0_tready),
.M_AXIS_PHASE_0_tvalid(M_AXIS_PHASE_0_tvalid),
.aclk_0(aclk_0)
);

endmodule

仿真结果:

仿真时注意DDSIP核输出的是有符号数,因此需要将DDS输出的数据设置成有符号数,即将仿真数据radix为signed decimal

参考链接

  1. https://docs.xilinx.com/v/u/en-US/pg141-dds-compiler
  2. https://www.bilibili.com/video/BV1zh411r76w/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=ef5a0ab0106372751602034cdd9ab98e

使用IP核实现DDS
https://www.duruofu.xyz/2024/02/24/4.硬件相关/FPGA/FPGA实践/使用IP核实现DDS/
作者
DuRuofu
发布于
2024年2月24日
更新于
2024年2月24日
许可协议