FC2カウンター FPGAの部屋 reVISION, xfOpenCV
fc2ブログ

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

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

ZYBO Z7-20 に xfOpenCV の median フィルタを実装する2(Vivado + Vitis 編)

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 プロジェクトを作成した。
medianblur_xfopencv_14_210109.png

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

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

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

Address Editor を示す。
medianblur_xfopencv_18_210109.png

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

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

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

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

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

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

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

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

FPGAの部屋 プレゼンツ 「 Zynq&HLSハンズオンセミナー応用編」”では、前回の記事と今回の記事の内容を私と一緒に実装していきます。皆さんもよろしければご参加ください。オンラインなので、全国何処からでもご参加いただけます。
もし、Vivado HLS や Zynq に慣れていないとう方は”FPGAの部屋 プレゼンツ 「 Zynq&HLSハンズオンセミナー基礎編」”からご参加ください。(ステマです。。。)
  1. 2021年01月10日 06:34 |
  2. reVISION, xfOpenCV
  3. | トラックバック:0
  4. | コメント:0

ZYBO Z7-20 に xfOpenCV の median フィルタを実装する1(Vivado 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 プロジェクトを示す。
medianblur_xfopencv_1_210109.png

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

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

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

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

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

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

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

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

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

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

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

Export RTL を行った。
最初は Timing met しなかったが、 Solution メニューから Solution Settings... を選択して、Synthesis Settings の Uncertainty を 3 ns に設定したら、Timing met した。
medianblur_xfopencv_13_210109.png
  1. 2021年01月09日 17:02 |
  2. reVISION, xfOpenCV
  3. | トラックバック:0
  4. | コメント:0

xfOpenCV の cvMat2AXIvideoxf() の AXI4-Stream の RGB バイト割当

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 のバイト位置が分かるはずだ。
Vitis_Vision_Library4Vitis_HLS_51_210105.png

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

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

これで、

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

ということが分かった。
  1. 2021年01月05日 20:55 |
  2. reVISION, xfOpenCV
  3. | トラックバック:0
  4. | コメント:0

Vitis HLS 2020.2 で xfOpenCV の medianblur をやってみよう

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 を登録した。
Vitis_Vision_Library4Vitis_HLS_47_210102.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

を設定した。
Vitis_Vision_Library4Vitis_HLS_48_210102.png

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

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

を設定した。
Vitis_Vision_Library4Vitis_HLS_49_210102.png

これで準備が整った。
Project メニューから Run Simulation を選択して、 C シミュレーションをスタートしたが、エラーで終了した。
Vitis_Vision_Library4Vitis_HLS_50_210102.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”と同じエラーだ。
  1. 2021年01月02日 05:36 |
  2. reVISION, xfOpenCV
  3. | トラックバック:0
  4. | コメント:0

Vivado HLS 2019.2 で xfOpenCV のAXI4-Stream 版 medianblur をやってみる2

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 シミュレーションを行った。結果を示す。
xfOpenCV_91_200310.png

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

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

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

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

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

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

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

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

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

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

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

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

うまく行って良かった。
  1. 2020年03月12日 04:33 |
  2. reVISION, xfOpenCV
  3. | トラックバック:0
  4. | コメント:0

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

Vivado HLS 2019.2 で xfOpenCV の medianblur をやってみる1”で動いていた AXI4-Stream 版 medianblur が動かなくなったと書いたが、これは、画像の大きさを指定するところで、height と width を取り違えていたからだった。4k2k 画像から HD 画像に変更しようとして、height と width を間違ってしまっていたのだった。orz

新たに作り直したAXI4-Steram 版の medianblur を紹介する。だいぶ自分の書き方になってきたのだが、xf_headers.h は Xilinx 社のソースコードをそのまま使用している。
なお、白黒画像とカラー画像を define で切り替えるようにしてある。

最初に 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

#ifndef __XF_MEDIAN_BLUR_H__
#define __XF_MEDIAN_BLUR_H__

#include "hls_stream.h"
#include "ap_int.h"
#include "common/xf_common.h"
#include "imgproc/xf_median_blur.hpp"
#include "common/xf_axi_sdata.h"

#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 を貼っておく。
(2020/03/12:修正) img_height と img_width を AXI4-Lite Slave に変更した。

// 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

#include "xf_median_blur.h"
#include "common/xf_infra.h"

void median_blur_accel(xf::Mat<TYPE, HEIGHT, WIDTH, NPxPC> &_src, xf::Mat<TYPE, HEIGHT, WIDTH, NPxPC> &_dst)
{
    xf::medianBlur <WINDOW_SIZE, XF_BORDER_REPLICATE, TYPE, HEIGHT, WIDTH,  NPxPC> (_src, _dst);
}

void xf_median_blur(AXI_STREAM& _src, AXI_STREAM& _dst, int img_height, int img_width){
#pragma HLS INTERFACE s_axilite port=img_width
#pragma HLS INTERFACE s_axilite port=img_height
#pragma HLS INTERFACE s_axilite port=return
#pragma HLS INTERFACE axis register both  port=_src
#pragma HLS INTERFACE axis register both  port=_dst

     xf::Mat<TYPE, HEIGHT, WIDTH, NPxPC> img_in(img_height, img_width);
     xf::Mat<TYPE, HEIGHT, WIDTH, NPxPC> img_out(img_height, img_width);

#pragma HLS stream variable=img_in.data dim=1 depth=16
#pragma HLS stream variable=img_out.data dim=1 depth=16
#pragma HLS dataflow

    xf::AXIvideo2xfMat(_src, img_in);

    median_blur_accel(img_in, img_out);

    xf::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

#include "xf_headers.h"
#include "xf_median_blur.h"
#include "common/xf_infra.h"
#include "common/xf_axi.h"

void xf_median_blur(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;

    cvMat2AXIvideoxf<NPxPC>(in_img, _src);
    xf_median_blur(_src, _dst, img_height, img_width);
    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::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;
}


Vivado HLS 2019.2 で medianblur プロジェクトを作成した。
xfOpenCV_90_200310.png

Vivado HLS 2019.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

を設定した。
また、Input Arguments に

im0.jpg

を設定した。

同様に、Project Settings (medianblur) ダイアログで、Synthesis をクリックして、 xf_median_blur.cpp の CFLAGS に

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

を設定した。

最後に Solution メニューの Solution Settings... を選択して、Solution Settings (solution1) ダイアログが表示される。 Cosimulation をクリックして、Input Arguments に

im0.jpg

を設定した。

im0.jpg は”Vivado HLS 2019.2 で xfOpenCV の medianblur をやってみる1”と同じもので、ノイズを加えてあるカラー画像となっている。これは、xfopencv/examples/medianblur/data/im0.jpg を、Pinta ツールのサイズ変換で 800 x 450 ピクセルに縮小して、ノイズを加えた画像である。
  1. 2020年03月11日 04:23 |
  2. reVISION, xfOpenCV
  3. | トラックバック:0
  4. | コメント:0

Vivado HLS 2019.2 で xfOpenCV の medianblur をやってみる2

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

前回は、medianblur の Mat 画像版というか、xfOpenCV の medianblur サンプルそのままをやってみようということで、C シミュレーションを行って、ノイズ除去することができた。今回は、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行う。

C コードの合成を行った。
xfOpenCV_86_200310.png

Latency の max は 8339545 クロックだった。画像の大きさは、3840 x 2160 ピクセルの 4k 画像なので、8294400 ピクセルとなる。8339545 クロック / 8294400 ピクセル ≒ 1.005 クロック / ピクセルだったので、性能的には問題ない。

Instance をクリックして Loop の値を表示できるところまで遡って見た。
xfOpenCV_87_200310.png

次に C/RTL 協調シミュレーションを行ったところエラーになった。
xfOpenCV_88_200310.png

エラーメッセージを貼っておく。

ERROR: System recieved a signal named SIGSEGV and the program has to stop immediately!
This signal was generated when a program tries to read or write outside the memory that is allocated for it, or to write memory that can only be read.
Possible cause of this problem may be: 1) the depth setting of pointer type argument is much larger than it needed; 2)insufficient depth of array argument; 3)null pointer etc.
Current execution stopped during CodeState = DUMP_INPUTS.
You can search CodeState variable name in apatb*.cpp file under ./sim/wrapc dir to locate the position.


ERROR: [COSIM 212-360] Aborting co-simulation: C TB simulation failed.
ERROR: [COSIM 212-320] C TB testing failed, stop generating test vectors. Please check C TB or re-run cosim.
ERROR: [COSIM 212-5] *** C/RTL co-simulation file generation failed. ***
ERROR: [COSIM 212-4] *** C/RTL co-simulation finished: FAIL ***
command 'ap_source' returned error code


Export RTL を行った。
xfOpenCV_89_200310.png

CP achieved post-implementation も 3.775 ns なので、問題無さそうだ。

次には、うまく行った AXI4-Stream 版の medianblur を書いておく。
  1. 2020年03月10日 04:46 |
  2. reVISION, xfOpenCV
  3. | トラックバック:0
  4. | コメント:0
»