RFSoC应用笔记 - RF数据转换器(4):RFSoC关键配置之RF-ADC内部解析(二)

本文转载自:Vuko-wxh的CSDN博客

前言

RFSoC中最重要的部分是射频直采ADC和DAC的配置,因此了解内部相关原理结构可以帮助我们更好理解相关功能配置参数含义。本文参考官方手册,主要对RFSoC ADC的数字数据路径相关功能进行介绍。

RF-ADC 数字数据路径

Tile 中的 RF-ADC 组件具有集成的 DSP 功能,您可以启用这些功能在将来自 RF-ADC 设备的采样数据传递到 PL 之前对其进行预处理。 不同的 DSP 功能块如下:

  • 检测功能:包含一个双级可编程阈值,为内部互连逻辑提供两个标志,并在 RFADC 的绝对输出值大于或小于编程阈值时置位。

  • 补偿功能:包含一个正交调制器校正 (QMC) 模块和一个粗延迟调整模块。

  • 数字下变频器 (DDC):

混频器——粗调(四分之一和半速率)和精细(具有 48 位频率分辨率的 NCO)。

Gen 1/Gen 2:信号抽取功能—支持1(旁路)、2、4 或8 抽取。

Gen 3:信号抽取功能—支持1(旁路)、2、3、4、5、6、8、12、16、20、24、40 抽取。

可以使用或绕过单个、多个或所有 DSP 功能。 某些功能,例如 QMC,需要在 I 和 Q RF-ADC 中激活相同的功能。 偶数 RF-ADC 始终用于 I 数据路径,奇数 RF-ADC 用于 Q 数据路径。 您可以使用 IP 内核实现、配置或修改一个或多个功能的功能。

下图显示了 RF-ADC 中的可用功能。

1.png

RF-ADC 阈值和超范围设置

与任何 ADC 一样,输入模拟信号必须保持在 ADC 的满量程范围内,并且处于正确的输入电平。 任何不符合这些条件的信号都会导致数据丢失。 为了帮助防止这种情况,阈值检测器功能可用于调整信号链增益,以将信号保持在理想的满量程范围内。 但是,如果信号确实超出了满量程范围,每个 RF-ADC 通道都具有内置的检测和保护功能,具有过量程和过压功能。

过电压和超范围信号提供给 IP 内核上的中断功能,以及 IP 内核上的 RF-ADC 实时信号总线,以便直接访问 PL 设计。

Over Range(超出范围)

当信号超出 RF-ADC 的满量程输入时,会出现超出范围的情况。 当检测到这种情况时,转换后的数据会饱和(限幅)以限制数据损坏,并且信号由中断机制和通过断言 Over Range 实时输出信号进行标记。 由于 Over Range 事件可以短至一个 RF-ADC 样本,因此输出信号具有粘性。 要清除 Over Range 输出和相关中断,使用 API 中断处理机制。

Over Voltage 过压(第 1 代/第 2 代)

当信号远远超出正常工作输入范围时,就会出现过压情况。由于输入端电压过高会损坏器件,因此提供了自动保护机制。过压事件会导致输入缓冲器自动关闭以保护它。 过压电路独立监控差分输入的每个信号,并在任何单个输入信号超过最大输入电压或低于 RF-ADC 输入缓冲器的最小输入电压时标记状态。过压功能为 Zynq UltraScale+ RFSoC 数据表中定义的范围内的信号提供保护(DS926)。 超过此最大值的信号是不允许的,必须注意外部,以确保不会将此类电压提供给 RF-ADC 输入。

当检测到过压情况时,中断机制和置位过压实时输出信号都会对信号进行标记。 过电压实时输出被异步断言和取消断言,并提供事件的即时通知。 因此,当过压条件不再存在时,过压输出会自行清零。 相关的中断是粘性的,因此需要通过 API 中断处理例程清除。

在发生过压事件后,输入缓冲器会自动重新启用,并且 RF-ADC 会像以前一样恢复运行。 但是,应将过压条件视为停止通信并重新启动接收器链的理由。 如果出现过压情况,缓冲器将关闭,由此产生的 RF-ADC 输出数字代码大多只是噪声。 结果,阈值信息变得无关紧要,这会影响 AGC 的实施。 因此,AGC 实施应考虑过电压信号并相应地设置两个阈值检测器,这一点很重要。

