Vitis Vision ライブラリ

Vitis Vision ライブラリの勉強1
Vitis Vision ライブラリについて勉強した。
Basic Features、Vitis Vision Kernel on Vitis、ホスト・アプリケーションの動作、カーネルの動作
Vitis Vision ライブラリの勉強2
前回は、Vitis Vision ライブラリを”Vitis Vision Library User Guide”で勉強するということで、ホスト・アプリケーションとカーネルのソースコードを解説してみた。今回は、Vitis のライブラリを git clone して、Vision ライブラリについて見て行こう。

Vitis Vision ライブラリの resize サンプルをやってみる1
”Vitis Vision ライブラリの勉強2”で学んだ L2/examples/resize を Ultra96-V2 で動作させてみように従って、resize をビルドしてみた。
Vitis Vision ライブラリの resize サンプルをやってみる2
L2/examples/resize を Ultra96-V2 で動作させてみように従って、resize をビルドしたところ、sd_card ディレクトリの生成でエラーが出たが、大体一式ビルドできた。今回は、Vivado HLS の合成結果とVivado のブロックデザインとインプリメンテーションの結果を見ていこう。
Vitis Vision ライブラリの resize サンプルをやってみる3
L2/examples/resize を Ultra96-V2 で動作させてみように従って、resize をビルドしたところ、sd_card ディレクトリの生成でエラーが出たが、大体一式ビルドできた。前回は、Vivado HLS の合成結果とVivado のブロックデザインとインプリメンテーションの結果をみた。今回は、Ultra96-V2の実機で動作させたところ、実機で動作した。
Vitis Vision ライブラリの resize サンプルをやってみる4
L2/examples/resize を Ultra96-V2 で動作させてみように従って、resize をビルドしたところ、sd_card ディレクトリの生成でエラーが出たが、大体一式ビルドできた。前回は、ビルドしたファイルを使用して、Ultra96-V2 の実機で動作を確認できた。動作を確認できたのだが、リサイズ後の画像が残っていないので、寂しい。それに、元画像も 4k とは言いながら HD 解像度だったので、元画像を 4k にして、リサイズ後の画像も保存してみることにした。

Vitis Vision ライブラリの resize サンプルを Vitis GUI でやってみるが失敗
”Vitis Vision ライブラリの resize サンプルをやってみる4”を CUI じゃなくて Vitis GUI でやってみたいということで、Vitis GUI でやってみたがコンパイル、リンクに失敗した。

Vitis_Libraries/vision /L3/examples/colordetect/をやってみた1
前回は、Vitis Vision ライブラリの resize をやってみた。CUI ではうまく行ったが Vitis GUI では、うまく行かなかった。
今回は、Vitis_Libraries/vision/L3/examples/colordetect/をやってみる。xclbin をビルドして、sd_card ディレクトリを作成させた。
Vitis_Libraries/vision /L3/examples/colordetect/をやってみた2
Vitis_Libraries/vision/L3/examples /colordetect/をやってみるということで、xclbin をビルドして、sd_card ディレクトリを作成させた。今回は、Vivado HLS プロジェクトと Vivado プロジェクトを見ていこう。
Vitis_Libraries/vision /L3/examples/colordetect/をやってみた3
Vitis_Libraries/vision/L3/examples /colordetect/をやってみるということで、xclbin をビルドして、sd_card ディレクトリを作成させた。今回は、Vivado HLS プロジェクトと Vivado プロジェクトを確認した。今回は、Ultra96-V2 の実機で動作させてみよう。実機動作を確認できた。

Vitis_Libraries/vision /L3/examples/cornertracker/をやってみた1
Vitis_Libraries/vision/L3/examples/colordetect/ に続いて、Vitis_Libraries/vision/L3/examples/cornertracker/ をやってみようと思う。Ultra96-V2 の UltraScale++ MPSoC のリソースが足りずにインプリメンテーションでエラーがでてしまった。

Vitis_Libraries/vision/L3/examples/stereopipeline/ をやってみた1
前回、 Vitis_Libraries/vision/L3/examples/cornertracker/ をやってみたが、Ultra96-V2 の UltraScale++ MPSoC のリソースが足りずにインプリメンテーションでエラーがでてしまった。今回は、 Vitis_Libraries/vision/L3/examples/stereopipeline/ をやってみよう。
Vitis_Libraries/vision/L3/examples/stereopipeline/ をやってみた2
前回は、 Vitis_Libraries/vision/L3/examples/stereopipeline/ のビルドを行って成功した。今回は、 Vitis_Libraries/vision/L3/examples/stereopipeline/ のVivado HLS や Vivado のプロジェクトを見ていこう。
Vitis_Libraries/vision/L3/examples/stereopipeline/ をやってみた3
Vitis_Libraries/vision/L3/examples/stereopipeline/ のVivado HLS や Vivado のプロジェクトを見た。今回は、Ultra96-V2 の実機で動作を確認した。

