ポートの配列サイズとデータ型は、テンプレート パラメーターを使用して定義できます。これらのパラメーターは、ブロックの入力信号により定義されます。追加のカスタマイズ パラメーターも定義できます。これらは入力信号では定義されないので、シミュレーション実行時間前にユーザーが [Block Parameter] ダイアログ ボックスで定義する必要があります。
- C/C++ の関数テンプレートを使用する。
- 関数引数に Model Composer (XMC) PARAMETER プラグマを割り当て、ブロックの入力または出力に接続するのではなく、カスタマイズ パラメーターとして定義する。
どちらの方法にも利点と欠点があります。それらを次に説明します。
関数テンプレート
関数引数のテンプレート パラメーターは、標準関数テンプレート構文を使用して定義されますが、テンプレート パラメーターは関数シグネチャの入力引数には割り当てられません。ブロックをモデルにインスタンシエートすると、Model Composer により値が入力信号で決定されないテンプレート パラメーターが識別され、これらのカスタマイズ パラメーターの値をユーザーが定義できるようになります。モデルのカスタマイズ パラメーターの値は、シミュレーションの前であればいつでも定義できます。
関数テンプレートでは、カスタマイズ パラメーターはデータ型のサイズまたは次元を定義する整数か、データ型を定義可能なスカラー変数にしかできません。Model Composer では、整数パラメーターのデフォルト値 0、データ型のデフォルト値 int32、または typename パラメーターが定義されます。
template <int M, int B>
double func1(double x) {
return x * M + B;
}
カスタマイズ パラメーターは、次の func1
関数の例に示すように、インポートされたブロックの [Block Parameters] ダイアログ ボックスに表示されます。モデルでブロックをダブルクリックして Block Parameters ダイアログ ボックスを開き、次の図に示す [M] および [B] のように変更可能なパラメーターの値を入力します。
param1
は MATLAB ワークスペースで定義され、M の値を定義するのに使用されます。PARAMETER プラグマ
2 番目の方法では、Model Composer の PARAMETER
プラグマを使用して関数引数をカスタマイズ パラメーターとして定義します。
PARAMETER
プラグマを追加して、その後にパラメーター名を記述します。1 つのプラグマで複数のパラメーターを指定するか、各パラメーターに個別のプラグマを使用できます。#pragma XMC PARAMETER <name1>, <name2>
#pragma XMC PARAMETER <name3>
function declaration(<name1>, <name2>, <name3>)
関数引数をプラグマを使用してカスタマイズ パラメーターと宣言した場合、xmcImportFunction
コマンドでその引数に対してブロックに入力ポートまたは出力ポートは作成されません。関数の本体内でのみ使用されるよう定義されます。モデルにブロックを追加すると、[Block Parameter] ダイアログ ボックスにカスタマイズ フィールドが追加され、ユーザーが値を定義できるようになります。
入力信号により駆動されている関数引数に PARAMETER
プラグマを使用すると、エラーまたは警告となります。この場合、関数の信号入力伝搬の方がカスタマイズ パラメーターよりも優先されます。
関数テンプレートではスカラーおよび整数パラメーターしかサポートされませんが、PARAMETER
プラグマではパラメーターに整数、浮動小数点型または固定小数点型がサポートされます。カスタマイズ パラメーターをスカラー、ベクター、または 2 次元行列にすることもできます。さらに、関数テンプレートでは整数型のデフォルト値は 0、データ型のデフォルト値は int32
に定義されていますが、PARAMETER
プラグマではユーザーがパラメーターのデフォルト値を定義できます。ユーザーがデフォルト値を定義しない場合は、すべてのパラメーターのデフォルト値が 0 に定義されます。
次の例では、Model Composer の PARAMETER
プラグマを使用してカスタマイズ パラメーター M と B を定義しています。
#pragma XMC PARAMETER M, B
double func2(double x, double M = 1.2, double B = 3) {
return x * M + B;
}
M および B カスタマイズ パラメーターには、デフォルト値 M=1.2
および B=3
も指定されています。カスタマイズ パラメーターのデフォルト値は、関数シグネチャの引数に割り当てられ、Block
Parameters ダイアログ ボックスにも次のように表示されます。
ベクターおよび行列カスタマイズ パラメーター
coef
ベクターがプラグマによりカスタマイズ パラメーターとして定義されています。#pragma XMC PARAMETER coef
#pragma XMC INPORT din
#pragma XMC OUTPORT dout
#pragma XMC SUPPORTS_STREAMING
void FIR(ap_fixed<17, 3> din[100], ap_fixed<17, 3> dout[100],
ap_fixed<16, 2> coef[52]);
- ベクター パラメーター:
[val1, val2, val3, ...]
- 行列パラメーター (行優先順):
[val11, val12, val13, ...; val21, val22, val23, ...; ...]
インターフェイス出力のデータ型とサイズ
カスタマイズ パラメーターは、関数への入力で値が決定されない出力ポートのデータ型および次元サイズを直接設定するためにも使用できます。次の関数では、テンプレート変数で ap_fixed
のデータ型のワード長と小数部の長さ、および配列サイズを定義しています。
template <typename T1, int N1, int W2, int I2, int N2>
void func(const T1 in[N1], ap_fixed<W2, I2> out[N2]) {
...
}
テンプレート変数 W2、I2、および N2 は、値が入力引数により決定されず、ユーザーが設定する必要があるので、カスタマイズ パラメーターを定義します。テンプレート変数 T1 および N1 は、Model Composer により入力ポートで指定されることが認識されるので、データ型 (typename
) および入力ベクターのサイズはカスタマイズ パラメーターではなく、ブロックの入力信号により定義されます。
出力ポートのデータ型または関数の本体で使用される引数を設定するには、指定された typename
が Model Composer でサポートされるデータ型 (符号付きおよび符号なしの固定データ型を含む) の 1 つである必要があります。
サポートされる typename |
---|
'int8' |
'uint8' |
'int16' |
'uint16' |
'int32' |
'uint32' |
'double' |
'single' |
'x_half' |
'boolean' |
'x_sfix<n1>_En<n2>' |
'x_ufix<n1>_En<n2>' |
次の関数例では、T1 の typename
は入力信号により決定されますが、T2 の typename
はブロックをモデルに追加したときかシミュレーションの前に Block Parameters ダイアログ ボックスで設定します。
template <typename T1, int N1, typename T2, int N2>
void func(const T1 in[N1], T2 out[N2]) {
...
}