下图显示了阈值、过量程和过压电平以及随着输入模拟信号的增加这些电平的响应。

2.png

阈值设置

阈值功能无需等待信号通过信号处理模块传播,而是提供传入信号电平的早期指示。 PL 中实现的自动增益控制 (AGC) 可以使用这种信号电平的早期指示。 用于指示输入信号电平的阈值电平是使用 RFdc 驱动程序 API 设置的。

当 RF-ADC 采样数据进入数据路径时,会进行阈值监控。 将此数据与用户定义的阈值进行比较。 阈值状态信号被发送到 IP 内核的输出,以指示已超过用户定义的阈值。 每个 RF-ADC 有两个实时超阈值输出信号。 阈值监控电路的模式如下表所示。

3.JPG

阈值级别设置为 14 位无符号值,允许 0 到 16383 之间的任何值。 最大值 16383 表示 RF-ADC 满量程输入的绝对值。 32 位可编程延迟对 RF-ADC 样本进行计数。 要将此计数与特定时间相关联,可以使用以下等式:

4.JPG

其中对于 Quad RF-ADC tile,Interleaving Factor 为 4,并且为 8 用于双 RF-ADC 模块。

延迟也可以用样本而不是 ms 表示,如下所示:

5.JPG

清除阈值标志

在 Sticky Over 和 Sticky Under 模式下,阈值置位后,可以通过两种方式清除标志; 通过直接发出 clear 命令或使用 AutoClear 功能。

每当与该 RF-ADC 关联的 QMC 增益值更新时,AutoClear 模式都会清除阈值。

阈值操作示例

下图说明了阈值单元操作。 该图显示了三个阈值 a、b 和 c,每个阈值配置为不同的阈值模式。 在硬件中,所有阈值单元都有独立的阈值电平和延迟值。 在此示例中,阈值水平由水平虚线表示,并且所有单元都使用相同的水平进行说明。

延迟值设置为 5(延迟值对 Sticky Over 模式没有影响),并且设置了粘性阈值以通过不同的清除模式清除。 以下部分描述了该行为。

注意:在下图中,样本由一个 sub-ADC 计数,而不是 RF-ADC。

6.png

Threshold-A, Sticky Over Mode

当第一个样本超过阈值上限时,该标志置位。 在此示例中,使用对 XRFdc_ThresholdStickyClear API 函数的调用来清除标志。

Threshold-B, Sticky Under Mode

当样本持续低于样本延迟数(示例中为 6)的下限阈值时,该标志置位。 在此示例中,通过更新 QMC 增益值来清除标志,该值是通过调用 XRFdc_SetQMCSettings API 函数发出的,然后是更新事件,该事件应用 QMC 增益更新。

Threshold-C, Hysteresis Mode

当第一个样本超过上限阈值时,该标志置位。 当样本持续低于样本延迟数的下限阈值时,该标志被清除。

阈值 RFdc 驱动程序 API 操作

使用 RFdc 驱动程序 API 配置阈值电平和延迟值。

// Initial Setup
XRFdc_Threshold_Settings Threshold_Settings;
Threshold_Settings.UpdateThreshold = XRFDC_UPDATE_THRESHOLD_BOTH; // Setup
values
for threshold 0 and 1
Threshold_Settings.ThresholdMode[0] = XRFDC_TRSHD_STICKY_UNDER; // Set
threshold0
mode to Sticky Under
Threshold_Settings.ThresholdUnderVal[0] = 1000; // Measured in 14-bit
unsigned LSBs
Threshold_Settings.ThresholdAvgVal[0] = 10; // Data must be below lower
threshold for 10*8 4 GSPS RF-ADC samples
// Write threshold values to the selected Tile / RF-ADC
XRFdc_SetThresholdSettings(ptr, Tile, Block, &Threshold_Settings);

阈值应用

阈值检测器的常见用途是自动增益控制 (AGC) 应用。

超量程设置

有两种类型的超量程信号可用作可编程逻辑的状态输出,即超电压和超量程。IP 内核使用中断机制公开这些信号,因此任何违规都会立即标记给用户应用程序。 当超出正常或预期的操作水平时触发这些。

过压信号

