FC2カウンター FPGAの部屋 Vivado HLS
FC2ブログ

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

FPGAの部屋

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

Windows 10 の Vivado HLS 2019.2 で mnist_nn プロジェクトを C シミュレーションしたときのエラー

Windows 10 の Vivado HLS 2019.2 で mnist_nn プロジェクトを C シミュレーションしたときに謎のエラーが発生する。トラブルシューティングしてみたので、その顛末を書いておく。

MNIST用 2 層の全結合層を持ったニューラルネットワークの Vivado HLS プロジェクトが mnist_nn プロジェクトだ。それについては、”「ゼロから作るDeep Learning」の2層ニューラルネットワークのハードウェア化4(Vivado HLS)”を参照のこと。

「ゼロから作るDeep Learning」の2層ニューラルネットワークのハードウェア化4(Vivado HLS)”では、Windows 版の Vivado HLS 2017.1 を使用して、mnist_nn プロジェクトで C シミュレーションを行っていた。

Vivado HLS 2019.2 でも mnist_nn プロジェクトを作成して、C シミュレーションを行ったが、エラーになってしまった。
Win_Vivado_HLS_192_1_200517.png

C シミュレーションのログを示すが、何もエラーについて情報が無い。

C:/Xilinx/Vivado/2019.2/bin/vivado_hls.bat C:/Users/masaaki/Documents/Vivado_HLS/HDLab/mnist_nn/solution1/csim.tcl
INFO: [HLS 200-10] Running 'C:/Xilinx/Vivado/2019.2/bin/unwrapped/win64.o/vivado_hls.exe'
INFO: [HLS 200-10] For user 'masaaki' on host 'marsee-lenovo' (Windows NT_amd64 version 6.2) on Sun May 17 05:46:41 +0900 2020
INFO: [HLS 200-10] In directory 'C:/Users/masaaki/Documents/Vivado_HLS/HDLab'
Sourcing Tcl script 'C:/Users/masaaki/Documents/Vivado_HLS/HDLab/mnist_nn/solution1/csim.tcl'
INFO: [HLS 200-10] Opening project 'C:/Users/masaaki/Documents/Vivado_HLS/HDLab/mnist_nn'.
INFO: [HLS 200-10] Opening solution 'C:/Users/masaaki/Documents/Vivado_HLS/HDLab/mnist_nn/solution1'.
INFO: [SYN 201-201] Setting up clock 'default' with a period of 10ns.
INFO: [SYN 201-201] Setting up clock 'default' with an uncertainty of 1.25ns.
INFO: [HLS 200-10] Setting target device to 'xc7z010-clg400-1'
INFO: [HLS 200-435] Setting 'config_sdx -target' configuration: config_export -vivado_optimization_level=2
INFO: [HLS 200-435] Setting 'config_sdx -target' configuration: set_clock_uncertainty default
INFO: [SIM 211-2] *************** CSIM start ***************
INFO: [SIM 211-4] CSIM will launch GCC as the compiler.
   Compiling ../../../mnist_nn_tb.cpp in debug mode
csim.mk:74: recipe for target 'obj/mnist_nn_tb.o' failed
In file included from C:/Xilinx/Vivado/2019.2/include/floating_point_v7_0_bitacc_cmodel.h:143:0,
                 from C:/Xilinx/Vivado/2019.2/include/hls_fpo.h:186,
                 from C:/Xilinx/Vivado/2019.2/include/hls_half.h:44,
                 from C:/Xilinx/Vivado/2019.2/include/etc/ap_private.h:90,
                 from C:/Xilinx/Vivado/2019.2/include/ap_common.h:641,
                 from C:/Xilinx/Vivado/2019.2/include/ap_fixed.h:54,
                 from ../../../mnist_nn_tb.cpp:6:
C:/Xilinx/Vivado/2019.2/include/gmp.h:62:0: warning: "__GMP_LIBGMP_DLL" redefined
 #define __GMP_LIBGMP_DLL  0
 
