带数控振荡器的 RF-ADC 混频器
混频器功能具有三种模式:旁路(不混频)、粗混或细混。 精细混频自动启用用于生成载波频率的 NCO。 混频器支持完全正交混频,同时支持实数到 I/Q 和 I/Q 到 I/Q 模式。
粗调混频器:
- 粗调混合器允许将数据与 0、Fs/2、Fs/4 或 –Fs/4 的载波混合。选择 0 仅在使用 RFdc 驱动程序 API 时可用。
- 使用 0 载波进行混音会绕过混音器组件。
精细混频器:
- 精细混频器允许数据在频率上任意上移或下移。
- 频移量是通过对NCO 中产生的混频器频率进行编程来获得的。 精细混频器还支持 18 位相位调整。
- 可以对 NCO 进行编程以输出 NCO 频率 (Fc) 的 cos、-cos、sin 或 -sin。根据当前混频器模式选择 NCO 输出。
- I/Q to I/Q
Real to I/Q
- 当选择负正交时,Q输入是反向的。
- NCO 阶段可以使用 XRFdc_UpdateEvent 在图块内同步。
- NCO 相位可以使用外部事件信号(SYSREF 或 MARKER)跨图块同步。
- 为管理潜在的溢出,精细混频器输出包括 3 dBV 衰减,如上图所示。 此衰减与 R2C 模式无关,因此 API 的自动模式选择会根据 RF-ADC 混频器缩放输出因子选择正确的衰减级别(见下表)。 手动选择也是可能的,允许 0 dBV 或 -3 dBV。
Tile Usage | Coarse Mixer | Auto Fine Mixer |
IQ (C2C) | 1 (0 dBV) | 0.707 (-3 dBV) |
Real (R2C) | 1 (0 dBV) | 0.997 (~0 dBV) |
混频器设置可以在内核中配置,或者使用 RFdc 驱动 API。 内核用于设置初始混频器设置(例如,混频器类型和混频器模式),RFdc 驱动 API 用于在运行时调整设置。 RFdc 驱动程序 API 和内核都根据提供的采样率和所需频率计算所需的寄存器设置。 下图显示了一个示例配置界面。
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 之内或此范围之外。
RF-ADC 抽取滤波器(第 1 代/第 2 代)
需要抽取滤波器来实现数字下变频 (DDC) 过程的下采样和滤波部分。 整体滤波器响应由使用的抽取级数决定。 抽取链由三个 FIR 滤波器级组成,可以组合起来实现可变抽取率。 当 FIR 级未使用时,它会自动断电。 抽取过滤器允许创建以下内容(第 1 代/第 2 代):
- 1x:绕过所有过滤器阶段。
- 2x:使用单个阶段进行抽取过滤。
- 4x:使用两级抽取滤波。
- 8x:使用所有三个可用级进行抽取滤波。
每个抽取滤波器元件具有不同数量的抽头,阻带衰减和纹波显示在抽取滤波器详细信息中。 抽取滤波器链可以对 I/Q 数据或真实数据进行操作。 未使用的过滤器链断电。
考虑到 FIR 滤波器的阶跃响应,每个滤波器级都可能溢出,尤其是当满量程数据在输入上时。 为了检测和保护数据路径免于溢出,每个滤波器级和子相位在输出端都有一个带符号的溢出状态信号和饱和信号。 当不使用过滤级时,该标志被强制为零。 这些标志连接到中断处理中描述的数据路径中断机制。 下图中的多路复用器显示了在 IP 配置中选择的抽取级别以及相应的抽取滤波器块选择。
抽取滤波器操作模式(第 1 代/第 2 代)
Mode | Description |
Quad and Dual RF-ADC Tile | |
OFF | 整个滤波器被禁用/断电(在禁用 RF-ADC 时适用) |
1x | 整个过滤器被绕过 |
2x | 2x 抽取,80% 奈奎斯特通带 |
4x | 4x 抽取,80% 奈奎斯特通带 |
8x | 8x 抽取,80% 奈奎斯特通带 |
80% 奈奎斯特通带为 0.4*Fs。
抽取滤波器使用
IP 内核用于设置抽取率。 这是在 Vivado IDE 中设置的,因为随着 PL 带宽的变化,抽取率的改变会直接影响物理接口。 启用的过滤器如下图所示。 通过选中 Enable ADC 复选框来启用 RF-ADC。
相关 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,可启用它们以每级两倍的因子连续抽取。 滤波器传递函数如下图所示。
抽取滤波器的滤波器系数如下表所示。
RF-ADC 抽取滤波器(第 3 代)
下图显示了第 3 代中的抽取级。
有四级抽取滤波器级联; 每个抽取级都可以独立绕过。 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
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
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
抽取滤波器使用
IP 内核用于设置抽取率。 这是在 Vivado IDE 中设置的,因为随着 PL 带宽的变化,抽取率的改变会直接影响物理接口。 启用的过滤器如下图所示。 通过选中 Enable ADC 复选框来启用 RF-ADC。
相关 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