FPGAの部屋

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。ご利用ください。 http://marsee101.web.fc2.com/index.html

カテゴリ: reVISION, xfOpenCV

ZYBO Z7-20 に xfOpenCV の median フィルタを実装する1(Vivado HLS 編)”の続き。

以前、xfOpenCV のサンプルとして Vivado HLS 2019.2 で medianblur を実装したが、それを ZYBO Z7-20 に実装してみようということで、前回は、Vivado HLS 2019.2 で medianblur を再度 IP にした。今回は、その IP を使用して、Vivado 2019.2 でプロジェクトを作成して、ブロックデザインを作成し、論理合成、インプリメンテーション、ビットストリームの生成を行う。 XSA ファイルを生成して、Vitis 2019.2 を立ち上げて、プラットフォームとアプリケーション・プロジェクトを作成し、ZYBO Z7-20 で実機検証を行う。

Vivado 2019.2 で median_filter_axis プロジェクトを作成した。
7fb948bc.png


BMDispCaL , DMA2axis2st , axis2DMA2st , xf_median_blur(これは、Vivado HLS 2019.2 で作成した medianblur IP)をコピーした。
80526a4c.png


IP Catalog に先程の IP を登録した。
3ea8692d.png


ブロックデザインを作成して、IP を追加して、配線を行った。
fbc53e66.png


Address Editor を示す。
3334ce6d.png


ブロックデザインの HDL Wrapper を作成した。
3779acc8.png


制約ファイルの median_filter_axis.xdc を作成した。
f118de36.png


論理合成、インプリメンテーション、ビットストリームの生成を行った。結果を示す。
99490535.png


XSA ファイルをエクスポートした。
00eb5db5.png


Vivado から Vitis 2019.2 を立ち上げて、プラットフォームとアプリケーション・プロジェクトを作成した。
アプリケーション・ソフトウェアを作成した。
画像のピクセルをヘッダファイルの配列に書いてある bmp_data.h と、その配列を読み込んで、RGB のデータに変換する median_filter_axis.c をプロジェクトに入れた。この RGB の配置については、”xfOpenCV の cvMat2AXIvideoxf() の AXI4-Stream の RGB バイト割当”を参照した。
b9c7d6ba.png


Ubuntu 18.04 LTS から gtkterm を起動して、設定を行った。
Vitis からアプリケーション・ソフトウェアを Run すると Zynq をコンフィギュレーションして、アプリケーションを起動した。
gtkterm にプロンプトが表示された。
35eebd28.png


デフォルトでは、ノイズの乗った画像が ZYBO Z7-20 の HDMI OUT から出力されている。
a645e9ab.jpg


1 をキーボードから入力するとメディアン・フィルタ処理されて、ノイズが除かれた画像が表示された。
5ecf50c7.jpg


FPGAの部屋 プレゼンツ 「 Zynq&HLSハンズオンセミナー応用編」”では、前回の記事と今回の記事の内容を私と一緒に実装していきます。皆さんもよろしければご参加ください。オンラインなので、全国何処からでもご参加いただけます。
もし、Vivado HLS や Zynq に慣れていないとう方は”FPGAの部屋 プレゼンツ 「 Zynq&HLSハンズオンセミナー基礎編」”からご参加ください。(ステマです。。。)

Vitis HLS 2020.2 の Vitis Vision Library の medianblur をやっていたが、今の所、どうしても AXI4-Stream インターフェースにすることができなかった。また、Mat.data のアドレスを与える方法も、そのデータフォーマットがよく分からずにハードウェアすることができていない。(ツィッターで教えてもらったので、うまく行きそうだ。ありがとうございます。)
そこで、以前やってみた AXI4-Stream 版 xfOpenCV の medianblur を ZYBO Z7-20 に実装してみよう。

これは、筑波大学の Vivado HLS セミナでやっている一部でもあり、”FPGAの部屋 プレゼンツ 「 Zynq&HLSハンズオンセミナー応用編」”で行う内容の一部でもある。ただし、HDLab では、 ZYBO Z7-10 で行う様になっているが、ZYBO Z7-20 でも同様に行うことができる。オンラインで行うので全国何処からでもご参加いただけます。もしよろしければ、”FPGAの部屋 プレゼンツ 「 Zynq&HLSハンズオンセミナー応用編」”にご参加ください。(ステマです。)

Vivado HLS 2019.2 で xfOpenCV のAXI4-Stream 版 medianblur をやってみる1
Vivado HLS 2019.2 で xfOpenCV のAXI4-Stream 版 medianblur をやってみる2
Vivado HLS 2019.2 で xfOpenCV のAXI4-Stream 版 medianblur をやってみる3
の記事の xfOpenCV の medianblur を元にやってみよう。

すでに、 xfOpenCV の xf::AXIvideo2xfMat() による AXI4-Stream の RGB のバイト・フィールドは、”xfOpenCV の cvMat2AXIvideoxf() の AXI4-Stream の RGB バイト割当”によって、分かっているので、そのAXI4-Stream の RGB フォーマットに合わせればよい。

Vivado HLS 2019.2 の xfOpenCV の medianblur プロジェクトを示す。
61969bf4.png