只要输入信号超过来自 RF-ADC 输入缓冲器的安全输入范围,就会检测到过压信号。

超量程信号

  • 当输入信号超过RF-ADC 的± 数字满量程范围时,检测到超量程信号。

  • 在RF-ADC 的原始数字输出处测量超量程信号。

信号幅度检测器(第 3 代)

时间交错式 RF-ADC 依赖于多个背景校准,以最大限度地提高其在工艺变化范围内的性能,并在电压和温度变化范围内保持其性能。 背景校准算法需要输入信号存在一段时间才能收敛并达到最佳性能。 当输入信号不存在时,校准会发散,因此当输入信号恢复时,校准需要一段时间才能重新收敛。

如果处理不当,一些实际应用(例如电缆应用和 TDD 无线通信中使用的突发模式信号,或来自雷达应用之类的不可预测信号)会降低校准的准确性。

每个 RF-ADC 通道都内置了幅度检测器,用于监控 RF-ADC 数据并检测信号幅度何时低于某个阈值。 信号的开/关状态呈现给可编程逻辑,并可通过实时端口用于冻结或启用背景校准模块。

概述

幅度检测器模块用于监控 RF-ADC 数据并检测信号幅度何时低于某个阈值。 该模块监视 4 个或 8 个并行输入字。 每个通道监控的输入字数基于 RF-ADC 配置(四通道或双通道块)。下图显示了幅度检测器在 RF-ADC 数据路径上的位置。每个 RF-ADC 通道都有自己的幅度检测器模块。

7.png

该块的目的是检测信号幅度何时低于或高于某个可编程阈值,并将信号的状态作为实时异步状态输出到可编程逻辑。 结构的输出状态是信号状态。 信号状态被认为是开或关。

信号幅度检测器详解

幅度检测器由一个输入级、一个泄漏积分器滤波器、一个阈值比较器和两个基于滞后计数器的滤波器实例组成。下图显示了检测器的架构。

8.png

Input Stage

输入级以 T4/T8 时钟速率将 N=4 或 N=8 个输入字作为输入,并在每个 T4/T8 周期输出一个样本。 该模块以以下两种模式之一运行:

  • 平均模式:所有子ADC 输入的平均幅度用于检测信号幅度。

  • 随机采样:一个随机选择的数据字(子ADC)用于检测信号幅度。

泄漏积分器(Leaky Integrator )

泄漏积分器用于测量一段时间内的平均信号幅度。 泄漏积分器时间常数可编程从单个 T4/T8 时钟周期到 2 ^16 个时钟周期。

泄漏积分器的变换函数如下:

9.JPG

其中:

y[n] 是泄漏积分器的输出。

y[n-1] 是泄漏积分器的最后一个输出。

x[n] 是当前输入值; 输入级的输出。

2^λ 的输出是时间常数。

下表给出了可编程时间常数值:

10.JPG

11.png

上图中使用了一个高斯分布信号进行说明。 一组基于不同时间常数的曲线显示了泄漏积分器的 20*log10 输出。

用户可编程刷新位可用于刷新将值重置为 0 的泄漏积分器。

上升和下降时间

在输入信号是突发信号或幅度变化剧烈的某些应用中,需要评估泄漏积分器的上升/下降时间。 上升时间可以从它的阶跃响应推导出来; 下降时间可以从它对初始条件的响应中得出。 以下公式分别显示了如何计算上升和下降时间:

12.JPG

其中: α = 1 - 1/2^λ

考虑到何时泄漏积分器的输出达到上升时间计算最终值的 90%,比最终值低约 1 dB。

对于下降时间,使用 1% (-40 dB) 来说明满量程信号下降到 -40 dBFS,这使得下降时间大约是上升时间的两倍。

下表显示了基于不同时间常数的参考上升/下降时间:

13.JPG

迟滞计数器(Hysteresis Counter)

漏滤波器之后的滞后计数器块,由一个阈值比较器和两个计数器组成,它们都是用户可编程的。 迟滞计数器用于进一步过滤来自泄漏积分器的信号幅度,以避免在信号幅度接近阈值电平时发生振荡,并输出稳定状态,ON或OFF。