Vitis Vision Library を使用する時の Vitis HLS 2020.2 の設定方法(dilation 編 1)
XfOpenCV が休止になって、後継が Vitis Vision Library になった。
正確に言うと、 Vitis_Libraries/vision/L1/ が Vitis HLS のフローとなっている。
Vitis Vision Library のマニュアルは、 Vitis Vision Library User Guide で、 Vitis HLS での Vitis Vision Library の使用方法については、 Getting Started with HLS に記述がある。
Vitis Vision Library User Guide の Prerequisites に従って、”Ubuntu 18.04 LTS のパソコンに OpenCV 3.4.9 をインストールする”で OpenCV 3.4.9 を Ubuntu 18.04 LTS の自分のパソコンにインストールした。
これで、Vitis HLS 2020.2 で Vitis Vision Library を実行する環境が整ったので、早速やってみよう。
Vitis HLS 2020.2 で Vitis Vision Library を使用する2(dilation 編 2)
前回は、Vitis Vision Library User Guide の Getting Started with HLS に従って、 Vitis HLS 2020.2 の dilation プロジェクトを作成し、Vitis Vision を使用する上での設定を行った。今回は、Vitis Vision Library の dilation プロジェクトの C シミュレーション、 C コードの合成などを行っていこう。
Vitis HLS 2020.2 で Vitis Vision Library を使用する3(sobelfilter 編)
前回は、Vitis Vision Library の examples の dilation をやってみたが、出力結果がおかしいようだった。今回は、同じく Vitis Vision Library の examples の sobelfilter をやってみよう。
Vitis HLS 2020.2 で Vitis Vision Library を使用する4(medianblur 編)
今まで、Vitis Vision Library の例としてやってきた dilation や sobelfilter は画像ファイルを読み込み時にグレイスケールとして読み込んでいた。今回の medianblur はカラーとして読み込んで、メディアン・フィルタ処理するので、どのようなスループットになるか?楽しみだ。今回は、AXI4 Master のビット幅をデフォルトの 128 ビット幅から 32 ビット幅に減らしてやってみようと思う。

Vitis Vision Library で AXI4-Stream 入出力の medianblur を実装する1
”Vitis HLS 2020.2 で Vitis Vision Library を使用する4(medianblur 編)”で Vitis Vision Library で medianblur をたぶん実装できたのだが、(たぶんというのはノイジーな画像を入力していないからだ)配列からDMA してフィルタをかけた、つまり、DMA Read ー フィルタ ー DMA Write ということだ。これを AXI4-Stream ー フィルタ ー AXI4-Stream の方式でフィルタしたい。こうした方がメモリ帯域を消費しなくてすむ。

Vitis Vision Library の AXI4 Master インターフェース版 medianblur をZYBO Z7-20 で使ってみる1(準備編)
Vitis Vision Library の AXI4 Master インターフェース版 medianblur をZYBO Z7-20 で実際に使ってみたい。
それで、Vitis Vision Library の AXI4 Master インターフェース版 medianblur を使用する際に確かめておかなくてはならないことがある。
それは、カメラのピクセル・データを渡す際のバイトの配置のことだ。ピクセルの RGB ごとの位置がわからないとカメラからのデータを配置することができない。
ピクセルの RGB ごとの位置を確かめた。

OpenCV Mat 形式での .data のデータフォーマットを検証する
Vitis Vision Library の examples では、OpenCV Mat 形式の .data を ap_uint<***> * でキャストして、ハードウェア化する関数に渡していた。そのフォーマットを検証してみよう。

XF_8UC4 を使用して median_blur_accel() を実装する
”OpenCV Mat 形式での .data のデータフォーマットを検証する”では画像ファイルを読み込んだデータを一旦 CV_8UC4 (BGRA)に変換してから、 array2axis() を呼び出すと 32 ビット幅のバイト・レーンに アルファ・チャネル、Red , Green 、Blue が並ぶことが確認できた。こうなると、自分の IP から使用しやすくなる。 medianblur も XF_8UC4 を使って実装してみよう。
どうやら、 XF_8UC4 は対応していないようだ。とっても残念。。。

XF_8UC3 を XF_8UC4 に変換する xf_8uc3_2rgb プロジェクトを作成する1
もうだいぶ、Vitis Vision Library には嫌気が差してきたのだが、最後に XF_8UC3 を XF_8UC4 に変換する xf_8uc3_2rgb プロジェクトを作成してみようと思う。ソー スコードを貼った。
XF_8UC3 を XF_8UC4 に変換する xf_8uc3_2rgb プロジェクトを作成する2
XF_8UC3 を XF_8UC4 に変換する xf_8uc3_2rgb プロジェクトを作成してみようと思うということで、前回はソースコードとテストベンチを貼って、 Vitis HLS 2020.2 のプロジェクトを示した。今回は、 C シミュレーション、 C コードの合成、 C/RTL 協調シミュレーション、 Export RTL を行った。

