”
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 でプロジェクトを開いて、作業をしていく。
ポールスミス ステンカラーコート M黒髪 かつら コメント不要 黒色 簡単 ショート 耐熱 黒袋帯 正絹 健勝苑 招寿箔スナイデル 2022福袋 ワンピースアンファー スカルプD ボーテ ピュアフリーボリュームマスカラ ブラック限定価格 セキセイインコの救急箱100問 100答ワンピース 3点セット グラマラスガーデン GLAMOROUS GARDENDEAN DELUCA ディーンデルーカ 日傘 折り畳み傘
あんスタ 青葉つむぎ 缶バッジ 2点 セット遙かなる時空の中で 下敷き まとめ売り寶瓶黒朱砂天珠ブレスレット パワーストーンブレスレット 天然石ブレスレット袋帯 正絹 健勝苑 招寿箔【⭐︎値下げ⭐︎】ハンドメイドリング(猫)還暦祝い赤いちゃんちゃんこBCBG シフォンのふんわりプリーツスカート限定価格 セキセイインコの救急箱100問 100答
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