In file included from C:/Xilinx/Vivado/2019.2/include/hls_fpo.h:186:0,
                 from C:/Xilinx/Vivado/2019.2/include/hls_half.h:44,
                 from C:/Xilinx/Vivado/2019.2/include/etc/ap_private.h:90,
                 from C:/Xilinx/Vivado/2019.2/include/ap_common.h:641,
                 from C:/Xilinx/Vivado/2019.2/include/ap_fixed.h:54,
                 from ../../../mnist_nn_tb.cpp:6:
C:/Xilinx/Vivado/2019.2/include/floating_point_v7_0_bitacc_cmodel.h:135:0: note: this is the location of the previous definition
 #define __GMP_LIBGMP_DLL 1
 
make: *** [obj/mnist_nn_tb.o] Error 1
ERROR: [SIM 211-100] 'csim_design' failed: compilation error(s).
INFO: [SIM 211-3] *************** CSIM finish ***************
4
    while executing
"source C:/Users/masaaki/Documents/Vivado_HLS/HDLab/mnist_nn/solution1/csim.tcl"
    invoked from within
"hls::main C:/Users/masaaki/Documents/Vivado_HLS/HDLab/mnist_nn/solution1/csim.tcl"
    ("uplevel" body line 1)
    invoked from within
"uplevel 1 hls::main {*}$args"
    (procedure "hls_proc" line 5)
    invoked from within
"hls_proc $argv"
Finished C simulation.


いろいろとやってみたが、なぜエラーになるか? どうしてエラーになったのか分からない?

Vivado HLS 2019.2 で C シミュレーションのエラーが出る前のタスクマネージャーの画面なのだが、どうやら java (TM) Platform SE binary (14) というのが Vivado HLS のソフトウェアのようだ。下のタスクマネージャーは Vivado HLS でエラーが出る直前の画面だ。メモリを 3.4 GB も消費しているので、32 ビット・アプリケーションとしては限界までメモリを消費していて、それでエラーになったのか?
Win_Vivado_HLS_192_2_200517.png

そこで、入力データを 100 個から 10 個に減らした mnist_data_10.h を用意した。
Win_Vivado_HLS_192_3_200517.png

mnist_nn_tb.cpp も mnist_nn_10.h を使用するように変更した。
Win_Vivado_HLS_192_4_200517.png

これで C シミュレーションをしたところ成功した。
Win_Vivado_HLS_192_5_200517.png

java (TM) Platform SE binary (14) の消費メモリも 3.0 GB 程度になっていた。やはり、メモリ消費量が 32 ビット・アプリケーションの限界を超えてしまったので、エラーになったようだ。しかし、Windows 版の Vivado HLS 2019.2 が 32 ビット・アプリケーションなのは何とかならないものなのだろうか?大きなデータを与えることができない。。。

ちなみに、Ubuntu 18.04 LTS の Vivado HLS 2019.2 では、100 個のデータのままで、C シミュレーションが成功する。
Win_Vivado_HLS_192_6_200517.png
  1. 2020年05月17日 06:19 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

Vivado HLS 2019.2 の Encoding の設定機能

Vivado HLS 2019.2 から Encoding 設定機能が付ていたので、その機能を確認してみよう。

今まで、Vivado HLSやVivado はWindows は SHFIT JISコード、Linux は UTF-8 を使用していた。Winidws で作った日本語入りのソースコードを Linux に移行する際には、コードを SHIFT JIS コードから UTF-8 に変換していた。それが、Vivado HLS で対応できるということになればとても嬉しい。

最初に Linux (Ubuntu 18.04)から試してみよう。
Windows で作った SHIFT JIS コードの unsharp_mask_axis.cpp で確かめてみると下の図のように見える。
Vivado_HLS_Encoding_1_200405.png

この文字コードを変更してみよう。
Edit メニューから Set Encoding... を選択する。
Vivado_HLS_Encoding_2_200405.png

Set Encoding ダイアログが表示される。
Default は UTF-8 だが、Other を選択しても SHIFT_JIS が無かった。とりあえず ISO-8859-1 にしてみた。
Vivado_HLS_Encoding_3_200405.png

Vivado_HLS_Encoding_4_200405.png

日本語がトーフになってしまった。
Vivado_HLS_Encoding_5_200405.png