如果信号大于或等于 2 *“高计数器”连续周期数的阈值,则认为该信号为 ON。 以类似的方式,如果信号在 2 *“低计数器”连续周期数内小于“阈值”,则认为该信号为 OFF。如果前一个条件不满足,低计数器和高计数器立即同步复位。 “ON”或“OFF”输出将保持其状态,直到被另一个计数器更改。

阈值电平为 15 位无符号值,以下公式将阈值电平转换为满量程对数值:

14.JPG

高位计数器和低位计数器均为 17 位 无符号值,虽然高 16 位是用户可编程的,但最低有效位始终为 0。

信号检测器示例

将阈值设置为 -40 dBFS,以下示例说明了此信号检测器模块在不同时间常数和计数器值下的响应。

假设采样率为 4 GHz,插值因子为 8,则每个 T8 为 2 ns。

假设 lambda = 8 时的 on 和 off 计数器值为 1000,lambda = 12 时为 300,则上升时间为 (587 或 9429 + 21000 或 2300) * T8,大约为 5.2 µs 或 20 µs; 在本例中,下降时间应考虑从 -39 dBFS 下降到 -41 dBFS,约为 (58 或 942 + 21000 或 2300) * T8,结果为 4.1 µs 或 3.1 µs。

下图显示了两个示例,均基于高 PAR(约 12 dB)突发信号,信号幅度约为 -40 dBFS,有一点偏移(1-2 dB)。

15.png

上图说明了 lambda = 12 和 counter = 300 的响应。

16.png

上图说明了 lambda = 8 和 counter = 1000 的响应。

这些示例显示了此模块根据输入信号幅度给出的正确响应。 您应该为特定应用选择计数器值和适当的时间常数。

带数控振荡器的 RF-ADC 混频器

混频器功能具有三种模式:旁路(不混频)、粗混或细混。 精细混频自动启用用于生成载波频率的 NCO。 混频器支持完全正交混频,同时支持实数到 I/Q 和 I/Q 到 I/Q 模式。

17.png

粗调混频器:

  • 粗调混合器允许将数据与 0、Fs/2、Fs/4 或 –Fs/4 的载波混合。选择 0 仅在使用 RFdc 驱动程序 API 时可用。

  • 使用 0 载波进行混音会绕过混音器组件。

精细混频器:

精细混频器允许数据在频率上任意上移或下移。

频移量是通过对NCO 中产生的混频器频率进行编程来获得的。 精细混频器还支持 18 位相位调整。

可以对 NCO 进行编程以输出 NCO 频率 (Fc) 的 cos、-cos、sin 或 -sin。根据当前混频器模式选择 NCO 输出。

18.JPG

当选择负正交时,Q输入是反向的。

  • NCO 阶段可以使用 XRFdc_UpdateEvent 在图块内同步。

  • NCO 相位可以使用外部事件信号(SYSREF 或 MARKER)跨图块同步。

  • 为管理潜在的溢出,精细混频器输出包括 3 dBV 衰减,如上图所示。 此衰减与 R2C 模式无关,因此 API 的自动模式选择会根据 RF-ADC 混频器缩放输出因子选择正确的衰减级别(见下表)。 手动选择也是可能的,允许 0 dBV 或 -3 dBV。

    19.JPG

混频器设置可以在内核中配置,或者使用 RFdc 驱动 API。 内核用于设置初始混频器设置(例如,混频器类型和混频器模式),RFdc 驱动 API 用于在运行时调整设置。 RFdc 驱动程序 API 和内核都根据提供的采样率和所需频率计算所需的寄存器设置。 下图显示了一个示例配置界面。

20.png

RF-ADC 混频器 RFdc API 示例

相关的 RFdc 驱动 API 函数显示在以下代码中。 此代码说明了 NCO 相位复位功能的使用。 启动时必须使用此函数将精细混频器的相位初始化为有效状态。 请注意,以下代码会重置所有磁贴中的 NCO。