medianblur プロジェクトにノイズを拡散させた 800 x 600 ピクセルの test2.jpg 画像ファイルを追加した。
5fb21407.png


Solution メニューから Solution Settings... を選択して、 Clock Period を 10 ns に、Part Selection を Zybo Z7-20 (xc7z020clg400-1) に設定した。
eb27aece.png


Project メニューから Project Settings... を選択して、 Simulation を選択し、 Input Arguments を test2.jpg に変更した。
6215b206.png


Vivado HLS 2019.2 の medianblur プロジェクトの Explorer で Test Bench を右クリックし右クリックメニューから Add Files... を選択して test2.jpg を加えた。
cce05ab7.png


C シミュレーションを実行した。
9d9e2bf7.png


medianblur/solution1/csim/build ディレクトリを示す。
hls.jpg が生成されている。
acbafb37.png


元画像ファイルの test2.jpg を示す。
ノイズが重畳されているのが分かると思う。
507bd0c9.jpg


そして、この hls.jpg がハードウェアになる予定のメディアン・フィルタ処理した画像となる。ノイズが消えている。
28152be3.jpg


C コードの合成結果を示す。これは以前と変化なしだ。
0f87a1fb.png


C/RTL 協調シミュレーションを行う。
Co-simulation Dialog でInput Arguments に test2.jpg を入力した。
medianblur_xfopencv_11_210109.png

結果を示す。
Latency は 488452 クロックだった。総ピクセル数は 480000 ピクセルなので、 488452 / 480000 ≒ 1.02 クロック/ピクセルだった。
413e2c7f.png


Export RTL を行った。
最初は Timing met しなかったが、 Solution メニューから Solution Settings... を選択して、Synthesis Settings の Uncertainty を 3 ns に設定したら、Timing met した。
medianblur_xfopencv_13_210109.png

Vivado HLS 2019.2 で xfOpenCV のAXI4-Stream 版 medianblur をやってみる1
Vivado HLS 2019.2 で xfOpenCV のAXI4-Stream 版 medianblur をやってみる2
Vivado HLS 2019.2 で xfOpenCV のAXI4-Stream 版 medianblur をやってみる3
この 3 つの記事でやってきた AXI4-Stream インターフェース版のメディアン・フィルタを自分の環境で使用したい。テストベンチでは cvMat2AXIvideoxf() で cv::Mat を AXI4-Stream に変換しているが、RGB の 8 ビットのバイトは 32 ビット幅でどのバイト・フィールドにあるのかを確かめる。

それを確かめるために、 im0.png を作成した。
im0.png は上 1/3 が赤、真ん中 1/3 が緑、下 1/3 が青の画像だ。これで、Vivado HLS 2019.2 で C/RTL 協調シミュレーションを行うと RGB のバイト位置が分かるはずだ。
c39b3a3d.png


Vivado HLS 2019.2 で xfOpenCV のAXI4-Stream 版 medianblur をやってみる2”の medianblur プロジェクトで im0.png を使用して、 C/RTL 協調シミュレーションを行った。
f95ee240.png


C/RTL 協調シミュレーションの内の入力の AXI4-Stream 波形を示す。
492fc409.png


これで、

24 ビット 〜 16 ビットが赤
15 ビット 〜 8 ビットが緑
7 ビット 〜 0 ビットが青

ということが分かった。

Vitis Vision Library で AXI4-Stream 入出力の medianblur を実装する1”で Vitis Vision Library で AXI4-Stream 入出力の medianblur を実装したのだが、C シミュレーションはエラーで実行できなかった。
それでは、 xfOpenCV を Vitis HLS 2020.2 では使えないのだろうか? ということでやってみた。

Vivado HLS 2019.2 で xfOpenCV のAXI4-Stream 版 medianblur をやってみる1”のコードをそのまま使用して、”Vivado HLS 2019.2 で xfOpenCV の medianblur をやってみる1”の Vivado HLS の設定をそのまま使用するのだが、多少変更する必要がある。

Vitis HLS 2020.2 で xfopencv ディレクトリの下に medainblur プロジェクトを作成した。
Vitis Vision Library で AXI4-Stream 入出力の medianblur を実装する1”と同じファイルを持ってきて、Vitis HLS の Source に xf_median_blur.cpp を Test Bench に im0.jpg と xf_median_blur_tb.cpp を登録した。
fd3158e8.png


Vitis HLS 2020.2 の Project メニューから Project Settings... を選択すると、Project Settings (medianblur) ダイアログが開く。
Project Settings (medianblur) ダイアログで、Simulation をクリックして、xf_median_blur_tb.cpp の CFLAGS に

-D__SDSVHLS__ -I/home/masaaki/xfopencv/include --std=c++0x -I/usr/local/include

を入力した。これは、Vitis HLS 2020.2 は OpenCV へのリンクが無いので、自分でインストールした OpenCV 3.4.9 の include へのパスを追加した。
Linker Flags に

-L/usr/local/lib -lopencv_core -lopencv_imgcodecs -lopencv_imgproc

を入力した。
Input Arguments に

im0.jpg

を設定した。
a8abac6d.png


