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

前言本文根据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 / 1psmodule tb_top;// top parametersparameter period = 10;// top inputsreg clk = 0 ;// top outputsinitialbegin forever #(period/2) clk=~clk;endtop u_top ( .clk(clk));initialbegin #10000; $finish;endendmodule编写完成后直接点击运行仿真测试即可。
测试结果运行仿真查看波形结果,将顶层例化模块的波形添加到波形窗口,可以得到数字模式下的十六进制显示的数值,可将数值转化为波形显示方便观察。
设置下数据的进制格式和显示模式,这里修改通道数据为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仿真测试仿真文件可以保持单通道测试不变,点击运行行为级仿真,添加信号波形修改波形设置,可得到混频后的信号效果。

华为p50pro价格官网价
小米致力于开拓亚洲第三大经济体:如今成为了印度第一和全球第四大智能手机厂商
英特尔观望博通收购高通计划的发展,而且考虑对博通发出收购提议
深圳小区电梯智能维保系统
电阻器组成及特性解读
数字信号处理-DDS IP应用实例
独特创意纯手工打造智能无线供电台灯
Salesforce Research的爱因斯坦AI及其所提供的产品
基于ARM44B0x的信号发射机控制器设计
西门子S7-200SMART的移位指令介绍
荣耀30Pro的配置已确认,曲面打孔屏+麒麟995
反激式开关电源电路图大全(高频变压器/反激式转换器/双环路反馈系统)
异步复位同步撤离是什么意思?如何做到异步复位同步撤离呢?
深睿医疗和推想科技分别宣布肺炎AI产品获NMPA三类证
中国联通在2019年世界移动通信大会上展示了超宽带接入网络关键技术
新磁芯结构在电子变压器中的应用
利用二极管改善电流连续模式PFC电路效率示例
苹果新版ipad、iPad Air2,、ipad pro三者评测对比,你选择谁?
油气分离器的结构工作原理
PLC远程监控助力食品废水处理智能化管理