XRFdc_Mixer_Settings Mixer_Settings;
for(tile=0;tile<4; tile++) {
	// 确保混合器设置更新使用 Tile 事件
    for(block=0; block<2; block++) {
        XRFdc_GetMixerSettings (ptr, XRFDC_ADC_TILE, tile, block,&Mixer_Settings);
        Mixer_Settings.EventSource = XRFDC_EVNT_SRC_TILE; //使用XRFDC_EVNT_SRC_TILE事件更新混频器设置
        XRFdc_SetMixerSettings (ptr, XRFDC_ADC_TILE, tile, block,&Mixer_Settings);
    }
    //重置 Tile0 中两个 DDC 的 NCO 相位(假设两者都处于活动状态)
    XRFdc_ResetNCOPhase(ptr, XRFDC_ADC_TILE, tile, 0); // DDC Block0
    XRFdc_ResetNCOPhase(ptr, XRFDC_ADC_TILE, tile, 1); // DDC Block1
    XRFds_UpdateEvent(ptr, XRFDC_ADC_TILE, tile, 1, XRFDC_EVENT_MIXER); //生成tile事件
}

NCO 频率转换

NCO 处于数字域,其有效频率范围始终为 -Fs/2 至 Fs/2。

当 RF-ADC 或 RF-DAC 工作在子采样频率 (Fc>Fs/2) 时,应用程序必须首先计算第一奈奎斯特频带的信号位置,然后设置有效 NCO 值以移位信号。

为方便起见,Zynq UltraScale+ RFSoC IP GUI 和 API 支持在 -10 GHz 到 10 GHz 的范围内设置 NCO 频率(RFdc API 对 NCO 范围没有限制)。 Vivado Design Suite 或 RFdc API 自动将第一奈奎斯特区之外的高频转换为有效的 NCO 配置。 这适用于 RF-ADC 和 RF-DAC,并严格遵循采样理论。

为避免原始频谱倒置,当所需信号位于偶数奈奎斯特频带时,在下变频中设置正 NCO 频率,或当所需信号位于奇数奈奎斯特频带时,设置负 NCO 频率。 对于上变频,将信号移至偶数奈奎斯特频带时设置负 NCO 频率,将信号移至奇数奈奎斯特频带时设置正频率(此转换仅适用于将 NCO 设置为第一个奈奎斯特频带之外的频率 (±Fs/2) )。

NCO 设置示例

下图说明了为不同场景设置 NCO,从偶数或奇数 Nyquist 频带进行上变频和下变频。 NCO 可以设置在 ±Fs/2 之内或此范围之外。

21.png

RF-ADC 抽取滤波器(第 1 代/第 2 代)

需要抽取滤波器来实现数字下变频 (DDC) 过程的下采样和滤波部分。 整体滤波器响应由使用的抽取级数决定。 抽取链由三个 FIR 滤波器级组成,可以组合起来实现可变抽取率。 当 FIR 级未使用时,它会自动断电。 抽取过滤器允许创建以下内容(第 1 代/第 2 代):

  • 1x:绕过所有过滤器阶段。

  • 2x:使用单个阶段进行抽取过滤。

  • 4x:使用两级抽取滤波。

  • 8x:使用所有三个可用级进行抽取滤波。

每个抽取滤波器元件具有不同数量的抽头,阻带衰减和纹波显示在抽取滤波器详细信息中。 抽取滤波器链可以对 I/Q 数据或真实数据进行操作。 未使用的过滤器链断电。

考虑到 FIR 滤波器的阶跃响应,每个滤波器级都可能溢出,尤其是当满量程数据在输入上时。 为了检测和保护数据路径免于溢出,每个滤波器级和子相位在输出端都有一个带符号的溢出状态信号和饱和信号。 当不使用过滤级时,该标志被强制为零。 这些标志连接到中断处理中描述的数据路径中断机制。 下图中的多路复用器显示了在 IP 配置中选择的抽取级别以及相应的抽取滤波器块选择。

22.png

抽取滤波器操作模式(第 1 代/第 2 代)

23.JPG

80% 奈奎斯特通带为 0.4*Fs。

抽取滤波器使用

IP 内核用于设置抽取率。 这是在 Vivado IDE 中设置的,因为随着 PL 带宽的变化,抽取率的改变会直接影响物理接口。 启用的过滤器如下图所示。 通过选中 Enable ADC 复选框来启用 RF-ADC。

24.png

相关 API 命令

RFdc 驱动程序 API 可用于使用以下代码获取 IP 内核中设置的抽取率。