Vitis Vision Library の medianblur を ZYBO Z7-20 で使ってみる1
”Vitis HLS 2020.2 で Vitis Vision Library を使用する4(medianblur 編)”で AXI4 Master による DMA 版のメディアン・フィルタを実装した。この実装は、CV_8UC3 のデータを DMA Read してメディアン・フィルタ処理をして、また CV_8UC3 で DMA Write する。そして、”XF_8UC3 を XF_8UC4 に変換する xf_8uc3_2rgb プロジェクトを作成する1”と”XF_8UC3 を XF_8UC4 に変換する xf_8uc3_2rgb プロジェクトを作成する2”で CV_8UC3 と同等の XF_8UC3 のデータを DMA Read して CV_8UC4 と同等の XF_8UC4 フォーマットで DMA Write する IP ができた。
これら 2 つの IP を組み合わせれば、 CV_8UC3 のデータを DMA Read して、 CV_8UC4 で DMA Write する実装が作れる。 CV_8UC4 のデータはアルファ・チャネル、Red、Green、Blue の 8 ビットずつの 32 ビット幅フォーマットになっているので、既存の自作ビットマップ・ディスプレイ・コントローラーを使用すれば、画像としてディスプレイに表示することができる。
Vivado 2020.2 を使用してプロジェクトを作って、論理合成、インプリメンテーションを行ったところ、clk_fpga_0 の内部のタイミング違反と pclk_buf -> clk_fpga_0 のクロック間のパスのタイミング違反、Other Path Groups の **async_default** で clk_fpga_0 -> pclk_buf のクロック間のパスのタイミング違反が出てしまった。
Vitis Vision Library の medianblur を ZYBO Z7-20 で使ってみる2
AXI4 Master 版のメディアン・フィルタと XF_8UC3 を XF_8UC4 に変換する IP を使用して、メディアン・フィルタ処理後の画像をディスプレイに出力するシステムを作成しようということで、前回は、IP を用意して、ブロックデザインを作成し、論理合成、インプリメンテーション、ビットストリームの生成を行ったところ、タイミング・エラーが発生した。今回は、タイミング・ エラーを解消した。
Vitis Vision Library の medianblur を ZYBO Z7-20 で使ってみる3
前回は、タイミングエラーを解消して、ビットストリームの生成が成功して、XSA ファイルを生成した。今回は、Vitis 2020.2 を立ち上げて、プラットフォームとアプリケーション・プロジェクトを作成し、実機検証を行い成功した。
Vitis Vision Library の medianblur を ZYBO Z7-20 で使ってみる4
前回は、 Vitis 2020.2 を立ち上げて、プラットフォームとアプリケーション・プロジェクトを作成し、実機検証を行い、フィルタ処理画像を見ることができた。今回は、複雑な構成になっているので、 後先間違っているようだが、ブロック図を書いて、構成を説明した。

AXI4-Stream の IP を使用して Vitis Vision Library で加工されたデータをディスプレイに表示する1(構想編)
”Vitis Vision Library の medianblur を ZYBO Z7-20 で使ってみる4”までで画像にメディアン・フィルタをかけてディスプレイに表示することができた。しかし、下図に示すスキームだと DMA のパスが多くてメモリ帯域が逼迫することが考えられる。
そこで、作ってきた AXI4-Stream 版ビットマップ・ディスプレイ・コントローラを使用して、下図の様に構成して DMA のパスを削減しよう。

AXI4-Stream 出力 xf_8uc3_2axis IP を Vitis HLS 2020.2 で作成する1
”AXI4-Stream の IP を使用して Vitis Vision Library で加工されたデータをディスプレイに表示する1(構想編)”で構想したように、DMA Write 出力 xf_8uc3_2rgb IP を AXI4-Stream 出力 xf_8uc3_2axis IP に変更したい。
そこで、今回は、AXI4-Stream 出力 xf_8uc3_2axis IP を作成しよう。
AXI4-Stream 出力 xf_8uc3_2axis IP を Vitis HLS 2020.2 で作成する2
AXI4-Stream 出力の xf_8uc3_2axis IP を作成するということで、前回は、ソースコードとテストベンチ・コードを貼って、Vitis HLS 2020.2 の xf_8uc3_2axis プロジェクトを作成した。今回は、C シミュレーション、 C コードの合成、C/RTL 協調シミュレーション、Export RTL を行う。
AXI4-Stream 出力 xf_8uc3_2axis IP を Vitis HLS 2020.2 で作成する3
AXI4-Stream 出力の xf_8uc3_2axis IP を作成するということで、前回は、Vitis HLS 2020.2 の xf_8uc3_2axis プロジェクトで、C シミュレーション、 C コードの合成、C/RTL 協調シミュレーション、Export RTL を行った。今回は、どうしても DSP を 20 個も使っているのが気に入らないので、浮動小数点数演算を任意精度固定小数点演算に変更する。

AXI4-Stream の IP を使用して Vitis Vision Library で加工されたデータをディスプレイに表示する2(Vivado プロジェクト)
それらの IP と”Vitis Vision Library の medianblur を ZYBO Z7-20 で使ってみる1”の medianblur IP を使用して下図の様に画像にメディアン・フィルタを掛ける回路を作成する。
AXI4-Stream の IP を使用して Vitis Vision Library で加工されたデータをディスプレイに表示する3(Vitis プロジェクト)
AXI4-Stream 版ビットマップ・ディスプレイ・コントローラと AXI4-Stream 出力 xf_8uc3_2axis IP を使用して”Vitis Vision Library の medianblur を ZYBO Z7-20 で使ってみる1”の回路を変更した。前回は Vivado 2020.2 で median_vision_axis プロジェクトを作成して、ブロックデザインを作成し、論理合成、インプリメンテーション、ビットストリームの生成が成功して、ハードウェアをエクスポートした。今回は Vitis 2020.2 を起動して、プラットフォームとアプリケーション・プロジェクトを作成した。
アプリケーション・ソフトウェアを起動したところディスプレイに画像を表示できた。

