ZCU111 でマルチタイル同期を行う

本記事では, 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設定

マルチタイル同期の手順

マルチタイル同期には特定の 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 パラメータ
  • ADC I/Q ミキサ : なし
  • DAC I/Q ミキサ : 25 MHz
  • DAC I 相 : cos (2 π f0 t)
  • DAC Q 相 : cos (2 π f0 t + π / 4)
  • f0 = 30.7 * 106

    波形1

    波形1

    波形2 パラメータ
  • ADC I/Q ミキサ : 45 MHz
  • DAC I/Q ミキサ : なし
  • DAC real : cos (2 π f1 t)
  • f1 = 61.4 * 106

    波形2 I 相

    波形2 (I相)

    波形2 Q 相

    波形2 (Q相)

    コメント

    タイトルとURLをコピーしました