”
Vitis HLS 2021.2 で Vitis Vision Library を使用する6(AXI4-Stream 入出力の xf_median_blur 編 2) ”の続き。
Vitis HLS 2021.2 で dilation を実装してみることにしたということで、前回は、Vitis HLS 2021.2 を起動して、xf_median_blur プロジェクトを開いて、 C シミュレーション、C コードの合成、C/RTL 協調シミュレーションを行った。しかし、C/RTL 協調シミュレーション波形は見ることができなかった。今回は、画像サイズを 128 x 128 ピクセルに小さくして、C/RTL 協調シミュレーションを行って、波形を確認した。そして、Export RTL と Implementation を行った。
Vitis_Libraries/vision/data/128x128.png を使用して、xf_median_blur の C/RTL 協調シミュレーションを行った。
結果を示す。
Latency は 18193 クロックだった。
128 x 128 = 16384 ピクセルなので、18193 / 16384 ≒ 1.11 クロック / ピクセルだった。
今回は、波形を見ることができたので、まずは全体波形から示す。
拡大した。
p_src_TDATA を見ると、46xxxxxx で下 24 ビットにピクセル・データが入っていそうだ。
p_dst_TDATA も 00xxxxxx で下 24 ビットにピクセル・データが入っていることが分かる。
何処のバイト・フィールドが RGB なのか?は次回検証することにする。
Export RTL を行った。
xf_median_blur/solution1/impl ディレクトリに export.zip が生成された。
Implementation を行った。
CP achieved post-implementation が 9.344 ns で危なそうだった。
Vitis HLS メニューから Solution -> Solution Settings... を選択する。
Solution Settings (solution1) ダイアログが開く。
Synthesis を選択し、 Uncertainty を 5 ns にした。
これで C コードの合成を行った。
Estimated は 5.132 ns になっているが、果たしてどうだろうか?
Implementation を行ったが、以前同様だった。
Uncertainty の 5 ns を消して、C コードの合成を行っておいた。結局、元に戻した。
以前の xfOpenCV でも、Uncertainty をいじっても CP achieved post-implementation が改善することは無かった気がする。
2022年01月18日 03:33 |
Vitis HLS
| トラックバック:0
| コメント:0
”
Vitis HLS 2021.2 で Vitis Vision Library を使用する5(AXI4-Stream 入出力の xf_median_blur 編 1) ”の続き。
Vitis HLS 2021.2 で dilation を実装してみることにしたということで、前回は、本命の AXI4-Stream 入出力のメディアン・フィルタをやってみようということで、Vitis HLS 2020.2 で xf_median_blur プロジェクトを作成した。今回は、Vitis HLS 2021.2 を起動して、xf_median_blur プロジェクトを開いて、 C シミュレーション、C コードの合成、C/RTL 協調シミュレーションを行った。
Vitis HLS 2021.2 を起動して、、xf_median_blur プロジェクトを開いた。
C シミュレーションを行った。
solution1/csim/build ディレクトリに hls.jpg, out_ocv.jpg, diff_img.jpg が生成されている。
hls.jpg を見ると、test2.jpg のノイズが綺麗に除去されていた。メディアン・フィルタのノイズ除去機能が発揮されている。
C コードの合成を行って成功した。
Vitis Vision Library L1 で初めて実用的な AXI4-Stream 入出力の IP の C コードの合成が成功した。嬉しい。。。
Latency は 2096432 クロックだった。
画像は最大の 1920 x 1080 = 2073600 ピクセルだから、2096432 / 2073600 ≒ 1.01 クロック/ピクセルだった。
C/RTL 協調シミュレーションを行った。
Co-Simulation Dialog の Input Argument に test2.jpg を指定して、Dump Trace を all にして、C/RTL 協調シミュレーションを行ったが終了しなかった。
そこで、Dump Trace を port にして C/RTL 協調シミュレーションをやり直したが、これも終了しなかった。
Dump Trace を none にしたところ、C/RTL 協調シミュレーションが終了した。
結果を示す。
Latency は 932817 クロックだった。
シミュレーションでは実際の画像をメディアン・フィルタ処理した時のクロック数なので、画像は 1280 x 720 = 921600 ピクセルとなる。
932817 / 921600 ≒ 1.01 クロック / ピクセルとなった。
2022年01月16日 05:21 |
Vitis_Vision
| トラックバック:0
| コメント:0
”
Vitis HLS 2021.2 で Vitis Vision Library を使用する4(rgbirbayer 編) ”の続き。
Vitis HLS 2021.2 で dilation を実装してみることにしたということで、前回は、rgbirbayer をやってみた。これは、AXI4-Stream 入出力で実装されている。dilation 編同様、Vitis HLS 2020.2 でプロジェクトを作成してから Vitis HLS 2021.2 で C コードの合成をやってみた。なお、入力画像が用意できないので、シミュレーションは無しとする。結果は Vitis HLS 2020.2 では C コードの合成が成功したが、Vitis HLS 2021.2 ではエラーになってしまった。今回は、本命の AXI4-Stream 入出力のメディアン・フィルタをやってみよう。
以前、xfOpenCV で AXI4-Stream 版の medianblur をやってみた。”
Vivado HLS 2019.2 で xfOpenCV のAXI4-Stream 版 medianblur をやってみる1 ”
Vitis HLS 2020.2 のときに、この xfOpenCV 版をやってみたが、エラーで合成ができなかった。”
Vitis Vision Library で AXI4-Stream 入出力の medianblur を実装する1 ”
今回、AXI4-Stream 入出力のサンプルコードの rgbirbayer が公開されていたので、それに合わせて”
Vivado HLS 2019.2 で xfOpenCV のAXI4-Stream 版 medianblur をやってみる1 ”を変更した。
プロジェクトは Vitis HLS 2020.2 で作成し、そのプロジェクトを Vitis HLS 2021.2 で使用することにする。
xf_median_blur.h を示す。
// xf_median_blur.h // 2020/03/09 by marsee // xfopencv/examples/medianblur/xf_median_blur_config.h のコードを引用している // https://github.com/Xilinx/xfopencv/blob/master/examples/medianblur/xf_median_blur_config.h // xfopencv/examples/medianblur/xf_config_params.h のコードを引用している // https://github.com/Xilinx/xfopencv/blob/master/examples/medianblur/xf_config_params.h // 2022/01/10 : for Vitis Vision Library #ifndef __XF_MEDIAN_BLUR_H__ #define __XF_MEDIAN_BLUR_H__ #include "hls_stream.h" #include "ap_int.h" #include "common/xf_common.hpp" #include "ap_axi_sdata.h" #include "common/xf_infra.hpp" #include "common/xf_axi_io.hpp" #include "imgproc/xf_median_blur.hpp" //#include "xf_config_params.hpp" #define NO 1 // Normal Operation #define RO 0 // Resource Optimized #define RGB 1 #define GRAY 0 /* Filter window size*/ #define WINDOW_SIZE 3 /* set the height and weight */ #define WIDTH 1920 #define HEIGHT 1080 #if NO #define NPxPC XF_NPPC1 #else #define NPxPC XF_NPPC8 #endif #if GRAY #define TYPE XF_8UC1 #define CHANNELS 1 #define STREAMW 8 #else #define TYPE XF_8UC3 #define CHANNELS 3 #define STREAMW 32 #endif typedef hls::stream<ap_axiu<STREAMW,1,1,1> > AXI_STREAM; #endif
xf_median_blur.cpp を示す。
// xf_median_blur.cpp // 2020/03/08 by marsee // xfopencv/HLS_Use_Model/Standalone_HLS_AXI_Example/xf_ip_accel_app.cpp のコードを引用している // https://github.com/Xilinx/xfopencv/blob/master/HLS_Use_Model/Standalone_HLS_AXI_Example/xf_ip_accel_app.cpp // xfopencv/examples/medianblur/xf_median_blur_accel.cpp のコードを引用している // https://github.com/Xilinx/xfopencv/blob/master/examples/medianblur/xf_median_blur_accel.cpp // 2022/01/10 : for Vitis Vision Library #include "xf_median_blur.h" void median_blur_accel_axis(AXI_STREAM& _src, AXI_STREAM& _dst, int img_height, int img_width){ #pragma HLS INTERFACE mode=s_axilite port=img_width #pragma HLS INTERFACE mode=s_axilite port=img_height #pragma HLS INTERFACE mode=s_axilite port=return #pragma HLS INTERFACE mode=axis register_mode=both port=_src register #pragma HLS INTERFACE mode=axis register_mode=both port=_dst register xf::cv::Mat<TYPE, HEIGHT, WIDTH, NPxPC> img_in(img_height, img_width); xf::cv::Mat<TYPE, HEIGHT, WIDTH, NPxPC> img_out(img_height, img_width); #pragma HLS DATAFLOW xf::cv::AXIvideo2xfMat(_src, img_in); xf::cv::medianBlur <WINDOW_SIZE, XF_BORDER_REPLICATE, TYPE, HEIGHT, WIDTH, NPxPC> (img_in, img_out); xf::cv::xfMat2AXIvideo(img_out, _dst); }
xf_median_blur_tb.cpp を示す。
// xf_median_blur_config_tb.cpp // 2020/03/08 by marsee // xfopencv/HLS_Use_Model/Standalone_HLS_AXI_Example/xf_dilation_tb.cpp のコードを引用している // https://github.com/Xilinx/xfopencv/blob/master/HLS_Use_Model/Standalone_HLS_AXI_Example/xf_dilation_tb.cpp // xfopencv/examples/medianblur/xf_median_blur_tb.cpp のコードを引用している // https://github.com/Xilinx/xfopencv/blob/master/examples/medianblur/xf_median_blur_tb.cpp // 2022/01/10 : for Vitis Vision Library #include "opencv2/opencv.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgcodecs/imgcodecs.hpp" #include "xf_median_blur.h" #include "common/xf_axi.hpp" #include "common/xf_sw_utils.hpp" void median_blur_accel_axis(AXI_STREAM& _src, AXI_STREAM& _dst, int img_height, int img_width); int main(int argc, char** argv) { if(argc != 2) { fprintf(stderr,"Invalid Number of Arguments!\nUsage:\n"); fprintf(stderr,"<Executable Name> <input image path> \n"); return -1; } cv::Mat out_img,ocv_ref; cv::Mat in_img,in_img1,diff; // reading in the color image #if GRAY in_img = cv::imread(argv[1], 0); #else in_img = cv::imread(argv[1], 1); #endif if (in_img.data == NULL) { fprintf(stderr,"Cannot open image at %s\n", argv[1]); return 0; } // create memory for output images /* reading the gray/color image */ #if GRAY ocv_ref.create(in_img.rows,in_img.cols,CV_8UC1); out_img.create(in_img.rows,in_img.cols,CV_8UC1); diff.create(in_img.rows,in_img.cols,CV_8UC1); in_img1.create(in_img.rows,in_img.cols,CV_8UC1); #else ocv_ref.create(in_img.rows,in_img.cols,CV_8UC3); out_img.create(in_img.rows,in_img.cols,CV_8UC3); diff.create(in_img.rows,in_img.cols,CV_8UC3); in_img1.create(in_img.rows,in_img.cols,CV_8UC3); #endif int img_height = in_img.rows; int img_width = in_img.cols; ///////////////// Opencv Reference //////////////////////// cv::medianBlur(in_img,ocv_ref,WINDOW_SIZE); cv::imwrite("out_ocv.jpg", ocv_ref); AXI_STREAM _src,_dst; xf::cv::cvMat2AXIvideoxf<NPxPC>(in_img, _src); median_blur_accel_axis(_src, _dst, img_height, img_width); xf::cv::AXIvideo2cvMatxf<NPxPC>(_dst, in_img1); cv::imwrite("hls.jpg", in_img1); ////////////////// Compute Absolute Difference //////////////////// cv::absdiff(ocv_ref, in_img1, diff); float err_per; xf::cv::analyzeDiff(diff,0,err_per); cv::imwrite("diff_img.jpg",diff); in_img.~Mat(); out_img.~Mat(); ocv_ref.~Mat(); in_img.~Mat(); in_img1.~Mat(); diff.~Mat(); if(err_per > 0.0f) { return 1; } return 0; }
Vitis HLS 2020.2 で xf_median_blur プロジェクトを作成した。
xf_median_blur ディレクトリに 1280 x 720 ピクセルの test2.jpg 、 xf_median_blur.h, xf_median_blur.cpp, xf_median_blur_tb.cpp をコピーした。
test2.jpg を示す。ランダム・ノイズを画像に重畳している。
Vitis HLS 2021.2 の Project メニューから Project Settings... を選択して、設定を行う。
Project Settings (xf_median_blur) ダイアログが開く。
左のウインドウで Simulation をクリックする。
xf_median_blur_tb.cpp の CFLAGS を設定する。(設定方法は、Edit CFLAGS... ボタンをクリックする)
xf_median_blur_tb.cpp の CFLAGS に
-I/media/masaaki/Ubuntu_Disk/Xilinx_github/Vitis_Libraries/vision/L1/include -std=c++0x -I/usr/local/include
を設定した。
Linker Flags に
-L/usr/local/lib -lopencv_core -lopencv_imgcodecs -lopencv_imgproc
を設定した。
Input Arguments に
/media/masaaki/Ubuntu_Disk/Vitis_HLS/ZYBO_Z7_20/2021.2/xf_median_blur/test2.jpg
を設定した。
Project Settings (xf_median_blur) ダイアログの左のウインドウで Synthesis をクリックしxf_median_blur.cpp の CFLAGS を設定する。(設定方法は、Edit CFLAGS... ボタンをクリックする)
-I/media/masaaki/Ubuntu_Disk/Xilinx_github/Vitis_Libraries/vision/L1/include -std=c++0x
を設定した。
ZYBO Z7-20 を使用するので、64 ビットアドレスの DMA を禁止して、 32 ビットアドレスの DMA にする。
Vitis HLS の Solution メニューから Solution Settings... を選択する。
Solution Settings (solution1) ダイアログが開く。
config_interface を展開して、m_axi_addr64 の Value のチェックボックスのチェックを外した。
これで、Vitis HLS 2020.2 の作業は終了し、次回からは Vitis HLS 2021.2 でプロジェクトを開いて、作業をしていく。
羊毛フェルト うさぎ クリーナー マスコットナンバー1028★別冊付録 EURO出場24カ国 選手名鑑付!【最終値下げ】ゼナック ブラッカート B65フィネスユニクロ キャミソール タンクトップ サイズ130WEGO 財布【値下げしました】GTRACING ゲーミングチェア【送料無料】アフロ田中 ブルーレイUOTANI SPⅡ ハイパワーコイルセット
トトロのコインケースです。です。アルカリ乾電池 単1形2本パック【5個セット】送料無料 絶版本 入手困難 男闘呼組 写真集 ジャニーズラック様専用 クシタニ(KUSHITANI) メッシュジャケット Mイタリア製 ジャケット ウールン商会 KUTAHYA和装用バッグチノパンスーパードラゴンボールヒーローズ 人造人間17号 UM9-053
2022年01月15日 05:20 |
Vitis_Vision
| トラックバック:0
| コメント:0
”
Vitis HLS 2021.2 で Vitis Vision Library を使用する3(dilation 編 3) ”の続き。
Vitis HLS 2021.2 で dilation を実装してみることにしたということで、前回は、dilation の残りの C/RTL 協調シミュレーションと Export RTL , Implementation を行った。今回は、
rgbirbayer をやってみたい。これは、AXI4-Stream 入出力で実装されている。dilation 編同様、Vitis HLS 2020.2 でプロジェクトを作成してから Vitis HLS 2021.2 で C コードの合成をやってみた。なお、入力画像が用意できないので、シミュレーションは無しとする。
Vitis HLS 2020.2 で xf_rgbirbayer プロジェクトを作成した。
Vitis_Libraries/vision/L1/examples/rgbirbayer/ の xf_config_params.h, xf_rgbir_accel_axivideo.cpp, xf_rgbir_config_axivideo.h を xf_rgbirbayer ディレクトリにコピーした。
Vitis HLS 2020.2 の sources に xf_rgbir_accel_axivideo.cpp を Add Source した。
xf_rgbir_accel_axivideo.cpp は AXI4-Stream 入出力で、AXI4-Stream と xf::cv::Mat 形式を変換するために xf::cv::AXIvideo2xfMat() と xf::cv::xfMat2AXIvideo() の組を使用している。
Vitis HLS 2021.2 の Project メニューから Project Settings... を選択して、設定を行う。
Project Settings (xf_rgbirbayer) ダイアログが開く。
左のウインドウで Synthesis をクリックし、xf_rgbir_accel_axivideo.cpp の CFLAGS を設定する。(設定方法は、Edit CFLAGS... ボタンをクリックする)
-I/media/masaaki/Ubuntu_Disk/Xilinx_github/Vitis_Libraries/vision/L1/include -std=c++0x
を設定した。
ZYBO Z7-20 を使用するので、64 ビットアドレスの DMA を禁止して、 32 ビットアドレスの DMA にする。
Vitis HLS の Solution メニューから Solution Settings... を選択する。
Solution Settings (solution1) ダイアログが開く。
config_interface を展開して、m_axi_addr64 の Value のチェックボックスのチェックを外した。
一旦、Vitis HLS 2020.2 で C コードの合成を行った。
Estimated が 9.007 ns で Slack がマイナスになってしまったが、合成することができた。
Vitis HLS 2020.2 を落として、Vitis HLS 2021.2 を起動して、 xf_rgbirbayer プロジェクトを読み込んだ。
C コードの合成を行ったところ、エラーが発生した。
エラー内容を示す。
ERROR: [SYNCHK 200-61] /media/masaaki/Ubuntu_Disk/Xilinx_github/Vitis_Libraries/vision/L1/include/common/xf_utility.hpp:66: unsupported memory access on variable 'tmp_buf' which is (or contains) an array with unknown size at compile time.
Vitis HLS 2021.2 で C コードの合成をすることができなかった。。。
2022年01月14日 04:32 |
Vitis_Vision
| トラックバック:0
| コメント:0
”
Vitis HLS 2021.2 で Vitis Vision Library を使用する2(dilation 編 2) ”の続き。
Vitis HLS 2021.2 で dilation を実装してみることにしたということで、前回は、xf_dilation プロジェクトで C シミュレーション、C コードの合成を行ったが、C コードの合成でエラーになってしまった。しかし、Vitis HLS 2020.2 でプロジェクトを作成してから、そのプロジェクトを Vitis HLS 2021.2 で使用すれば C コードの合成が成功した。今回は、残りの C/RTL 協調シミュレーションと Export RTL , Implementation を行った。
C/RTL 協調シミュレーションを行った。結果を示す。
Latency は 17834 クロックだった。
C/RTL 協調シミュレーションの波形を示す。
全体波形から。
拡大する。
AXI4 Master Read はバーストしているが、AXI4 Master Write はバースト設定にはなっているが、転送間の間が空いている。
Export RTL を行った。
solution1/impl に export.zip が生成された。
Implementation を行った。
結果を示す。
Timing Met している。
CP achieved post-implementation は 8.314 ns だった。問題無さそうだ。
2022年01月13日 05:17 |
Vitis_Vision
| トラックバック:0
| コメント:0
”
Vitis HLS 2021.2 で Vitis Vision Library を使用する1(dilation 編 1) ”の続き。
Vitis HLS 2021.2 で dilation を実装してみることにしたということで、前回は、Vitis_Libraries/vision/L1/examples/dilation を Vitis HLS 2021.2 で xf_dilation プロジェクトを作成した。今回は、xf_dilation プロジェクトで C シミュレーション、C コードの合成を行ったが、C コードの合成でエラーになってしまった。
OS は Ubuntu 18.04 LTS を使用している。
xf_dilation プロジェクトで C シミュレーションを行った。
C シミュレーションは成功した。
しかし、 dilation/solution1/csim/build ディレクトリの hw_out.jpg を見ると出力がおかしいというのは、前回の”
Vitis HLS 2020.2 で Vitis Vision Library を使用する2(dilation 編 2) ”と同じ結果だった。
C シミュレーションを行ったが、エラーになってしまった。
エラー内容は
ERROR: [HLS 207-812] 'common/xf_common.hpp' file not found (xf_dilation/xf_dilation_config.h:22:10)
だった。
Vitis Vision Library L1 の include ディレクトリは指定してあるのだが。。。
なお、Vitis HLS 2021.1 でも xf_dilation プロジェクトを作成して、C コードの合成を行っても同様なエラーが発生した。
Vitis HLS 2020.2 で、xf_dilation プロジェクトを作成して、C コードの合成を行うと成功した。
それから、不思議なことに、Vitis HLS 2020.2 で xf_dilation_202 プロジェクトを作成し、Vitis HLS 2021.2 で開いて、 C コードの合成を行うと成功した???
この結果からすると、Vitis Vision Library L1 を Vitis HLS 2021.X で C コードを合成する時にエラーがでるというバグがあって、それは、プロジェクト作成時に GUI が Synthesis の時の include パスを正常に反映できていないというバグなんじゃないだろうか?
とりあえず Vitis HLS 2021.2 の xf_dilation_202 プロジェクトの合成結果を示す。
2022年01月12日 04:40 |
Vitis HLS
| トラックバック:0
| コメント:0
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 Vision Library を使用する時の Vitis HLS 2020.2 の設定方法(dilation 編 1) ”を見て、xf_dilation プロジェクトを Vitis HLS 2021.2 で作成しよう。
Vitis HLS 2021.2 で ZYBO Z7-20 用の xf_dilation プロジェクトを作成した。
Vitis Libraries を もう一度、git clone した。
git clone https://github.com/Xilinx/Vitis_Libraries.git Vitis HLS 2021.2 で xf_dilation プロジェクトを作成した。
Vitis_Libraries/vision/L1/examples/dilation ディレクトリの 3 つのファイル
xf_dilation_accel.cpp xf_dilation_config.h xf_dilation_tb.cpp
を Vitis HLS の dilation プロジェクトのディレクトリにコピーした。
Vitis_Libraries/vision/L1/examples/dilation/build ディレクトリの
xf_config_params.h
も Vitis HLS の dilation プロジェクトのディレクトリにコピーした。
Vitis HLS の Explorer で Source に xf_dilation_accel.cpp を Test Bench に xf_dilation_tb.cpp を登録した。
Vitis HLS 2021.2 の Project メニューから Project Settings... を選択して、設定を行う。
Project Settings (dilation) ダイアログが開く。
左のウインドウで Simulation をクリックする。
xf_dilation_tb.cpp の CFLAGS を設定する。(設定方法は、Edit CFLAGS... ボタンをクリックする)
xf_dilation_tb.cpp の CFLAGS に
-I/media/masaaki/Ubuntu_Disk/Xilinx_github/Vitis_Libraries/vision/L1/include -std=c++0x -I/usr/local/include
を設定した。
Linker Flags に
-L/usr/local/lib -lopencv_core -lopencv_imgcodecs -lopencv_imgproc
を設定した。
Input Arguments に
/media/masaaki/Ubuntu_Disk/Xilinx_github/Vitis_Libraries/vision/data/128x128.png
を指定した。
Project Settings (dilation) ダイアログの左のウインドウで Synthesis をクリックし、xf_dilation_accel.cpp の CFLAGS を設定する。(設定方法は、Edit CFLAGS... ボタンをクリックする)
-I/media/masaaki/Ubuntu_Disk/Xilinx_github/Vitis_Libraries/vision/L1/include -std=c++0x
を設定した。
最後に ZYBO Z7-20 を使用するので、64 ビットアドレスの DMA を禁止して、 32 ビットアドレスの DMA にする。
Vitis HLS の Solution メニューから Solution Settings... を選択する。
Solution Settings (solution1) ダイアログが開く。
config_interface を展開して、m_axi_addr64 の Value のチェックボックスのチェックを外した。
2022年01月11日 04:53 |
Vitis_Vision
| トラックバック:0
| コメント:0