FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

Vivado HLSで開発したIPをZynq ZedBoardでIPとして利用したい(2)

f:id:msyksphinz:20160601001536p:plain

前回、Vivado HLS上でC言語の行列積関数を記述し、それをテストするところまで確認した。今回はこれを論理合成し、C言語とRTLのCosimulationを実施しよう。

Vivado HLSを使用してC言語の関数を論理合成する

論理合成はツールバーから[Run C Synthesis]をクリックした。これだけで一応完成する。

f:id:msyksphinz:20160903165533p:plain

Vivado HLSを使用してC言語の関数と合成語のRTLをCosimulationする

これも、ボタンを一つクリックするだけで良い。ツールバーから[Run C/RTL Cosimulation]をクリックする。ダイアログボックスが出てくるが、特に何も設定しない。

f:id:msyksphinz:20160903165659p:plain

特に問題無くシミュレーションが成功すれば、Finished C/RTL Cosimulationと表示される。これでIPの開発は終了だ。簡単だ!

f:id:msyksphinz:20160903165700p:plain

開発した回路をExportとしてVivadoで使用できるIPに変換する

さて、せっかく作成した回路なので、Vivadoにエクスポートして、Zynq FPGAのPL部分にインプリし、ARMから制御できるようにしたい。 このためにはどうすれば良いのだろうか?

まず考えられるのは、足回りを調整しなければならないこと。この行列積演算関数では引数を3つ取っており、2つが入力用、1つが出力用だ。

void matrix_mul (const float matrix_a[8][8], const float matrix_b[8][8], float matrix_c[8][8])

これがそのままでは、PL部にAXIのインタフェースを持って接続できないので、これを変換しなければならない。このためには、開発したプログラムにDirectiveを追記し、AXIに変換されるように調整してやる必要がある。

設定しなければならないことは、

  • この関数がどのようなインタフェースを持つのか --> AXI Slaveのインタフェース1つのみ
  • この関数はどのような引数を取るのか --> 2つの入力、1つの出力。これを1つのAXI Slaveのインタフェースで共有する

ということになる。これをIPの情報として設定し、IPに変換される際にAXIのインタフェースが所望の形になるように調整してやらなければならない。

Vivado HLS上で、開発したIPのインタフェースディレクティブを指定する

まずは、各引数に設定を行っていこう。まずはmatrix_hls.cppをVivado HLS上で開き、右側のペインにあるDirectiveをクリックする。 matrix_aを右クリックし、Insert Directiveをクリックする。

f:id:msyksphinz:20160903170714j:plain

ダイアログボックスが表示される。

f:id:msyksphinz:20160903170749j:plain

以下のように設定する。DirectiveINTERFACEに設定し、mode(optional)s_axilitebundle(optional)slv0に設定する。

f:id:msyksphinz:20160903170954p:plain

これを全ての引数matrix_a, matrix_b, matrix_cに対して同様に設定する。

f:id:msyksphinz:20160903171019j:plain

ここで、bundle(optional)を全て同様の値に設定することで、同一のAXIインタフェースを利用することを指定している(と思う)。

いろいろ調べたのだが、以下のビデオで設定していたので設定してみると、所望の構造でIPが生成されたので良しとする。

Vivado HLS デザインに AXI4 インターフェイスを指定

Vivado IP カタログから使用できるように Vivado HLS IP をパッケージ化

さらに、関数そのものである、matrix_hlsを右クリックし、Insert Directiveをクリックする。

f:id:msyksphinz:20160903171712j:plain

こちらも同様に設定をする。こちらにも、Bundle名としてslv0を設定する。まあ良く見てみると、return文に対する指定っぽいので、ここで指定する必要は無いみたいだが。

f:id:msyksphinz:20160903171813p:plain

f:id:msyksphinz:20160903171858p:plain

これで設定完了だ。ツールバーから[Export RTL]をクリックしてIPをエクスポートする。

f:id:msyksphinz:20160903172203p:plain

生成されたディレクトリから、ip --> verilog --> matrix_mul.vを開くと、一つのAXIインタフェースs_axi_slv0_xxxが定義されていることが分かる。

f:id:msyksphinz:20160903172328p:plain

これでIPの設定は完了だ。次は、これをVivadoにIPとしてインポートしよう。