Vitis Vision Library でカメラ画像にメディアン・フィルタをかけてディスプレイに出力する1(構想編)
Vitis Vision Library 2020.2 を使用して、カメラ画像にメディアン・フィルタをかけてディスプレイに出力してみよう。
今回は、そのための構想を練ってみる。
Vitis Vision Library でカメラ画像にメディアン・フィルタをかけてディスプレイに出力する2(axis2xf8uc3 IP その1)
Vitis Vision Library 2020.2 を使用して、カメラ画像にメディアン・フィルタをかけてディスプレイに出力してみようということで、前回は、構想を練った。今回は、図のうちで axis2xf8uc3 IP を Vitis HLS 2020.2 で作成する。
Vitis Vision Library でカメラ画像にメディアン・フィルタをかけてディスプレイに出力する3(axis2xf8uc3 IP その2)
Vitis Vision Library 2020.2 を使用して、カメラ画像にメディアン・フィルタをかけてディスプレイに出力してみようということで、前回は、 axis2xf8uc3 IP のソースコードとテストベンチ・ファイルを貼った。今回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーションを行ったが、単発転送になっていたので、もう一度作り直すことになった。
Vitis Vision Library でカメラ画像にメディアン・フィルタをかけてディスプレイに出力する4(axis2xf8uc3 IP その3)
Vitis Vision Library 2020.2 を使用して、カメラ画像にメディアン・フィルタをかけてディスプレイに出力してみようということで、前回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーションを行ったが、単発転送になっていたので、もう一度作り直すことになった。今回はソースコードを修正して、もう一度、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行った。
Vitis Vision Library でカメラ画像にメディアン・フィルタをかけてディスプレイに出力する5(random_nise_gen その1)
前回は、AXI4-Stream の画像データを XF8UC3(CV8UC3) に変換する IP を作成できた。今回は、”Vitis Vision Library でカメラ画像にメディアン・フィルタをかけてディスプレイに出力する1(構想編)”の図に示してあるランダムノイズ発生器(random_noise_gen)を作成す る。
Vitis Vision Library でカメラ画像にメディアン・フィルタをかけてディスプレイに出力する6(random_nise_gen その2)
前回は、”Vitis Vision Library でカメラ画像にメディアン・フィルタをかけてディスプレイに出力する1(構想編)”の図に示してあるランダムノイズ発生器(random_noise_gen)を作成する ということで、ソースコードとテストベンチ・コードを貼って、Vitis HLS 2020.2 の random_noise.gen プロジェクトを示した。今回は、その random_noise_gen プロジェクトで、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行った。
Vitis Vision Library でカメラ画像にメディアン・フィルタをかけてディスプレイに出力する7(random_nise_gen その3)
前回は、ランダムノイズ発生器(random_noise_gen)プロジェクトで、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行った。今回は、ランダムノイズの発生をON/OFF できるようにソースコードとテストベンチを変更したので、それを貼っておく。
Vitis Vision Library でカメラ画像にメディアン・フィルタをかけてディスプレイに出力する8(aixs2xf8uc3 IP その4)
OV5642 カメラを使用するには、カメラの設定の関係で画像の上下を反転する vflip_dma_write IP が必要だった。DMA IP にする必要があるため、aixs2xf8uc3 に vflip 引数を追加しよう。

axis2xf8uc3 IP を Vitis HLS 2020.2 で作成する
axis2xf8uc3 に関する記事が長くなってので、別スレッドにすることにした。
なお、vflip の axis2xf8uc8 は別の IP にすることにした。
いろいろな実装を試しているが、XF8UC3 は unsigned なので、それで実装し直したので、もう一度貼っておく。
axis2xf8uc8 は PIPELINE 指示子に rewind オプションを付加してもリソース使用量が増えないが、vflip の axis2xf8uc8 は”Vitis Vision Library でカメラ画像にメディアン・フィルタをかけてディスプレイに出力する8(aixs2xf8uc3 IP その4)”の様にリソース使用量が 8 倍以上になってしまった。

axis2xf8uc3vflip IP を Vitis HLS 2020.2 で作成する1
”axis2xf8uc3 IP を Vitis HLS 2020.2 で作成する”で通常 DMA の AXI4-Stream から XF8UC3 変換してDMA Write する IP を作成した。今回は、AXI4-Stream の画像データを XF8UC3 に変換して、画像の上下を入れ替えてDMA する axis2xf8uc3vflip IP を Vitis HLS 2020.2 で作成した。
画像の上下をひっくり返すために、1行の画像データが 3/4 で割り切れることが条件となる。 800 x 600 ピクセルの画像は 800 ピクセルの 3/4 は 600 となって割り切れるため vflip することができる。
axis2xf8uc3vflip IP を Vitis HLS 2020.2 で作成する2
前回は、ソースコードとテストベンチ・コードを貼って、Vitis HLS 2020.2 の axis2xf8uc3vflip プロジェクトを作った。今回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行う。