nkf で UTF-8 に変更して、Encodings を UTF-8 に戻したら正常に表示された。
nkf -Lu -w --overwrite *.cpp
nkf -Lu -w --overwrite *.h

Vivado_HLS_Encoding_6_200405.png

さて、Windows 側はどうだろうか?
先ほどと同様に、UTF-8 コードの unsharp_mask_axis.cpp を見ていこう。
Vivado_HLS_Encoding_101_200405.png

このコードは、nkf で SHIFT_JIS から UTF-8 に変換した。
この文字コードを変更してみよう。
Edit メニューから Set Encoding... を選択する。
nkf -Lu -w --overwrite *.cpp
nkf -Lu -w --overwrite *.h

Vivado_HLS_Encoding_106_200405.png

この文字コードを変更してみよう。
Edit メニューから Set Encoding... を選択する。
Vivado_HLS_Encoding_102_200405.png

Set Encoding ダイアログが表示される。
SHIFT_JIS から UTF-8 に変更する。
Vivado_HLS_Encoding_103_200405.png

日本語がおかしい。。。
Vivado_HLS_Encoding_105_200405.png

Vivado HLS 2019.2 の Encoding 設定機能は今のところ使えないようだ。
  1. 2020年04月05日 14:39 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

2020年度版Vivado HLSセミナ資料の項目

2020年度版Vivado HLSセミナ資料の項目です。
筑波大学で院生対象にやりたいと思っていますが、新型コロナウィルス対応でどうなるか、分かりません。遠隔になるかも?
バージョン2017.4 からバージョン 2019.2 に変更しました。また最後に Vivado HLS の xfOpenCV 対応方法の演習を追加しました。2019.2 なのでアプリケーション・ソフトの作成には Vitis を使っています。
総スライド数は xfOpenCV のVivado 部分を除いて(まだ書いてません) 1,320 枚くらいです。

HDLabでもVivado HLS 応用編をやりたいと思って、資料を作っているところです。こちらはより実践的なチューニング方法を書いています。完成したら、皆さんセミナを受けに来てください。よろしくお願いします。

