VMC AI エンジン デザイン

Model Composer を使用した PID コントローラー デザイン - Versal ACAP 向け (XAPP1376)

Document ID
XAPP1376
Release Date
2022-03-09
Revision
1.0 日本語

AI エンジンは、数値計算に新たな柔軟性をもたらします。Versal AI エンジンの汎用性を示すため、AI エンジンをターゲットにして PID を書き直しました。次に、AI エンジンを使用した 1 チャネル SPFP PID 組み込み関数のソース コードを示します。


// error = setpt - feedback
error = upd_elem(error, 0, readincr(setpt)); // MM 1/6 was inp_data, 0, readincr...
scratch_pad = upd_elem(scratch_pad, 0, readincr(feedback));
error = fpsub(error, scratch_pad); // save error data

// proportional code
acc = fpmul(error, *Gp_ptr); // acc now holds proportional path results

writeincr(testpt, ext_elem(error, 0)); // MM

// derivative code
inp_data = fpmul(error, *Gd_ptr); // X1(n)
scratch_pad = fpsub( inp_data, fpmul(derivative_delay1, *C_ptr) ); // X1(n)-CYd(n-1)
scratch_pad = fpsub(scratch_pad, derivative_delay); // Yd(n) = X1(n)-CYd(n-1)-X1(n-1)
derivative_delay = inp_data;
derivative_delay1 = scratch_pad;

// add proportional & derivative results
acc = fpadd(acc, scratch_pad);

// integral code
inp_data = fpmul(error, *Gi_ptr); // X2(n)
scratch_pad = fpadd(inp_data, integral_delay);
integral_delay = inp_data;
scratch_pad = fpadd(integral_delay1, scratch_pad);

// test for saturation for integral path (ie: prevent integral anti-windup)
if (ext_elem(scratch_pad,0) > max_clip )
    scratch_pad = upd_elem(scratch_pad, 0, max_clip);
else if (ext_elem(scratch_pad,0) < min_clip )
    scratch_pad = upd_elem(scratch_pad, 0, min_clip);

integral_delay1 = scratch_pad;

// add proportional, integral, derivative results
acc = fpadd(acc, scratch_pad); 

// test for saturation
if (ext_elem(acc,0) > max_clip) 
    acc = upd_elem(acc, 0, max_clip);
else if (ext_elem(acc,0) < min_clip )
    acc = upd_elem(acc, 0, min_clip);

// write out results for servo lane 0
writeincr(outp, ext_elem(acc, 0));

}

1 チャネルの PID 実装では、AI エンジンの全容量の 1/8 しか使用しません。または、ベクター プロセッサの単一命令複数データ (SIMD) 機能を利用して 1 ~ 8 つの PID を並列に処理することもできます。次の図に、1 チャネル SPFP PID (ソース コード PID.cc) と 4 チャネル SPFP PID (ソース コード PID_rv2.cc) の両方を AI エンジン上で同時に実行した例を示します (ソース コード PID_rv2.cc)。

図 1. 4 チャネルの AI エンジン PID と 1 チャネルの AI エンジン PID、および基準となる Simulink リファレンスの比較 (リファレンス デザイン: ClosedLoopPID_ACAP_rv2.slx)

4 チャネルのスコープの結果 (ScopeAIE_All) には、係数 Kp、Ki、および Kd の結果が 4 セット表示されています。AI エンジン用の C++ は、開発中に Simulink の [Run] をクリックして Vitis Emulation-SW シミュレーションを実行することで機能的なデバッグが実行されました。

図 2. Simulink での AI エンジン デザインのシミュレーション (Vitis Emulation-SW シミュレーション)

機能デバッグ (Vitis Emulation-SW シミュレーション) は、同じモデルをサイクル近似シミュレーション (Vitis Emulation-AI エンジン シミュレーション) を使用して実行するよりも 1 ~ 2 桁高速に実行できます。したがって、開発時間を短縮し、新規デザインのデバッグを簡略化するために、開発の大部分で機能シミュレーションを使用することが推奨されます。PID コントローラーの機能検証が完了後、次の図に示すように MC Hub トークン経由で Vitis Emulation-AI エンジン (サイクル近似) シミュレータを使用します。

図 3. ビット精度およびサイクル近似 (Emulation-AI エンジン) シミュレーションの実行

サイクル近似シミュレーションでは、ソース コードの変更やコンパイラ指示子の適用、およびサイクル精度実装の潜在的な問題のデバッグにより、スループットを向上させることができます。サイクル近似シミュレーションに Model Composer Hub を使用すると、次の手順が自動で実行されます。

  1. Simulink デザインを使用したテストベンチが作成され、ADF (Adaptive Data Flow) グラフが生成されます。
  2. Vitis ツールを使用して Emulation-AI エンジンVitis フローが実行されます。
  3. Vitis アナライザーが開き、詳細な解析が実行されます。
  4. Emulation-AI エンジン シミュレーションの出力をプロットし、スループットが見積もられます。

1 チャネルの AI エンジン ベース PID デザインのサイクル近似 (Emulation-AI エンジン シミュレーション) の出力見積もりをプロットすると、次の図に示すようにスループットは 5 MSPS となります。

図 4. Emulation-AI エンジンのスループット見積もり

4 チャネルの AI エンジン PID のスループットは 4 MSPS です。1 チャネル PID と 4 チャネル PID でサンプル レート性能が異なっている理由は、4 つの並列チャネル間での反復に必要な条件文にあります。PID_rv2.cc の 105 行目にある定数 num_pids で PID のループ回数を定義しています。既存の値は 4 ですが、最大値は 8 です。ここでは、Simulink ADF シートが複雑になって見にくくなるのを避けるため、チャネル数を 4 に設定して説明しています。