Vitis Vision Library でカメラ画像にメディアン・フィルタをかけてディスプレイに出力する9(vitis_vision_cam その1)
これまで作ってきた IP をつないで、Vitis Vision Library 2020.2 を使用して、カメラ画像にメディアン・フィルタをかけてディスプレイに出力するため Vivado 2020.2 プロジェクトの vitis_vision_cam を作成する。
カメラには OV5642 を使用する。
Vitis Vision Library でカメラ画像にメディアン・フィルタをかけてディスプレイに出力する10(vitis_vision_cam その2)
前回は、これまで作ってきた IP をつないで、Vitis Vision Library 2020.2 を使用して、カメラ画像にメディアン・フィルタをかけてディスプレイに出力するため Vivado 2020.2 プロジェクトの vitis_vision_cam を作成した。そして、論理合成、インプリメンテーション、ビットストリームの生成を行って、ハードウェアをエクスポートした。今回は、Vitis 2020.2 を起動してプラットフォームを作成し、アプリケーション・プロジェクトを作成し、アプリケーション・ソフトウェアを作成して ZYBO Z7-20 で実機検証したが、カメラ画像はディスプレイに表示されなかった。
Vitis Vision Library でカメラ画像にメディアン・フィルタをかけてディスプレイに出力する11(vitis_vision_cam その3)
これまで作ってきた IP をつないで、Vitis Vision Library 2020.2 を使用して、カメラ画像にメディアン・フィルタをかけてディスプレイに出力するため、前回は、Vitis 2020.2 を起動してプラットフォームを作成し、アプリケーション・プロジェクトを作成し、アプリケーション・ソフトウェアを作成して ZYBO Z7-20 で実機検証したところ、画像が表示されなかった。今回は、Vivado Analyzer を使用してデバックを行った。
ビデオ側はちゃんと動作している。カメラ側がおかしいのは分かったがどのIPが割るのか分からない。

ILA デフォルト・ダッシュボードの ADVANCED トリガ・モードを使用する
”ZYNQ で PS のクロックを使用している場合に Vivado ロジック解析機能を使用する”では、最初の 1 行しか見ることができない。。。orz
そこで、ILA デフォルト・ダッシュボードの ADVANCED トリガ・モードを使用して、その後の行まで見てみよう。
Trigger State Machine を書いて、16ビットカウンタの限界まで見てみたが、まだ足りない。

ILA デフォルト・ダッシュボードの ADVANCED トリガ・モードを使用して、バグを確かめる
”ILA デフォルト・ダッシュボードの ADVANCED トリガ・モードを使用する”を使用して、 OV5642 カメラの行を見ていったが、画面の最後の行まで見ることができなかった。今回は、 trigger state machine ファイルを変更して、その先で、どうして出力されなくなるか?を見ていこう。
最初に $counter0 と $counter1 を使用して、 32 ビット幅のカウンタにしようとしたが、できなかった。まだ、トリガ・ステートマシン・ファイルに慣れていないのかも知れない?
次に、tlast をカウントすれば良いのでは?ということで、カウントして、表示した。その際の Trigger position in window は 3800 にした。

MNIST_CNN_Z7_OV5642vfd_183 を Vivado 2018.3 で確かめる
Vivado 2020.2 で作成した vitis_vision_cam プロジェクトが動作しないので、以前、”ZYBO Z7-20でのMNISTの実装にOV5642を使用する3”で作成した MNIST_CNN_Z7_OV5642vfd_183 を試してみることにした。
問題なく動作した。
MNIST_CNN_Z7_OV5642vfd を Vivado 2020.2 で確かめる
”MNIST_CNN_Z7_OV5642vfd_183 を Vivado 2018.3 で確かめる”で ZYBO Z7-20 で OV5642 を使用した画像表示システムが動作するのを確認した。それじゃ Vivado 2020.2 では動作するのだろうか?ということで、Vivado 2019.2 を間に挟んで、アップグレードして行ったところ、無事にVivado 2020.2 でも動作した。
更に、Vivado 2020.2 でカメラ・インターフェースやその先の AXI4-Stream と vfilp_dma_write IP の AXI4 Master を Debug に指定して ILA デフォルト・ダッシュボード画面で確認してみよう。

vitis_vision_cam プロジェクトをデバックするために dma_read4image を Vitis HLS 2020.2 で作る1
Vivado 2020.2 プロジェクトの vitis_vision_cam のデバックをするためにメモリから DMA Read して、AXI4-Stream に出力する dma_read4image を Vitis HLS 2020.2 のプロジェクトとして作成することにした。
vitis_vision_cam プロジェクトをデバックするために dma_read4image を Vitis HLS 2020.2 で作る2
前回は、ソースコードとテストベンチ・コードを貼って、Vitis HLS 2020.2 の dma_read4image プロジェクトを作成した。今回は、 dma_read4image プロジェクトの C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行う。

