• 検索結果がありません。

C++ コードの生成

ドキュメント内 Model Composer ユーザー ガイド (ページ 74-78)

Model Composer サブシステム モジュールの関数引数が Vivado HLS で変換されて 1 つの複合ポートにまとめられる 場合は、そのポートの signal type 情報が不明になるので、System Generator IP ブロックに含まれなくなります。

このため、ポートで再形成、マップ、データ パック最適化などを使用した場合は、これらの複合ポートに対するポー ト タイプ情報を System Generator で手動で指定する必要があります。これには、複合ポートがどのように作成され たかを理解してから、System Generator 内で slice および reinterpretation ブロックを使用して、Vivado HLS ブロックをシステムのほかのブロックに接続する必要があります。

たとえば、R、G、B の 3 つの 8 ビット入出力ポートが 24 ビット入力ポート (RGB_in) と 24 ビット出力ポート (RGB_out) にパックされているとします。IP ブロックを System Generator に含めた後、次のようになる必要があり ます。

• 24 ビット入力ポート (RGB_in) は、3 つの 8 ビット入力信号 (R_in、G_in、B_in) を正しくまとめた System Generator ブロックで駆動される必要があります。

• 24 ビット出力ポート (RGB_out) は、3 つの 8 ビット入力信号 (R_out、G_out、B_out) に正しく分割される必要

があります。

ヒント: 複合タイプのポートに接続するための slice および reinterpretation ブロックの使用方法の詳細は、System Generator の資料を参照してください。

図 37: Edge Detection サブシステム

Edge_Detection.cppファイルでは次のインクルードファイルが指定されており、これらのインクルードファイ ルによりサブシステムで使用されるさまざまな Model Composer ブロック用に生成されたコードが組み込まれます。

#include "Edge_Detection.h"

#include "GradMagnitude.h"

#include "SobelFilter.h"

次の図は、Edge Detection サブシステム用に生成されたコードを示しています。関数に追加されたプラグマでは、そ の関数のシグネチャと戻り値用に関数プロトコルと I/O ポート プロトコルが指定されています。プラグマを使用す ると、Vivado HLS で合成されたソリューションが指示されるので、インプリメントされた RTL のパフォーマンスを 向上できます。

Edge_Detection(hls::stream< ap_axiu<16, 1, 1, 1> >& Y, hls::stream< ap_axiu<16, 1, 1, 1> >& Y_Out)

{ #pragma HLS INTERFACE s_axilite port=return

#pragma HLS INTERFACE axis bundle=image_out port=Y_Out #pragma HLS INTERFACE axis bundle=input_vid port=Y #pragma HLS dataflow

uint8_t core_Y[360][640];

#pragma HLS stream variable=core_Y dim=2 depth=1 uint8_t core_Cb[360][320];

#pragma HLS stream variable=core_Cb dim=2 depth=1 uint8_t core_Cr[360][320];

#pragma HLS stream variable=core_Cr dim=2 depth=1 uint8_t core_Y_Out[360][640];

#pragma HLS stream variable=core_Y_Out dim=2 depth=1 uint8_t core_Cb_Out[360][320];

#pragma HLS stream variable=core_Cb_Out dim=2 depth=1 uint8_t core_Cr_Out[360][320];

#pragma HLS stream variable=core_Cr_Out dim=2 depth=1

fourier::AxiVideoStreamAdapter< uint8_t >::readStreamVf0(Y,

reinterpret_cast< uint8_t* >(core_Y), reinterpret_cast< uint8_t* >(

core_Cb), reinterpret_cast< uint8_t* >(core_Cr), 360, 640);

Edge_Detection_core(core_Y, core_Cb, core_Cr, core_Y_Out, core_Cb_Out, core_Cr_Out);

第 4 章: 出力の生成

fourier::AxiVideoStreamAdapter< uint8_t >::writeStreamVf0(Y_Out, reinterpret_cast< uint8_t* >(core_Y_Out), reinterpret_cast<

uint8_t* >(

core_Cb_Out), reinterpret_cast< uint8_t* >(core_Cr_Out), 360, 640);

}

最後に、出力フォルダーに生成された run_hls.tcl ファイルに注目してください。これは生成された出力ファイル で Vivado HLS を実行するために使用可能な Tcl スクリプトで、プロジェクトおよびソリューションを作成し、C++ コ ードから RTL を合成して、デザインを System Generator にエクスポートします。Vivado HLS プロジェクトにはそれ ぞれ 1 セットの C/C ++コードが含まれており、複数のソリューションを含めることができます。各ソリューション に異なる制約および最適化指示子を設定できます。詳細は、『Vivado Design Suite ユーザー ガイド: 高位合成』

(UG902) を参照してください。

run_hls.tcl スクリプトは、Vivado HLS コマンド プロンプトから次のように実行できます。

1. Vivado HLS コマンドプロンプトを開きます。

• Windows では、[スタート] → [すべてのプログラム] → [Xilinx Design Tools] → [Vivado 2019.x] → [Vivado HLS] 

→ [Vivado HLS 2019.x Command Prompt] をクリックします。

• Linux では、新しいシェルを開き、<install_dir>/Vivado/<version>/settings64.sh スクリプトを 読み込んでシェルを設定します。

2. Model Composer Hub ブロックの追加の指示に従って、コマンド プロンプトから、出力を生成したときに [Model

Composer Hub] ダイアログ ボックスの [Target directory] で指定したディレクトリの親フォルダーに移動します。

次に例を示します。

cd C:/Data

3. コマンド プロンプトで C ディレクトリにある run_hls.tcl スクリプトを実行します。

vivado_hls -f ./code/run_hls.tcl

Vivado HLS で C++ コードから RTL が合成され、Vivado HLS プロジェクトとソリューションが生成されます。Vivado

HLS プロジェクトは、[Target directory] で指定したディレクトリに移動して、次のようにプロジェクト名を付けて実 行すると開くことができます。

vivado_hls -p ./Edge_Detection_proj

Vivado HLS プロジェクトが GUI モードで開きます。

Model Composer のログ ファイル

コード生成に関する問題は、Model Composer で生成される model_composer.log ログ ファイルに記述されます。

このファイルは Model Composer Hub ブロックの [Target Directory] で指定したディレクトリに含まれます。

デフォルトでは、ブロックがタスク パイプラインまたはデータフローで同時に実行されるストリーミング マイクロ アーキテクチャを使用したコードが生成されますが、モデルにストリーミングをサポートしないブロック (例:

xmcImportFunction ブロック) が含まれる場合は、ストリーミング マイクロ アーキテクチャが使用できないこと もあります。この場合、Model Composer でブロックがシーケンシャルに実行されるコードが生成されます。Model Composer ログ ファイルには、この状況がいつ発生するか、および可能性のある原因を見つけやすくする情報が含ま れます。

第 4 章: 出力の生成

Model Composer Hub ブロックの [Export Type] を C++ コードに設定し、[Create and execute testbench] をオンにし た場合は、model_composer.log ファイルに C++ 検証の出力が含まれるようになります。

[Export Type] を [IP Catalog] または [System Generator] に設定した場合は、Vivado HLS の実行に関連する情報が含ま れます。この場合、詳細が vivado_hls.log に含まれます。このファイルは、[Target Directory] で指定したディレ クトリに含まれます。

第 4 章: 出力の生成

第 5 章

デザインのシミュレーションおよび検証

概要

Model Composer での検証は、次の 2 つのプロセスに分けることができます。

• デザインが論理的に正しいかどうかを確認する Simulink のアルゴリズムの検証。

ドキュメント内 Model Composer ユーザー ガイド (ページ 74-78)