ip核配置定制输出数据位宽这里的输出数据指的是输出的波形数据,其位宽相关参数介绍如下:
可见,输出数据宽度和sfdr以及noise shaping有关,你可先不必知道noise shaping和sfdr是什么?只需要暂时知道在ip核定制时需要选择即可,如果noise shaping选择了none and dithering,则输出数据宽度为:
如果为taylor:
而spurious free dynamic range (sfdr)翻译为无杂散动态范围,和输出数据宽度以内部总线宽度以及各种实现策略有关;假设我需求的数据宽度为10位,noise shaping选为none,则sfdr为60,输入ip定制页面:
查看输出是否为10bit:
定制相位位宽(或频率分辨率)根据数据手册对频率分辨率的描述:
频率分辨率:以赫兹为单位指定,指定最小频率分辨率,用于确定相位累加器使用的相位宽度及其相关的相位增量(pinc)和相位偏移(poff)值。较小的值可提供较高的频率分辨率,并且需要较大的累加器。较大的值会减少硬件资源。根据噪声整形的选择,可以增加相位宽度,并且频率分辨率高于指定的分辨率。
对于光栅化模式(rasterized mode),频率分辨率由系统时钟、通道数和所选模数固定。从这段描述,我们得出信息,频率分辨率可以用来控制相位位宽。如果操作模式选择标准模式,如下ip 核定制页面:
频率分辨率可以这样计算:
我们先给定需求的相位宽度,又已知系统频率值,根据公式就可以算出频率分辨率;将频率分辨率代入ip核定制页面,即可自动得到相位宽度。 其实从上式也可以直接推出相位宽度:
本例我们的系统频率为100mhz,如果想要相位宽度为16位,则频率 分辨率为:
在ip核定制页面,如下图,我们输入频率分辨率的值:
查看相位宽度为16位:
上面选择的是标准模式,如果选择另一种模式呢?rasterized mode of operation:光栅化操作模式;我们可以根据下面公式得到频率分辨率, 但和相位宽度没有直接关系 ,为了知识完整性,简介如下:
在ip核定制页面提现如下:
输出频率本示例选择的是单通道,也即通道数为1,因此输出频率也只能选择一个:
输出频率值也不是随便选择的,而是有其范围的,例如我输入105mhz,则通过不了:
提示超出范围,范围为(0,100).
输出正余弦选择以及数据格式可以在ip核定制页面选择输出正弦还是余弦还或者是都输出:
本示例选择输出正余弦,由于输出采用的是axi总线,因此输出数据位于m_axis_data_tdata中,那么正余弦输出结果是如何组合成m_axis_data_tdata的呢?
数据手册给出解释:
输出data通道tdata结构将正弦和余弦输出字段符号扩展到下一个字节边界,然后以最低有效部分的余弦进行连接,以创建m_axis_data_tdata。如果仅选择正弦或余弦之一,则将其符号扩展并放入m_axis_data_tdata的最低有效部分。
下图显示了这三种配置的tdata的内部结构。正交输出,仅余弦和仅正弦。例如,在图中显示了11位输出,符号扩展到16位。<<<表示符号扩展名:
因此我们可以这么认为,由于存在扩展符号位的关系,我们可以提取低一半的数据为cos,高一半的数据未sin。
其他设置有了上面的定制参数,输出波形是没有问题了,至于其他的定制参数,本文选择默认:
点击ok,等待ip核定制完成。
电路设计本示例设计十分简单,就是单纯例化下ip核:
复制例化模板:
给出设计文件:
`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////////// company: // engineer: reborn lee// module name: waveform_gen// additional comments:// //////////////////////////////////////////////////////////////////////////////////`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////////// company: // engineer: reborn lee// module name: waveform_gen// additional comments:// //////////////////////////////////////////////////////////////////////////////////module waveform_gen( input i_clk, output o_data_valid, output [31 : 0] o_data, output o_phase_valid, output [15 : 0] o_phase );dds_compiler_0 inst_dds ( .aclk(i_clk), // input wire aclk .m_axis_data_tvalid(o_data_valid), // output wire m_axis_data_tvalid .m_axis_data_tdata(o_data), // output wire [31 : 0] m_axis_data_tdata .m_axis_phase_tvalid(o_phase_valid), // output wire m_axis_phase_tvalid .m_axis_phase_tdata(o_phase) // output wire [15 : 0] m_axis_phase_tdata);endmodule行为仿真仿真程序也仅仅例化设计文件,设计下系统频率即可:
`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////////// company: // engineer: reborn lee// create date: 2020/06/03 17:25:26// module name: waveform_gen_tb//////////////////////////////////////////////////////////////////////////////////module waveform_gen_tb( ); reg clk; wire o_data_valid; wire [15 : 0] o_data; wire o_phase_valid; wire [31 : 0] o_phase; initial begin clk = 0; forever begin # 5 clk = ~clk; end end waveform_gen inst_waveform_gen ( .i_clk (clk), .o_data_valid (o_data_valid), .o_data (o_data), .o_phase_valid (o_phase_valid), .o_phase (o_phase) );endmodule执行行为仿真:
注意,仿真时间可以在此确定:
仿真波形:
正余弦拆开:
选择高16位作为sin。下面选择有符号数显示:
同时选择模拟显示:
之后你会发现正余弦显示波形相对于整体太平坦,以致于看起来像是直线,这是因为显示范围太大了导致的:
改下显示的坐标幅度范围:
显示正常了。
微软突破性绿色技术,加快实现减碳减排
BT33型调光台灯电路的制作方法
法国人能买到的奇葩电动车——雪铁龙 E-Mehari
如何降低电源噪声
并网逆变器拓扑
求一种基于DDS IP核的任意波形发生器设计方案
纳芯微的新产品NSi66x1A
Uber无人驾驶部门前主管申请破产 此前挖走了多名谷歌员工
国内首款4座固定翼飞机CG231已成功完成了飞行测试
预付费电能管理系统在大学宿舍中的应用
诺基亚Q2季度实现强劲增长,盈利能力明显好于市场预期
人工智能驱动的数据分析:这种变革趋势的内幕
时代民芯宣布在上海浦东成立控股公司-宇芯科技
这几个电阻在制作三极管电路中的作用
移远通信与爱立信联手共同探索行业5G应用的落地
爱奇艺VR一体机奇遇2S评测 已经彻底跨越了尝鲜的价值
有源钳位反激(ACF)变换器控制方案(1)
哈密顿回路算法
大数据挖掘,数据结构化首当其冲
在平面国生活,会是怎样的体验?