FC2カウンター FPGAの部屋 DSF2015 C-6 でのVivado HLS で生成したAXI4-Master IPの簡単な例について
FC2ブログ

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

FPGAの部屋

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

DSF2015 C-6 でのVivado HLS で生成したAXI4-Master IPの簡単な例について

DSF2015C-6 ”Xilinx社のFPGAにおける高位合成ツールVivado HLSの効果と性能”で説明したAXI4 Masterインターフェースの例をブログで説明したいと思います。

最初に GitHub のmarsee101/multi_axim にVivado HLS 2014.4 のプロジェクトがあります。これを git の clone でも zip ファイルでダウンロードでも良いので、自分のパソコンにダウンロードして下さい。
zip ファイルでダウンロードの例を説明します。
Download.zip ボタンをクリックすると保存ダイアログが開いて、multi_axim-master.zip をダウンロードすることができます。
multi_axim_1_150928.png

multi_axim-master.zip を展開すると、multi_axim-master フォルダが出てきます。これが、Vivado HLS 2014.4 のプロジェクト・フォルダです。
multi_axim-master フォルダに入ると、multi_aixm.c, multi_axim_tb.c, solution1 フォルダがあります。他のファイルやフォルダもあります。
multi_axim_2_150928.png

multi_aixm.c がハードウェアにするC ソフトウェアです。
multi_aixm_tb.c がハードウェアにするC ソフトウェア用のテストベンチです。
ファイルを開いて見てみましょう。

multi_aixm.c は、x[10] の配列の1つの要素とその要素を+1 した数の積を取って、y[10] の配列の要素に代入します。それを10個要素それぞれに付いて行います。
関数の引数で、値渡しの引数は入力ポートになります。ポインタ渡しの引数は入力ポートにも出力ポートもなります。または出力ポートと入力ポート両方を生成することもできます。
#pragma HLS INTERFACE m_axi port=y depth=10 offset=slave このディレクティブで y はAXI4 Master インターフェースになります。offset=slave はAXI4 Lite Slave インターフェースのレジスタとしてオフセットレジスがマップされます。
x も同様です。
#pragma HLS INTERFACE s_axilite port=return はブロックレベルのインターフェースを AXI4 Lite Slave にするというディレクティブになります。
動作は、x[]のアドレスでAXI4 Master Read を行って、演算してから y[] のアドレスに結果を AXI4 Master Write します。

multi_aixm_tb.c は見ればひと目でわかると思います。

solution フォルダの下にCシミュレーションの結果(csim フォルダ)、CからHDL への合成結果(syn フォルダ)、C/RTL協調シミュレーション結果(sim フォルダ)、IP化の結果(impl フォルダ)が入っています。
multi_axim_3_150928.png

multi_axim-master\solution1\csim\report フォルダに multi_axim_csim.log があるので見てましょう。(Vivado HLS をインストールしていない人向けに書いてありますので、持ってい方はVivado HLS で csim のリポートを見れば同じです)
Cシミュレーションの結果が、multi_axim_csim.log に書いてあります。
multi_axim_4_150928.png

multi_axim-master\solution1\syn フォルダには、C からHDL へ合成した結果が入っています。
report フォルダは合成結果が入っています。
systemc, verilog, vhdl フォルダには、合成した結果のHDL が入っています。
multi_axim_5_150929.png

report フォルダを見てみましょう。
multi_axim_csynth.rpt を開いてみてください。
multi_axim_csynth.rpt にはCからHDL への合成時のレポートが入っています。
Timing Summary の Target 10.00 の単位は ns でターゲットの動作周期です。
Estimated が合成によって推定された動作周期です。これが 8.75 ns です。
Latency と Interval も見て下さい。
multi_axim_6_150929.png

次に、verilog フォルダを開いてみてください。
ファイルが4つありますが、multi_axim.v がトップなので開いてみてください。
multi_axim_7_150929.png
s_axi_AXILiteS_... がAXI4 Lite Slave インターフェースの信号
m_axi_gmem_... がAXI4 Master インターフェースの信号です。