vitis_vision_cam の Vivado 2020.2 プロジェクトで、どの IP がバグっているのかを調査した
”vitis_vision_cam プロジェクトをデバックするために dma_read4image を Vitis HLS 2020.2 で作る1”
”vitis_vision_cam プロジェクトをデバックするために dma_read4image を Vitis HLS 2020.2 で作る2”
で DMA_Read して、 AXI4-Stream で出力する IP が作成できた。AXI4-Stream から DMA_Write するのは、vflip_dma_write IP をすでに作成済みなので、それを利用する。そして、vitis_vision_cam プロジェクトをコピーして、ディレクトリ名を vitis_vision_cam_test として、中のブロックデザインを変更した。
これだとカメラ画像を表示することができた。
どうやら axis2xf8uc3vflip IP が原因のようだ?

DATAFLOW 指示子を使用しない Vitis HLS 2020.2 の axis2xf8uc3vflip2 プロジェクトを作成する1
”vitis_vision_cam の Vivado 2020.2 プロジェクトで、どの IP がバグっているのかを調査した”で vitis_vision_cam プロジェクトが動作しないのは、どうやら axis2xf8uc3vflip IP が原因のようだ?ということがわかった。
そこで、DATAFLOW 指示子を使用しない axis2xf8uc3vflip IP を作ることにしたのだが、並列動作させずに DMA_Write すると DMA_Write する部分に if 文が入るので、単発転送になってしまう。今回は、1 行データをまとめたら、バーストで DMA 転送する方式にすることにした。これだと、レイテンシは 3/4 だけ増加することになるが、もともとピクセル・クロックが 40 MHz (SVGA) なので、AXI4-Stream の動作周波数の 100 MHz からすると 2/5 になっていて半分以下なので、十分に間に合う計算になる。
DATAFLOW 指示子を使用しない Vitis HLS 2020.2 の axis2xf8uc3vflip2 プロジェクトを作成する2
DATAFLOW 指示子を使用しない axis2xf8uc3vflip IP を作ることにしたということで、前回は、ソースコードとテストベンチ・コードを貼って、Vitis HLS 2020.2 の axis2xf8uc3vflip2 プロジェクトを作成した。今回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行う。

DATAFLOW 指示子を使用しない axis2xf8uc3vflip IP を使用して vitis_vision_cam を実装する
この DATAFLOW 指示子を使用しない axis2xf8uc3vflip IP を使用して vitis_vision_cam を実装しよう
実装して、テストしたところ、カメラ画像が表示された。やっと成功した。良かったよ。。。

DATAFLOW 指示子を使用した sobel_axis_dma IP を使った sobel_axis_dma_cam を実装する2
前回は、DATAFLOW 指示子を使った sobel_axis_dma の Vivado HLS での IP を使用して、カメラ画像表示システムの sobel_axis_dma_cam を作成して、ソーベル・フィルタをかけることができた。しかし、 sobel_axis_dma IP は Vivado HLS 2019.2 で作成したので、最新の Vitis HLS 2020.2 で作成した IP はどうなのか?という疑問は残った。今回は、下に示す 2 つの記事のブログで作ってきた Vitis HLS 2020.2 版の sobel_axis_dma IP を sobel_axis_dma_cam プロジェクトで使用して、動作を確認したところ、成功した。

Vitis HLS 2021.2 で Vitis Vision Library を使用する1(dilation 編 1)
Vitis Vision Library を Vitis HLS 2021.2 を使用してやってみることにした。
きっかけは Vitis_Libraries/vision/L1/examples/rgbirbayer/ を見たことだった。この実装は、 AXI4-Stream を使用して実装されている。 Vitis Vision Library で AXI4-Stream が使えるととっても良い。前回 Vitis Vision Library をやった時は AXI4-Stream 入出力にすることができなかった。
また、”XF_8UC4 を使用して median_blur_accel() を実装する”で失敗したが、 XF_8UC4 が Vitis Vision Library で使用できるととっても良い。XF_8UC4 が使用できるようになっていないだろうか?
とりあえず、現状を知るために Vitis HLS 2021.2 で dilation を実装してみることにした。
Vitis HLS 2021.2 で Vitis Vision Library を使用する2(dilation 編 2)
前回は、Vitis_Libraries/vision/L1/examples/dilation を Vitis HLS 2021.2 で xf_dilation プロジェクトを作成した。今回は、xf_dilation プロジェクトで C シミュレーション、C コードの合成を行ったが、C コードの合成でエラーになってしまった。
Vitis HLS 2020.2 で、xf_dilation プロジェクトを作成して、C コードの合成を行うと成功した。
それから、不思議なことに、Vitis HLS 2020.2 で xf_dilation_202 プロジェクトを作成し、Vitis HLS 2021.2 で開いて、 C コードの合成を行うと成功した???
Vitis HLS 2021.2 で Vitis Vision Library を使用する3(dilation 編 3)
前回は、xf_dilation プロジェクトで C シミュレーション、C コードの合成を行ったが、C コードの合成でエラーになってしまった。しかし、Vitis HLS 2020.2 でプロジェクトを作成してから、そのプロジェクトを Vitis HLS 2021.2 で使用すれば C コードの合成が成功した。今回は、残りの C/RTL 協調シミュレーションと Export RTL , Implementation を行った。
Vitis HLS 2021.2 で Vitis Vision Library を使用する4(rgbirbayer 編)
前回は、dilation の残りの C/RTL 協調シミュレーションと Export RTL , Implementation を行った。今回は、rgbirbayer をやってみたい。これは、AXI4-Stream 入出力で実装されている。dilation 編同様、Vitis HLS 2020.2 でプロジェクトを作成してから Vitis HLS 2021.2 で C コードの合成をやってみた。なお、入力画像が用意できないので、シミュレーションは無しとする。
Vitis HLS 2021.2 で Vitis Vision Library を使用する5(AXI4-Stream 入出力の xf_median_blur 編 1)
前回は、rgbirbayer をやってみた。これは、AXI4-Stream 入出力で実装されている。dilation 編同様、Vitis HLS 2020.2 でプロジェクトを作成してから Vitis HLS 2021.2 で C コードの合成をやってみた。なお、入力画像が用意できないので、シミュレーションは無しとする。結果は Vitis HLS 2020.2 では C コードの合成が成功したが、Vitis HLS 2021.2 ではエラーになってしまった。今回は、本命の AXI4-Stream 入出力のメディアン・フィルタをやってみよう。
Vitis HLS 2021.2 で Vitis Vision Library を使用する6(AXI4-Stream 入出力の xf_median_blur 編 2)
前回は、本命の AXI4-Stream 入出力のメディアン・フィルタをやってみようということで、Vitis HLS 2020.2 で xf_median_blur プロジェクトを作成した。今回は、Vitis HLS 2021.2 を起動して、xf_median_blur プロジェクトを開いて、 C シミュレーション、C コードの合成、C/RTL 協調シミュレーションを行った。

