本記事では, ZCU111 の RF Data Converter のマルチタイル同期を行った手順と結果について記します. マルチタイル同期を行うにあたって Zynq UltraScale+ RFSoC RF Data Converter v2.6 を参照しました.
RF Data Converter のクロックの設定
RF Data Converter のサンプリングレートおよび入力クロックは下図のように設定しました. 本設定では analog / PL SYSREF 信号の周波数は共に 7.68 MHz になります.マルチタイル同期の手順
マルチタイル同期には特定の RFdc driver API を使用します. 以下にマルチタイル同期を行うコードの例を示します.
// 以下のコードを実行する前に, DAC / ADC のデジタル処理機能 (I/Q ミキサ, 間引き, 補間など) の設定を
// 済ませておく必要があります.
// また, analog / PL SYSREF 信号が RF Data Converter に入力されていなければなりません.
// マルチタイル同期の設定を格納する構造体の初期化
XRFdc_MultiConverter_Sync_Config dac_sync_config;
XRFdc_MultiConverter_Sync_Config adc_sync_config;
XRFdc_MultiConverter_Init(&dac_sync_config, 0, 0, 0);
XRFdc_MultiConverter_Init(&adc_sync_config, 0, 0, 0);
dac_sync_config.Tiles = 0x3; // ビットマスクで同期するタイルを選択: DAC タイル 0, 1
adc_sync_config.Tiles = 0xF; // ビットマスクで同期するタイルを選択: ADC タイル 0, 1, 2, 3
dac_sync_config.Target_Latency = -1;
adc_sync_config.Target_Latency = -1;
// analog SYSREF レシーバの有効化
XRFdc_MTS_Sysref_Config(&RFdcInst, &dac_sync_config, &adc_sync_config, 1);
usleep(1000);
// マルチタイル同期処理を実行
XRFdc_MultiConverter_Sync(&RFdcInst, XRFDC_DAC_TILE, &dac_sync_config);
XRFdc_MultiConverter_Sync(&RFdcInst, XRFDC_ADC_TILE, &dac_sync_config);
// analog SYSREF レシーバの無効化
XRFdc_MTS_Sysref_Config(&RFdcInst, &dac_sync_config, &adc_sync_config, 1);
usleep(1000);
// DAC I/Q ミキサの同期
for (u32 tile_id = 0; tile_id < 2; ++tile_id) {
for (u32 block_id = 0; block_id < 4; ++block_id) {
// タイル, ブロックを指定して I/Q ミキサの設定を取得
XRFdc_Mixer_Settings mixer_settings;
u32 res = XRFdc_GetMixerSettings(&RFdcInst, DAC, tile_id, block_id, &mixer_settings);
// I/Q ミキサの設定 (NCO の位相も含む) の更新条件を SYSREF が入力されたときにする.
mixer_settings.EventSource = XRFDC_EVNT_SRC_SYSREF;
XRFdc_SetMixerSettings(&RFdcInst, DAC, tile_id, block_id, &mixer_settings);
// I/Q ミキサの NCO の位相リセットを要求. (この時点ではまだリセットされない)
XRFdc_ResetNCOPhase(&RFdcInst, DAC, tile_id, block_id);
}
}
// ADC I/Q ミキサの同期
for (u32 tile_id = 0; tile_id < 4; ++tile_id) {
for (u32 block_id = 0; block_id < 2; ++block_id) {
// タイル, ブロックを指定して I/Q ミキサの設定を取得
XRFdc_Mixer_Settings mixer_settings;
u32 res = XRFdc_GetMixerSettings(&RFdcInst, ADC, tile_id, block_id, &mixer_settings);
// I/Q ミキサの設定 (NCO の位相も含む) の更新条件を SYSREF が入力されたときにする.
mixer_settings.EventSource = XRFDC_EVNT_SRC_SYSREF;
XRFdc_SetMixerSettings(&RFdcInst, ADC, tile_id, block_id, &mixer_settings);
// I/Q ミキサの NCO の位相リセットを要求. (この時点ではまだリセットされない)
XRFdc_ResetNCOPhase(&RFdcInst, ADC, tile_id, block_id);
}
}
// analog SYSREF レシーバの有効化 (NCO の位相がリセットされる)
XRFdc_MTS_Sysref_Config(&RFdcInst, &dac_sync_config, &adc_sync_config, 1);
usleep(1000);
// analog SYSREF レシーバの無効化
XRFdc_MTS_Sysref_Config(&RFdcInst, &dac_sync_config, &adc_sync_config, 1);
usleep(1000);
波形の入出力結果
上記の手順でマルチタイル同期をした後, DAC から出力した波形を ADC に入力し, ADC のサンプルデータを波形としてプロットした結果を以下に示します.
波形1 パラメータ
コメント