Simulink + SystemGenerator で IPコアを作成し、それをLabVIEW FPGA の VI に取り込む (2) 具体的な手順

 こんにちはドルフィンシステムの笹生です。

本日は前回の続きで「Simulink + SystemGenerator で IPコアを作成し、それをLabVIEW FPGA の VI に取り込む (2) 具体的な手順」をお送りします。

前回の記事はこちら「Simulink + SystemGenerator で IPコアを作成し、それをLabVIEW FPGA の VI に取り込む (1)メリット・デメリット」


今回実際に、SimulinkとSystemGenerator で IPコアを作成してみます。その後 LabVIEW に作成した IP コアをインポートしてコンパイルさせてみます。

Simulink + SystemGenerator で IPコアを作成する

Simulink上で SystemGeneratorを使用したIPコアの作成手順書は、Mathwork社, Xilinx社双方で用意されています。

MathWorks 社のサイトでの解説はここにあります。

https://jp.mathworks.com/help/hdlcoder/ug/code-generation-with-xilinx-system-generator-subsystems.html

Xilinx 社のサイトでは PDF で配布されており、こちらのほうが詳細な記述になっているようです。以下は Vivado 2020.2 でのユーザーガイド UG897 です。

https://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx2020_2/ug897-vivado-sysgen-user.pdf

最新の Vivado 2021 以降では、SystemGenerator という表記よりも ModelComposer という名称になるようです。(どうも AI 関連のデザイン向けにシフトしているような気がします。SystemGenerator もレガシー的に含んでいるという感じでしょうか。)

アイコンも、Model Composer and System Generator という表記になっています。


① SystemGenerator の起動

SystemGenerator のアイコンをダブルクリックして起動させます。
紐づいている Matlab が起動します。弊社では Matlab R2020aが紐づいております。

起動して警告が表示されていますが、今のところ影響は無さそうなので良しとしております。
通常の MATLAB の起動では、Xilinx のツールが読み込まれないようなので、起動するときには SystemGenerator のアイコンから起動してください。

②作業ディレクトリに移動

Matlab をやるときにはお約束ですが、作業ディレクトリに移動します。

今回は SampleIP という空のディレクトリを作ってそこに移動しました。

③Simulink を起動

メニュー右側にある Simulink を起動します。
スタートページが開きますが、「空のモデル」を開いて OK です。

空のモデルをクリック。新しい空のモデルが開きます。

④モデルの作成

いよいよモデルの作成をしていきましょう。

まずは、イメージとしてこんな感じのモデルを作成したいと思います。

最初に結構重要な基本的なサンプルレートも規定しておきましょう。
お約束的にサンプル時間を変数 Ts として Ts = 1/100e6 (100MHzなのでその逆数をサンプル時間とする)をモデルの何もないところで
右クリック→モデルプロパティ→コールバック→ PreLoadFcn
に規定しておくと、ブロックを置いてサンプル時間に Ts を入力すれば一括で変更できて便利です。

右クリック→モデルプロパティ

コールバック→ PreLoadFcn で、Ts=1/100e6 を記述
こうすると、次回起動時にこの記述が実行されて Ts という変数に 1/100e6 がセットされます。

一旦モデルを保存して再起動します。(再起動してTsを有効にします)
保存名は SampleIP にします。

入力信号に当たる正弦波のブロックをライブラリブラウザからドラッグしておきます。




Sine などで検索掛けると表示されます。
プロパティは以下の様にします。
アイコンがこんな感じの離散的なものに変わります。(細かいですが、わかりやすくていいですね)
さて、IP対象の処理についてはちょっと後回しにして、観測する Sink のほうを置いておきます。正弦波を見る Scope を置いて接続してみます。
このようになります。
実行してますが、今回サンプルレートを 100MHz と高速にしているので、終了時間がデフォルトの 10秒だと長すぎるため、0.001 秒 (1ms) にします。
これで実行します。
Scope をダブルクリックすると、波形が表示されます。(拡大しています)

⑤IP部分の作成

さて実際の IP 部分をSystemGenerator のブロックで作成してみます。
今回は CORDIC を使ってみようと思います。

