More Related Content
Similar to ラプラシアンフィルタをZedBoardで実装(ソフトウェアからハードウェアにオフロード) (20)
ラプラシアンフィルタをZedBoardで実装(ソフトウェアからハードウェアにオフロード)
- 2. 説明の流れ
ラプラシアンフィルタ
ZedBoard
Zynq
カメラ画像表示回路のハードウェア
ZedBoard用のLinuxとフレームバッファ
ラプラシアンフィルタのソフトウェア実装
ソフトウェアの最適化
Vivado HLSでラプラシアンフィルタ式のみをハードウェア化
Vivado HLSでラプラシアンフィルタ回路全体をハードウェア化
自作AXI Master IPによるラプラシアンフィルタのハードウェア化
再度Vivado HLSでラプラシアンフィルタ回路全体をハードウェア化
まとめ
2
- 5. ZedBoardとは?
Digilent社のZynq搭載ボード
Zynq-7000 AP SoC XC7Z020-CLG484
Dual-core ARM Cortex A9 + FPGA
Memory:
512 MB DDR3
256 Mb Quad-SPI Flash
4 GB SD card
Onboard USB-JTAG Programming
10/100/1000 Ethernet
USB OTG 2.0 and USB-UART
PS & PL I/O expansion (FMC, Pmod™, XADC)
Multiple displays (1080p HDMI, 12-bit VGA, 128 x 32
OLED)
I2S Audio CODEC
5
- 8. Zynq-7000について
デュアル・ARMプロセッサ(PS) + FPGA(PL)
28nm HPLプロセス
ロジック部分は7シリーズ相当
最大1GHz動作のDual Cortex-A9
ZedBoardのZynq-7020は667MHz
PS(Processing System)とPL(Programming Logic)は
AXIバスで接続
PS部分にDDRコントローラ、豊富なI/Oペリフェラル
FPGAはARMプロセッサのスレーブ
ARMプロセッサがブートして、FPGAをコンフィグ
FPGA単体ではブート出来ない
8
- 9. Zynq-7000の用途
画像処理
自動車関連
自動運転、自動ブレーキなど
医療機器
CTなど?
カメラ関係
スマートカメラ、放送用カメラ
プリンタ複合機
産業用モーター制御
ソフトウェア無線
GPUが無いので、パソコンやAndroidになるのは不向き?
9
- 11. PSとPLのインターフェース
AXIバスでPSとPLを接続
AXI_HPスレーブ・インターフェース
32ビット幅または64ビット幅のスレーブ4ポート
FAXI_MAX 250MHz
HPポート、200MHz x 64ビット = 1.6GB/s
AXI_GPマスタ&スレーブ・インターフェース
データバス32ビット幅のマスタ、スレーブそれぞれ2ポート
AXI_ACPスレーブ・インターフェース
64ビットAXIスレーブ1ポート
SCUに接続されて、CPUとPL間でキャッシュ・コヒーレンシを維持
キャッシュに読み書きできるのでCPUとのデータ交換のレイテンシ
が短い
11
- 14. カメラ画像表示の概要
Digilent Linux
ペンギン2匹をHDMIに表示
ZedBoard_OOB_Design
Digilent LinuxのPL内のハードウェア
AXI VDMAとHDMI制御回路でディスプレイに表示
オーディオ回路
CMOSカメラ・インターフェース回路
mt9d111_inf_axi_master_0
ディスプレイ表示回路
bitmap_disp_cntrler_axi_master_0
VGA出力とHDMI出力
HDMIは接続無し
14
- 19. 使用するOSとフレームバッファ
Digilent Linux
カメラ用のフレームバッファはどうしよう?
Linux初心者 - フレームバッファを設定できない
他の領域を使うとLinux本体を壊す可能性がある
そうだ。Digilent Linuxの標準ではHDの画面にペンギン
2匹のみ表示されているので、余っている部分を使う
表示サイズは800x600なので、それで十分
その下にラプラシアンフィルタの表示領域を確保
19
- 22. フレームバッファを使うために
Linuxカーネル調査
ZedBoardのLinuxカーネルコンパイルのテスト
UbuntuでDigilent Linuxのコンパイルのテスト - 成功
Digilent Linuxを解析して、フレームバッファのアドレスをアロケート
している部分を特定した
linux-digilent-master/drivers/gpu/drm/drm_fb_cma_helper.c の
drm_fbdev_cma_create()
FBのアドレスをprintk()で起動メッセージに表示
SDKでDevice Treeを生成
xilinx.dtsを生成
DTCでDevice Tree をコンパイル
xilinx.dts をコンパイルして、xilinx.dtb を生成
ZedBoard用Digilent LinuxのSysfs
/sys/devices/axi.0にAXIバスIPのアドレスのディレクトリ
Linux起動時(/etc/init.d/rcS)にFBのアドレスを調べる
カメラ表示用FBの開始アドレスをファイル(fb_start_addr.txt)に書く
カメラ表示用FBの開始アドレスを各IPのアドレス開始番地レジスタに書
く22
- 26. ソフトウェアのプロファイリング1
gettimeofday()を入れて時間計測
mmap()、munmap()の回数測定
実装1のmmap(), munmap()数と実行時間
rmmap_cnt = 4294836
wmmap_cnt = 480000
total time = 138 sec
実装2のmmap(), munmap()数と実行時間
rmmap_cnt = 1223626
wmmap_cnt = 469
total time = 37 sec
実装2の方がmmap(), munmap()数が圧倒的に少ない
http://marsee101.blog19.fc2.com/blog-entry-
2597.html
26
- 29. ソフトウェアの最適化
ARMの1st Dキャッシュは32kバイト
3ライン分の9.6kバイトは入るかも?少なくとも2ndキャッシュ
最初は3ライン分Readして、それを使って1ライン分のラプラ
シアンフィルタの処理を行う(ローカル変数を使用して、キャッ
シュにPrefetch)
次からは、前の2ラインは使えるので、1ラインだけReadする
結果
処理時間 439msec
rmmap_cnt = 469
wmmap_cnt = 469
mmap(), munmap() の処理時間は、469回 x 2 x 28usec ≒
26.3msec それほど大きい割合では無くなった
http://marsee101.blog19.fc2.com/blog-entry-2598.html
29
- 30. ソフトウェアの最適化
(ハードウェアと同じ方式)
フレームの最初に2ラインを読む
2つピクセルを保存
1つピクセルを読んで、保存しながら、真ん中のラプラシ
アン・フィルタの値を計算していく
処理時間434msec ー 更に5msecほど短縮
conv_rgb2y() 関数で使用しているfloatをintに変換
係数が小数なので、256倍して整数に変換し、結果を
256で割る
処理時間391msec ー 更に45msecほど短縮
http://marsee101.blog19.fc2.com/blog-entry-
2599.html
30
- 31. Vivado HLSについて
Xilinx社の純正高位合成ツール
C, C++, SystemCをVHDLやVerilog HDLに変換
EDK用のIPやVivado用IPを生成
AXIバスの自動生成機能
AXI Lite Slave IP(レジスタ設定)、AXI Master IP単体でも使
える
ソフトウェアからハードウェアにオフロード
ラプラシアンフィルタをCコードからVerilog HDLに変換できる
のでは?
ラプラシアンフィルタ式のみをハードウェア化
AXI Lite Slaveバス
ラプラシアンフィルタ回路全体をハードウェア化
AXI Masterバス
31
- 32. Vivado HLSでラプラシアンフィルタ式のみを
ハードウェア化1
// laplacian_filter axi lite slave version
#include <stdio.h>
int laplacian_filter(int *x0y0, int *x1y0, int *x2y0, int *x0y1, int *x1y1,
int *x2y1, int *x0y2, int *x1y2, int *x2y2)
{
#pragma HLS PIPELINE
#pragma HLS INTERFACE ap_hs port=x0y0
#pragma HLS INTERFACE ap_vld port=x1y0
#pragma HLS INTERFACE ap_vld port=x2y0
#pragma HLS INTERFACE ap_vld port=x0y1
#pragma HLS INTERFACE ap_vld port=x1y1
#pragma HLS INTERFACE ap_vld port=x2y1
#pragma HLS INTERFACE ap_vld port=x0y2
#pragma HLS INTERFACE ap_vld port=x1y2
#pragma HLS INTERFACE ap_vld port=x2y2
#pragma HLS RESOURCE variable=x0y0 core=AXI4LiteS
metadata="-bus_bundle BUS_A"
#pragma HLS RESOURCE variable=x1y0 core=AXI4LiteS
metadata="-bus_bundle BUS_A"
#pragma HLS RESOURCE variable=x2y0 core=AXI4LiteS
metadata="-bus_bundle BUS_A"
#pragma HLS RESOURCE variable=x0y1 core=AXI4LiteS
metadata="-bus_bundle BUS_A"
#pragma HLS RESOURCE variable=x1y1 core=AXI4LiteS
metadata="-bus_bundle BUS_A"
#pragma HLS RESOURCE variable=x2y1 core=AXI4LiteS
metadata="-bus_bundle BUS_A"
#pragma HLS RESOURCE variable=x0y2
core=AXI4LiteS metadata="-bus_bundle BUS_A"
#pragma HLS RESOURCE variable=x1y2
core=AXI4LiteS metadata="-bus_bundle BUS_A"
#pragma HLS RESOURCE variable=x2y2
core=AXI4LiteS metadata="-bus_bundle BUS_A"
#pragma HLS RESOURCE variable=return
core=AXI4LiteS metadata="-bus_bundle BUS_A"
int y;
y = -*x0y0 -*x1y0 -*x2y0 -*x0y1 +8*(*x1y1) -*x2y1 -
*x0y2 -*x1y2 -*x2y2;
if (y<0)
y = 0;
else if (y>255)
y = 255;
return(y);
}
32
- 35. Vivado HLSでラプラシアンフィルタ式のみを
ハードウェア化4
ハードウェア化の手順
ラプラシアンフィルタの式のみ演算するAXI Lite Slave IPを
XPSプロジェクトに追加(Vivado HLSで生成)
ISEで論理合成、インプリメント、ビットストリームの生成
ハードウェアをエクスポートしてSDKを立ち上げる
SDKで制御用のソフトウェアを作ってリモートデバック
結果は1.94sec で、ソフトウェアに比べて5倍遅くなった
予想していた、なぜか?
計算量に比べて、IOの時間が長すぎる
バスプロトコルもソフトウェアで生成する
http://marsee101.blog19.fc2.com/blog-entry-
2607.html
35
- 40. 自作AXI Master IPによるラプラシアンフィルタ
のハードウェア化1
Vivado HLSでラプラシアンフィル
タをまるごとハード化したが動作
せず(バグのため)
自分でVerilog HDLを使ってラプ
ラシアンフィルタのハード化をする
ことにした
ハード特有の構造はとらないで、
わざとC言語からHLSで合成した
ようにメモリベースで作る
http://marsee101.blog19.fc2.co
m/blog-entry-2648.html
40
- 41. 自作AXI Master IPによるラプラシアンフィルタ
のハードウェア化2
レジスタ設定用のAXI4 Lite Slave モジュール
lap_filter_axim_LiteS_if.v はVivado HLSが生成したファイ
ルを流用した
http://marsee101.blog19.fc2.com/blog-entry-2657.html
AXI4 Master IPは自作した
http://marsee101.blog19.fc2.com/blog-entry-2645.html
http://marsee101.blog19.fc2.com/blog-entry-2646.html
http://marsee101.blog19.fc2.com/blog-entry-2647.html
lap_filter_axim.v
トップファイル
line_read_and_y.v
HORIZONTAL_PIXELS 分のピクセルデータを start_addr から
AXI4 Master Read
RGB - Y変換を行い、y_data へ出力する
Dual_Port_Memory.v
41
- 43. 自作AXI Master IPによるラプラシアンフィルタ
のハードウェア化4
一応完成。
一応と付けたのは連続で動かすと動かないから
いろいろやることあるし、とりあえず一発動けば良いや
結果
処理時間 23.6msec
最適化したソフトウェア laplacian_filter.elf の実行時間は約
398msec だったので、398 / 23.6 ≒ 16.9倍、高速になった
ハードウェア処理のラプラシアン・フィルタ部分のみの経過時
間 10.1msec
60fpsのフレームレートの時間間隔は16.7msec
それより短いので完成
http://marsee101.blog19.fc2.com/blog-entry-
2661.html
43
- 44. 再度Vivado HLSでラプラシアンフィルタ回路全
体をハードウェア化1
匿名希望様にデバックして頂いてバグとVivado HLSのレジ
スタアクセスの書き方がわかった
もう一度、Vivado HLSでラプラシアンフィルタ全体のIP化に
挑戦
結果
ラプラシアンフィルタの出力画像がソフトウェアと違う
ラプラシアンフィルタ関数、RGB-Y変換関数は同じ記述なのになぜ
だろうか?
処理時間は100msec
ソフトウェアの約4倍高速だけど、微妙な値
結果のURL
http://marsee101.blog19.fc2.com/blog-entry-2737.html
ソースのURL
http://marsee101.blog19.fc2.com/blog-entry-2738.html
44
- 47. まとめ
ZedBoardにカメラを付けて、画像をディスプレイに表示
ソフトウェアでラプラシアンフィルタを実装
最適化を行った。最終的に0.39秒で実行
Vivado HLSでラプラシアンフィルタ式のみをAXI Lite
Slave IPとして実装したが、ソフトウェアより遅くなった
(1.94秒)
AXI4 Master IPとしてラプラシアンフィルタ全体をハード
ウェアで実装した(0.03秒)
Vivado HLSでラプラシアンフィルタ全体をハードウェア
化(0.1秒)
この発表のラプラシアンフィルタについての情報
http://marsee101.web.fc2.com/lap_filter_soft2hard.html47
- 48. その後
48
Vivado HLS 2014.1から高位合成したラプラシアンフィルタ
の結果が正しくなった
http://marsee101.blog19.fc2.com/blog-entry-2800.html
Vivado HLSは、AXIバス関連のディレクティブが変更になっ
て、このスライドに書いてあるディレクティブではコンパイルで
きなくなった
Vivado HLSはとても便利に使うことができる
Vivado HLSでもCソースコードを最適化すると、15.3msでラ
プラシアンフィルタ処理を完了できた(使用したボードは
ZYBO)
http://marsee101.blog19.fc2.com/blog-entry-3120.html
これからは、Vivado HLSで書ける所はなるべく使っていこう
と思う
2015/07/23 更新