HLS の使用

xfOpenCV ライブラリを使用して、Vivado® HLS でアプリケーションをビルドできます。このセクションでは、Vivado HLS 2019.1 環境のデザインに xfOpenCV ライブラリ コンポーネントを統合する方法を説明します。C シミュレーション、C 合成、C/RTL 協調シミュレーション、および RTL を IP としてエクスポートなど、Vivado HLS 2019.1 使用フローで 1 つのライブラリ コンポーネントを実行する手順を示します。

Vivado HLS 2019.1 で使用モデルが正しく機能するようにするため、次の変更を加える必要があります。

  1. 適切なコンパイル時間オプションの使用: HLS で xfOpenCV 関数を使用する際、コンパイル時に -D__SDSVHLS__ および -std=c++0x オプションを使用する必要があります。
  2. インターフェイス レベル引数へのインターフェイス プラグマの指定: 最上位インターフェイス引数を (1 つ以上の読み出し/書き込みアクセスを持つ) ポインターとして含む関数には、m_axi インターフェイス プラグマを指定する必要があります。次に例を示します。
    void lut_accel(xf::Mat<TYPE, HEIGHT, WIDTH, NPC1> &imgInput, xf::Mat<TYPE, HEIGHT, WIDTH, NPC1> &imgOutput, unsigned char *lut_ptr)
    {
    #pragma HLS INTERFACE m_axi depth=256 port=lut_ptr offset=direct bundle=lut_ptr
    	xf::LUT< TYPE, HEIGHT, WIDTH, NPC1> (imgInput,imgOutput,lut_ptr);
    }
    

HLS スタンドアロン モード

HLS スタンドアロン モードは、次の 2 つのモードで使用できます。

  1. Tcl スクリプト モード
  2. GUI モード

Tcl スクリプト モード

Tcl スクリプトを使用して HLS スタンドアロン モードを操作するには、次の手順に従います。
  1. Vivado® HLS Tcl スクリプト ファイルで、すべての add_files セクションの cflags をアップデートします。
  2. xfOpenCV/include ディレクトリへのパスを追加します。このディレクトリには、ライブラリに必要なヘッダー ファイルがすべて含まれます。
  3. -D__SDSVHLS__ および -std=c++0x コンパイラ フラグを追加します。
注記: Windows で Vivado HLS を使用する場合は、C シミュレーションおよび協調シミュレーションにのみ -std=c++0x フラグを追加してください。合成を実行する場合は、このフラグは含めないでください。

例:

ソース ファイルのフラグ設定:
add_files xf_dilation_accel.cpp -cflags "-I<path-to-include-directory> -D__SDSVHLS__ -std=c++0x" 
テストベンチ ファイルのフラグ設定:
add_files -tb xf_dilation_tb.cpp -cflags "-I<path-to-include-directory> -D__SDSVHLS__ -std=c++0x"

GUI モード

GUI を使用して HLS スタンドアロン モードを操作するには、次の手順に従います。
  1. Vivado® HLS を GUI モードで開いて新規プロジェクトを作成します。
  2. プロジェクト名を指定します (「Dilation」など)。
  3. [Browse] をクリックし、プロジェクトを保存するワークスペース フォルダーを指定します。
  4. [Next] をクリックします。
  5. [Design Files] セクションに、examples フォルダーにある accel.cpp ファイルを追加します。[Top Function] に最上位関数名 (ここでは dilation_accel) を入力します。
  6. [Next] をクリックします。
  7. [TestBench Files] セクションに、tb.cpp ファイルを追加します。
  8. [Next] をクリックします。
  9. クロック周期 (ここでは 10 ns) を指定します。
  10. パーツを選択します (例 xczu9eg-ffvb1156-2-i)。
  11. [Finish] をクリックします。
  12. 作成したプロジェクトを右クリックし、[Project Settings] をクリックします。
  13. 開いたタブで [Simulation] を選択します。
  14. [TestBench Files] セクションで追加したファイルが表示されます。ファイルを選択して [Edit CFLAGS] をクリックします。
  15. -I<path-to-include-directory> -D__SDSVHLS__ -std=c++0x」と入力します。
    注記: Windows で Vivado HLS を使用する場合は、C シミュレーションおよび協調シミュレーションにのみ -std=c++0x フラグを追加してください。合成を実行する場合は、このフラグは含めないでください。
  16. [Synthesis] を選択し、表示されているすべてのファイルに対して上記の手順を繰り返します。
  17. [OK] をクリックします。
  18. C シミュレーションを実行し、[Clean Build] を選択して必要な入力引数を指定します。
  19. [OK] をクリックします。
  20. 生成された出力ファイル/画像はすべて solution1->csim->build にあります。
  21. C Synthesis を実行します。
  22. 適切な入力引数を指定して Co-simulation を実行します。
  23. 協調シミュレーションのステータスはコンソールで確認できます。

協調シミュレーション用の制約

xfOpenCV 関数の協調シミュレーションを実行するには、いくつかの制限があります。これらは次のとおりです。

  1. 複数のアクセラレータを含む関数はサポートされていません。
  2. コンパイラおよびシミュレータ (gcc、XSim) では、HLS がデフォルトになります。
  3. HLS では複数のカーネルの統合がサポートされないので、現在のフローでも複数のカーネルの統合はサポートされません。そのため、ピラミッド型オプティカル フロー関数および Canny 法によるエッジ検出関数はこのフローではサポートされません。
  4. config.h ファイルで設定されている最大画像サイズ (HEIGHT および WIDTH) は、実際の入力画像サイズである必要があります。

AXI ビデオ インターフェイス関数