//获取 Tile0、DDC Block1 的抽取因子
int Tile = 0;
u32 Block = 1;
u32 Decimation_Factor;
if( XRFdc_GetDecimationFactor (ptr, Tile, Block, &DecimationFactor) == XST_SUCCESS) {
	xil_printf("ADC Tile%1d,%1d Decimation Factor is: %d", Tile, Block,Decimation_Factor);
}

抽取滤波器详细信息(第 1 代/第 2 代)

抽取滤波器链由三个 FIR 滤波器组成:FIR2、FIR1 和 FIR0,可启用它们以每级两倍的因子连续抽取。 滤波器传递函数如下图所示。

25.png

26.png

27.png抽取滤波器的滤波器系数如下表所示。

28.png

RF-ADC 抽取滤波器(第 3 代)

下图显示了第 3 代中的抽取级。

29.png

有四级抽取滤波器级联; 每个抽取级都可以独立绕过。 FIR1 级包含 3 个抽取滤波器——FIR1a (2x)、FIR1b (3x) 和 FIR1c (5x)——对于指定的配置,只能启用其中一个。 FIR2、FIR3 和 FIR4 模块的抽取因子均为 2。使用滤波器组合,以下显示了所有可能的抽取因子:1x(旁路)、2x、3x、4x、5x、6x、8x、10x、12x、 16x、20x、24x、40x 注:DDC的信号流向为:FIR4->FIR3->FIR2->FIR1。

IP 配置和驱动 API 自动选择高阶 FIR 组合。 例如,选择 FIR2 和 FIR1a 进行 4 倍抽取。

抽取滤波器详细信息(第 3 代)

下面列出了所有抽取滤波器的系数和频率响应图。 这些都是半带滤波器,所以只列出了中心抽头值和前半部分。 N(bit) 是系数的位宽,用于归一化系数。

FIR 1a (2x)

N(bit) = 17
Center Tap: 65536
First Half:
5,0,-17,0,44,0,-96,0,187,0,-335,0,565,0,-906,0,1401,0,-2112,0,3145,0,-4723,0,7415,0,-13331,0,41526

FIR 1b (3x)

N(bit) = 19
Center Tap: 174763
2,6,0,-17,-27,0,57,79,0,-143,-187,0,307,385,0,-590,-721,0,1050,1254,0,-1757,-2063,0,2807,3256,0,-4339,-4991,0,6579,7549,0,-9975,-11517,0,15633,18486,0,-27325,-34856,0,71618,144204

30.png

FIR 1c (5x)

N(bit) = 19
Center Tap: 104858
First Half:
2,0,-4,-10,-13,-11,0,17,35,43,32,0,-47,-91,-107,-78,0,106,198,228,162,0,-210,-386,-437,-304,0,383,693,772,531,0,-652,-1166,-1286,-875,0,1056,1872,2049,1384,0,-1648,-2905,-3163,-2127,0,2514,4421,4804,3227,0,-3819,-6731,-7340,-4956,0,5956,10615,11742,8070,0,-10195,-18821,-21778,-15872,0,24203,52516,79099,98013

31.png

FIR 2 (2x) Coefficients

N(bit) = 15
Center Tap: 16384
First Half: -12,0,84,0,-337,0,1008,0,-2693,0,10142

FIR 3/4 (2x) Coefficients
FIR 3 和 4 具有相同的系数。

N(bit) = 12
Center Tap: 2048
First Half: -6,0,54,0,-254,0,1230

32.png

抽取滤波器使用

IP 内核用于设置抽取率。 这是在 Vivado IDE 中设置的,因为随着 PL 带宽的变化,抽取率的改变会直接影响物理接口。 启用的过滤器如下图所示。 通过选中 Enable ADC 复选框来启用 RF-ADC。

33.png

相关 API 命令

RFdc 驱动程序 API 可用于使用以下代码获取 IP 内核中设置的抽取率。

//获取 Tile0、DDC Block1 的抽取因子
int Tile = 0;
u32 Block = 1;
u32 Decimation_Factor;
if( XRFdc_GetDecimationFactor (ptr, Tile, Block, &DecimationFactor) == XST_SUCCESS) {
	xil_printf("ADC Tile%1d,%1d Decimation Factor is: %d", Tile, Block,Decimation_Factor);
}

reference

1.PG269


最新文章

最新文章