...

Vivado HLS ビデオ ライブラリを使用して Zynq-7000 All

by user

on
Category: Documents
20

views

Report

Comments

Transcript

Vivado HLS ビデオ ライブラリを使用して Zynq-7000 All
ア プ リ ケーシ ョ ン ノ ー ト : Vivado HLS
XAPP1167 (v3.0) 2015 年 6 月 24 日
Vivado HLS ビデオ ラ イ ブ ラ リ を使用 し
て Zynq‐7000 All Programmable SoC で OpenCV ア プ リ ケーシ ョ ン を高速化
著者 : Stephen Neuendorffer、 Thomas Li、 Devin Wang
概要
こ のアプ リ ケーシ ョ ン ノ ー ト では、OpenCV ラ イ ブ ラ リ を使用 し て Zynq®-7000 All Programmable SoC で コ ン ピ ュ ー タ ー ビ
ジ ョ ン アプ リ ケーシ ョ ン を開発す る 方法について説明 し ます。 OpenCV は、 アルゴ リ ズ ムのプ ロ ト タ イ ピ ン グか ら イ ン シ
ス テ ム での実行ま で、 設計プ ロ セ ス の さ ま ざ ま な段階で使用で き ます。 OpenCV コ ー ド は、 Vivado® 高位合成 (HLS) に付
属のビデオ ラ イ ブ ラ リ を使用 し て、 合成可能な C++ コ ー ド に移行す る こ と も 可能です。 合成 さ れたブ ロ ッ ク を Zynq SoC
デザ イ ンに統合す る こ と で、 高い解像度 と フ レーム レー ト の コ ン ピ ュ ー タ ー ビ ジ ョ ン アルゴ リ ズ ムが イ ン プ リ メ ン ト で
き ます。
は じ めに
コ ン ピ ュ ー タ ー ビ ジ ョ ンの分野には、 製造不良品を検出する 産業用監視シ ス テ ムか ら 自動車の運転支援シ ス テ ム ま で、 数
多 く の興味深いアプ リ ケーシ ョ ンが広 く 存在 し ます。コ ン ピ ュ ー タ ー ビ ジ ョ ン シ ス テ ムの多 く は、デス ク ト ッ プ プ ロ セ ッ
サお よ び GPU を タ ーゲ ッ ト と す る 多数の一般的な コ ン ピ ュ ー タ ー ビ ジ ョ ン機能の最適化 さ れた イ ンプ リ メ ン テーシ ョ ン
を含む ラ イ ブ ラ リ であ る OpenCV を使用 し て イ ンプ リ メ ン ト ま たはプ ロ ト タ イ ピ ン グ さ れてい ます。 OpenCV ラ イ ブ ラ リ
内の多数の関数は、さ ま ざ ま な コ ン ピ ュ ー タ ー ビ ジ ョ ン アプ リ ケーシ ョ ン をほぼ リ アル タ イ ム で実行で き る よ う に高度に
最適化 さ れてい ますが、最適化 さ れた イ ンプ リ メ ン テーシ ョ ンが組み込まれてい る 方が望ま し い場合が少な く あ り ません。
こ のアプ リ ケーシ ョ ン ノ ー ト では、OpenCV プ ロ グ ラ ム を Zynq デバ イ スへ リ タ ーゲ ッ ト する デザ イ ン フ ロ ーを示 し ます。
こ のデザ イ ン フ ロ ーでは、 Vivado Design Suite の HLS テ ク ノ ロ ジ と 、 最適化済みの合成可能ビデオ ラ イ ブ ラ リ を使用 し ま
す。 ラ イ ブ ラ リ は直接使用す る こ と も 、 それを アプ リ ケーシ ョ ン独自の コ ー ド と 組み合わせて、 特定のアプ リ ケーシ ョ ン
向けにカ ス タ マ イ ズ さ れた ア ク セ ラ レー タ を作成す る こ と も で き ます。 こ のデザ イ ン フ ロ ーでは高性能で低消費電力の多
数の コ ン ピ ュ ー タ ー ビ ジ ョ ン アルゴ リ ズ ム を迅速に イ ンプ リ メ ン ト で き ます。 ま た、 高デー タ レー ト の ピ ク セル処理 タ
ス ク はプ ロ グ ラ マブル ロ ジ ッ ク で実行 し 、 低デー タ レー ト の フ レームベース処理 タ ス ク は従来どお り ARM® コ アで実行
す る よ う に設計す る こ と も 可能です。
次の図に示す よ う に、 OpenCV はビデオ処理シ ス テ ムの さ ま ざ ま な設計段階で使用で き ます。 左側では、 フ ァ イ ル ア ク セ
ス関数を用い る イ メ ージの入力/出力お よ び処理の両方に OpenCV 関数呼び出 し を使用 し 、アルゴ リ ズ ム を設計お よ び イ ン
プ リ メ ン ト で き ます。 次に、 こ のアルゴ リ ズ ム を (Zynq ベース TRD な ど の) エンベデ ッ ド シ ス テ ムに イ ンプ リ メ ン ト し 、
プ ラ ッ ト フ ォーム独自の関数呼び出 し を使用す る 入力/出力 イ メ ージにア ク セ ス し ます。 こ の場合、 ビデオ処理は、 こ れま
で どお り (Zynq プ ロ セ ッ シ ン グ シ ス テ ム内の Cortex™-A9 プ ロ セ ッ サ コ ア な ど の) プ ロ セ ッ サで実行 さ れ る OpenCV 関数
呼び出 し を使用 し て イ ン プ リ メ ン ト さ れ ます。 あ る いは、 OpenCV 関数呼び出 し を、 対応す る Vivado HLS ビデオ ラ イ ブ
ラ リ 内の合成可能な関数で置 き 換え る こ と も で き ます。 こ の場合 も 、 OpenCV 関数呼び出 し は、 入力/出力 イ メ ージへのア
ク セ ス と 、 ビデオ処理アルゴ リ ズ ムの完全な リ フ ァ レ ン ス イ ンプ リ メ ン テーシ ョ ンの提供に使用可能です。 合成後、 処理
ブ ロ ッ ク は Zynq プ ロ グ ラ マブル ロ ジ ッ ク に統合で き ます。 統合 さ れたブ ロ ッ ク は、 プ ロ グ ラ マブル ロ ジ ッ ク に イ ンプ リ
メ ン ト さ れ る デザ イ ンに応 じ て、 プ ロ セ ッ サに よ っ て作成 さ れ る ビデオ ス ト リ ーム (フ ァ イ ルか ら 読み出 さ れ る デー タ な
ど) や外部入力か ら の生の リ アル タ イ ム ビデオ ス ト リ ーム を処理 し ます。
本資料は表記のバージ ョ ンの英語版を翻訳 し た も ので、内容に相違が生 じ る場合には原文を優先 し ます。 資料に よ っ ては英語版の更新に対応 し ていない も のがあ り ます。 日本
語版は参考用 と し て ご使用の上、 最新情報につ き ま し ては、 必ず最新英語版を ご参照 く だ さ い。
XAPP1167 (v3.0) 2015 年 6 月 24 日
japan.xilinx.com
1
リ フ ァ レ ン ス デザイ ン
X-Ref Target - Figure 1
,PDJH5HDG2SHQ&9
,PDJH5HDG
2SHQ&9
9LGHR)UDPH5HDG
9LGHR)UDPH5HDG
2SHQ&9$;,YLGHR
$;,YLGHR0DW
+/6YLGHROLEUDU\
IXQFWLRQFKDLQ
2SHQ&9IXQFWLRQ
FKDLQ
0DW$;,YLGHR
6\QWKHVL]HG)3*$
3URFHVVLQJ%ORFN
6\QWKHVL]DEOH
%ORFN
2SHQ&9IXQFWLRQ
FKDLQ
$;,YLGHR2SHQ&9
,PDJH:ULWH
2SHQ&9
9LGHR)UDPH:ULWH
9LGHR)UDPH:ULWH
,PDJH:ULWH2SHQ&9
図 1 : デザイ ン フ ロー
こ のアプ リ ケーシ ョ ン ノ ー ト の一般的なデザ イ ン フ ロ ーは、 次の と お り です。
1.
デス ク ト ッ プで OpenCV アプ リ ケーシ ョ ン を開発 し 、 実行す る 。
2.
OpenCV アプ リ ケーシ ョ ン を変更せずに Zynq SoC 内で再コ ンパ イ ル し 、 実行する 。
3.
I/O 関数を使用 し て OpenCV アプ リ ケーシ ョ ン を リ フ ァ ク タ リ ン グ し 、 ア ク セ ラ レー タ 関数を カプセル化する 。
4.
OpenCV 関数呼び出 し を、 ア ク セ ラ レー タ 関数内の合成可能ビデオ ラ イ ブ ラ リ 関数呼び出 し で置き 換え る 。
5.
Vivado HLS を使用 し て、 ア ク セ ラ レー タ 関数か ら ア ク セ ラ レー タ お よ びそれに対応す る API を生成す る 。
6.
ア ク セ ラ レー タ 関数の呼び出 し を、 ア ク セ ラ レー タ API の呼び出 し で置 き 換え る 。
7.
高速化 さ れた アプ リ ケーシ ョ ン を再 コ ンパ イ ル し 、 実行す る 。
リ フ ァ レ ン ス デザイ ン
リ フ ァ レ ン ス デザ イ ンは、 次の リ ン ク か ら ダ ウ ン ロ ー ド で き ます。
https://secure.xilinx.com/webreg/clickthrough.do?cid=323570
表 1 に、 リ フ ァ レ ン ス デザ イ ンの詳細を示 し ます。
表 1 : リ フ ァ レ ン ス デザイ ンの詳細
パラ メ ー タ ー
説明
全般
開発者
Thomas Li
タ ーゲ ッ ト デバ イ ス (ス テ ッ ピ ン グ レベル、 ES、 プ
ロ ダ ク シ ョ ン、 ス ピー ド グ レー ド )
XC7020-1
ソ ース コ ー ド の提供
あり
ソ ース コ ー ド の形式
C
XAPP1167 (v3.0) 2015 年 6 月 24 日
japan.xilinx.com
2
Vivado HLS のビデオ処理ラ イ ブ ラ リ
表 1 : リ フ ァ レ ン ス デザイ ンの詳細
パラ メ ー タ ー
説明
既存の ザ イ リ ン ク ス ア プ リ ケ ーシ ョ ン ノ ー ト / リ
フ ァ レ ン ス デザ イ ン、 CORE Generator ツール、 サー
ド パーテ ィ か ら デザ イ ンへの コ ー ド /IP の使用
あ り (Zynq ベース TRD アプ リ ケーシ ョ ン ノ ー ト / リ
フ ァ レ ン ス デザ イ ン、 CORE Generator ツール、 ま た
はサー ド パーテ ィ のシ ミ ュ レーシ ョ ンに基づ く )
シ ミ ュ レーシ ョ ン
論理シ ミ ュ レーシ ョ ンの実施
あ り 、 C を使用
タ イ ミ ン グ シ ミ ュ レーシ ョ ンの実施
なし
論理 シ ミ ュ レ ー シ ョ ン お よ び タ イ ミ ン グ シ ミ ュ
レーシ ョ ンでのテ ス ト ベンチの利用
あり
テ ス ト ベンチの形式
C
使用 し たシ ミ ュ レー タ /バージ ョ ン
g++
SPICE/IBIS シ ミ ュ レーシ ョ ンの実施
なし
イ ン プ リ メ ン テーシ ョ ン
使用 し た合成ツール/バージ ョ ン
Vivado 2014.4
使用 し た イ ン プ リ メ ン テーシ ョ ン ツール/バージ ョ
ン
Vivado 2014.4
ス タ テ ィ ッ ク タ イ ミ ン グ解析の実施
あり
ハー ド ウ ェ ア検証
ハー ド ウ ェ ア検証の実施
あり
使用 し たハー ド ウ ェ ア プ ラ ッ ト フ ォーム
ZC702
Vivado HLS のビデオ処理ラ イ ブ ラ リ
Vivado HLS には、 各種の ビデオ処理機能の作成を容易にす る ビデオ ラ イ ブ ラ リ が多数含ま れてい ます。 こ れ ら の ラ イ ブ
ラ リ は合成可能な C++ コ ー ド と し て イ ン プ リ メ ン ト さ れ、 OpenCV に イ ン プ リ メ ン ト さ れてい る ビデオ処理関数お よ び
デー タ 構造にほぼ対応 し てい ます。 Vivado HLS におけ る ビデオの概念お よ び抽象化の多 く は、 OpenCV のそれ ら と 非常に
類似 し てい ます。 特に、 OpenCV imgproc モジ ュ ールの関数の多 く に、 対応する Vivado HLS ラ イ ブ ラ リ 関数があ り ます。
た と えば、 OpenCV の中心的な要素であ る cv::Mat ク ラ ス は、 通常はビデオ処理シ ス テ ム で イ メ ージ を表す際に使用 さ れま
す。 cv::Mat オブジ ェ ク ト は、 通常は次の例に示す よ う に宣言 さ れます。
cv::Mat image(1080, 1920, CV_8UC3);
こ れは変数 image を宣言 し 、 こ の変数を初期化 し て 1080 行、 1920 列の イ メ ージ を表 し ます。 こ こ で、 各ピ ク セルは 3 個
の符号な し 8 ビ ッ ト 数で表現 さ れます。 合成可能 ラ イ ブ ラ リ には、 こ れに対応す る hls::Mat<> テ ンプ レー ト ク ラ ス が含ま
れ、 同様の概念を合成可能な方法で次の よ う に表現 し ます。
hls::Mat<2047, 2047, HLS_8UC3> image(1080, 1920);
得 ら れ る オブジ ェ ク ト はほぼ同 じ ですが、 コ ン ス ト ラ ク タ ー引数に加え てテ ンプ レー ト パ ラ メ ー タ ーを使用 し て イ メ ージ
の最大サ イ ズ と フ ォーマ ッ ト が記述 さ れ る 点が異な り ます。 こ れに よ り 、 Vivado HLS は、 こ の イ メ ージの処理に使用す る
メ モ リ のサ イ ズ を決定 し 、 得 ら れた回路を特定のピ ク セル表現方法に合せて最適化で き ます。 ま た、 hls::Mat<> テ ンプ レー
ト ク ラ ス では、 処理 さ れ る イ メ ージの実際のサ イ ズが最大サ イ ズ と 同 じ であ る 場合、 コ ン ス ト ラ ク タ ー引数を完全に省略
で き ます。
hls::Mat<1080, 1920, HLS_8UC3> image();
同様に、 OpenCV ラ イ ブ ラ リ では、 cvScale 関数で イ メ ージの各ピ ク セル値に リ ニ ア ス ケー リ ン グ を適用可能です。 こ の
関数は次の よ う に呼び出 さ れます。
XAPP1167 (v3.0) 2015 年 6 月 24 日
japan.xilinx.com
3
ビデオ処理アーキテ ク チ ャ
cv::Mat src(1080, 1920, CV_8UC3);
cv::Mat dst(1080, 1920, CV_8UC3);
cvScale(src, dst, 2.0, 0.0);
こ の関数呼び出 し は、 入力 イ メ ージ src の ピ ク セルを オ フ セ ッ ト な し で 2 倍に ス ケー リ ン グ し 、 出力 イ メ ージ dst を生
成 し ます。 合成可能 ラ イ ブ ラ リ で こ れに対応する 動作は、 hls::Scale テ ンプ レー ト 関数の呼び出 し に よ っ て次の よ う に
イ ンプ リ メ ン ト さ れます。
hls::Mat<1080, 1920, HLS_8UC3> src;
hls::Mat<1080, 1920, HLS_8UC3> dst;
hls::Scale(src, dst, 2.0, 0.0);
注記 : hls::Scale はテ ンプ レー ト 関数ですが、 テ ン プ レー ト 引数は src お よ び dst の宣言内のテ ン プ レー ト 引数か ら
推測 さ れ る ため、 指定す る 必要はあ り ません。 ただ し 、 hls::Scale テ ンプ レー ト 関数では、 入力 イ メ ージ と 出力 イ メ ー
ジのテ ンプ レー ト 引数が同一でなければな り ません。 サポー ト さ れてい る 関数の一覧は、 『Vivado Design Suite ユーザー ガ
イ ド : 高位合成』 (UG902) [参照 4] に記載 さ れてい ます。
ビデオ処理アーキテ ク チ ャ
Zynq SoC のビデオ処理デザ イ ンは、 通常は次に説明す る 2 つの一般的な アーキ テ ク チ ャ のいずれかに従い ます。 「ダ イ レ
ク ト ス ト リ ー ミ ン グ」 と 呼ばれ る 第 1 のアーキ テ ク チ ャ の場合、 ピ ク セル デー タ は、 プ ロ グ ラ マブル ロ ジ ッ ク の入力ピ
ンに到着 し た後、ビデオ処理 コ ン ポーネ ン ト に直接送 ら れ、そ こ か ら ビデオ出力へ直接伝送 さ れます。 こ のアーキ テ ク チ ャ
は、 一般的に最 も 簡単かつ効率的な ビデオ処理方法ですが、 ビデオ処理 コ ン ポーネ ン ト が厳密に リ アル タ イ ム で フ レーム
を処理で き る こ と が要件です。
X-Ref Target - Figure 2
''5
3URFHVVLQJ
6\VWHP
''50HPRU\&RQWUROOHU
86%&DPHUD
+DUGHQHG
3HULSKHUDOV86%
*LJ(&$163,
8$57&*3,2
$0%$Š6ZLWFKHV
$0%$Š6ZLWFKHV
$38
'XDO&RUH
&RUWH[$2&0
6B$;,B+3ELW
6B$;,B*3EELW
$;,6WUHDP
,3&RUH
$;,,QWHUFRQQHFW
,D/
9LGHR
,QSXW
9LGHR
3URFHVVLQJ
&RPSRQHQW
9LGHR
'LVSOD\
&RQWUROOHU
,D/
;
図 2 : ビデオ処理のダ イ レ ク ト ス ト リ ー ミ ング アーキテ ク チ ャ
「フ レーム バ ッ フ ァ ー ス ト リ ー ミ ン グ」 と 呼ばれ る 第 2 のアーキ テ ク チ ャ の場合、 ピ ク セル デー タ はまず外部 メ モ リ に格
納 さ れ、処理後に再び外部 メ モ リ に格納 さ れます。処理 さ れた ビデオの出力にはビデオ デ ィ ス プ レ イ コ ン ト ロ ー ラ ーが必
要です。 こ のアーキ テ ク チ ャ では、 ビデオ レー ト が ビデオ コ ン ポーネ ン ト の処理速度の影響を受けに く く な り ますが、 外
部 メ モ リ に対す る ビデオ フ レームの読み出 し と 書 き 込みに十分な メ モ リ 帯域幅が求め ら れます。
XAPP1167 (v3.0) 2015 年 6 月 24 日
japan.xilinx.com
4
AXI 4 ス ト リ ー ミ ング ビデオ
X-Ref Target - Figure 3
''5
3URFHVVLQJ
6\VWHP
''50HPRU\&RQWUROOHU
86%&DPHUD
+DUGHQHG
3HULSKHUDOV86%
*LJ(&$163,
8$57&*3,2
$0%$Š6ZLWFKHV
$0%$Š6ZLWFKHV
6B$;,B+3ELW
6B$;,B*3EELW
$;,6WUHDP
,3&RUH
$38
'XDO&RUH
&RUWH[$2&0
$;,,QWHUFRQQHFW
$;,
9'0$
,D/
9LGHR
,QSXW
$;,
9'0$
$;,
9'0$
9LGHR
'LVSOD\
&RQWUROOHU
,D/
9LGHR
3URFHVVLQJ
&RPSRQHQW
;
図 3 : ビデオ処理のフ レーム バ ッ フ ァ ー アーキテ ク チ ャ
こ のアプ リ ケーシ ョ ン ノ ー ト では、 柔軟性に優れ、 プ ロ セ ッ サ コ アでの ビデオ処理を高速化す る 方法を理解 し やすい フ
レーム バ ッ フ ァ ー ス ト リ ー ミ ン グ アーキ テ ク チ ャ を扱い ます。高度に最適化 さ れた シ ス テ ム を実現す る ために、こ のアー
キ テ ク チ ャ か ら ダ イ レ ク ト ス ト リ ー ミ ン グ アーキ テ ク チ ャ を作成す る のは比較的容易です。
AXI 4 ス ト リ ー ミ ング ビデオ
ザ イ リ ン ク ス のビデオ処理 コ ン ポーネ ン ト は、一般的な AXI4 ス ト リ ー ミ ン グ プ ロ ト コ ルを使用 し て ピ ク セル デー タ をや
り 取 り し ます。 こ のプ ロ ト コ ルは、 ビデオ ピ ク セルの各 ラ イ ン を AXI4 パケ ッ ト と し て記述 し 、 各 ラ イ ンの最後の ピ ク セ
ルは TLAST 信号のアサー ト でマー ク し ます。 ま た、 ビデオ フ レームの開始は USER[0] ビ ッ ト のアサー ト で最初の ラ イ ン
の先頭の ピ ク セルを マー ク す る こ と で示 し ます。 こ のプ ロ ト コ ルの詳細は、 [参照 2] を参照 し て く だ さ い。
基礎 と な る AXI4 ス ト リ ー ミ ン グ ビデオ プ ロ ト コ ルには、 イ メ ージ内の ラ イ ン サ イ ズに対す る 制約はあ り ませんが、 す
べてのビデオ ラ イ ンが同 じ 長 さ であれば、 ほ と ん ど の複雑な ビデオ処理演算は大幅に簡略化 さ れます。 こ の制限は、 一連
の ビデオ フ レームの始め過渡状態の間を除けば、 ど のデジ タ ル ビデオ フ ォ ーマ ッ ト で も ほぼ常に満た さ れ ます。 こ の状
態は通常、 処理ブ ロ ッ ク の入力 イ ン タ ーフ ェ イ ス でのみ問題 と な り 、 継続的な矩形フ レームの処理に移行す る 前に適切に
扱 う 必要があ り ます。 AXI4 ス ト リ ー ミ ン グ ビデオ プ ロ ト コ ルを受信す る 入力 イ ン タ ーフ ェ イ ス では、 各ビデオ フ レーム
が厳密に ROWS * COLS 個の ピ ク セルで構成 さ れ る よ う にで き ます。 そ し て、 パ イ プ ラ イ ン内の後続のブ ロ ッ ク は、 ビデ
オ フ レームが完全な矩形フ レームであ る こ と を前提にで き ます。
Vivado HLS のビデオ イ ン タ ー フ ェ イ ス ラ イ ブ ラ リ
こ の よ う な イ ン タ ーフ ェ イ ス の問題を扱いやす く す る ために、 Vivado HLS には一連の合成可能な ビデオ イ ン タ ーフ ェ イ
ス ラ イ ブ ラ リ 関数が含まれてい ます。 こ れ ら の関数を次の表に示 し ます。
XAPP1167 (v3.0) 2015 年 6 月 24 日
japan.xilinx.com
5
制限
表 2 : Vivado HLS の合成可能な ビデオ関数
ビデオ ラ イ ブ ラ リ 関数
説明
hls::AXIvideo2Mat
AXI4 ビ デ オ ス ト リ ー ム 表現 の デー タ を
hls::Mat フ ォーマ ッ ト に変換する
hls::Mat2AXIvideo
hls::Mat フ ォ ーマ ッ ト で格納 さ れたデー タ を
AXI4 ビデオ ス ト リ ームに変換す る
具体的にい う と 、 AXIvideo2Mat 関数は AXI4 ス ト リ ー ミ ン グ ビデオ を使用する 一連の イ メ ージ を受信 し 、 hls::Mat 表現を
生成 し ます。 同様に、 Mat2AXIvideo 関数は一連の イ メ ージの hls::Mat 表現を受信 し 、 AXI4 ス ト リ ー ミ ン グ ビデオ プ ロ ト
コ ルを用いて正 し く エン コ ー ド し ます。
こ れ ら の関数は、 AXI4 ビデオ ス ト リ ーム に基づいて イ メ ージ サ イ ズ を決定す る のではな く 、 hls::Mat コ ン ス ト ラ ク タ ー
引数で指定 さ れた イ メ ージ サ イ ズ を使用 し ます。 AXI4 ス ト リ ー ミ ン グ イ ン タ ーフ ェ イ ス で任意のサ イ ズの入力 イ メ ージ
を処理す る よ う に設計 さ れた シ ス テ ムでは、 ビデオ ラ イ ブ ラ リ ブ ロ ッ ク の外部で イ メ ージ サ イ ズ を決定す る 必要があ り
ます。 Zynq ビデオ TRD では、 ア ク セ ラ レー タ に よ っ て処理 さ れ る イ メ ージ サ イ ズは、 AXI4-Lite 制御レ ジ ス タ と し て ア
ク セ ス可能です。 ただ し 、 ソ フ ト ウ ェ ア と シ ス テ ムの残 り の部分は、 1920x1080 の解像度のみを処理す る よ う に設計 さ れ
てい ます。 よ り 複雑なシ ス テ ムでは、 ザ イ リ ン ク ス の Video Timing Controller コ ア [参照 3] を使用 し て、 受信 し た ビデオ信
号のサ イ ズ を検出で き ます。
ビデオ ラ イ ブ ラ リ には、 次の合成不可の ビデオ イ ン タ ーフ ェ イ ス ラ イ ブ ラ リ 関数 も 含まれてい ます。
表 3 : Vivado HLS の合成不能な ビデオ関数
ビデオ ラ イ ブ ラ リ 関数
hls::cvMat2AXIvideo
hls::AXIvideo2cvMat
hls::IplImage2AXIvideo
hls::AXIvideo2IplImage
hls::CvMat2AXIvideo
hls::AXIvideo2CvMat
こ れ ら の関数は、通常は合成可能な関数 と 組み合わせて OpenCV ベース のテ ス ト ベンチの イ ンプ リ メ ン ト に使用 さ れます。
制限
現在の合成可能な ラ イ ブ ラ リ にはい く つかの制限があ り 、 それ ら は注意 し な ければ見落 と し がちです。 基本的な制限は、
OpenCV 関数は直接合成で き ず、 合成可能な ラ イ ブ ラ リ の関数に よ っ て置 き 換えが必要な こ と です。 こ の制限の理由は第
一に、 OpenCV 関数には通常は (合成可能ではない任意のサ イ ズの cv::Mat オブジ ェ ク ト の コ ン ス ト ラ ク タ ーな ど) 動的
な メ モ リ 割 り 当てが含まれ る ためです。
2 つ目の制限は、 イ メ ージのモデル化に使用 さ れ る hls::Mat<> デー タ 型は、 外部 メ モ リ 内の ピ ク セルの配列 と し てでは
な く 、 hls::stream<> デー タ 型を使用 し て内部で ピ ク セルの ス ト リ ーム と し て定義 さ れ る こ と です。 その結果、 イ メ ー
ジ上で ラ ン ダ ム ア ク セ ス はサポー ト さ れ ません。 ま た、 cv::Mat<>.at() メ ソ ッ ド と cvGet2D() 関数に対応す る 等価
な関数は合成可能な ラ イ ブ ラ リ 内にあ り ません。 イ メ ージへのア ク セ ス は ス ト リ ー ミ ン グ ア ク セ ス にな る ため、 複数の関
数に よ っ て イ メ ージ を処理す る 場合は、 hls::Duplicate<> 関数な ど で最初に イ メ ージ を 2 つの ス ト リ ームに複製す る
必要があ り ます。ま た、イ メ ージのエ リ ア を変更す る には、イ メ ージの周囲の未変更の ピ ク セルを処理す る 必要があ り ます。
も う 1 つの制限はデー タ 型に関す る も のです。 OpenCV 関数は、 通常は整数デー タ 型ま たは浮動小数点デー タ 型をサポー
ト し ます。 し か し 、 プ ロ グ ラ マブル ロ ジ ッ ク を タ ーゲ ッ ト と する 場合、 浮動小数点型の方が よ り コ ス ト がかか る ため敬遠
さ れます。 ほ と ん ど の場合、 Vivado HLS でfloat 型お よ び double 型を Vivado HLS の固定小数点テ ンプ レー ト ク ラ ス
ap_fixed<> お よ び ap_ufixed<> に置 き 換え る こ と がで き ます。 さ ら に、 OpenCV と 合成可能な ラ イ ブ ラ リ の動作は概
し て機能的に同等にな る こ と こ と を意図 し てい ますが、 OpenCV は浮動小数点演算を実行す る ため、 合成可能な ラ イ ブ ラ
リ の結果がそれに対応す る OpenCV 関数 と 等 し い ビ ッ ト 精度にな る こ と は想定で き ません。 場合に よ っ ては、 合成可能 ラ
イ ブ ラ リ は内部で固定小数点の最適化を実行 し 、 浮動小数点演算を削減 し ます。
最後の制限 と し て、 イ ン タ ーフ ェ イ ス関数は AXI4 ス ト リ ー ミ ン グ ビデオ用にのみ提供 さ れます。 こ れ ら の イ ン タ ーフ ェ
イ ス は、 シ ス テ ム レベルでザ イ リ ン ク ス の Video DMA (VDMA) コ アお よ びほかの ビデオ処理 IP コ ア と 統合で き ますが、
AXI4 ス レーブ ポー ト や AXI4 マ ス タ ー ポー ト に直接接続す る こ と はで き ません。 し たがっ て、 (た と えば複数の連続す る
フ レーム を ま と めて処理す る 目的で) 外部 メ モ リ フ レーム バ ッ フ ァ ーを必要 と す る デザ イ ンでは、 プ ロ セ ッ サに よ っ て管
理 さ れ る 複数の VDMA コ ア を使用 し て、 フ レーム バ ッ フ ァ ーを外部で イ ンプ リ メ ン ト す る 必要があ り ます。
XAPP1167 (v3.0) 2015 年 6 月 24 日
japan.xilinx.com
6
リ フ ァ レ ン ス デザイ ン
リ フ ァ レ ン ス デザイ ン
こ のアプ リ ケーシ ョ ン ノ ー ト には、複数の HLS デザ イ ンが含まれてい ます。 こ れ ら のデザ イ ンは、プ ロ グ ラ マブル ロ ジ ッ
ク 内の画像処理 フ ィ ル タ ーを Vivado HLS お よ び Vivado HLS 合成可能 ラ イ ブ ラ リ に よ っ て生成 し た フ ィ ル タ ーで置 き 換
え、 Zynq ベー ス タ ーゲ ッ ト リ フ ァ レ ン ス デザ イ ン の動作を変更 し ま す。 合成可能な フ ィ ル タ ーの ゴールデン モデルが
OpenCV ラ イ ブ ラ リ を使用 し て イ ン プ リ メ ン ト さ れ、 合成 さ れた コ ー ド の動作が検証で き る よ う にな り ます。 ま た、 こ れ
ら のデザ イ ンは Linux アプ リ ケーシ ョ ン を変更 し 、 フ ィ ル タ ーの OpenCV イ ンプ リ メ ン テーシ ョ ン ま たは合成可能 イ ンプ
リ メ ン テーシ ョ ン を Cortex-A9 コ アで実行で き る よ う に し ます。
リ フ ァ レ ン ス デザ イ ンには次の も のがあ り ます。
•
demo : 一連の ピ ク セル処理関数
•
fast-corners : コ ーナー検出用の高速アルゴ リ ズ ム
•
pass-through : パ ス スルー以外何 も 実行 し ない
•
simple-median : 単純な Median フ ィ ル タ ー
•
simple-posterize : 単純なポ ス タ ラ イ ゼーシ ョ ン
•
sobel : し き い値あ り の Sobel フ ィ ル タ ー (Zynq ベース TRD 内のデザ イ ン と 同 じ )
こ のセ ク シ ョ ンでは、 3 つの標準的な リ フ ァ レ ン ス デザ イ ン を順に紹介 し 、 OpenCV アプ リ ケーシ ョ ン を高速化す る 方法
の概要を示 し ます。
最初の リ フ ァ レ ン ス デザ イ ンは 「pass-through 」 と 呼ばれ る 透過的な画像フ ィ ル タ ーで、 入力フ レーム を変更せずに出力
に渡すだけです。 こ れはユーザーのアプ リ ケーシ ョ ン で フ ィ ル タ ーのテ ン プ レー ト と し て使用で き ます。 OpenCV コ ー ド
は次の よ う に簡単です。
49 void opencv_image_filter(IplImage *src, IplImage *dst) {
50 cvCopy(src, dst);
51 }
OpenCV コ ー ド と 比較す る と 、合成可能 コ ー ド には イ ン タ ーフ ェ イ ス を容易にす る #pragma 指示子が多数含まれてい ます。
こ れ ら の指示子は、 入力お よ び出力 ス ト リ ーム を AXI4 ス ト リ ー ミ ン グ イ ン タ ー フ ェ イ ス と し て ア ク セ ス 可能に し (行
46-47)、 バン ド ル さ れた制御バ ス内のその他の入力を AXI4 Lite ス レーブ イ ン タ ーフ ェ イ ス と し て ア ク セ ス可能に し ます
(行 49-51)。 TRD が使用 し ていた ド ラ イ バー と の位置を合わせる ために、 rows お よ び cols のオ フ セ ッ ト が指定 さ れてい る
こ と に注意 し て く だ さ い。 ま た、 ブ ロ ッ ク は同 じ サ イ ズの イ メ ージ を繰 り 返 し 処理す る こ と が予想 さ れ る ため、 rows お よ
び cols 入力は安定入力 と し て指定 さ れ ます (行 53-54)。 変数はパ イ プ ラ イ ン の各段を通 し てプ ッ シ ュ さ れ る 必要はないた
め、 こ の指定に よ っ て さ ら に最適化で き る よ う にな り ます。 最後に、 dataflow モー ド が選択 さ れ る こ と で (行 57)、 ピ ク セ
ルがブ ロ ッ ク 間で ス ト リ ー ミ ン グ さ れて、 さ ま ざ ま な処理関数の同時実行が可能にな り ます。
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
void image_filter(AXI_STREAM& video_in, AXI_STREAM& video_out, int rows, int cols) {
//Create AXI streaming interfaces for the core
#pragma HLS INTERFACE axis port=video_in bundle=INPUT_STREAM
#pragma HLS INTERFACE axis port=video_out bundle=OUTPUT_STREAM
#pragma HLS INTERFACE s_axilite port=rows bundle=CONTROL_BUS offset=0x14
#pragma HLS INTERFACE s_axilite port=cols bundle=CONTROL_BUS offset=0x1C
#pragma HLS INTERFACE s_axilite port=return bundle=CONTROL_BUS
#pragma HLS INTERFACE ap_stable port=rows
#pragma HLS INTERFACE ap_stable port=cols
YUV_IMAGE img_0(rows, cols);
#pragma HLS dataflow
hls::AXIvideo2Mat(video_in, img_0);
hls::Mat2AXIvideo(img_0, video_out);
}
demo と い う 名前の第 2 の リ フ ァ レ ン ス デザ イ ンには、 図 4 に示す関数の簡単なパ イ プ ラ イ ンが含まれてい ます。
XAPP1167 (v3.0) 2015 年 6 月 24 日
japan.xilinx.com
7
リ フ ァ レ ン ス デザイ ン
X-Ref Target - Figure 4
6XEWUDFW
7KUHVKKROG
6FDOH9DOXH
(URGH
'LODWH
;
図 4 : 「demo」 のデザイ ン ブ ロ ッ ク図
OpenCV では、 次の コ ー ド 例に示す一連の ラ イ ブ ラ リ 呼び出 し を使用 し て、 こ のアプ リ ケーシ ョ ン を イ ン プ リ メ ン ト で き
ます (apps/demo/opencv_top.cpp か ら の抜粋)。
49 void opencv_image_filter(IplImage *src, IplImage *dst) {
50 IplImage* tmp = cvCreateImage(cvGetSize(src), src->depth, src->nChannels);
51
cvCopy(src, tmp);
52
cvSubS(tmp, cvScalar(50, 50), dst);
53
cvScale(dst, tmp, 2, 0);
54
cvErode(tmp, dst);
55
cvDilate(dst, tmp);
56
cvCopy(tmp, dst);
57
cvReleaseImage(&tmp);
58 }
一連の OpenCV 関数呼び出 し は、 類似 し た イ ン タ ーフ ェ イ ス を持ち等価な動作を行 う HLS ビデオ ラ イ ブ ラ リ 呼び出 し で
置 き 換え ら れてい ます。 pass-through デザ イ ンのテ ンプ レー ト に基づいた合成可能コ ー ド は簡単であ り 、 #pragma 指示子は
同 じ です。 pass-through デザ イ ン と の主な違いは、 い く つかの hls::Mat 宣言 (IMAGE_C2 は top.h で定義 さ れ る 2 チ ャ ネル
YUV 画像の タ イ プ) を追加 し 、 HLS ラ イ ブ ラ リ 関数を使用 し た処理パ イ プ ラ イ ン を接続 し てい る こ と です。
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
void image_filter(AXI_STREAM& video_in, AXI_STREAM& video_out, int rows, int cols) {
//Create AXI streaming interfaces for the core
#pragma HLS INTERFACE axis port=video_in bundle=INPUT_STREAM
#pragma HLS INTERFACE axis port=video_out bundle=OUTPUT_STREAM
#pragma HLS INTERFACE s_axilite port=rows bundle=CONTROL_BUS offset=0x14
#pragma HLS INTERFACE s_axilite port=cols bundle=CONTROL_BUS offset=0x1C
#pragma HLS INTERFACE s_axilite port=return bundle=CONTROL_BUS
#pragma HLS INTERFACE ap_stable port=rows
#pragma HLS INTERFACE ap_stable port=cols
IMAGE_C2 img_0(rows, cols);
IMAGE_C2 img_1(rows, cols);
IMAGE_C2 img_2(rows, cols);
IMAGE_C2 img_3(rows, cols);
IMAGE_C2 img_4(rows, cols);
PIXEL_C2 pix(50, 50);
#pragma HLS dataflow
hls::AXIvideo2Mat(video_in, img_0);
hls::SubS(img_1, pix, img_1);
hls::Scale(img_1, img_2, 2, 0);
hls::Erode(img_2, img_3);
hls::Dilate(img_3, img_4);
hls::Mat2AXIvideo(img_4, video_out);
}
「fast-corners」 と い う 名前の第 3 の リ フ ァ レ ン ス デザ イ ンには、 図 5 に示す よ う に、 よ り 複雑なパ イ プ ラ イ ンが含まれてい
ます。
XAPP1167 (v3.0) 2015 年 6 月 24 日
japan.xilinx.com
8
リ フ ァ レ ン ス デザイ ン
7R
*UD\VFDOH
)DVW
&RUQHUV
'HWHFWLRQ
'UDZ
&RUQHUV
;
X-Ref Target - Figure 5
図 5 : Fast‐Corners ア プ リ ケーシ ョ ン
OpenCV では、 こ のアプ リ ケーシ ョ ンは次の コ ー ド 例を使用 し て イ ンプ リ メ ン ト で き ます
(apps/fast-corners/opencv_top.cpp か ら の抜粋)。
49 void opencv_image_filter(IplImage *_src, IplImage *_dst) {
50
Mat src(_src);
51
Mat dst(_dst);
52
cvCopy(_src, _dst);
53
std::vector<Mat> layers;
54
std::vector<KeyPoint> keypoints;
55
split(src, layers);
56
FAST(layers[0], keypoints, 20, true);
57
for (int i = 0; i < keypoints.size(); i++) {
58
rectangle(dst,
59
Point(keypoints[i].pt.x-1, keypoints[i].pt.y-1),
60
Point(keypoints[i].pt.x+1, keypoints[i].pt.y+1),
61
Scalar(255,0),
62
CV_FILLED);
63
}
64 }
こ のアプ リ ケーシ ョ ンは簡単に見え ますが、 合成可能な ラ イ ブ ラ リ 内に対応す る 関数を持た ない関数がい く つか含まれて
い ます。 std::vector ク ラ ス は合成で き ません (行 54)。 cv::rectangle 関数は、 置き 換え更新のため、 現在の と こ ろ
合成可能 ラ イ ブ ラ リ 内に イ ンプ リ メ ン ト さ れてい ません (行 58-62)。
こ のアプ リ ケーシ ョ ン を イ ンプ リ メ ン ト す る 1 つの可能性 と し て、 アプ リ ケーシ ョ ン を分割 し 、 プ ロ セ ッ シ ン グ シ ス テ ム
で動作す る コ ー ド に よ っ て FAST コ ーナーを矩形でマー ク し なが ら 、プ ロ グ ラ マブル ロ ジ ッ ク でグ リ ーン チ ャ ネルの抽出
と FAST コ ーナーの検出を実行す る こ と が考え ら れ ます。 こ こ では、 FPGA に イ ンプ リ メ ン ト で き る ピ ク セル処理パ ラ ダ
イ ムの枠内に留ま り なが ら 、 コ ー ド を若干簡略化す る こ と に し ます。 次の コ ー ド 例に、 簡略化 し た コ ー ド を示 し ます。
69 void opencv_image_filter(IplImage *_src, IplImage *_dst) {
70
Mat src(_src);
71
Mat dst(_dst);
72
cvCopy(_src, _dst);
73
Mat mask(src.rows, src.cols, CV_8UC1);
74
Mat dmask(src.rows, src.cols, CV_8UC1);
75
std::vector<Mat> layers;
76
std::vector<KeyPoint> keypoints;
77
split(src, layers);
78
FAST(layers[0], keypoints, 20, true);
79
GenMask(mask, keypoints);
80
dilate(mask, dmask, getStructuringElement(MORPH_RECT, Size(3,3), Point(1,1)));
81
PaintMask(dst, dmask, Scalar(255,0));
82 }
こ の コ ー ド は OpenCV で記述 さ れてい ますが、 合成可能コ ー ド への変換が可能な形で構造化 さ れてい ます。 こ の組み合わ
せは特に、 動的に割 り 当て ら れた構造 と し てではな く 、 イ メ ージ マ ス ク と し て キーポ イ ン ト を生成 し ます。 PaintMask
関数は、 こ の よ う なマ ス ク を使用 し て イ メ ージの上に描画 し ます。 次の コ ー ド 例に、 FAST コ ーナー アプ リ ケーシ ョ ンの
合成可能バージ ョ ン を示 し ます (apps/fast-corners/top.cpp か ら の抜粋)。
44 void image_filter(AXI_STREAM& video_in, AXI_STREAM& video_out, int rows, int cols) {
45
//Create AXI streaming interfaces for the core
46 #pragma HLS INTERFACE axis port=video_in bundle=INPUT_STREAM
47 #pragma HLS INTERFACE axis port=video_out bundle=OUTPUT_STREAM
XAPP1167 (v3.0) 2015 年 6 月 24 日
japan.xilinx.com
9
ソ ース フ ァ イル と プ ロ ジ ェ ク ト デ ィ レ ク ト リ
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#pragma HLS INTERFACE s_axilite port=rows bundle=CONTROL_BUS offset=0x14
#pragma HLS INTERFACE s_axilite port=cols bundle=CONTROL_BUS offset=0x1C
#pragma HLS INTERFACE s_axilite port=return bundle=CONTROL_BUS
#pragma HLS INTERFACE ap_stable port=rows
#pragma HLS INTERFACE ap_stable port=cols
IMAGE_C2 img_0(rows, cols);
IMAGE_C2 img_1(rows, cols);
IMAGE_C2 img_1_(rows, cols);
IMAGE_C1 img_1_Y(rows, cols);
IMAGE_C1 img_1_UV(rows, cols);
IMAGE_C2 img_2(rows, cols);
IMAGE_C1 mask(rows, cols);
IMAGE_C1 dmask(rows, cols);
PIXEL_C2 color(255,0);
#pragma HLS dataflow
#pragma HLS stream depth=20000 variable=img_1_.data_stream
hls::AXIvideo2Mat(video_in, img_0);
hls::Duplicate(img_0, img_1, img_1_);
hls::Split(img_1, img_1_Y, img_1_UV);
hls::Consume(img_1_UV);
hls::FASTX(img_1_Y, mask, 20, true);
hls::Dilate(mask, dmask);
hls::PaintMask(img_1_, dmask, img_2, color);
hls::Mat2AXIvideo(img_2, video_out);
}
こ の コ ー ド では、行 66 の指示子の使用に よ っ て 1 つの ス ト リ ームの深 さ が設定 さ れてい る こ と に注意 し て く だ さ い。 こ の
例では、 ラ イ ン バ ッ フ ァ ーがあ る ため、 Duplicate > FASTX > Dilate > PaintMask のパ ス上にビデオ ラ イ ン単
位の レ イ テ ン シがあ り ます。 こ の場合、 FASTX で最大 7 ラ イ ン、 Dilate で最大 3 ラ イ ン の レ イ テ ン シが発生す る ため、
少な く と も 1920 * (7+3) < 20000 ピ ク セルが必要です。 さ ら に、行 71 の hls::FASTX 呼び出 し は、前の変更 さ れた OpenCV
コ ー ド の cv::FAST 関数 と GenMask 関数の組み合わせに対応 し ます。
ソ ース フ ァ イル と プ ロ ジ ェ ク ト デ ィ レ ク ト リ
こ のアプ リ ケーシ ョ ン ノ ー ト の フ ァ イ ルの全体構造は、 Zynq ベース TRD の構造を反映 し てい ます。 SD カー ド 用にあ ら
か じ め作成 さ れた イ メ ージが ready_to_test デ ィ レ ク ト リ に用意 さ れてお り 、 デザ イ ン を簡単に試す こ と がで き ます。 こ の
イ メ ージは Zynq ベース TRD か ら 若干変更 さ れてお り 、 ブー ト 時に ロ ー ド さ れ る RAM デ ィ ス ク イ メ ージに、 ARM 用の
OpenCV ラ イ ブ ラ リ のプ リ コ ンパ イ ル済みバージ ョ ン が含 ま れてい ま す。 デバ イ ス ツ リ ー も 変更 さ れ、 画像処理フ ィ ル
タ ー内の制御レ ジ ス タ にア ク セ スす る ための汎用 UIO Linux カーネル ド ラ イ バーの適切な コ ン フ ィ ギ ュ レーシ ョ ンが含ま
れてい ます。 apps デ ィ レ ク ト リ には HLS リ フ ァ レ ン ス デザ イ ンが含まれてい ます。 デザ イ ンの再構築を簡単にす る ため、
次のそれぞれを タ ーゲ ッ ト と す る makefile も 提供 さ れてい ます。
•
make all -- sw お よ び hw の作成、 sd_image の生成
•
make csim -- C シ ミ ュ レーシ ョ ンの実行
•
make cosim -- C/RTL 協調シ ミ ュ レーシ ョ ンの実行
•
make core -- 高位合成の実行 と IP コ アのエ ク ス ポー ト
•
make bitstream -- ビ ッ ト ス ト リ ームの生成
•
make boot -- ブー ト イ メ ージの生成
•
make elf -- ソ フ ト ウ ェ ア アプ リ ケーシ ョ ンの作成
•
make help -- ヘルプの出力
XAPP1167 (v3.0) 2015 年 6 月 24 日
japan.xilinx.com
10
OpenCV ア プ リ ケーシ ョ ン を高速化する手順
各デザ イ ン デ ィ レ ク ト リ (apps/<design name>) で、 Linux コ マ ン ド ラ イ ン ま たは Windows の Vivado HLS コ マ ン ド プ
ロ ンプ ト か ら make all を実行す る と デザ イ ン全体が再作成 さ れ、 実行可能な SD カー ド イ メ ージが生成 さ れます。 新 し い
ア プ リ ケーシ ョ ン を作成す る には、 最初の apps/ サブデ ィ レ ク ト リ の 1 つを コ ピ ー し 、 ソ ー ス コ ー ド を変更 し て適切な
makefile ルールを実行 し ます。 FPGA デザ イ ンの全体構造は C コ ー ド ベース では変更 さ れないため、 ソ ース コ ー ド の変更
は生成 さ れ る RTLの イ ン タ ーフ ェ イ ス を変更 し ない も のに限 ら れます。 あ る いは、 FPGA デザ イ ンで も 対応す る 箇所を変
更す る のであれば、 イ ン タ ーフ ェ イ ス を変更で き ます。
OpenCV ア プ リ ケーシ ョ ン を高速化する手順
こ のセ ク シ ョ ンでは、 OpenCV アプ リ ケーシ ョ ン を高速化 し 、 ボー ド でテ ス ト す る ウ ォー ク スルーを示 し ます。 OpenCV ア
プ リ ケーシ ョ ンの例 と し て、 画像処理の簡単な 2D フ ィ ル タ ーであ る erode (収縮処理) を考え ます。 こ こ で示すウ ォー ク ス
ルーに従っ て画像処理アルゴ リ ズ ム を置 き 換え る こ と で、 独自の OpenCV アプ リ ケーシ ョ ン を簡単に作成で き ます。 こ の
アプ リ ケーシ ョ ン ノ ー ト に付属す る 2 つの リ フ ァ レ ン ス デザ イ ン も 、 こ の手順に従っ て利用で き ます。
こ の目的を達成す る には、 次の前提要件があ り ます。
•
ザ イ リ ン ク ス の Zynq-7000 SoC ZC702 評価キ ッ ト ま たは Zynq-7000 SoC ビデオお よ び画像処理キ ッ ト
•
HDMI™ ポー ト ま たは DVI ポー ト 搭載 (HDMI/DVI ケーブルが必要)、 解像度 1920x1080、 60 フ レーム レー ト 表示対応
のモニ タ ー
•
Linux/Windows ホ ス ト
•
XAPP1167 パ ッ ケージ ( こ のアプ リ ケーシ ョ ン ノ ー ト に付属)
•
Vivado Design Suite 2014.4 System Edition
•
(オプシ ョ ン) HDMI ラ イ ブ ビデオ入力を有効にする ための FMC-IMAGEON ボー ド
次に説明す る 手順の大半は、 Linux コ マ ン ド ラ イ ンで示 さ れます。 Windows 用には、 同 じ コ マ ン ド に対応す る Vivado HLS
コ マ ン ド プ ロ ン プ ト を適切に設定 さ れたパ ス で起動す る バ ッ チ フ ァ イ ルが提供 さ れ ます。 Vivado ツールがデフ ォ ル ト の
場所に イ ン ス ト ール さ れていない場合は、 イ ン ス ト ール パ ス を反映す る よ う にバ ッ チ フ ァ イ ルを変更す る 必要があ り ま
す。
最初にパ ッ ケージの内容を展開 し 、 ホーム デ ィ レ ク ト リ と し て使用 し ます。
$ export VIDEO_HOME=/path/to/the/extracted/package/root
$ cd ${VIDEO_HOME}
$ ls
apps doc hardware ready_to_test software xapp1167_windows.bat
注記 : FMC-IMAGEON ボー ド を使用す る 場合は、 行 95 の apps/common/configure.mk を WITH_FMC := y に変更 し 、 適切な
デバ イ ス ツ リ ーを選択 し ます。 デフ ォ ル ト は WITH_FMC := n です。
手順 1 : 新 し いデザイ ン を作成する
pass-through デザ イ ンは、 画像処理デザ イ ン のテ ン プ レー ト と し て使用で き ます。 新 し い erode デザ イ ン を作成す る には、
apps デ ィ レ ク ト リ 内の pass-through デザ イ ン デ ィ レ ク ト リ を コ ピー し ます。
$ cd ${VIDEO_HOME}/apps
$ cp –r pass-through erode
$ cd erode
ソ ース フ ァ イ ル opencv_top.cpp を編集 し 、 cvCopy 関数を cvErode 関数で置 き 換え ます。
void opencv_image_filter(IplImage *src, IplImage *dst) {
cvErode(src, dst);
}
ソ ース フ ァ イ ル top.cpp を編集 し 、 各 イ ン タ ーフ ェ イ ス関数の間に HLS ビデオ ラ イ ブ ラ リ の erode 関数 hls::Erode を追加
し ます。
44 void image_filter(AXI_STREAM& video_in, AXI_STREAM& video_out, int rows, int cols) {
XAPP1167 (v3.0) 2015 年 6 月 24 日
japan.xilinx.com
11
OpenCV ア プ リ ケーシ ョ ン を高速化する手順
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
//Create AXI streaming interfaces for the core
#pragma HLS INTERFACE axis port=video_in bundle=INPUT_STREAM
#pragma HLS INTERFACE axis port=video_out bundle=OUTPUT_STREAM
#pragma HLS INTERFACE s_axilite port=rows bundle=CONTROL_BUS offset=0x14
#pragma HLS INTERFACE s_axilite port=cols bundle=CONTROL_BUS offset=0x1C
#pragma HLS INTERFACE s_axilite port=return bundle=CONTROL_BUS
#pragma HLS INTERFACE ap_stable port=rows
#pragma HLS INTERFACE ap_stable port=cols
YUV_IMAGE img_0(rows, cols);
YUV_IMAGE img_1(rows, cols);
#pragma HLS dataflow
hls::AXIvideo2Mat(video_in, img_0);
hls::Erode(img_0, img_1);
hls::Mat2AXIvideo(img_1, video_out);
}
C シ ミ ュ レーシ ョ ン を実行 し て アルゴ リ ズ ム を検証 し ます。
$ make csim
こ れに よ り 、 hls::Erode を実行 し て出力 イ メ ージ を生成 し 、 OpenCV 関数 cvErode に よ っ て生成 さ れ る ゴールデン イ
メ ージ と 比較す る テ ス ト が作成 さ れます。 「Test passed!」 と 表示 さ れ る と 、 2 つの イ メ ージが ま っ た く 同一であ る こ と がわ
か り ます。 出力 イ メ ージ を表示 し て、 収縮処理の結果を検証す る こ と を推奨 し ます。
手順 2 : ARM 用 OpenCV ア プ リ ケーシ ョ ン を作成する
ホ ス ト 上で ARM アプ リ ケーシ ョ ン を ク ロ ス ビル ド す る には、 ARM GNU ツールが イ ン ス ト ール さ れてい る 必要があ り ま
す。 ARM GNU ツールは、 ザ イ リ ン ク ス の ソ フ ト ウ ェ ア開発キ ッ ト (SDK) に含まれてい ます。 こ のデザ イ ンでは、 次の コ
マ ン ド ルールを実行 し て ARM アプ リ ケーシ ョ ン を作成 し ます。
$ make elf
ビル ド が完了す る と 、ARM 実行フ ァ イ ル video_cmd が apps/erode/software/xsdk/video_cmd/bin/video_cmd
に作成 さ れます。 ARM アプ リ ケーシ ョ ンには、 プ ロ セ ッ サで OpenCV の erode を実行する オプシ ョ ンがあ り ます。
手順 3 : Vivado HLS を実行 し て IP コ ア を作成する
こ の手順では、 Vivado HLS を使用 し て ビデオ ラ イ ブ ラ リ 関数を合成 し 、 次の手順のために IP コ ア を作成 し ます。 次の コ
マ ン ド を実行 し て先に進みます。
$ make core
注記 : こ こ では手順を迅速化す る ために C/RTL 協調シ ミ ュ レーシ ョ ン を省略 し てい ます。 ただ し 、 Vivado HLS デザ イ ン で
は常に協調シ ミ ュ レーシ ョ ン を実行す る こ と を推奨 し ます。 協調シ ミ ュ レーシ ョ ンは、 次の コ マ ン ド で実行で き ます。
$ make cosim
手順 4 : ア ク セ ラ レー タ を使用 し て新 し いシ ス テムを構築する
次の コ マ ン ド は、 新たに生成 さ れた IP コ ア をハー ド ウ ェ ア プ ロ ジ ェ ク ト に コ ピー し 、 FPGA イ ンプ リ メ ン テーシ ョ ン フ
ロ ーを開始 し て ビ ッ ト ス ト リ ーム を生成 し ます。
$ make bitstream
次に、 ビ ッ ト ス ト リ ーム フ ァ イ ルに よ っ て、 SD カー ド のブー ト イ メ ージが、 プ リ コ ンパ イ ル済み FSBL 実行フ ァ イ ルお
よ びプ リ コ ンパ イ ル済み U-Boot 実行フ ァ イ ル と 共に生成 さ れます。
$ make boot
XAPP1167 (v3.0) 2015 年 6 月 24 日
japan.xilinx.com
12
OpenCV ア プ リ ケーシ ョ ン を高速化する手順
ブー ト イ メ ージは、 boot/BOOT.bin に置かれ ます。 こ こ で、 新 し いデザ イ ンのハー ド ウ ェ ア と ソ フ ト ウ ェ アの両方がボー
ド でテ ス ト で き ます。 最後に、 次の コ マ ン ド を実行 し て、 オン ボー ド テ ス ト 用の sd_image を生成 し ます。
$ make all
注記 : デザ イ ン デ ィ レ ク ト リ で make all を実行す る と 、 手順 2 ~ 4 が実行 さ れます。 こ の処理が完了す る と 、 使用可能
な状態の SD カー ド イ メ ージが ./sd_image に作成 さ れます。
手順 5 : ボー ド で テ ス ト を行 う
生成 さ れた sd_image/ 内のすべてのフ ァ イ ル と デ ィ レ ク ト リ を、 SD カー ド のルー ト デ ィ レ ク ト リ に コ ピー し ます。
ボー ド を次のよ う にセ ッ ト ア ッ プ し ます。
•
HDMI ま たは HDMI/DVI ケーブルを使用 し て、 ZC702 ボー ド の HDMI 出力ポー ト にモニ タ ーを接続 し ます。
•
UART 通信用に、 ZC702 ボー ド の USB UART と 表示 さ れた Mini USB ポー ト J17 に USB Mini-B ケーブルを接続 し 、 ホ
ス ト PC の空 き USB ポー ト に USB Type-A ケーブル コ ネ ク タ を接続 し ます。
•
ZC702 ボー ド に電源を接続 し ます。
•
(オプシ ョ ン) 1080p60 ビデオを出力する ビデオ ソ ース を FMC_IMAGEON ボー ド の HDMI 入力ポー ト に接続 し 、 ラ イ
ブ入力を有効に し ます。
•
(オプシ ョ ン) RJ45 イ ーサネ ッ ト ケーブルを使用 し て、 ZC702 ボー ド の イ ーサネ ッ ト ポー ト を ネ ッ ト ワー ク に接続 し
ます。
図 6 に示す よ う に ス イ ッ チが設定 さ れてい る こ と を確認 し ます。 こ れに よ り 、 ZC702 ボー ド を SD カー ド か ら ブー ト で き
ます。
X-Ref Target - Figure 6
図 6 : ZC702 ボー ド 上の SW16 ス イ ッ チの設定
端末プ ロ グ ラ ム (TeraTerm な ど) を 開 き 、 Baud Rate = 115200、 Dat a bits = 8、 Parity = None、 Stop Bits = 1、 Flow control =
None に設定 し ます。
sd_image の内容を格納 し た SD カー ド を、 ZC702 ボー ド の SD ス ロ ッ ト に挿入 し ます。
ボー ド の電源を オンに し て、 シ ス テ ムが起動す る のを待ち、 root/root で ロ グ イ ン し ます。
コ マ ン ド ラ イ ン モー ド でアプ リ ケーシ ョ ン を実行 し ます。
root@zynq:~# run_video.sh -cmd
XAPP1167 (v3.0) 2015 年 6 月 24 日
japan.xilinx.com
13
ま とめ
ま とめ
OpenCV は、 コ ン ピ ュ ー タ ー ビ ジ ョ ン デザ イ ンの開発に便利な フ レーム ワー ク です。 OpenCV アプ リ ケーシ ョ ンは、 ARM
アーキ テ ク チ ャ 向けに再 コ ンパ イ ル し て Zynq デバ イ ス で実行す る こ と に よ り 、 エンベデ ッ ド シ ス テ ムで も 使用可能にな
り ます。 ま た、 Vivado HLS の合成可能ビデオ ラ イ ブ ラ リ を利用 し て、 OpenCV アプ リ ケーシ ョ ン を高速化 し 、 高精細ビデ
オ を リ アル タ イ ムで処理で き ます。
参考資料
1.
www.opencv.org
2.
『AXI リ フ ァ レ ン ス ガ イ ド 』 (UG761)
3.
『Video Timing Controller 製品ガ イ ド 』 (PG016)
4.
『Vivado Design Suite ユーザー ガ イ ド : 高位合成』 (UG902 : 英語版、 日本語版)
5.
『Zynq ベース TRD』 (UG925)
6.
Vivado HLS の ウ ェ ブ ページ : japan.xilinx.com/hls
改訂履歴
次の表に、 こ の文書の改訂履歴を示 し ます。
日付
バージ ョ ン
内容
2015 年 6 月 24 日
v3.0
最新 リ リ ース を反映す る よ う に 「 リ フ ァ レ ン ス デザ イ ン」 お よ びその他の
セ ク シ ョ ン を更新。
2013 年 7 月 23 日
v2.0
最新 リ リ ース を反映す る よ う に各セ ク シ ョ ン を更新。
2013 年 3 月 20 日
v1.0
初版
XAPP1167 (v3.0) 2015 年 6 月 24 日
japan.xilinx.com
14
Fly UP