Project Settings (medianblur) ダイアログで、Synthesis をクリックして、

-D__SDSVHLS__ -I/home/masaaki/xfopencv/include --std=c++0x

を設定した。
f5845ecf.png


これで準備が整った。
Project メニューから Run Simulation を選択して、 C シミュレーションをスタートしたが、エラーで終了した。
8aecd97a.png


エラー内容を示す。

INFO: [SIM 2] *************** CSIM start ***************
INFO: [SIM 4] CSIM will launch GCC as the compiler.
   Compiling ../../../xf_median_blur_tb.cpp in debug mode
csim.mk:73: recipe for target 'obj/xf_median_blur_tb.o' failed
In file included from ../../../../../../../../../home/masaaki/xfopencv/include/common/xf_axi_io.h:33:0,
                 from ../../../../../../../../../home/masaaki/xfopencv/include/common/xf_infra.h:43,
                 from ../../../xf_median_blur_tb.cpp:11:
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis_HLS/2020.2/include/utils/x_hls_utils.h:243:40: 警告: ‘hls_preserve’ 属性指示が無視されました [-Wattributes]
 __attribute__((hls_preserve)) T reg(T d)
                                        ^
In file included from ../../../xf_median_blur_tb.cpp:12:0:
../../../../../../../../../home/masaaki/xfopencv/include/common/xf_axi.h: In instantiation of ‘void cvMat2AXIvideoxf(cv::Mat&, hls::stream<ap_axiu<W, 1, 1, 1> >&) [with int NPC = 1; int W = 32]’:
../../../xf_median_blur_tb.cpp:63:38:   required from here
../../../../../../../../../home/masaaki/xfopencv/include/common/xf_axi.h:144:18: エラー: conversion from ‘cv::Mat’ to non-scalar type ‘IplImage {aka _IplImage}’ requested
   IplImage img = cv_mat;
                  ^~~~~~
../../../../../../../../../home/masaaki/xfopencv/include/common/xf_axi.h: In instantiation of ‘void AXIvideo2cvMatxf(hls::stream<ap_axiu<W, 1, 1, 1> >&, cv::Mat&) [with int NPC = 1; int W = 32]’:
../../../xf_median_blur_tb.cpp:65:39:   required from here
../../../../../../../../../home/masaaki/xfopencv/include/common/xf_axi.h:259:17: エラー: conversion from ‘cv::Mat’ to non-scalar type ‘IplImage {aka _IplImage}’ requested
  IplImage img = cv_mat;
                 ^~~~~~
make: *** [obj/xf_median_blur_tb.o] Error 1
ERR: [SIM 100] 'csim_design' failed: compilation error(s).
INFO: [SIM 3] *************** CSIM finish ***************


エラー内容は”conversion from ‘cv::Mat’ to non-scalar type ‘IplImage {aka _IplImage}’”ということだ。
これは、”Vitis Vision Library で AXI4-Stream 入出力の medianblur を実装する1”と同じエラーだ。

Vivado HLS 2019.2 で xfOpenCV のAXI4-Stream 版 medianblur をやってみる1”の続き。

前回は、新たに作り直したAXI4-Steram 版の medianblur のソースコードを貼った。今回は、カラー画像出力と白黒画像出力の C シミュレーションを行った。

まずは、”Vivado HLS 2019.2 で xfOpenCV のAXI4-Stream 版 medianblur をやってみる1”のソースコードそのままのカラー画像出力の場合を示す。こちらは、xf::Mat の画像のタイプが XF_8UC3 で AXI4-Stream のデータ幅が 32 ビットとなっている。(hls::stream<ap_axiu<32,1,1,1> >)
C シミュレーションを行った。結果を示す。
4cd9f8d0.png


medianblur/solution1/csim/build ディレクトリを示す。
d4bcd772.png


これが元画像の im0.jpg で、xfopencv/examples/medianblur/data/im0.jpg を、Pinta ツールのサイズ変換で 800 x 450 ピクセルに縮小して、ノイズを加えた画像である。
27cded97.jpg


これを、ハードウェアでメディアンフィルタをかけた画像を示す。(今回は、C シミュレーションだが)
7613d6fa.jpg


ノイズが低減されている。

次に、OpenCV の cv::medianBlur() を使ってメディアンフィルタをかけた画像を示す。
b7ac32df.jpg


こちらも同じようにノイズが低減されている。

次に、白黒画像出力に設定変更して C シミュレーションを行った。define の RGB を 0 にして、GRAY を 1 にした。
55d3f042.png


こちらは、xf::Mat の画像のタイプが XF_8UC1 で AXI4-Stream のデータ幅が 8 ビットとなっている。(hls::stream<ap_axiu<8,1,1,1> >)

C シミュレーションを行った。結果を示す。
1f90b89c.png


medianblur/solution1/csim/build ディレクトリを示す。
0e201328.png


ハードウェアでメディアンフィルタをかけた画像を示す。(今回は、C シミュレーションだが)
4c5d01fe.jpg


OpenCV の cv::medianBlur() を使ってメディアンフィルタをかけた画像を示す。
f8d82585.jpg


うまく行って良かった。

↑このページのトップヘ