DE0-Nano-SoC用ベアメタルアプリとFPGAコンフィギュレーション

DE0-Nano-SoCのベアメタルアプリをSDカードからブートするとき、FPGAのコンフィギュレーションも同時に行う場合の手順です。

ベアメタルアプリとFPGAコンフィギュレーション

FPGAのコンフィギュレーションは、HPSでFPGAのデータをFPGA Portionにロードすることで行います。具体的には、FPGAのデータをFPGA Portionにロードするようなプログラムを作り、通常処理の前にFPGAのコンフィギュレーションをプログラム的に行います。FPGAのコンフィギュレーション用データは、ベアメタルアプリのデータと結合して1つのバイナリにします。

FPGAコンフィギュレーションのサンプル

サンプルデータがQuartus II(SoC EDS)に格納されています。サンプルの場所はembedded/examplessoftware、ファイル名はAltera-SoCFPGA-HardwareLib-FPGA-CV-GNU.tar.gzです。このサンプルを参考に、自分のベアメタルアプリにFPGAデータのコンフィギュレーションプログラムを追加します。

プログラムの追加例

自分のベアメタルアプリのmain関数の先頭部分に、FPGAコンフィギュレーション用関数の呼びだしを追加します。この例ではfpga_configがFPGAコンフィギュレーション用の関数です。

fpga_configの処理

FPGAデータをロードするfpga_configの処理内容は次の通りです。

  • HPSのDMAコントローラのセットアップ
  • SDカードに格納されたバイナリ中のFPGAコンフィギュレーションデータの確認
  • DMAコントローラを使ったFPGAデータのロード
  • AXIブリッジの有効化

具体的なコードは次の通りです。なお、fpga_config内で呼び出している関数socfpga_*は、Altera-SoCFPGA-HardwareLib-FPGA-CV-GNU.tar.gzに格納されているhwlib.cに定義されているものをそのまま流用しています。

FPGAデータのロード関数socfpga_setup_dmaの内部では、Cyclone VのMSEL[4:0]の確認とalt_fpga_configure_dma関数によるFPGAデータのロードが行われています。DE0-Nano-SoCのMSEL[4:0]の設定は、ON/OFF/ON/OFF/ON(デフォルト)に設定する必要があります。

コンパイル

コンパイルは、Altera-SoCFPGA-HardwareLib-FPGA-CV-GNU.tar.gzの格納されているMakefileが参考になります。注意点は次のとおりです。

defineの追加

ALT_FPGA_ENABLE_DMA_SUPPORTをdefineする必要があります。defineしないと、一部の関数がリンクされません。

.rbfの圧縮

FPGAのコンフィギュレーションデータ(.sof)は、.rbfに変換後、さらに.oに変換してアプリケーションのバイナリとリンクします。.rbfに変換するときには、圧縮オプションを有効にする必要があります。圧縮しないとうまくロードできませんでした。

実際にmakeを行うと、次のようなログが表示されます。この例ではhello-mkimage.binが最終的なバイナリです。このバイナリの中に、FPGAのコンフィギュレーションデータとベアメタルアプリが格納されています。

実行ログ

出来上がったhello-mkimage.binを、ベアメタル用のSDカードに入れてDE0-Nano-SoCの電源をONにすると、FPGAコンフィギュレーション後に通常のアプリの処理が始まります。

まとめ

FPGAコンフィギュレーションをHPSで行うと、Programmerで毎回.sofをロードする処理が不要になります。電源投入ですぐにアプリケーションが起動するので、期待以上に快適です。

スポンサーリンク
広告大
広告大
  • このエントリーをはてなブックマークに追加
スポンサーリンク
広告大