2020年度Vivado HLSセミナ概要
2019年度のVivado HLSの使い方を勉強するセミナを開きます。回数は半日10回とします。今回から初心者編として最初に資料のNo1、No2、No3、No4、No5、No6を実施します。次に応用編としてNo7、No8、No9、No10を実施します。初心者編で十分な方はそこまでとします。応用編では、AXI4 MasterやAXI4-Streamのチューニングの方法や、HLSストリーム、OpenCV対応、任意精度固定小数点データ型、xfOpenCV対応などを実施します。なお資料のURLは別途送ります。このURLや資料はお友達やWebに拡散しないようにお願いします。
Windows版のVivado 2019.2(WebPACKで十分です)をインストールし、ZYBOのボードファイルをノートパソコンにインストールしてください。ただしノートパソコンは2回目から使用します。なお、Vivadoはv2019.2からマシンスペックを要求するようになっています。16GBのメモリを搭載したノートパソコンをご用意ください。
Vivado 2019.2のインストール方法は、“Vivado Design Suite ユーザー ガイド リリース ノート、インストール、および ライセンス UG973 (v2019.2) 2019 年 12 月 17 日”をご覧ください。(https://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx2019_2/ug973-vivado-release-notes-install-license.pdf)登録してダウンロードし、WebPACKをインストールすれば、ライセンス無しの無料で使用できます。WebPACKをインストールするには、マニュアルの37ページの8.で一番上のVivado HL WebPACKのラジオボタンをクリックしてください。
ZYBOのボードファイルのインストール方法については、“Digilent社のFPGAボードのボードファイルの設定方法”をご覧ください。

No9ではLinuxを使用してMicroSDカードをフォーマットして、Linux起動用Micro SDカードを作成します。よって、VirtualBoxかVMwareでUbuntuをインストールしてください。(資料はVirtualBoxで書いてあります)

Class10 8GBのMicro SDカードを1人1枚ご用意ください。必ずClass10 のMicro SDカードをご用意ください。また、ノートパソコンから書き込めるようにMicro SDカードのリーダー・ライターをご用意ください。ノートパソコンに付属の物でも構いません。
Tera Termもインストールしておくようにお願いします。
・Vivado HLS初心者編
    1. 第1回目(2時間程度)No1のフォルダに資料があります。実習はありません
        (ア) Zynqの概要
        (イ) AXI4インターフェース
        (ウ) Vivado HLS(概要)
    2. 第2回目(半日程度)資料-No2フォルダ
        (ア) Vivado HLSセミナ1(Vivado HLSインターフェース編)(ZYBO実機を使用します)
            1 Vivado HLSの基本的に使い方を学習します。簡単な乗算回路のIPを作ります。組み合わせ回路を作ります。
            2 Vivado HLSで作ったIPを使用して、VivadoでIPIを使って乗算回路にしてZYBOで実際に動作させます。
    3. 第3回目(半日程度)資料-No3フォルダ
        (ア) Vivado HLSセミナ2(レジスタの挿入とPIPELINEディレクティブ)
            1 第2回目で作成した乗算回路にレジスタを挿入します。
            2 パイプライン処理の方法を学習します。
            3 Vivado HLSでディスプレイ・コントローラを作ってみます。
    4. 第4回(半日程度)資料-No4フォルダ(ZYBO実機を使用します)
        (ア) Vivado HLSセミナ3(AXI4 Lite Slave編)
            1 乗算回路をAXI4 Lite Slaveインターフェース対応にします。
            2 Vivado HLSで作った乗算回路IPをVivadoのIPインテグレータ―にインスタンスし、ZYBOで実際に動作させます。
    5. 第5回(半日程度)資料-No5フォルダ
        (ア) Vivado HLSセミナ4(AXI4 Master初心者編)
            1 2乗回路(簡単な例)を題材にAXI4 Masterの実装方法を学習します。
            2 Vivado HLSで2乗回路IPを作成し、Vivadoで実装してZYBO実機で2乗結果を確認します(AXI_HPポート使用)。
    6. 第6回(半日程度)資料-No6フォルダ
        (ア) Vivado HLSセミナ5(AXI4 Stream初心者編)
            1 第5回と同じ2乗回路(簡単な例)を題材にAXI4-Streamの実装方法を学習します。
            2 Vivado HLSで2乗回路IPを作成し、DMA IPと組み合わせてVivadoで実装してZYBO実機で2乗結果を確認します(AXI_ACPポート使用)。

・Vivado HLS応用編
    7. 第7回(半日程度)資料-No7フォルダ
        (ア) Vivado HLS勉強会6(AXI4 Masterチューニング編)
            1 ラプラシアンフィルタを題材にAXI4 Masterの実装方法を学習します。
            2 ディレクティブ(指示子)やCの構造による性能の違いを学習します(チューニング方法)。
    8. 第8回(半日程度)資料-No8フォルダ
        (ア) Vivado HLSセミナ7(AXI4 Streamチューニング編)
            1 第5回目のラプラシアンフィルタをAXI4 Streamで実装します。AXI4 Streamは一番性能が出やすくお得です。
            2 AXI4-Streamを使用したラプラシアンフィルタをVivadoで実装して実機確認します(実習)。
    9. 第9回(半日程度)資料-No9フォルダ(ZYBO実機を使用します)
        (ア) Vivado HLSセミナ8(Vivado HLSのIPをLinuxから使用する)
            1 第6回目で作成した2乗回路をLinuxから使用する方法を学習します。
            2 ikwzmさんのスキームを使用したZYBOでDebianを起動できるMicro SDカードを作成します。
            3 ZYBOでDebianを起動して、デバイス・ドライバや環境の設定を行います。
            4 Linuxが起動中に、デバイスツリーをロードして、FPGAのコンフィギュレーションとUIO、UDMABUFのロード、PSのクロック設定を行います。
            5 アプリケーションソフトを使用して、2乗回路をLinuxから使用します。
    10. 第10回(半日程度)資料-No10フォルダ
        (ア) Vivado HLSセミナ9(任意精度固定小数点データ型とVivado HLSのビデオ関数、xfOpenCV)
            1 任意精度固定小数点データ型
                1. いろいろな任意精度固定小数点データ型に対して量子化モード、オーバーフローモードを変更してCシミュレーションし、その違いを実感する。
                2. また、①のCコードの合成を行い、リソース使用量の違いを確認する。
            2 Vivado HLSのビデオ関数
                1. Vivado HLSのOpenCV対応ライブラリについて学習する
                2. Vivado HLSのビデオ関数を使用したSobelフィルタについて実習する。
            3 XfOpenCV
                1. Vivado HLSのxfOpenCVの使用方法について学習する
                2. XfOpenCVを使用したmedianフィルタを実装する
                3. 2.の medianフィルタIPを使用したVivadoのブロックデザインを作成し、ZYBOの実機で動作を確認する

なお、資料は自習ができるように丁寧に書いてあります。勉強会の途中から抜ける、また、途中から参加もOKです。履修した授業は出席するようにしてください。質問は勉強会以外でも随時受け付けます。

なお、My電源タップをもってきて頂けると助かります。電源につないでおかないとノートの電池は持たないと思います。
ノートパソコンにインストールし置いたほうが良いソフトウェア
・SDメモリカードフォーマッター
  1. 2020年04月04日 08:30 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

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

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

前回は、カラー画像出力と白黒画像出力の C シミュレーションを行って、成功した。今回は、カラー画像出力と白黒画像出力それぞれにおいて、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行う。

まずは前回の続きで、C コードの合成を行った。左側が白黒画像出力、右側がカラー画像出力だ。
xfOpenCV_101_200312.pngxfOpenCV_106_200312.png

2 つ共、Latency は同じ max 値で 2094021 クロックだった。最大解像度は 1920 x 1080 = 2073600 ピクセルなので、 2094021 クロック / 2073600 ピクセル ≒ 1.010 クロック / ピクセルだった。性能は問題ない。
リソース使用量は当然ながらカラー画像出力の方が多い。BRAM_18K の使用量も白黒画像出力が 3 個、カラー画像出力が 9 個だった。

C/RTL 協調シミュレーションを行った。結果を示す。上がが白黒画像出力、下がカラー画像出力だ。
xfOpenCV_102_200312.png
xfOpenCV_107_200312.png

どちらも Latency は 366956 クロックだった。使用画像は 800 x 450 ピクセルなので、合計 360000 ピクセル、よって 366956 クロック / 2073600 ピクセル ≒ 1.019 クロック / ピクセルだった。

C/RTL 協調シミュレーションの全体波形を示す。上がが白黒画像出力、下がカラー画像出力だ。
xfOpenCV_103_200312.png
xfOpenCV_108_200312.png

ほとんど同じだが、TDATA が 8 ビットと 32 ビットの違いがある。

C/RTL 協調シミュレーションの波形を拡大してみよう。上がが白黒画像出力、下がカラー画像出力だ。
xfOpenCV_104_200312.png
xfOpenCV_109_200312.png

こちらも同じだ。

最後に、Export RTL を示す。左側が白黒画像出力、右側がカラー画像出力だ。
xfOpenCV_105_200312.pngxfOpenCV_110_200312.png

この結果がそっくり同じということはどういうことだろうか?
C コードの合成の結果は違っていたのに?何かバグっているとしか思えない。
  1. 2020年03月13日 03:59 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

Vivado HLS 2019.2 の HLS Video Library を使用して resize() を実装する4

Vivado HLS 2019.2 の HLS Video Library を使用して resize() を実装する3”の続き。

前回は、HLS Video Library の resize を使用して、800 x 600 ピクセルの画像を 60 x 45 ピクセル、100 x 75 ピクセル、200 x 150 ピクセルに縮小できるかどうか?を C シミュレーションですべてできることを確認した。今回は、60 x 45 ピクセル、200 x 150 ピクセルに縮小した時の C コードの合成、 C/RTL 協調シミュレーション、 Export RTL を行った。

800 x 600 ピクセルの画像を 60 x 45 ピクセルに縮小した場合
C コードの合成を行った。
HLS_Video_Library_32_200306.png

Latency は 503450 クロックだった。これは、 503450 クロック / 480000 ピクセル数 ≒ 1.05 クロック / ピクセルだ。
リソース使用量もそこそこだ。

C/RTL 協調シミュレーションを行った。
HLS_Video_Library_33_200307.png

Latency は 498437 クロックで、合成レポートよりも小さくなっている。

C/RTL 協調シミュレーションの全体波形を示す。
HLS_Video_Library_34_200307.png

outs_TVALID が櫛形になっているのが分かる。

もう少し拡大してみた。
HLS_Video_Library_35_200307.png

outs_TVALID の櫛形の部分が細かいデータ転送が集まっていることが分かる。この塊が画像の 1 行に相当する。

outs_TVALID のデータ転送部分を拡大してみた。
HLS_Video_Library_36_200307.png

やはり、outs_TVALID が櫛形になっているのが分かる。これは、60 / 800 ピクセルで 1 / 13.3333 であるはずだ。

Export RTL の結果を示す。
HLS_Video_Library_37_200307.png

CP achieved post-implementation が 4.085 ns で問題ない。

800 x 600 ピクセルの画像を 200 x 150 ピクセルに縮小した場合
C コードの合成を行った。左が200 x 150 ピクセルに縮小した場合のレポートで、右が 60 x 45 ピクセルに縮小した場合のレポートだ。
HLS_Video_Library_38_200307.pngHLS_Video_Library_32_200306.png

200 x 150 ピクセルに縮小した場合の方が FF と LUT の使用量が僅かに増えている。
Latency は同じだった。

C/RTL 協調シミュレーションを行った。
HLS_Video_Library_39_200307.png

Latency は 502637 クロックで、 60 x 45 ピクセルのときよりも多い。

C/RTL 協調シミュレーションの波形を示す。
HLS_Video_Library_40_200307.png

1 / 13.33333 から 1 / 4 の縮小率になったので、 outs_TVALID の櫛形の間隔が狭い。

拡大してみよう。
HLS_Video_Library_41_200307.png

やはり、outs_TVALID の櫛形の部分が細かいデータ転送が集まっていることが分かる。

outs_TVALID のデータ転送部分を拡大してみた。
HLS_Video_Library_42_200307.png

データ転送は 4 クロックに 1 回であることが分かる。

Export RTL を行った。
HLS_Video_Library_43_200307.png

Export RTL の結果は、 60 x 45 ピクセルに縮小した場合と全く同じだ。。。興味深い。

800 x 600 ピクセルの画像を 200 x 150 ピクセルに縮小した場合で、C コードの合成結果を HLS Video Library と xfOpenCV とで比較してみよう。左が HLS Video Library で、右が xfOpenCV での結果だ。
HLS_Video_Library_38_200307.pngxfOpenCV_73_200302.png

Latency は HLS Video Library が 503450 クロックで、 xfOpenCV が 487696 クロックだった。
リソース使用量の差を表にする。
HLS_Video_Library_44_200307.png

xfOpenCV の方が BRAM_18K を除くと HLS Video Library よりもリソース使用量は少ない。

xfOpenCV と HLS Video Library は適材適所で良いかもしれない。
  1. 2020年03月07日 05:14 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

Vivado HLS 2019.2 の HLS Video Library を使用して resize() を実装する3

Vivado HLS 2019.2 の HLS Video Library を使用して resize() を実装する2”の続き。

前回は、カラー画像の resize をカラー画像から白黒画像への resize に変更した。今回は、いろいろな縮小率で画像が縮小できるか?を C シミュレーションで検証する。

800 x 600 ピクセルの画像を 60 x 45 ピクセルの画像に変換する設定を行った時の C シミュレーションの結果を示す。
HLS_Video_Library_18_200306.png

resize_gray/solution1/csim/build ディレクトリの内容を示す。
問題なく画像が縮小できているようだ。
HLS_Video_Library_19_200306.png

test_straight0.bmp を示す。これが、HLS Video Library で縮小した画像だ。
HLS_Video_Library_20_200306.png

test_straight0_cv.bmp を示す。こっちは OpenCV で縮小した画像だ。
HLS_Video_Library_21_200306.png

同じに見える。

次に、800 x 600 ピクセルの画像を 100 x 75 ピクセルの画像に変換する設定を行った場合の C シミュレーションを行った。
HLS_Video_Library_22_200306.png

C シミュレーションは問題なく終了した。
resize_gray/solution1/csim/build ディレクトリの内容を示す。
問題なく画像が縮小できているようだ。
HLS_Video_Library_23_200306.png

test_straight0.bmp を示す。これが、HLS Video Library で縮小した画像だ。
HLS_Video_Library_24_200306.png

800 x 600 ピクセルの画像を 200 x 150 ピクセルの画像に変換する設定を行った場合の C シミュレーションを行った。
HLS_Video_Library_25_200306.png

C シミュレーションは問題なく終了した。
resize_gray/solution1/csim/build ディレクトリの内容を示す。
問題なく画像が縮小できているようだ。
HLS_Video_Library_26_200306.png

test_straight0.bmp を示す。これが、HLS Video Library で縮小した画像だ。
HLS_Video_Library_27_200306.png

最後に、800 x 600 ピクセルの画像を 40 x 30 ピクセルの画像に変換する設定を行った場合の C シミュレーションを行った。
HLS_Video_Library_28_200306.png

C シミュレーションは問題なく終了した。
resize_gray/solution1/csim/build ディレクトリの内容を示す。
問題なく画像が縮小できているようだ。流石に小さい。
HLS_Video_Library_29_200306.png

test_straight0.bmp を示す。これが、HLS Video Library で縮小した画像だ。
HLS_Video_Library_30_200306.png

あまりにも小さいので、拡大した。
HLS_Video_Library_31_200306.png

基本的な要素は保たれているようだ。白線も見える。

このように、HLS Video Library の resize は xfOpenCV の resize よりも画像を縮小する範囲が広いが、bilinear interpolation のみとなっている。
800 x 600 ピクセルの画像を 60 x 45 ピクセルの画像に変換するという私の要件では、HLS Video Library の resize が一択となる。
  1. 2020年03月06日 05:20 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

Vivado HLS 2019.2 の HLS Video Library を使用して resize() を実装する2

Vivado HLS 2019.2 の HLS Video Library を使用して resize() を実装する1”の続きと言うか修正版。

前回、カラーの画像をカラーで縮小する HLS Video Library の resize のソースコードを貼ったが、”Vivado HLS 2019.2 で xfOpenCV を使用する6(resize 1)”でも、カラーの画像を白黒画像に縮小する resize だったので、今回は、同様に、カラーの画像を白黒画像に縮小する resize のソースコードを貼る。
以前書いたブログの”Vivado HLS で画像のサイズを縮小して白黒変換(resize_gray)”のソースコードそのものなのだが、いろいろな解像度でうまく行くか?を確かめるために、多少変更した。

resize_gray.h を示す。

// resize.h
// 2020/03/04 by marsee

#ifndef __RESIZE_GRAY_H__
#define __RESIZE_GRAY_H__

#include "ap_axi_sdata.h"
#include "hls_video.h"

#define ORG_HEIGHT   600
#define ORG_WIDTH    800

typedef hls::stream<ap_axiu<32,1,1,1> > AXI_STREAM;
typedef hls::Mat<ORG_HEIGHT, ORG_WIDTH, HLS_8UC3> RGB_IMAGE;
typedef hls::Mat<ORG_HEIGHT, ORG_WIDTH, HLS_8UC1> GRAY_IMAGE;

#define RESIZE_HEIGHT 45
#define RESIZE_WIDTH 60

#endif


resize_gray.cpp を示す。

// resize_gray.cpp
// 2017/08/31 by marsee
// 2020/03/04 : Changed source code.
//

#include "resize_gray.h"

int resize_gray(AXI_STREAM& ins, AXI_STREAM& outs){
#pragma HLS INTERFACE axis register both port=outs
#pragma HLS INTERFACE axis register both port=ins
#pragma HLS DATAFLOW
#pragma HLS INTERFACE s_axilite port=return

    RGB_IMAGE org_img(ORG_HEIGHT, ORG_WIDTH);
    GRAY_IMAGE org_img_g(ORG_HEIGHT, ORG_WIDTH);
    GRAY_IMAGE resize_img_g(RESIZE_HEIGHT, RESIZE_WIDTH);
    RGB_IMAGE resize_img(RESIZE_HEIGHT, RESIZE_WIDTH);

    hls::AXIvideo2Mat(ins, org_img);
    hls::CvtColor<HLS_BGR2GRAY>(org_img, org_img_g);
    hls::Resize(org_img_g, resize_img_g);
    hls::CvtColor<HLS_GRAY2BGR>(resize_img_g, resize_img);
    hls::Mat2AXIvideo(resize_img, outs);

    return(0);
}


resize_gray_tb.cpp を示す。

// resize_gray_tb.cpp
// 2017/08/31 by marsee
// 2020/03/04 : Changed source code.
//

#include <iostream>
#include "hls_opencv.h"
#include "resize_gray.h"

using namespace cv;

#define INPUT_IMAGE        "straight0.bmp"
#define OUTPUT_IMAGE    "test_straight0.bmp"
#define OUTPUT_IMAGE_CV    "test_straight0_cv.bmp"

void resize_gray(AXI_STREAM& ins, AXI_STREAM& outs);
void opencv_resize_gray(Mat& src, Mat& dst);

int main (int argc, char** argv) {
    // OpenCV で 画像を読み込む
    Mat src = imread(INPUT_IMAGE);
    AXI_STREAM src_axi, dst_axi;

    // Mat フォーマットから AXI4 Stream へ変換
    cvMat2AXIvideo(src, src_axi);

    // resize_gray() 関数をコール
    resize_gray(src_axi, dst_axi);

    // AXI4 Stream から Mat フォーマットへ変換
    // dst は宣言時にサイズとカラー・フォーマットを定義する必要がある
    Mat dst(RESIZE_HEIGHT, RESIZE_WIDTH, CV_8UC3);
    AXIvideo2cvMat(dst_axi, dst);

    // Mat フォーマットからファイルに書き込み
    imwrite(OUTPUT_IMAGE, dst);

    // opencv_resize_gray() をコール
    Mat dst_cv(RESIZE_HEIGHT, RESIZE_WIDTH, CV_8UC3);
    opencv_resize_gray(src, dst_cv);
    imwrite(OUTPUT_IMAGE_CV, dst_cv);

    // dst と dst_cv が同じ画像かどうか?比較する
    for (int y=0; y<RESIZE_HEIGHT; y++){
        Vec3b* dst_ptr = dst.ptr<Vec3b>(y);
        Vec3b* dst_cv_ptr = dst_cv.ptr<Vec3b>(y);
        for (int x=0; x<RESIZE_WIDTH; x++){
            Vec3b dst_bgr = dst_ptr[x];
            Vec3b dst_cv_bgr = dst_cv_ptr[x];

            // bgr のどれかが間違っていたらエラー
            if (std::pow(dst_bgr[0]-dst_cv_bgr[0], 2.0) > 1 || std::pow(dst_bgr[1]-dst_cv_bgr[1], 2.0) > 1
                    || std::pow(dst_bgr[2]-dst_cv_bgr[2], 2.0) > 1){
                printf("x = %d, y = %d,  Error dst=%d,%d,%d dst_cv=%d,%d,%d\n", x, y,
                        dst_bgr[0], dst_bgr[1], dst_bgr[0], dst_cv_bgr[0], dst_cv_bgr[1], dst_cv_bgr[2]);
                //return 1;
            }
        }
    }
    printf("Test with 0 errors.\n");

    return 0;
}

void opencv_resize_gray(Mat& src, Mat& dst){
    Mat gray(src.rows, src.cols, CV_8UC1);
    Mat img0g(RESIZE_HEIGHT, RESIZE_WIDTH, CV_8UC1);

    cvtColor(src, gray, CV_BGR2GRAY);
    resize(gray, img0g, img0g.size(), 0, 0, INTER_LINEAR);
    cvtColor(img0g, dst, CV_GRAY2BGR);
}


Vivado HLS 2019.2 の resize_gray プロジェクトを示す。
HLS_Video_Library_17_200305.png
  1. 2020年03月05日 04:59 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0
»