概要Vitisビジョンライブラリでテストベンチ関数を使った高位合成の方法と結果を紹介。用例のcustomconvに含まれるFilter2D_accelを例にラプラシアンフィルタの高位合成と実装をめざす。本記事では高位合成を実行し、合成されたIPの構成を整理する。Xilinxの統合ソフトウェア開発環境では、Vitisビジョンライブラリ(以下、ビジョンライブラリ)をインクルードすることによって、画像処理機能を高速化(アクセラレーション)することが可能です。OpenCVのフィルタ処理などを、FPGAに実装可能なロジックへと高位合成することができます。本サイトでは実際にVitisビジョンライブラリのFilter2D_accel関数を例に、ラプラシアンフィルタを行う画像処理IPのCシミュレーション、高位合成、C/RTL協調シミュレーション、そして実装を進めていこうと思います。前回の記事では、テストベンチでのCシミュレーションの方法を紹介しました。Csim】Vitisビジョンライブラリでテストベンチ関数を使ったCシミュレーションの方法を解説。用例のcustomconvに含まれるFilter2D_accelを例にラプラシアンフィルタの高位合成と実装をめざす(本記事はCシミュレーションのみを行う)phys-higashi.com2022.01.22本記事では、Cシミュレーションで動作確認ができたFilter2D_accel関数を高位合成したいと思います。この記事の対象読者Vitisビジョンライブラリを初めて扱うビジョンライブラリの高位合成の方法と結果(リソース数やレイテンシー)を知りたい高位合成では、さっそく高位合成を行いましょう。合成後のIPのイメージ高位合成で作成するFilter2DのIPのイメージ図です。基本的にプロセッサはDMA転送のアドレスや開始信号などの制御信号を送るだけで、実際の画像や空間フィルタはAXI4マスターインタフェースを介してDMA転送されます。DDRメモリに保存された入力画像とラプラシアンフィルタをDMA転送でIPに送り、空間フィルタリング処理をIP上で実施します。IPで処理した画像をDDRメモリ上に保存した後、それを静止画出力ロジックからディスプレイに表示しました。静止画出力ロジックは以下の記事の内容と同じものを使うことにしました。-本記事では、VitisとVivadoを用いてZybo経由で外部ディスプレイに画像を出力するアプリケーションを作成します。DiligentからダウンロードしたHDMI出力デモサンプルをもとに、Zynq内部のハードウェア構成を設計しています。今回実装対象となるZyboには32ビットのアドレス長のDDR3メモリが搭載されています。follo...digilent.comイメージ図に記載した通り、AXI4マスターインタフェース(m-axi)を通じて、画像やフィルタをDDR3メモリとDMA転送するつもりです。そこで、メモリのアドレス長を超えないように、m_axi_addr64のチェックを外しました。その他の設定は変えていません。次に、ディレクティブ(#pragma)の設定について。ディレクティブは高位合成した後のRTLの構成を明示的に指定するための指示子です。これも基本的にデフォルトのままで変更せずに進めました。デフォルトでは、Filter2D_accelには2種類の指示子が用意されています。IPのポート(関数の引数や戻り値)のプロトコルを設定できる。内部関数を並列(パイプライン)処理。今回は、主にArray2xfMatとfilter2DとxfMat2Arrayの3関数が呼び出されており、こういった複数の関数をパイプライン処理させている。INTERFACE高位合成の対象となるFilter2D_accel関数には6つの引数と1つの戻り値が存在しています。cols)各変数に対しPS部から図のような制御を行うため、表のように、配列を渡すときにはAXI4マスターインターフェースを、値を渡すときにはAXI4-Liteスレーブインタフェースを割り当てています。s-axilite画像などの大容量の信号はAXI4マスターインターフェースでDMA転送・バーストモードを用いて高速に送信し、制御に必要な信号は転送の頻度が少ないためAXI4-Liteで送るようにしています。m_axiのdepthは、DDRメモリでのimg_in配列(深さ__XF_DEPTH_IN=14,400)、img_out配列(深さ__XF_DEPTH_OUT=14,400)、filter配列(深さ__XF_DEPTH_FILTER=9)のメモリマップに基づき定めています。本記事の後半でメモリマップについて解説します。以上の設定が完了したら高位合成をしてみましょう。synthesis]を実行します。クロック周期は10nsとし、ターゲットのチップはZyboに搭載されているxc7z010-clg400-1としました。高位合成の結果は次の通りです。使用リソースは以下の通り。FFに至っては半分くらいのリソースを使っていますが、十分実装可能な範囲です。いえ、160×120画素であれば処理可能ですが、より高解像度の画像を扱うには厳しいリソースといえます。合成後のRTLモジュールの構成を調べてみました。細かい構成は省略します(私も追い切れていません)が、最上位モジュールとその一つ下位のモジュール構成を示しました。最上位モジュールがFilter2d_accelモジュールとなっており、その内部に複数のサブモジュールが配置されています。colsの情報を格納したコントロールレジスタ。画像処理を開始するap_ctrlもここで生成。コントロールレジスタ周辺はかなりややこしい配線になっていますが...、メインの流れは次の通りです。画像処理を行うための制御情報をAXI4-Liteを通じてコントロールレジスタに書き込む入力画像とラプラシアンフィルタをDDRメモリから読み出す入力画像はgmem0へラプラシアンフィルタはgmem1へArray2xfMatモジュールで、入力画像をAXI4形式からMat形式に変換するfilter2Dモジュールで、入力画像とラプラシアンフィルタを受け取り、空間フィルタリング実行。画像処理後の出力画像を出力するxfMat2Arrayモジュールで、出力画像をMat形式からAXI4形式に変換するgmem2を通じて、出力画像をDDRメモリに書き込む少し気になっているのは、コントロールレジスタから画像処理するモジュール(例:Array2xfMatなど)にパラメータを送るときに、FIFOを使用する場合とそうでない場合をどう使い分けているかについてです。何か理由があると思うのですが、考察できていません。srcPtrとfilterはそれぞれ入力画像とラプラシアンフィルタのDDRメモリ内のベースアドレスですが、この2つはFIFOを介さずに直にコントロールレジスタから読んでいます。一方で、出力画像をDDRメモリに書き込むためのベースアドレスdstPtrはFIFOを通じて送られていました。配列データのメモリマップ送受信するimg_inとimg_out、そしてfilterの3つの配列の構成を整理しておきましょう。xf_custom_convolution_config.hではINPUT_PTR_WIDTH、OUTPUT_PTR_WIDTHともに32ビットとしていました。img_in配列とimg_out配列は32ビット配列(4byte)となるようにしています。img_out;一方、画像1ピクセルのTYPEはXF_8UC3としているので、1ピクセルあたり24ビット(3byte)です。そのため、DDRメモリ内の配列img_inやimg_outは、次のように1ピクセルずつではなく3要素で4ピクセルずつ詰めることになります。14,400$$となります。int型の配列のため、16ビット(2byte)です。filter;このビット長では、図のようなメモリ配置になるので、カーネル行列の要素数である9が配列の深さ__XF_DEPTH_FILTERとなります。配列データの流れ配列データのバイト数を踏まえて、モジュール内のデータの流れを整理しました。DDRメモリからは1要素ずつ読み出すので、入力画像は4byteずつArray2xfMatに送られます。filter2Dは1画素ずつ受信し、画像処理を行うので3byteずつ受け取ります。そのため、Array2xfMatはバイト数によるタイミングの違いを調整しています。Vitisでアプリケーションを構築するときに、このメモリマップを考慮して、ソースコードを作成しました。配列のサイズやポインタのデータ型、画像データの代入の仕方と関係します。次回以降の記事で、ソースコードを紹介しようと思います。まとめFilter2D_accel関数を例に、高位合成の方法と結果をまとめました。次の記事では、協調シミュレーションの結果に基づき、データの送受信のタイミングを整理したいと思います。2021.2次回の記事へのリンクビジョンライブラリを使った高位合成の方法【(3)C/RTL協調シミュレーション】Vitisビジョンライブラリを使った高位合成で、C/RTL協調シミュレーションを行う方法、確認するポイントを解説。Filter2D_accelを例に、本記事ではビジョンライブラリから高位合成した画像処理IPのタイミングチャートをまとめました。関連記事ビジョンライブラリビジョンライブラリの画像処理結果をディスプレイ表示【(1)構成】Vitisビジョンライブラリのcustomconvに含まれるFilter2D_accelを例にラプラシアンフィルタを行うIPを高位合成。本記事ではラプラシアンフィルタリング処理した画像をディスプレイ表示するブロックデザインの構築方法を紹介。ビジョンライブラリビジョンライブラリの画像処理結果をディスプレイ表示【(2)実装】Vitisビジョンライブラリのcustomconvに含まれるFilter2D_accelを例にラプラシアンフィルタを行うIPを高位合成。本記事ではラプラシアンフィルタリング処理した画像をディスプレイ表示するアプリケーションプロジェクトを紹介。HLSにビジョンライブラリとOpenCVをインクルードして、画像処理関数を高位合成する環境を構築しました。本記事では前準備として環境構築に必要なセットアップのうちOpenCVのインストール方法を解説しています。ビジョンライブラリビジョンライブラリを使った高位合成の方法【(3)C/RTL協調シミュレーション】Vitisビジョンライブラリを使った高位合成で、C/RTL協調シミュレーションを行う方法、確認するポイントを解説。Filter2D_accelを例に、本記事ではビジョンライブラリから高位合成した画像処理IPのタイミングチャートをまとめました。Csim】Vitisビジョンライブラリでテストベンチ関数を使ったCシミュレーションの方法を解説。用例のcustomconvに含まれるFilter2D_accelを例にラプラシアンフィルタの高位合成と実装をめざす(本記事はCシミュレーションのみを行う)ビジョンライブラリVitisビジョンライブラリのxf::cv::MatクラスについてVitisビジョンライブラリで画像を取り扱うためのクラスxf::cv::Matの宣言の仕方とテンプレート引数、メンバについてまとめました。OpenCVのcv::Matクラスとの相違点を中心に解説しています。コメントをキャンセルメールアドレスが公開されることはありません。※サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。上に表示された文字を入力してください。@phys_higashiFPGAを使ったデジタル回路の設計に興味を持ち、休日に勉強をしています。初学者の目線から、詰まりやすいポイントとそれを解決した方法について、記事にまとめています。初学者ゆえの間違い等あるとは思いますが、お気づきの際はお問い合わせをいただけますと幸いです。@phys_higashiFPGAを使ったデジタル回路の設計に興味を持ち、休日に勉強をしています。初学者の目線から、詰まりやすいポイントとそれを解決した方法について、記事にまとめています。初学者ゆえの間違い等あるとは思いますが、お気づきの際はお問い合わせをいただけますと幸いです。-掛け算IPをZyboに実装-2021.04.182022.02.13Rustupをインストールするときに発生したエラーの回避方法2021.08.102021.11.07。