前言
前言
因篇幅关系,此IP解析分为两篇文章:
-
Xilinx IP解析之DDS Compiler v6.0(1)—— 基础概念
主要说明DDS的一些基础概念,只有了解清楚基础概念,才能理解IP的运行原理和各个输入输出信号的含义,以便在使用此IP时心中有数。
-
Xilinx IP解析之DDS Compiler v6.0(2)—— IP信号接口、配置与仿真
主要说明IP各个信号的含义,如何配置IP,最后仿真试验了IP的基础功能。
此为第二篇。
一. IP端口与信号
一. IP端口与信号
IP端口框图如下图所示。可以看到IP的信号分为6组,下面分别展开说明。
1.1 时钟与复位
信号名 | 输入/输出 | 必须可选 | 说明 |
---|---|---|---|
aclk | 输入 | 必须 | 工作时钟,上升沿有效 |
aclken | 输入 | 可选 | 时钟使能,高电平有效 |
aresetn | 输入 | 可选 | 复位信号,低电平有效, 当复位时,需要持续两个时钟的低电平 |
1.2 输入配置
信号名 | 输入/输出 | 必须可选 | 说明 |
---|---|---|---|
s_axis_config_tvalid | 输入 | 必须 | 高电平表示config_data数据有效 |
s_axis_config_tready | 输出 | 可选 | 高电平表示IP准备好接收数据 |
s_axis_config_tdata[A-1 : 0] | 输入 | 必须 | 位宽可配置(8的倍数), 输入PINC/POFF/(PINC+POFF) |
s_axis_config_tlast | 输入 | 可选 | 高电平指示最后一个通道config_tdata有效 |
此通道当IP被配置为相位生成或DDS,且PINC或POFF被配置为可编程时启用
可单独使能PINC或POFF为可编程的,也可两者都设为可编程的,三种情况的配置数据结构如下图所示。每个字段宽度都必须是8的倍数,如果PINC配置位宽为11,则0 ~ 10位为有效输入,11 ~ 15位会被忽略。POFF同理。
另外,CONFIG通道是非阻塞的,意思是当CONFIG没有输入新的PINC或POFF时,IP的就以它们的前一个有效值持续工作下去。且IP限制了使用CONFIG时必须给PINC或POFF设置0时刻的值(在额外的Tab页中),这保证了即使CONFIG没有任何有效输入,IP都可以正常输出,这就是所谓的非阻塞的概念。
1.3 输入相位
输入PHASE通道适用于DDS编译器执行动态功能的应用,如相位或频率调制。
此通道在以下两种情况下启用,且输入信号的含义不同。
-
当IP被配置为仅查找表时,输入为相位
-
当IP被配置为DDS,且PINC或POFF设置为流接口(Streaming)时,输入为PINC或POFF
如果此时再使能同步信号RESYNC,则此通道会额外加上RESYNC
信号名 | 输入/输出 | 必须可选 | 说明 |
---|---|---|---|
s_axis_phase_tvalid | 输入 | 必须 | 高电平表示phase_data数据有效 |
s_axis_phase_tready | 输出 | 可选 | 高电平表示IP准备好接受数据 |
s_axis_phase_tdata[A-1 : 0] | 输入 | 必须 | 位宽可配置(8的倍数), 输入相位/PINC/POFF/(PINC+POFF) |
s_axis_phase_user[B-1 : 0] | 输入 | 可选 | – |
s_axis_phase_tlast | 输入 | 可选 | 高电平指示最后一个通道phase_tdata有效 |
输入相位通道是阻塞的,每个输入对应一个输出,如果输入的phase_tvalid为低,则输出的m_tdata_valid和m_phase_tvalid为低,即没有输入就没有输出。
输入相位通道的数据结构如下图所示。与配置数据通道是一样,同样需要位宽补全为8的倍数。
1.4 输出数据
当IP被配置为仅查找表或DDS时启用,用于输出正弦值。
信号名 | 输入/输出 | 必须可选 | 说明 |
---|---|---|---|
m_axis_data_tvalid | 输入 | 必须 | 高电平表示phase_data数据有效 |
m_axis_data_tready | 输出 | 可选 | 高电平表示IP准备好接受数据 |
m_axis_data_tdata[A-1 : 0] | 输入 | 必须 | 位宽可配置(8的倍数),正弦值 |
m_axis_data_user[B-1 : 0] | 输入 | 可选 | – |
m_axis_data_tlast | 输入 | 可选 | 高电平指示最后一个通道data_tdata有效 |
输出可以选择只输出正弦/余弦,或同时输出正弦和余弦。结构如下图所示,<<<表示符号位扩展。
1.5 输出相位
当IP被配置为相位生成时启用,或当IP被配置DDS且额外选择相位输出通道时启用。
信号名 | 输入/输出 | 必须可选 | 说明 |
---|---|---|---|
m_axis_phase_tvalid | 输入 | 必须 | 高电平表示phase_data数据有效 |
m_axis_phase_tready | 输出 | 可选 | 高电平表示准备好接受数据 |
m_axis_phase_tdata[A-1 : 0] | 输入 | 必须 | 位宽可配置(8的倍数),输出相位 |
m_axis_phase_user[B-1 : 0] | 输入 | 可选 | – |
m_axis_phase_tlast | 输入 | 可选 | 高电平指示最后一个通道phase_tdata有效 |
在标准操作模式下,输出相位会通过符号位扩展填充位宽,<<<表示符号位扩展,如下图所示。
而在栅格模式下,输出相位则通过高位补0填充位宽。
1.6 事件
事件信号是IP根据输入相关配置自动使能的,通过监测这些事件可以检测输入是否正确,通常用作调试。
如果不需要事件输出,可以将其保持未连接,Xilinx工具会优化掉相关逻辑。
信号名 | 输入/输出 | 必须可选 | 说明 |
---|---|---|---|
event_s_phase_tlast_missing | 输出 | 必须 | 当向s_axis_phase通道的最后一个通道(在多通道配置中)的传输没有断言tlast时,这个信号被断言 |
event_s_phase_tlast_unexpected | 输出 | 必须 | 当TLAST信号被断言用于向s_axis_phase通道的传输,而这个传输不是针对最后一个通道(在多通道配置中)时,这个信号被断言 |
event_s_phase_ chanid_incorrect | 输出 | 必须 | 当chanid字段(s_axis_phase中的TUSER子字段)与内部预期的通道号不一致时,这个信号被断言 |
event_pinc_invalid | 输出 | 必须 | 当要累积的PINC值超出范围时,这个信号被断言。这仅适用于栅格模式 |
event_poff_invalid | 输出 | 必须 | 当要累积的POFF值超出范围时,这个信号被断言。这仅适用于栅格模式 |
event_phase_invalid | 输出 | 必须 | 当Phase_In的值超出范围时,这个信号被断言。这仅适用于栅格模式 |
event_s_config_tlast_missing | 输出 | 必须 | 当向s_axis_config通道的最后一个传输(对于最后一个通道)没有伴随TLAST信号断言时,这个信号被断言 |
event_s_config_tlast_unexpected | 输出 | 必须 | 当向s_axis_config通道的传输伴随TLAST信号断言,而这个传输不是与最后一个通道关联的传输时,这个信号被断言 |
二. IP配置与使用
二. IP配置与使用
2.1 Configuration Tab(配置标签页)
系统参数界面:
Configuration Options,配置选项,共三种。
System Requirements,系统要求:
-
System Clock,系统时钟。
-
Number of Channels,通道数量:DDS和相位生成器最多支持16个通道。通道是时分复用的,这降低了每个通道的有效时钟频率。
-
Mode of Operation,工作模式:可选标准模式或栅格模式。
-
Modulus,模数(仅适用于栅格模式):栅格数M。
-
Frequency per Channel (Fs),每个通道的频率(Fs):由于时分复用,每个通道的有效系统时钟是实际系统时钟除以通道数。
Parameter Selection,参数选择:可选系统参数或硬件参数。系统参数主要面向系统架构师(频域参数),而硬件参数主要面向硬件工程师(时域参数)。相位生成器和SIN/COS LUT仅支持硬件参数。
2.1.1 System Parameters(系统参数)
-
Spurious Free Dynamic Range (SFDR),无杂散动态范围。
-
Frequency Resolution,频率分辨率。
Noise Shaping,噪声整形:这控制着是否使用相位截断、抖动或Taylor级数校正。选项包括:
-
None: 无矫正,即使用相位截断DDS。
-
Dithering: 使用相位抖动来提高SFDR。
-
Taylor Series Corrected: 使用Taylor级数校正DDS。
-
Auto: 根据系统参数(如SFDR)自动确定噪声整形选项。所选的噪声整形选项将显示在核心摘要页面中。Auto仅在参数选择为系统参数时可用。
[!TIP]
对IP使用来说,无需关心具体实现,只要SFDR和频率分辨率满足要求即可,选择Auto是合适的。
根据输入的系统参数和选择的噪声整形选项,Vivado IDE会推导出最小的相位宽度和输出宽度。相位宽度增加可以启用特定的噪声整形选项。例如,Taylor级数校正需要最小的相位宽度为12位。
Phase Width = ⌈ log 2 ( DDS Clock Rate Channels × Frequency Resolution ) ⌉ \text { Phase Width }=\left\lceil\log _2\left(\frac{\text { DDS Clock Rate }}{\text { Channels } \times \text { Frequency Resolution }}\right)\right\rceil Phase Width =⌈log2( Channels × Frequency Resolution DDS Clock Rate )⌉
即:相位宽度 = C e i l [ log 2 ( f d d s 通道数 ⋅ 频率分辨率 ) ] C e i l 表示向上取整 \text{即:相位宽度}=Ceil\left[ \log _2\left( \frac{f_{dds}}{\text{通道数}\cdot \text{频率分辨率}} \right) \right] \\ Ceil\text{表示向上取整} 即:相位宽度=Ceil[log2(通道数⋅频率分辨率fdds)]Ceil表示向上取整
从SFDR和噪声整形计算输出宽度:
图4-1展示了每个噪声整形选项操作的SFDR和相位宽度区域。对于“None”、“相位抖动”和“泰勒级数校正”这三种噪声整形方法,存在三个重叠的区域,并且使用了更深的阴影层次来指示区域重叠的部分。最暗的区域是这三个区域完全重叠的地方,表明所有三种噪声整形方法都可行。下方的虚线表示泰勒级数校正仅在SFDR大于66.0分贝(而非等于66.0分贝)时有效。相位宽度可以增加,以便针对特定的SFDR目标最大化可用的噪声整形选项数量。
2.1.2 Hardware Parameters(硬件参数)
-
Phase Width,相位宽度,决定了频率分辨率。
-
Output Width,输出宽度。
下表总结了硬件参数下噪声整形选项的可选范围。注意噪声整形选项的选择将限制硬件参数的输入输出位宽范围。
硬件参数下,SFDR由输出位宽与噪声整形共同决定,计算公式如下。
2.2 Implementation Tab(实现选项卡)
Phase Increment Programmability,相位增量可编程性:选择设置PINC值的方式。
-
Fixed,固定:PINC在生成时固定,无法在运行时更改。固定需要最少的资源。
-
Programmable,可编程:可以使用CONFIG通道在运行时更改PINC值。当DDS频率需要在操作模式之间变化时,建议使用此选项。选中此选项需要指定初始频率。
-
Streaming,流式:PINC值直接从输入的PHASE通道获取。当PINC值需要经常变化时,或者例如需要频率调制时,建议使用此选项。选中此选项无需指定初始频率。
Resync,重新同步:仅当PINC选择Streaming时可用。Resync启用时,s_axis_phase通道将包含一个RESYNC字段。激活这个字段后,它会重置指定通道的累加相位。在RESYNC信号生效的那个周期,累加相位的值将被重置为伴随RESYNC信号出现的PINC值和POFF值之和。
Phase Offset Programmability,相位偏移可编程性:选择设置POFF值的方式。
- None,无:不使用相位偏移功能,不生成所需的硬件。这样可以节省FPGA资源。
- Fixed,固定:POFF在生成时固定,无法在运行时更改。
- Programmable,可编程:可以使用CONFIG通道来更改POFF值。当DDS相位需要在操作模式之间变化时,建议使用此选项。
- Streaming,流式:可以使用输入的PHASE通道来更改POFF值。当POFF值需要经常变化时,或者例如需要相位调制时,建议使用此选项。
Output,输出:
-
Output_Selection,可选正弦、余弦或正弦加余弦。
-
Polarity,极性:负正弦:SINE变为原本的相反数;负余弦:COSINE变为原本的相反数。
Amplitude Mode,幅度模式:此选择允许DDS输出两种幅度之一。
-
Full Range,满量程:
满量程模式适用于那些需要最大幅度但具体值不那么重要的通信应用,因为预期会有自动增益控制。对于非Taylor模式,目标幅度是(1 - 2-(输出宽度-2));而在Taylor模式中,幅度则在(1 - 2-(输出宽度-2))和1之间变化。这里的幅度是相对于输出宽度归一化的,二进制小数点位于最前面。例如,一个8位输出,其最大幅度是从100000000减去10,得到的值介于01111110(略小于1)和11111110(略大于-1)之间。
-
Unit Circle,单位圆:
单位圆模式适用于那些需要精确控制DDS输出幅度的应用,例如在FFT运算中生成旋转因子。在单位圆模式下,DDS的输出幅度是满量程的一半,即数值范围从01000…(代表+0.5)到110000…(代表-0.5)。由于幅度减小到满量程的一半,SFDR相应减少了6 dB,可通过增加输出宽度或其它方式提高SFDR。
[!TIP]
一般情况下,就用满量程模式即可,即使幅值不非常准确,波形畸变也非常微小。
Implementation Options,实现选项:
- Memory Type,存储器类型:一般Auto即可,也可显式选择分布式ROM或块ROM。
- Optimization Goal,优化目标:可通过增加额外的流水线寄存器来增加电路时钟速度。此选择控制实现决策是针对最高速度还是最低资源。
- DSP48 Use,DSP48使用:此选项控制相位累加器和后续加法阶段(用于相位偏移和/或抖动噪声添加)的实现。当设置为Minimal时,相位累加器和后续阶段在FPGA逻辑中实现。当设置为Maximal时,所有内容都使用DSP片实现。
2.3 Detailed Implementation Tab(详细实现选项卡)
AⅪ Channel Options:AXI通道选项
DATA Has TLAST:是否启用TLAST,只在多通道时可用。
- Not Required,不需要:在此模式下,输入PHASE通道和输出通道上不显示TLAST信号。在多通道配置中,CONFIG通道上的TLAST用于指示最后一个需要重新配置的通道,这一信号始终存在,不受此设置影响。
- Vector Framing,向量帧结构:输入PHASE通道和输出通道上的TLAST脉冲标志着通道序列中的最后一个通道(例如,12个通道中的第12个)。如果TLAST脉冲没有在正确的时间与核心的通道状态相匹配,会在event_s_phase_tlast_missing或event_s_phase_tlast_unexpected事件输出上标记事件。
- Packet Framing,数据包帧结构:TLAST脉冲从输入PHASE通道传递到输出通道,延迟与TDATA相同。在这种配置中,TLAST可用于触发重新配置。详见第47页的同步模式。此模式旨在简化系统设计,适用于信号需要伴随数据流但不在DDS中使用的场景。
- Config Triggered,配置触发:此选项使得核心在应用新配置前,在最后一个TDM通道上生成输出TLAST。随后的输出样本将使用新的核心配置生成。此模式仅在存在CONFIG通道时可用。
Output TREADY,输出TREADY选项:启用此选项时,输出通道将包含TREADY信号,从而支持完整的AXI握手协议。
[!TIP]
一般来说,无需Tready,可认为Tready一直为高。
TUSER Options,TUSER选项:不使用TUSER字段,无需关心
Output Form,输出格式:通常情况下,输出采用二进制补码形式。但是,在使用象限对称时,输出格式可以改为符号和幅度。
Synchronization Mode,同步模式:同步模式决定了在CONFIG和PHASE通道同时存在时,重新配置的时机。配置通道独立于通道计数器的计数周期接收配置数据,并将其存储在缓冲区中。这个模式决定了这些新配置数据何时生效:
- On Vector,在向量上:在向量上:在这种模式下,当通道计数器开始新的时分复用通道周期时,应用新的配置数据。
- On Packet,在数据包上:当TLAST标记用于数据包帧结构时,这种模式可用。输入PHASE通道上的TLAST信号会触发重新配置。这种模式适用于需要将每组配置数据与输入TLAST指示的数据包相关联的情况。
Latency Options,延迟配置选项:选择延迟是否由Vivado IDE自动配置或手动配置:
-
自动:使DDS进行流水线处理以实现最佳性能(考虑到优化目标)。
-
可配置:在性能需求之外,可以将延迟设置为可配置,并选择较小的延迟值。这会减少流水线阶段数量,通常会导致资源节省。延迟的最小值受到限制,每个以下来源会产生一个延迟周期:
-
流阶段增量
-
SIN/COS查找表内的块ROM(可以通过选择分布式ROM来避免)。
-
第二阶泰勒级数校正内的块ROM(用于超过120 dB的SFDR)。
注意,当选择TREADY时,AXI接口以FIFO形式缓冲数据。这种缓冲会导致非确定性延迟。然而,这种操作只能增加延迟。在这种情况下,可能的最低延迟是6个周期加上上述描述的最小延迟。
-
Control Signals,控制信号:
- ACLKEN,时钟使能,高电平使能DDS工作时钟
- ARESETn,至少两个时钟周期的低电平使能复位
2.4 Parameter Entry Pages(参数输入页面)
- 如果配置选项选择Hardware Parameters:
当PINC选择Programmable时,会出现Phase Angle Increment Values页,用二进制数设定各个通道的初始角频率。
当POFF选择Programmable时,会出现Phase Angle Offset Values页,用二进制数设定各个通道的初始相位。
- 如果配置选项选择System Parameters:
当PINC选择Programmable时,会多出Output Frequencies页,设定各个通道的初始角频率。
当POFF选择Programmable时,会多出Phase Offset Angles页,设定各个通道的初始相位。
对于标准模式,初始相位的有效范围是-1.0 ~ 1.0,对应实际相位-2π ~ 2π,此范围大于一个周期,但允许,因为负值会映射到等效的正值。
对于栅格模式,有效范围是0 ~ 1.0。例如,输入0.5代表180°(即π弧度)。
2.5 Summary(摘要)与Additional Summary(摘要续)
- 摘要(第1页):此页面展示了IP最终配置值。包括内存类型、延迟、资源估计(DSP切片和块RAM使用量)等。此外当使用硬件参数作为输入时,此页面还显示了预期SFDR和频率分辨率,无需用户手动计算。
- 摘要(第2页):仅在Phase Increment和/或Phase Offset固定或可编程时显示,提供用于获得特定频率或相位偏移的十六进制值与实际值的摘要。
三. IP参数计算
三. IP参数计算
为方便的计算DDS的各种参数,特别是设置初始频率与PINC,本人编写了基于Mathcad编写了DDS参数计算书,只需改变橙黄色标记的参数,就能实现自动计算,部分截图如下:
四. IP仿真
四. IP仿真
为试验DDS IP的功能,编写顶层文件以实例化IP并编写testbench进行仿真,
顶层文件如下:
module tryDDS
#(
parameter PHASE_WIDTH = 16, // 相位位宽, 注意输入Phase PINC POFF与输出Phase位宽相同
parameter DDS_OUT_WIDTH = 16 // 输出正余弦值的位宽
)(
input wire [PHASE_WIDTH-1:0] dds_phase_din,
input wire dds_phase_din_valid,
input wire [PHASE_WIDTH-1:0] dds_pinc_din,
input wire dds_pinc_din_valid,
output wire [DDS_OUT_WIDTH-1:0] dds_out,
output wire dds_out_valid,
output wire [PHASE_WIDTH-1:0] dds_phase_out,
output wire dds_phase_out_valid,
input wire clk
);
dds_compiler_0 dds_compiler_0_u0 (
.aclk (clk ),
.s_axis_config_tvalid (dds_pinc_din_valid ),
.s_axis_config_tdata (dds_pinc_din ),
.m_axis_data_tvalid (dds_out_valid ),
.m_axis_data_tdata (dds_out ),
.m_axis_phase_tvalid (dds_phase_out_valid),
.m_axis_phase_tdata (dds_phase_out )
);
endmodule
testbench如下:
module tryDDS_tb();
timeunit 1ns;
timeprecision 1ps;
localparam PHASE_WIDTH = 16;
localparam DDS_OUT_WIDTH = 16;
logic [PHASE_WIDTH-1:0] dds_phase_din;
logic dds_phase_din_valid;
logic [PHASE_WIDTH-1:0] dds_pinc_din;
logic dds_pinc_din_valid;
logic [DDS_OUT_WIDTH-1:0] dds_out;
logic dds_out_valid;
logic [PHASE_WIDTH-1:0] dds_phase_out;
logic dds_phase_out_valid;
logic clk;
tryDDS #(
.PHASE_WIDTH (PHASE_WIDTH),
.DDS_OUT_WIDTH (DDS_OUT_WIDTH)
) tryDDS(.*);
// 生成时钟
localparam CLKT = 10; // 对应1000/CLKT (MHz), 例如:1000对应1MHz,
initial begin
clk = 0;
forever #(CLKT / 2) clk = ~clk;
end
initial begin
dds_pinc_din = 655;
dds_pinc_din_valid = 1;
#(CLKT * 200)
dds_pinc_din = 655 * 2;
#(CLKT * 100)
dds_pinc_din = 655 * 4;
#(CLKT * 100)
dds_pinc_din = 655 * 8;
#(CLKT * 100)
$stop;
end
endmodule
一般来说,选择PINC可编程模式,POFF为NONE或为定值,通过输入PINC来控制DDS生成不同频率的正弦波,上述testbench文件中逐级增加PINC的值,下图为仿真波形,可以看到输出波形频率逐级提高。
本文仅仿真了DDS的基础功能,未研究多通道输出,Resync等较复杂的功能,感兴趣的同学可自行摸索。
五. 总结与分享
五. 总结与分享
通过本文,用户应能熟悉DDS配置中的几个关键问题:
- 输入输出信号结构组成,位宽均为8的倍数。
- 输入配置通道是非阻塞的,输入相位通道是阻塞的。
- 输出幅值模式可选满量程模式与单位圆模式。
分享,本文的参考资料、IP参数计算书与IP仿真工程(Vivado 2023.2)。
(此IP解析的两篇博客分享相同,各位同学获取一次即可)
欢迎大家关注我的公众号:徐晓康的博客,回复以下四位数字获取。
7412
建议复制过去不会码错字!
徐晓康的博客持续分享高质量硬件、FPGA与嵌入式知识,软件,工具等内容,欢迎大家关注。
文章评论