チュートリアル

SDSoCの効果

FPGAのデザインを見てみると、SDSoCによって生成されたFOCモジュールは、rx_fifoのデータから、tx_fifoに与える波形を計算していることが窺えます。

 

なお、rx_fifoには、エンコーダをもとに計算した回転数・角度のデータと、ADCから取得した電流波形が入っています。すなわち、現在の回転数や角度と電流波形を元に、ハードウェア・アクセラレータによってモータコントロール波形を作り出していることがわかります。

rx_fifoおよびtx_fifoのインタフェースはAXI Streamとなっています。機械学習のようなメモリ内でのデータ計算とは異なり、SDSoCを利用したリアルタイム制御の例、および、ピン定義を含むカスタムプラットフォームの例として大変優れています。

 

SDSoCを適用する前

このチュートリアルのベースとなるカスタム・ハードウェア・プラットフォームの状態で、全体の13%程度のLUTを使用しています。

 

 

SDSoCを適用した前

SDSoCによる演算回路によって、LUTの使用率が約20%増大しています。

 

FOC関数をソフトウェアで実行した場合

プロジェクトトップページのHardware Functionsには

void foc(long long int *A, long long int *B, long long int *C,
int args[ARGS_SIZE], int status[STATUS_SIZE])

という関数が選択されています。この関数ではFOC(Field-Oriented Control)アルゴリズムの計算を行います。

SDSoCではハードウェア化したい関数を選択することで、自動的にHWアクセラレータが作成されます。SW/HWの切り替えるには、Project Exploreからsrc/foc.cppを右クリックし、Toggle SW/HWをクリックします。

 

下の図は、ソフトウェアでFOC関数を実行するようにした場合の合成結果です。

 

 

なんと、ハードウェア実行の場合よりもリソースの利用量が増えてしまっています。

 

その理由としては、rx_fifoの後ろにdm_2というモジュールが作られ、

 

tx_fifoの前にdm_1というモジュールが作られています。

 

このほかにもdbg_fifoとdm_0があり、これらはAXI GP0に接続されています。

すなわち、ハードウェアでリアルタイムに処理するべき回路をソフトで行うために、FIFOとデータムーバを作る必要が生じて、FPGAの多くのリソースを消費してしまっているというわけです。