Vitis Vision Library の AXI4-Stream のデータ・フォーマットを検証する
前回、AXI4-Stream 入出力の Vitis Vision Library の xf_median_blur を C/RTL 協調シミュレーションで波形を見ることができた。今回は、AX4-Stream 入出力関数、 xf::cv::AXIvideo2xfMat() 、 xf::cv::xfMat2AXIvideo() 関数のデータのフォーマットを検証する。
23 ビット目から 16 ビット目に Red
15 ビット目から 8 ビット目に Green
7 ビット目から 0 ビット目に Blue

Vitis Vision Library L1 の AXI4-Stream 入出力版 medianblur を 実機で動作を確認する 1
今まで積み上げてきた IP を使用して、Vitis Vision Library L1 の AXI4-Stream 入出力版 medianblur を 実機で動作を確認してみよう。実機は、ZYBO Z7-20 とする。
論理合成、インプリメンテーションを行ったところ、タイミング・エラーが出ている。
Vitis Vision Library L1 の AXI4-Stream 入出力版 medianblur を 実機で動作を確認する 2
今まで積み上げてきた IP を使用して、Vitis Vision Library L1 の AXI4-Stream 入出力版 medianblur を 実機で動作を確認してみようとうことで、前回は、各 IP を IP Catalog に追加して、ブロック・デザインを作成し、回路を完成させた。制約ファイルを追加して、論理合成、インプリメンテーション、ビットストリームの生成を行ったが、タイミング エラーが出てしまった。今回は、そのタイミングエラーを解消することができた。
Vitis Vision Library L1 の AXI4-Stream 入出力版 medianblur を 実機で動作を確認する 3
前回は、制約を追加することで、タイミングエラーを解消した。今回は、Vitis 2021.2 を起動して、プラットフォーム・プロジェクトとアプリケーション・プロジェクトを作成し、アプリケーション・ソフトウェアを作成する。そして、ビルドを行って、実機で動作 を確認できた。

Vitis HLS 2021.2 で Vitis Vision Library L1 を使用して C コードの合成を行う方法
”Vitis HLS 2021.2 で Vitis Vision Library を使用する8(AXI4-Stream 入出力の xf_resize 編 1)”で C コードの合成を行ったが、Vitis Vision Library L1 のインクルード・ファイルが見つからないというエラーになってしまった。
この解決方法は Vitis HLS 2020.2 でプロジェクトを作成してから、そのプロジェクトを Vitis HLS 2021.2 で読み込んで合成する、だった。(”Vitis HLS 2021.2 で Vitis Vision Library を使用する2(dilation 編 2)”参照)
しかし、ただ単に Vitis HLS 2020.2 でプロジェクトを作成してから、そのプロジェクトを Vitis HLS 2021.2 で読み込んでもダメなようだった。うまく行く条件は Vitis HLS 2020.2 で一回 C コードの合成を行っておくということのようだ。

Vitis HLS 2021.2 で Vitis Vision Library を使用する8(AXI4-Stream 入出力の xf_resize 編 1)
前回、Vitis HLS 2021.2 で Vitis Vision Library を使用して、メディアン・フィルタ IP を実装することができた。今回は、Vitis HLS 2021.2 で Vitis Vision Library を使用して、resize IP を実装することにしたのだが、C コードの合成をしようとしたら、どうやっても file not found が消えなかった。
解決方法は Vitis HLS 2020.2 でプロジェクトを作成してから、そのプロジェクトを Vitis HLS 2021.2 で読み込んで合成する、だった。。。
もう一度、やり直してみよう。