multi_axim_AXILiteS_s_axi.v を開いてみてください。
45行目から Address Info が書いてあります。これが、AXI4 Lite Slave のアドレスマップです。
Data signal of x が x[] 配列のオフセット・アドレス用レジスタです。ここに x[] 配列があるアドレスをセットします。
Data signal of y が y[] 配列のオフセット・アドレス用レジスタです。ここに y[] 配列があるアドレスをセットします。
multi_axim_8_150929.png

0x00 : Control signals の bit 0 - ap_start に 1 を書くと、このIP の処理が始まります。bit 1 - ap_done が 1 になるとIP の処理が終了しています。

残りのファイルを見て下さい。

solution1 フォルダに戻って、次は sim フォルダに入ります。
multi_axim_9_150930.png

sim フォルダの中の verilog フォルダに入ります。
multi_axim_10_150930.png

ここに、multi_axim.wdb と multi_axim.wcfg があるので、これをVivado のTcl Console から開いてRTL シミュレーション波形を確認します。

Vivado を持っていたら、Vivado を起動します。
multi_axim_11_150930.png

フォルダを cd コマンドで移動します。私の環境では、

cd c:/Users/Masaaki/Documents/Vivado_HLS/ZYBO/examples/multi_axim-master/solution1/sim/verilog

ですが、自分の環境の multi_axim-master/solution1/sim/verilog フォルダに移動して下さい。コマンドを入れるとフォルダの選択肢をTcl Console が表示してくれます。
multi_axim_12_150930.png

続けて

current_fileset
open_wave_database multi_axim.wdb
open_wave_config multi_axim.wcfg

をTcl Console に入力します。3つのコマンドをコピー&ペーストしても問題無いです。
そうすると波形が表示されます。
multi_axim_13_150930.png

波形をじっくりご覧下さい。

AXI4 Lite Slave, AXI4 MASTER Write 部分の波形を下に示します。
multi_axim_14_150930.png

AXI4 MASTER Write 部分を引き伸ばしてみると、y[] 配列に書き込んでいるデータ(m_axi_gmem_WDATA[31:0] が見えます。
multi_axim_15_150930.png

AXI4 Master Read と AXI4 MASTER Write を一緒に見てみましょう。
multi_axim_16_150930.png

最後にIP 化した部分を説明します。

solution1 フォルダに戻って、impl フォルダに入ります。
multi_axim_17_150930.png

更に、ip フォルダに入って下さい。ここがIP のフォルダです。
multi_axim_18_150930.png

drivers -> multi_axim_v1_0 -> src フォルダがドライバのソースファイルです。
multi_axim_19_150930.png

例えば、multi_axim.c を開いてみましょう。
multi_axim_20_150930.png

ここにドライバの関数が並んでいます。
例えば、XMulti_axim_Start() はIP の処理を開始させる関数です。

Vivado HLSの生成したドライバの使い方です。

  • 最初にX<関数名>_Initialize()、またはX<関数名>_LookupConfig()X<関数名>_CfgInitialize()の組
    • ベアメタル・アプリのDeviceIdは最初のインスタンスは0、次は1
  • X<関数名>_Set_入力ポートで入力ポートの値をWriteする
  • X<関数名>_IsIdleでアイドル状態であることを確認
  • X<関数名>_StartでIPのステートマシンをスタート
  • X<関数名>_IsDoneX<関数名>_出力ポート_vldを確認
  • X<関数名>_Get_出力ポートをReadする

いろいろとC ソースファイルを読んでみると面白いです。
ベアメタル・アプリケーションでは、SDKからこれらの関数を使うことができます。
LinuxではUIO でドライバを使うことができますが、デバイス・ツリーに登録する必要があります。

ip フォルダのxilinx_com_hls_multi_axim_1_0.zip がIP を圧縮したファイルになります。中身を下に示します。
multi_axim_21_150930.png

これで、DSF2015C-6 ”Xilinx社のFPGAにおける高位合成ツールVivado HLSの効果と性能”で説明したAXI4 Masterインターフェースの例の説明を終わります。
  1. 2015年10月02日 14:40 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/3264-13490c6a
この記事にトラックバックする(FC2ブログユーザー)