xfOpenCV には、xf::Mat を ザイリンクス ビデオ ストリーミング インターフェイスに、およびその逆に変換する関数が含まれます。xf::AXIvideo2xfMat() および xf::xfMat2AXIVideo() は、Vivado® IP インテグレーターの xfOpenCV 関数の IP に対するビデオ インターフェイスとして機能します。 cvMat2AXIvideoxf <NPC> および AXIvideo2cvMatxf<NPC> は、ホスト側で使用されます。

表 1. AXI ビデオ インターフェイス関数
ビデオ ライブラリ関数 説明
AXIvideo2xfMat AXI4 ビデオ ストリームのデータを xf::Mat フォーマットに変換します。
xfMat2AXIvideo xf::Mat フォーマットで格納されたデータを AXI4 ビデオ ストリームに変換します。
cvMat2AXIvideoxf cv::Mat フォーマットで格納されたデータを AXI4 ビデオ ストリームに変換します。
AXIvideo2cvMatxf AXI4 ビデオ ストリームのデータを cv::Mat フォーマットに変換します。

AXIvideo2xfMat

AXIvideo2xfMat 関数は、AXI4 Streaming Video を使用して画像のシーケンスを受信し、xf::Mat フォーマットの画像を生成します。

API 構文

template<int W,int T,int ROWS, int COLS,int NPC>
int AXIvideo2xfMat(hls::stream< ap_axiu<W,1,1,1> >& AXI_video_strm, xf::Mat<T,ROWS, COLS, NPC>& img)

パラメーターの説明

次の表に、テンプレートと関数のパラメーターを説明します。

表 2. AXIvideo2cvMatxf 関数のパラメーターの説明
パラメーター 説明
W AXI4-Stream のデータ幅。推奨される値はピクセル深さ。
T 画像のピクセルのデータ型。1 チャネル (XF_8UC1)。ピクセルのデータ幅は、W 以下である必要があります。
ROWS 入力画像の最大高さ。
COLS 入力画像の最大幅。
NPC 1 サイクルごとに処理されるピクセル数。使用可能なオプションは、1 ピクセルの場合は XF_NPPC1、8 ピクセルの場合は XF_NPPC8。
AXI_video_strm ap_axiu (axi protocol) 型の HLS ストリーム。
img 入力画像。

TLAST 入力を検出し、予期しないライン長を示す ERROR_IO_EOL_EARLY または ERROR_IO_EOL_LATE のビット エラーを返します。

AXI インターフェイスの詳細は、『AXI リファレンス ガイド』 (UG761) を参照してください。

xfMat2AXIvideo

Mat2AXI ビデオ関数は、cv::Mat フォーマットの画像のシーケンスを受信し、AXI4-Stream ビデオ プロトコルを使用してエンコードします。

API 構文

template<int W, int T, int ROWS, int COLS,int NPC>
int xfMat2AXIvideo(xf::Mat<T,ROWS, COLS,NPC>& img,hls::stream<ap_axiu<W,1,1,1> >& AXI_video_strm)

パラメーターの説明

次の表に、テンプレートと関数のパラメーターを説明します。

表 3. xfMat2AXIvideo 関数のパラメーターの説明
パラメーター 説明
W AXI4-Stream のデータ幅。推奨される値はピクセル深さ。
T 画像のピクセルのデータ型。1 チャネル (XF_8UC1)。ピクセルのデータ幅は、W 以下である必要があります。
ROWS 入力画像の最大高さ。
COLS 入力画像の最大幅。
NPC 1 サイクルごとに処理されるピクセル数。使用可能なオプションは、1 ピクセルの場合は XF_NPPC1、8 ピクセルの場合は XF_NPPC8。
AXI_video_strm ap_axiu (axi protocol) 型の HLS ストリーム。
img 出力画像。

この関数は値 0 を返します。

注記: データフローのすべての関数の NPC 値は、同じ値である必要があります。同じでない値があると、HLS でコンパイル エラーが生成されます。

cvMat2AXIvideoxf

cvMat2Axivideoxf 関数は、cv::Mat フォーマットの画像を受信し、AXI4 ストリーミング ビデオ画像を生成します。

API 構文

template<int NPC,int W>
void cvMat2AXIvideoxf(cv::Mat& cv_mat, hls::stream<ap_axiu<W,1,1,1> >& AXI_video_strm)

パラメーターの説明

次の表に、テンプレートと関数のパラメーターを説明します。

表 4. AXIvideo2cvMatxf 関数のパラメーターの説明
パラメーター 説明
W AXI4-Stream のデータ幅。推奨される値はピクセル深さ。
NPC 1 サイクルごとに処理されるピクセル数。使用可能なオプションは、1 ピクセルの場合は XF_NPPC1、8 ピクセルの場合は XF_NPPC8。
AXI_video_strm ap_axiu (axi protocol) 型の HLS ストリーム。
cv_mat 入力画像。

AXIvideo2cvMatxf

Axivideo2cvMatxf 関数は、画像を AXI4 ストリーミング ビデオとして受信し、cv::Mat フォーマットの画像を生成します。

API 構文

template<int NPC,int W>
void AXIvideo2cvMatxf(hls::stream<ap_axiu<W,1,1,1> >& AXI_video_strm, cv::Mat& cv_mat) 

パラメーターの説明

次の表に、テンプレートと関数のパラメーターを説明します。

表 5. AXIvideo2cvMatxf 関数のパラメーターの説明
パラメーター 説明
W AXI4-Stream のデータ幅。推奨される値はピクセル深さ。
NPC 1 サイクルごとに処理されるピクセル数。使用可能なオプションは、1 ピクセルの場合は XF_NPPC1、8 ピクセルの場合は XF_NPPC8。
AXI_video_strm ap_axiu (axi protocol) 型の HLS ストリーム。
cv_mat 出力画像。