Vitis HLS 2021.2 で Vitis Vision Library L1 を使用するために TCL スクリプトでプロジェクトを作成する1(resize 編1)
”Vitis HLS 2021.2 で Vitis Vision Library L1 を使用して C コードの合成を行う方法”で Vitis HLS 2020.2 で Vitis HLS のプロジェクトを作成して、一度 C コードの合成を行ってから、プロジェクトを閉じて、Vitis HLS 2021.2 で同じプロジェクトを開いて、C コードの合成をするという面倒くさいことをやっていた。かなり面倒なので、Vitis HLS 2021.2 だけでやる方法を考えていたのだが、TCL スクリプトでプロジェクトを作成して、C シミュレーションだけやってみよう。
Vitis HLS 2021.2 で Vitis Vision Library L1 を使用するために TCL スクリプトでプロジェクトを作成する2(resize 編2)
Vitis HLS 2021.2 で Vitis Vision Library L1 のプロジェクトを作成すると、C シミュレーションの時に Vitis Vision Library L1 のインクルード・ファイルが参照できないということで、TCL スクリプトで Vitis HLS 2021.2 のプロジェクトを作成して、やってみることにした。ということで、前回は、コードを表示して、TCL スクリプトで Vitis HLS 2021.2 のプロジェクトを作成し、C シミュレーションを行った。今回は、 Vitis HLS 2021.2 の GUI 上で、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL、 Implementation を行った。

Vitis HLS 2021.2 で Vitis Vision Library L1 を使用するために TCL スクリプトでプロジェクトを作成する3(fast 編1)
TCL スクリプトで Vitis HLS 2021.2 のプロジェクトを作成して、Vitis Vision Library L1 をやってみることにしたということで、前回は、AXI4-Stream 入出力版の resize の C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL、 Implementation を行った。今回は、fast をやってみることにした。コードを貼っておく。
Vitis HLS 2021.2 で Vitis Vision Library L1 を使用するために TCL スクリプトでプロジェクトを作成する4(fast 編2)
前回は、fast をやってみることにした。コードを貼って、xf_fast_axis ディレクトリを作成し、フィルを入れた。今回は、xf_fast_axis_home.tcl を起動したら、C シミュレーションがエラーになった。原因は、OpenCV の cv::FAST() が undefined reference だったことだ。
cv::FAST() は OpenCV の関数なので、ハードウェアには関係ないので、コメントアウトすることにした。それに関連する行もコメントアウトした。
Vitis HLS 2021.2 で Vitis Vision Library L1 を使用するために TCL スクリプトでプロジェクトを作成する5(fast 編3)
前回は、xf_fast_axis_home.tcl を起動したら、C シミュレーションがエラーになった。原因は、OpenCV の cv::FAST() が undefined reference だったので、この行と関連する行をコメントアウトした。すると、C シミュレーションが成功した。今回は、C コードの合成、C/RTL 協調シミュレーション、Export RTL 、Implementation を行った。

Vitis HLS 2021.2 で Vitis Vision Library L1 を使用するために TCL スクリプトでプロジェクトを作成する6(modefilter 編1)
前回の fast 編では、TCL スクリプトを自分で生成したが、今回は、Vitis Vision Library L1 にすでにある run_hls.tcl を少し改造して Vitis HLS 2021.2 のプロジェクトを生成してみよう。少ししか改造しなくてプロジェクトを生成できそうだ。Vitis Vision Library のユーザーズ・マニュアルにある Getting Started with HLS を使った方法はうまく行かなかったので、run_hls.tcl を書き換えることにした。そして、ソースコード・ファイルやテストベンチ・ファイル、ヘッダ・ファイルも AXI4-Stream 入出力に変更した。
Vitis HLS 2021.2 で Vitis Vision Library L1 を使用するために TCL スクリプトでプロジェクトを作成する7(modefilter 編2)
Vitis Vision Library L1 にすでにある run_hls.tcl を少し改造して Vitis HLS 2021.2 のプロジェクトを生成するということで、前回は、Vitis Vision Library のユーザーズ・マニュアルにある Getting Started with HLS を使った方法はうまく行かなかったので、run_hls.tcl を書き換えることにした。そして、ソースコード・ファイルやテストベンチ・ファイル、ヘッダ・ファイルも AXI4-Stream 入出力に変更した。Vitis HLS 2021.2 の xf_mode_filter_axis プロジェクトを作成することができた。今回は、C シミュレーション、C コードの合成を行った。

Vitis HLS 2021.2 で Vitis Vision Library L1 を使用するために TCL スクリプトでプロジェクトを作成する8(modefilter 編3)
Vitis Vision Library L1 にすでにある run_hls.tcl を少し改造して Vitis HLS 2021.2 のプロジェクトを生成するということで、前回は、modefilter のC シミュレーション、C コードの合成を行った。今回は、C/RTL 協調シミュレーション、Export RTL、Implementation を行った。
Vitis HLS 2021.2 で Vitis Vision Library L1 を使用するために TCL スクリプトでプロジェクトを作成する9(modefilter 編4)
前回は、modefilter の C/RTL 協調シミュレーション、Export RTL、Implementation を行った。今回は、シミュレーション用の画像を 800 x 600 ピクセルのノイズ付加した画像に切り替えて、ノイズ除去性能を確認する。その際に、HEIGHT と WIDTH (画像の最大値)を HD 解像度に設定して実際に使用できる IP にしてみよう。


inserted by FC2 system