これもお約束なのですが、IP化したいモデルに System Generator (そのままですが)と呼ばれるブロックを置きます。
ライブラリブラウザですと「System Gen」で検索しても出てきますが、簡単なのはモデルで右クリックして [Xilinx BlockAdd] で出てくるメニューの一番先頭にある「System Generator」を選んでもOKです。



このブロックでは、IP化する際のターゲットなどパラメータを指定したりすることができます。またこのブロックのダイアログで、実際に IP を生成したりできます。

設定は以下の様にします。
コンパイル設定
ターゲットの指定と出力するターゲットディレクトリを設定します。
ターゲットの指定は、LabVIEW で使用する FPGA のシリーズに揃えてください。
今回は Kintex7 を使うのでその用に指定します。
また、同じ作業ディレクトリで複数の IP を作成するのであれば、ターゲットディレクトリの名称は判るように変えないと上書きされる可能性がありますのでで注意です。

クロッキング設定

ここではひとまず赤枠の「Simulink system period(sec) 」を Tsに設定します。
一旦これで OK を押して先に進みましょう

今回は CORDIC をIP化してみます。
モデルで右クリックして [Xilinx BlockAdd] で表示されるメニューから COR で検索します。

表示された CORDIC 6.0 をダブルクリックします。
モデルに CORDICのブロックが追加されました。
沢山端子がありますが、今回は入力正弦波の位相を取得するモードにしたいと思います。

CORDIC ブロックをダブルクリックしてプロパティを変更します。

Function を Rotate から Arc_Tanh にします。
OKを押します。

入力と出力をつなぎますが、SystemGenerator のブロックはそれ以外のブロックと接続するためには必ず [Gateway In]、[Gateway Out] という専用のIFブロックを使う必要があります。
System Generator 同士の接続は必要ありません。
また、この  [Gateway In]、[Gateway Out] が生成する IP コアの入出力端子になります。

 [Gateway In]、[Gateway Out] はモデルで右クリックして [Xilinx BlockAdd] で表示されるメニューから [Gate] で検索すれば出てきます。


それぞれ置いて CORDIC と接続するとこのような感じになります。


この[Gateway In] にはサンプル時間を設定するプロパティがあるので、ダブルクリックして Ts をサンプル時間 (Sample Period) に設定します。

その他、データの型を変換して IP に合わせた入力ビット幅や固定小数点設定が可能です。

さて、先ほどの入力信号と出力Scope を接続してみます。
CORDIC は複素入力ですが、入力は同じものを入れ、出力はとりあえず dout_tdata_phase の部分だけを Scope につないでみます。

そして、入力の certesian_tvalid に接続されている [Gateway In] の設定は以下の様に Bool への変換をさせるようにします。

ライブライブラウザから定数 constant を持ってきて、certesian_tvalid に接続されている [Gateway In] に接続します。



全体としてはこのような感じになります。

ひとまずこの状態でシミュレーションを実行してみましょう。

CORDIC の結果の位相が表示されました。
結果の良し悪しは置いておいて、ひとまずエラーなく実行できました。

⑥IP の生成

このような形でシミュレーション出来たら、IPの生成はできると思います。
先ほど置いた「System Generator」のブロックをダブルクリックして「Generate」ボタンを押します。


このようなダイアログがでます。生成が終わるまでは規模によって時間がかかります。

エラーが無ければこのようにダイアログがでて終了です。

Matlab の作業ディレクトリにターゲットで指定した "netlist" というフォルダができていると思います。
その中に生成した IP コアが含まれています。


LabVIEW  FPGA に取り込む

生成できた IP コアを今度は LabVIEW FPGA に取り込みます。
LabVIEW を起動します。

とりあえずブランクプロジェクトを選びます。
プロジェクトを保存しておきます。
保存名はなんでもいいですがひとまず SampleIP_CLIPとしておきます。

①ターゲットを選ぶ

マイコンピュータで右クリックして新規→ターゲットとデバイス.. を選びます。

