1
Vivado HLS勉強会5
(AXI4 Stream)
小野 雅晃
2
注意点
● 元はVivado HLS 2014.4で作製した資料を修正が
必要なところだけVivado HLS 2015.4に修正して
あります
● よって、Vivado HLSのウインドウにOpen Wave
viewer…が無い画面がありますがご了承下さい
3
これからすること
● ラプラシアンフィルタをAXI4 Streamバス用のIPと
する
● AXI4 Streamについて勉強しよう(サイドチャネル
付き)
● 今回はStream入出力としたいので、C++を使用す
る
●
4
これから何するのか?
● Vivado HLS 2015.4
– AXI4 Streamのラプラシアンフィルタ用プロジェクト作製
– ソースコードなどをコピーして、Add Sources
– Cシミュレーション
– CからHDLを生成
– C/RTLコシミュレーション
– VivadoでC/RTLコシミュレーションの波形を確認
– IPとしてパッケージ
5
AXI4 Stream
●
動画の画像データや、カメラのフレームバッファのデータなど
のストリームデータ
●
つまり前から順番にデータを流す(シーケンシャル・アクセス)
● Master からSlave にデータを転送
● プロトコルはAXI4 Master,AXI4 Slave, AXI4 Lite Slaveと比
較しても簡単
●
ほとんどの信号がオプション
● FPGAの部屋のAXI4 Streamの解説ページ
– http://marsee101.blog19.fc2.com/blog-entry-2454.html
6
AXI4 Stream信号
7
AXI4 Stream
(スカラーデータのストリーム例)
8
AXI4 Stream
(複素数スカラーデータのストリーム例)
9
Vivado HLSでのAXI4 Stream 1
● サイドチャネル無しのAXI4 Stream
– 高位合成 UG902(v2015.2) 2015年6月24日146ペー
ジ
– http://japan.xilinx.com/support/documentation/sw_m
anuals_j/xilinx2015_2/ug902-vivado-high-level-synt
hesis.pdf
– AXI4 Streamの信号線はTVALD, TREADY, TDATAの
3種類のみ #include <ap_int.h>
#include <hls_stream.h>
int fil_axis_sample(hls::stream<ap_int<32> >& in_data,
hls::stream<ap_int<32> >& out_data){
#pragma HLS INTERFACE axis port=in_data
#pragma HLS INTERFACE axis port=out_data
#pragma HLS INTERFACE s_axilite port=return
10
Vivado HLSでのAXI4 Stream 2
● サイドチャネルありのAXI4 Stream
– 高位合成 UG902(v2015.2) 2015年6月24日147ページ
– http://japan.xilinx.com/support/documentation/sw_ma
nuals_j/xilinx2015_2/ug902-vivado-high-level-synthe
sis.pdf
– ap_axi_sdata.hをインクルードする (ap_axis, ap_axiu)
ap_axis のテンプレートを引用する
template<int D,int U,int TI,int TD>
struct ap_axis{
ap_int<D> data;
ap_uint<D/8> keep;
ap_uint<D/8> strb;
ap_uint<U> user;
ap_uint<1> last;
ap_uint<TI> id;
ap_uint<TD> dest;
};
11
サイドチャネルありのAXI4 Stream続き
● サイドチャネルありのAXI4 StreamのC++コード例
● user – 1bit, id – 1bit, dest – 1bit
#include <ap_int.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>
int fil_axis_side_ch(hls::stream<ap_axis<32,1,1,1> >& ins,
hls::stream<ap_axis<32,1,1,1> >& outs){
#pragma HLS INTERFACE axis port=ins
#pragma HLS INTERFACE axis port=outs
#pragma HLS INTERFACE s_axilite port=return
12
AXI4 Stream版
ラプラシアンフィルタIPブロック図
ラプラシアンフィルタ
処理部
AXI4 Stream入力
インターフェース
AXI4 Stream出力
インターフェース
AXI4
Stream
AXI4
Stream
13
ラプラシアンフィルタ処理部
画像の
輝度成分
AXI4 Stream出力
現在のAXI4 Stream入力
画像の
輝度成分
AXI4 Stream出力
ラプラシアンフィルタ処理
データ
現在のAXI4 Stream入力
nクロック
n+1クロック
14
これから何するのか?
● Vivado HLS 2015.4
– AXI4 Streamのラプラシアンフィルタ用プロジェクト作製
– ソースコードなどをコピーして、Add Sources
– Cシミュレーション
– CからHDLを生成
– C/RTLコシミュレーション
– VivadoでC/RTLコシミュレーションの波形を確認
– IPとしてパッケージ
15
Vivado HLS 2015.4の起動と
新規プロジェクト作製
● Vivado HLS 2015.4を起動する
● Create New Projectをクリックして、新規プロジェクトを作製する
16
プロジェクト作成パスと
プロジェクト名の指定
● Locationに適当なフォルダを指定する(ここでは、V_HLS_study_meetingを指
定した)
● Project nameにlap_filter_axisを入力する
● Next >ボタンをクリックする
17
Add/Remove C-based source files
● デフォルト状態で、Next >ボタンをクリックする
18
Add/Remove C-based testbench
files
● デフォルト状態で、Next >ボタンをクリックする
19
Solution Configuration 1
● solution1の設定を行う
● Clock Periodは10(ns)なので、そのままとする
● FPGAの種類を選択するためにPart Selectionの…ボタンをクリックする
20
Device Selection Dialog
● Filterを上図のように設定する
● xc7z010clg400-1を選択して、OKボタンをクリックする
21
Solution Configuration 2
● Part SelectionのPartにxc7z010clg400-1が設定された
● Finishボタンをクリックする
22
Vivado HLS起動
● Vivado HLSが起動した
23
これから何するのか?
● Vivado HLS 2015.4
– AXI4 Streamのラプラシアンフィルタ用プロジェクト作製
– ソースコードなどをコピーして、Add Sources
– Cシミュレーション
– CからHDLを生成
– C/RTLコシミュレーション
– VivadoでC/RTLコシミュレーションの波形を確認
– IPとしてパッケージ
24
ラプラシアンフィルタの出力画像
● 回り1ピクセルを0にするから、左2ピクセル、上2行を
0にするに変更した
● この方が条件分岐が少なくて済む
25
lap_filter_axis.cpp
● フル・チューン済みのAXI4 Stream版ラプラシアンフィルタ
(ハードウェア)
● サイドチャネルありのAXI4 Stream
● hls::stream<ap_axis<32,1,1,1> >& ins
– data 32ビット、user 1ビット、id 1ビット、dest 1ビット
● フレームの最初のデータを送るときにだけuserが1になるの
で、userが1になるのを待つ(AXI VDMAの仕様)
● ラプラシアンフィルタの出力ストリーミングの場合もuserの仕
様は同じ
● 行の最後でlastをアサートする
● またtu1978さんにサンプルコードを頂きました。ありがとうご
ざいました。
26
line_bufのディレクティブ
● unsigned int line_buf[2][HORIZONTAL_PIXEL_WIDTH];
● #pragma HLS array_partition variable=line_buf block
factor=2 dim=1
– block factor=2 dim=1 - 1次元、つまり[2]を2つのブロック
(BRAM)に分ける
● #pragma HLS resource variable=line_buf core=RAM_2P
– RESOURCEディレクティブにcoreオプションを付けるとコアを指定
できる
– RAM_2P - 1つのポートでReadできて、もう2つのポートで
Read/WriteできるBRAM
– RESOURCEディレクティブにLATENCYオプションを付ければレイ
テンシを指定できる
27
UNROLLディレクティブ
Vivado Design Suite ユーザー ガイド 高位合成 UG902 (v2015.1) 2015 年 4 月 1 日
177ページ「 図 1 69 :‐ ループの展開」を引用 
28
lap_filter_axis_tb.cpp
● test.bmpをオープンする
● UUTにダミー・データを送ってから、userを1にアサート
してtest.bmpの最初のデータを送る
– BMPファイルのデータは、一番下の行が先に出てくるので行
を逆順にする
● その後、userを0にして、test.bmpのデータを送る
● 行の最後ではデータと一緒にlastを1にする
●
ハードウェアとソフトウエアのラプラシアンフィルタ実装
のデータを比べる
● ハードウェアの出力データをtemp_lap.bmpに書き込む
29
ファイルをコピー
● Vivado_HLS勉強会FilesVivado HLS勉強会5用フォルダの
lap_filter_axis.cpp、lap_filter_axis.h、lap_filter_axis_tb.cpp、bm
p_header.h、test.bmpをlap_filter_axisフォルダへコピーする
30
SourceにAdd Files...
● ExplorerのSourceを右クリックし、右クリックメ
ニューからAdd Files...を選択する
31
”開く”ダイアログ
● lap_filter_axis.cpp, lap_filter_axis.hを選択して”
開く”ボタンをクリックする
32
Test Bench
● Sourceにlap_filter_axis.cpp, lap_filter_axis.hが入った
● 同様にTest Benchを右クリックし、右クリックメニューか
らAdd Files...を選択した
33
”開く”ダイアログ
● lap_filter_axis_tb.cpp、bmp_header.h、test.bmpを選択し
て、”開く”ボタンをクリックする
● 3つのファイルがExplorerのTest Benchに入った
34
これから何するのか?
● Vivado HLS 2015.4
– AXI4 Streamのラプラシアンフィルタ用プロジェクト作製
– ソースコードなどをコピーして、Add Sources
– Cシミュレーション
– CからHDLを生成
– C/RTLコシミュレーション
– VivadoでC/RTLコシミュレーションの波形を確認
– IPとしてパッケージ
35
Cシミュレーション
● ProjectメニューからRun C Simulationを選択する
36
C Simulation Dialog
● ダイアログが開く
● OKボタンをクリックする
37
Cシミュレーション結果
● Success HW and SW results matchと表示され
た
38
test_lap.bmp
● lap_filter_axissolution1csimbuildに
test_lap.bmpが生成された
39
BMPファイルの
ラプラシアンフィルタ処理
● test.bmpをラプラシアンフィルタ処理した結果を
test_lap.bmpに書き込んだ
test.bmp
test_lap.bmp
40
これから何するのか?
● Vivado HLS 2015.4
– AXI4 Streamのラプラシアンフィルタ用プロジェクト作製
– ソースコードなどをコピーして、Add Sources
– Cシミュレーション
– CからHDLを生成
– C/RTLコシミュレーション
– VivadoでC/RTLコシミュレーションの波形を確認
– IPとしてパッケージ
41
Top Functionの指定1
● Cコードを合成する前に、Top Functionを指定する。
● これがCコードの合成の最上位関数になる。
● ProjectメニューからProject Settings...を選択する
42
Top Functionの指定2
● 左のウインドウで、Synthesisを選択する
● Top Functionの右のBrows...ボタンをクリックする
43
Top Functionの指定3
● lap_filter_axis.cppのlap_filter_axisを選択する
● OKボタンをクリックする
44
Top Functionの指定4
● Top Functionにlap_filter_axisが入った
● OKボタンをクリックする
45
Cコードの合成
● SolutionメニューからRun C Synthesis->Active
Solutionを選択して、Cソースコードの合成を行う
46
Cコードの合成結果
● TimingのSummaryでClockのTarget周期が10nsのところ、
8.11nsなので問題無い
● Uncertaintyはクロックのばらつきの値(デフォルト:12.5%)
47
Cコードの合成結果2
● 下にスクロールして合成結果を見る
48
Analysis
● Analysisボタンをクリックして解析結果を見てみよ
う
● HDLソースも確認する
49
これから何するのか?
● Vivado HLS 2015.4
– AXI4 Streamのラプラシアンフィルタ用プロジェクト作製
– ソースコードなどをコピーして、Add Sources
– Cシミュレーション
– CからHDLを生成
– C/RTLコシミュレーション
– VivadoでC/RTLコシミュレーションの波形を確認
– IPとしてパッケージ
50
C/RTLコシミュレーション
● SolutionメニューからRun C/RTL Cosimulationを
選択する
51
Co-simulation Dialog
● Dump Trace を none
から all に設定を変更
する
● allにすると、シミュレー
ション波形が記録され
る
● OKボタンをクリックする
とC/RTLコシミュレー
ションが始まる
52
C/RTLコシミュレーション結果
● C/RTLコシミュレーションが終了した
● Latencyは3101、Intervalは0クロックだった
53
これから何するのか?
● Vivado HLS 2015.4
– AXI4 Streamのラプラシアンフィルタ用プロジェクト作製
– ソースコードなどをコピーして、Add Sources
– Cシミュレーション
– CからHDLを生成
– C/RTLコシミュレーション
– VivadoでC/RTLコシミュレーションの波形を確認
– IPとしてパッケージ
54
Open Wave viewer…アイコンをクリック
● Open Wave viewer…アイコンをクリックする
55
Vivadoが立ち上がった
56
Waveformウインドウを表示
● WindowメニューからWaveformを選択する
57
Vivadoによる
シミュレーション波形表示
58
波形ウインドウをフロート
● 波形ウインドウのFloatアイコンをクリックして、波形
ウインドウをフローティング・ウインドウにする
59
波形ウインドウ1
● Zoom Fitアイコンをクリックして、波形全体を表示
60
波形ウインドウ2
● ins_TVALIDとins_TREADYが常時1(Waitが無い)
● outs_TVALIDとouts_TREADYが常時1(Waitが無い)
● よって1クロックごとにラプラシアンフィルタ処理を実行できる
61
これから何するのか?
● Vivado HLS 2015.4
– AXI4 Streamのラプラシアンフィルタ用プロジェクト作製
– ソースコードなどをコピーして、Add Sources
– Cシミュレーション
– CからHDLを生成
– C/RTLコシミュレーション
– VivadoでC/RTLコシミュレーションの波形を確認
– IPとしてパッケージ
62
IPのパッケージ
● 合成したHDLをIPとしてパッケージ化
● SolutionメニューからExport RTLを選択する
63
Export RTL Dialog
● Exprot RTLダイアログが開く
● デフォルトのIP Catalog(Vivado用)を選択
● OKボタンをクリックする
64
IP生成が完了
● solution1の下にimplフォルダが作られ、その下の
ipフォルダにIPが生成された
65
impl/ipフォルダ
● solution1/impl/ipフォルダ
● xilinx_com_hls_lap_filter_axis_1_0.zipにIPが圧縮され
ている
66
AXI4 StreamのラプラシアンフィルタIP
の使い方
● AXI VDMAを使用してメモリからのDMA Readした
データをAXI4 StreamでラプラシアンフィルタIPに
入力する
● AXI4 Streamで出力されたラプラシアンフィルタ結
果をAXI VDMAでメモリへDMA Writeする
67
AXI4 Streamのラプラシアンフィルタ
入りカメラ表示システムブロックデザイン
68
camera_interface モジュール
ブロックデザイン
69
ラプラシアンフィルタ実装方法
へのリンク1
● AXI4-Stream版ラ プラシアンフィルタIPのカメラ
表示システム1(構想編)
● AXI4-Stream版ラ プラシアンフィルタIPのカメラ表示
システム2(Vivado 2015.1でプロジェクトを作製)
●
AXI4-Stream版ラ プラシアンフィルタIPのカメラ
表示システム3(ブロックデザイン1)
● AXI4-Stream版ラ プラシアンフィルタIPのカメラ
表示システム4(ブロックデザイン2)
● AXI4-Stream版ラ プラシアンフィルタIPのカメラ
表示システム5(制約ファイル、インプリメント)
● AXI4-Stream版ラ プラシアンフィルタIPのカメラ表示
システム6(SDK1)
70
ラプラシアンフィルタ実装方法
へのリンク2
● AXI4-Stream版ラプラシアンフィルタIPのカメラ表
示システム7(実機動作)
●
AXI4-Stream版ラプラシアンフィルタIPのカメラ表
示システム8(デバック)
● AXI VDMAのドライバによるレジスタの設定値
● AXI4-Stream版ラプラシアンフィルタIPのカメラ
表示システム9(カメラ画像表示は完成)
●
AXI4-Stream版ラプラシアンフィルタIPのカメラ
表示システム10(ラプラシアンフィルタ処理)
● AXI4-Stream版ラプラシアンフィルタIPのカメラ
表示システム11(ベアメタル・アプリ版完成)
71
まとめ
● ラプラシアンフィルタIPのインターフェースをサイド
チャネルありのAXI4 Streamにした
● ラプラシアンフィルタIPのインターフェースをAXI4
Streamにして、DMAはDMAのIPに任せたほうが
CやC++ソースをチューンしやすい
● Vivado HLSでIPを作るときのお勧めはAXI4
Stream
● DMAはIPで実装しよう
72
謝辞
● AXI4 Streamのラプラシアンフィルタ・サンプルコー
ドを教えて頂いた tu1978 さんに感謝いたします
73
参考文献
● Vivado Design Suite ユーザー ガイド 高位合成
UG902 (v2014.3) 2014 年 10 月 1 日
– http://japan.xilinx.com/support/documentation/sw_m
anuals_j/xilinx2014_4/ug902-vivado-high-level-synt
hesis.pdf
● Vivado Design Suite ユーザー ガイド 高位合成
UG902 (v2015.2) 2015 年 6 月 24 日
– http://japan.xilinx.com/support/documentation/sw_m
anuals_j/xilinx2015_2/ug902-vivado-high-level-synt
hesis.pdf

Vivado hls勉強会5(axi4 stream)