新規ターゲットまたはデバイスを選択して、下に表示されたデバイスから[FlexRIO FPGA Modules]→[PXIe-7976R] を選びます。(ここは本当にターゲットにしたいデバイスを選びます)


プロジェクトの FPGA ターゲットに指定したデバイスが追加されました。

②コンポーネントレベルIP として登録する

この FPGA ターゲットで先ほどの IP が使用できるように登録します。
FPGA ターゲットで右クリックして[プロパティ]を選びます。




左側のカテゴリから[コンポーネントレベルIP] を選びます。
右の新規作成アイコンをクリックします。

[シンセシスファイルを追加] をクリックします。

ここで、先ほど SystemGenerator で生成した IP のある "netlist/ip" フォルダの下の"/hdl" フォルダを開き、その中にある *.vhd  をすべて選択します。
次に再度、シンセシスファイルを追加ボタンを押して、 "netlist/ip" フォルダの下の"/sampleip_cordic_v6_0_i0" フォルダから *.xci ファイルを選びます。このフォルダは

選択して OK すると、このようにファイルが追加されます。
ただしこの時には適当なファイルがトップレベルに指定されていますので、"sampleip.vhd" を選択して[トップレベルに設定]をします。


ここから先は通常の CLIP の登録作業になります。

次へを押します。

以下のシリーズに限定をします。
今回の場合、System Generator のターゲットで Kintex7 にして生成していますので問題ないです。もしターゲットのシリーズが違うとうまく取り込めない可能性があります。
次へを押します。

構文を確認し、LabVIEW で使用可能な IP かを判定します。
構文確認が成功すると[次へ] のボタンが押せるようになります。


次へ
基本信号設定では、clk_1 の信号タイプをクロックに設定します。

次へ
上級クロックはデフォルトで
次へ
上級ステータス信号も特に使わないので
次へ
上級データ信号設定では、すべての信号線の必須クロック領域を clk_1 に指定します。

次へ
生成される XML ファイルの内容が表示されます。

終了します。

これで、作成した sampleip が使用できるようになりました。

③プロジェクトに新規コンポーネントレベルIPを追加する

プロジェクトに戻って、 FPGA のところで右クリック→新規→コンポーネントレベルIP を選択します。

先ほどの XML が生成されれば、ここで sampleip を選択できます。

OK を押すと、sampleip 、名称は Component-Level IP がプロジェクトに追加されます。

あとは FPGA 用の VI のブロックダイアグラムでドロップして使うことができます。


この例では SCTL に Component-LevelIP をドロップして、制御器、表示器(入出力端子)を付けた単純なものです。

④FPGA をビルドしてみる

ビルドしてみます。
プロジェクトエクスプローラでFPGA の VI を右クリックして[ビルド仕様を作成]します。

ビルド仕様に追加されます。
ビルドします。

コンパイルサーバーは適宜選択して OK します。
(通常はローカルコンパイルサーバー)

中間ファイルが生成されて、LabVIEW から Vivado に転送されてビルドが始まります。

と、ここまで一連の手順をまとめてみました。

ここで注意!

今回実はたまたま CORDIC だったので LabVIEW 取り込みができ、コンパイルまで通りました。じつはこの記事を書く前に試した CORDIC ではうまく行ったので、本記事の手順を書くために FFT で再度行っていたところエラーが出てしまいました。
CORDIC ではなく FFT を System Generator で IP を生成した場合は System Generator 側で紐づけている Vivado のバージョンと、LabIVEW FPGA でインストールされている Vivado のバージョンが私の環境で異なっていて LabVIEW でコンポーネントレベル IP の作成時にシンセシスファイルを追加で *.xci ファイルの指定をすると以下のようなエラーメッセージが出て先に進めません。

CORDIC の場合ははたまたまバージョンの違いがなくすんなり LabVIEW で取り込んでコンパイルできたようです。
Vivadoのバージョンはそろえてください。(同じバージョンが 2つインストールされてしまいますが。。。)

LabVIEW FPGA のバージョンと紐づいている Vivado のバージョンは以下のURL に記述があります。
これにあった System Generator での生成をする必要があります。







0 件のコメント :

コメントを投稿