VisualAppletsは、実行時にデザインパラメータにアクセスするためのさまざまなモデルをサポートしています。
-
HAPファイルベースのeVAランタイム環境の使用
-
生成されたGenICam XMLコードに基づくGenICam APIの使用
-
VisualAppletsによって生成された汎用的なデザイン固有のC APIコードの使用
VisualAppletsは、FPGAデザインの合成および実装を制御します。生成されたデザインは、独自のBaslerファイル形式(*.hap)で保存されます。この形式には、FPGA用のコンフィギュレーションビットストリームと、デザイン固有のソフトウェアインターフェースを実現するための手段が含まれています。
一般に、VisualAppletsオペレーターには、実行時に変更できる動的パラメータが含まれています。HAPファイルには、デザイン固有のパラメータに簡単にアクセスするために必要なすべての情報が含まれています。
ユーザープラットフォーム上でランタイムソフトウェアを正しく機能させるには、以下の要件を満たす必要があります。
-
ユーザーはコンフィギュレーションを実行する必要があるため、FPGAビットストリームへのアクセスが必要です。そのために、ランタイムインターフェースは次の機能を提供します。
vaRt_GetConfig(). -
デザインレジスタのスレーブインターフェースにアクセスするには、ユーザーが次の機能を実装する必要があります。
WriteReg32(),ReadReg32()、またはオプションでWriteReg64()およびReadReg64()。機能が実行されると、ランタイムソフトウェアにこれらの機能が通知されます。vaRt_InitParams()が呼び出されるまで取得モードのままになります。
その後、VisualAppletsビットストリームを設定し、ランタイムソフトウェアでデザインパラメータの読み書きを行うことができます。
レジスタアクセス関数は、次の関数タイプに準拠している必要があります。
typedef int ReadReg32(void* device, const uintptr_t address, uint32_t *value)
typedef int WriteReg32(void* device, const uintptr_t address, uint32_t value)
typedef int ReadReg64(void* device, const uintptr_t address, uint64_t *value)
typedef int WriteReg64(void* device, const uintptr_t address, uint64_t value)
ソフトウェアインターフェースライブラリには、VisualAppletsデザインを制御するための追加機能が用意されています。次の表に、アクセス関数の完全なセットを示します。
|
No. |
機能 |
説明 |
|---|---|---|
|
1 |
|
ハードウェアアプレットを開き、 |
|
2 |
|
によって開かれたハードウェアアプレットを閉じます。 |
|
3 |
|
FPGAのコンフィギュレーションビットストリームへのポインタを返します。 |
|
4 |
|
アプレットのクロックネット iDesignClk の最大周波数、ターゲットプラットフォームに関する情報、バージョン情報などのアプレットPropertyのクエリ関数。 |
|
5 |
|
デザインを構成するプロセスの数を返します。 |
|
6 |
|
使用されている外部インターフェースポートの数を返します。すべての種類のインターフェースポートがリストにまとめられており、リスト内の位置がポートの論理番号になります。ポート名とPropertyは、以下で指定する関数によって取得できます。
|
|
7 |
|
指定された論理ポート番号を持つインターフェースポートの名前を取得します。 |
|
8 |
|
接続されたオペレーターの名前、このポートを制御するプロセス、このポートの現在の画像フォーマット設定などのI/OポートPropertyのクエリ。 |
|
9 |
|
デザインのパラメータ数を返します。 |
|
10 |
|
指定されたパラメータ番号に対応する名前が返されます。 |
|
11 |
|
指定されたパラメータ番号に対応するパラメータ ID が返されます。 |
|
12 |
|
指定されたパラメータ名に対応するパラメータ ID が返されます。 |
|
13 |
|
パラメータ Property をクエリします。 |
|
14 |
|
パラメータ インターフェイスを設定し、パラメータをデフォルト値に初期化します。 |
|
15 |
|
パラメータ値をクエリします。 |
|
16 |
|
パラメータの配列をクエリします。 |
|
17 |
|
パラメータ値を設定します。 |
|
18 |
|
パラメータの配列を設定します。 |
|
19 |
|
Master Enable 信号を設定します。 |
|
20 |
|
VisualApplets デザインのプロセスをアクティブ化します。 |
|
21 |
|
VisualApplets デザインプロセスのリセットを実行します。 |
|
22 |
|
指定されたエラーコードの説明をクエリします。 |
情報をクエリしてパラメータを設定するには、ランタイム インターフェイスを介してデータを送受信する必要があります。インターフェイス関数をシンプルに保ちつつタイプセーフなインターフェイスを提供するために、データの抽象化メカニズムが実装されています。異なる型のデータをやり取りする必要がある場合はいつでも、 va_data というデータ構造が使用されます。これには、データへの参照と、基となるデータ型に関する情報が含まれています。このデータ構造はユーザーによって作成されますが、以下の専用関数によって設定されます。次の表は、このメソッドで処理されるデータ型を示しています。
|
データ型 |
説明 |
|---|---|
|
|
32 ビット整数として指定された Enum エントリ。 |
|
|
32 ビット符号付き整数。 |
|
|
32 ビット符号なし整数。 |
|
V |
64 ビット符号付き整数。 |
|
|
64 ビット符号なし整数。 |
|
|
浮動小数点値、倍精度。 |
|
|
32 ビット符号付き整数の配列。 |
|
|
32 ビット符号なし整数の配列。 |
|
|
64 ビット符号付き整数の配列。 |
|
|
64ビット符号なし整数配列。 |
|
|
倍精度浮動小数点数配列。 |
|
|
次のように指定された文字列: |
以前に作成された va_data 構造体(vaData)を設定し、データ通信をセットアップするには、次の関数を使用します。
va_data* va_data_enum(va_data* vaData, int32_t *data)
va_data* va_data_int32(va_data* vaData, int32_t *data)
va_data* va_data_uint32(va_data* vaData, uint32_t *data)
va_data* va_data_int64(va_data* vaData, int64_t *data)
va_data* va_data_uint64(va_data* vaData, uint64_t *data)
va_data* va_data_double(va_data* vaData, double *data)
va_data* va_data_int32_array(va_data* vaData, int32_t *data, size_t elementCount)
va_data* va_data_uint32_array (va_data* vaData, uint32_t *data, size_t elementCount)
va_data* va_data_int64_array (va_data* vaData, int64_t *data, size_t elementCount)
va_data* va_data_uint64_array (va_data* vaData, uint64_t *data, size_t elementCount)
va_data* va_data_double_array (va_data* vaData, double *data, size_t elementCount)
va_data* va_data_string(va_data* vaData, char *data, size_t strSize)
va_data* va_data_const_string(va_data* vaData, const char **data)
文字列の通信には、次の2つの方法があります。
-
次を介してchar配列を提供する:
va_data_string()。これにより、クエリされた文字列データがその配列にコピーされます。 -
次へのポインタを提供する:
const char*。その後、次のようなタイプの情報をクエリすると、VA_STRING内部文字列列表現へのポインタが返されます。このアプローチを使用する場合は、返された文字列のライフタイムを確認してください。
サンプルコード:
次の例は、設定されたデザインの設計周波数をクエリするためのコードを示しています。
double desFreq;
va_data va_desFreq;
va_data_double(&va_desFreq,&desFreq);
vaRt_GetAppletProperty(hapHandle, "DesignFreq",&va_desFreq);
その後、変数 desFreq に要求された情報が含まれます。
次の表は、指定されたランタイムアクセス関数のパラメータと戻り値の詳細な説明を示しています。
|
機能 |
|
|---|---|
|
パラメータ 1 |
開くhapファイルの名前。 |
|
パラメータ 2 |
hapハンドル用の戻り値ポインタ。 |
|
説明 |
指定された名前でハードウェアアプレットを開き、hap構造体へのポインタを返します。 返されたポインタは、他のすべてのインターフェイス関数でハンドルとして使用されます。 |
|
戻り値 |
0 : OK <0: Error opening applet |
|
機能 |
|
|---|---|
|
パラメータ 1 |
次からのhapハンドル: |
|
説明 |
VAハードウェアアプレットを閉じます。 |
|
戻り値 |
0 = OK <0 = Error closing HAP |
|
機能 |
|
|---|---|
|
パラメータ 1 |
次からのhapハンドル: |
|
パラメータ 2 |
ターゲットプラットフォーム内のFPGAのID。シングルコンフィギュレーションのHAPファイル(現在は唯一のオプション)の場合、このパラメータは-1に固定される場合があります。それ以外の場合、このパラメータは、VisualAppletsプラットフォームの作成に使用されたハードウェア定義ファイルで指定された(オプションの)FPGA IDに対応している必要があります。 |
|
パラメータ 3 |
コンフィギュレーションビットストリームのバッファへのポインタ。 |
|
パラメータ 4 |
コンフィギュレーションビットストリームのサイズをバイト単位で通知します。 |
|
説明 |
FPGAデザインのコンフィギュレーションビットストリームを取得します。この関数には2つの動作モードがあります。 |
|
戻り値 |
0: OK <0: Error acquiring the bitstream |
|
機能 |
int vaRt_GetAppletProperty (va_hap_handle handle, const char* propName,va_data
* data)
|
|---|---|
|
パラメータ 1 |
次からのhapハンドル: |
|
パラメータ 2 |
クエリするPropertyの名前。 |
|
パラメータ 3 |
通信に使用されるデータ構造へのポインタ。 |
|
説明 |
アプレットのPropertyを取得します。以下のPropertyをクエリできます。
プロパティは上記の文字列のいずれかによって識別され(パラメータ2を介して提供)、パラメータ3を介して指定されたデータ構造を介して通信されます。型のプロパティの場合 |
|
戻り値 |
0 : OK <0 : Can’t retrieve applet property |
|
機能 |
|
|---|---|
|
パラメータ 1 |
次からのhapハンドル: |
|
パラメータ 2 |
プロセス数の戻り値。 |
|
説明 |
デザインが構成されているプロセスの数を取得します。 |
|
戻り値 |
0: OK <0 : Can’t retrieve information |
|
機能 |
|
|---|---|
|
パラメータ 1 |
次からのhapハンドル: |
|
パラメータ 2 |
ポート数の戻り値。 |
|
説明 |
VA IP Coreの使用されているI/Oポートの数を取得します。返された数値は、すべてのインターフェースポートが登録され、リスト内の位置がI/Oポートの論理番号となる、内部で管理されるポートリストのサイズを表します。 |
|
戻り値 |
0: OK <0 : Can’t retrieve information |
|
機能 |
|
|---|---|
|
パラメータ 1 |
次からのhapハンドル: |
|
パラメータ 2 |
論理インターフェースポート番号。これは、Zeroと、 |
|
説明 |
指定された論理番号を持つインターフェースポートの名前を取得します。同じ種類のポートが複数ある場合、これらのポートはサフィックス _X(X はポートインデックス、例: DmaRd_0)によって区別されます。 |
|
戻り値 |
0: OK; <0 : No port with given index found |
|
機能 |
|
|---|---|
|
パラメータ 1 |
次からのhapハンドル: |
|
パラメータ 2 |
I/Oポートの名前。 |
|
パラメータ 3 |
クエリするPropertyの名前。 |
|
パラメータ 4 |
通信に使用されるデータ構造へのポインタ。 |
|
説明 |
指定された名前を持つI/Oポートのプロパティを取得します。次のプロパティを照会できます:
の場合のみ利用可能です)。Property は上記の文字列のいずれかによって特定され( |
|
戻り値 |
0: OK <0 : Can’t retrieve the requested property |
|
機能 |
|
|---|---|
|
パラメータ 1 |
次からのhapハンドル: |
|
パラメータ 2 |
ローレベルアクセス関数に提供されるデバイスハンドルへのポインタ、および
|
|
パラメータ 3 |
32 ビットレジスタ読み取り関数の関数ポインタ。 |
|
パラメータ 4 |
32 ビットレジスタ書き込み関数の関数ポインタ。 |
|
パラメータ 5 |
64 ビットレジスタ読み取り関数の関数ポインタ。 |
|
パラメータ 6 |
64 ビットレジスタ書き込み関数の関数ポインタ。 |
|
説明 |
ローレベルレジスタアクセス関数を提供し、ボードインターフェイスポインタをそれらに関連付けることによって、パラメータインターフェイスを初期化します。初期化手順には、初期値の設定が含まれます。その他のすべての関数
レジスタアクセス関数に関しては、次のオプションを利用できます。 |
|
戻り値 |
0: パラメータインターフェイスが正常に初期化されました <0 : Error during initialization |
|
機能 |
|
|---|---|
|
パラメータ 1 |
次からのhapハンドル: |
|
パラメータ 2 |
パラメータ数の戻り値。 |
|
説明 |
パラメータインターフェイスを介してアクセスできるアプレットのパラメータ数を取得します。返される数は、利用可能なすべてのパラメータが登録されている内部管理されるパラメータリストのサイズを表し、リスト内の位置がパラメータの論理番号を定義します。 |
|
戻り値 |
0: OK <0 : Can’t retrieve information |
|
機能 |
|
|---|---|
|
パラメータ 1 |
次からのhapハンドル: |
|
パラメータ 2 |
論理パラメータ番号。ゼロから |
|
パラメータ 3 |
名前文字列へのポインタを返します。 |
|
説明 |
指定された論理パラメータ番号に対応するアプレットパラメータの名前を取得します。 |
|
戻り値 |
0: OK。*name は、パラメータ名(0で終端)を保持する静的バッファへのポインタを返します。このバッファは、本関数の次回呼び出しによって上書きされる場合があることに注意してください。 <0 : Can’t retrieve information |
|
機能 |
|
|---|---|
|
パラメータ 1 |
次からのhapハンドル: |
|
パラメータ 2 |
論理パラメータ番号。0から以下の戻り値までの間の整数です。 |
|
パラメータ 3 |
パラメータ ID の返却用ポインタ。 |
|
説明 |
アプレットのパラメータの ID を取得します。この ID は、そのパラメータにアクセスするために使用されます。 |
|
戻り値 |
0: OK <0 : No parameter with given index found |
|
機能 |
|
|---|---|
|
パラメータ 1 |
次からのhapハンドル: |
|
パラメータ 2 |
パラメータの名前。以下によって提供される値のいずれかになります。
|
|
パラメータ 3 |
パラメータ ID の返却用ポインタ。 |
|
説明 |
指定された名前を持つパラメータの ID を取得します。この ID は、そのパラメータにアクセスするために使用されます。 |
|
戻り値 |
0: OK <0 : No parameter with given name found |
|
機能 |
|
|---|---|
|
パラメータ 1 |
次からのhapハンドル: |
|
パラメータ 2 |
パラメータ名。 |
|
パラメータ 3 |
クエリするPropertyの名前。 |
|
パラメータ 4 |
通信に使用されるデータ構造へのポインタ。 |
|
説明 |
アプレットパラメータの Property をクエリします。パラメータの種類によって、異なる Property が存在します。利用可能なパラメータ Property のリストについては、VA Engine の仕様書を参照してください。Property は、パラメータ 3 で指定される文字列によって識別され、パラメータ 4 で提供されるデータ構造を介して通信されます。以下の型の Property については、 |
|
戻り値 |
0 : OK <0 : Can’t retrieve parameter property |
|
機能 |
|
|---|---|
|
パラメータ 1 |
次からのhapハンドル: |
|
パラメータ 2 |
パラメータ ID。 |
|
パラメータ 3 |
通信に使用されるデータ構造へのポインタ。関連するデータ要素は、取得された値によって上書きされます。 |
|
説明 |
パラメータ ID でアプレットパラメータをクエリします。データは、パラメータ 3 で指定されたデータ構造を使用して通信されます。フィールドパラメータをクエリするには、以下を使用します。
|
|
戻り値 |
0: OK。 <0 : Error querying the parameter. |
|
機能 |
|
|---|---|
|
パラメータ 1 |
次からのhapハンドル: |
|
パラメータ 2 |
パラメータ ID。 |
|
パラメータ 3 |
通信に使用されるデータ構造へのポインタ。関連するデータ要素は、取得された値によって上書きされます。 |
|
パラメータ 4 |
パラメータフィールド内の開始インデックス |
|
パラメータ 5 |
クエリする要素の数 |
|
説明 |
データ要素の配列を埋め込みながら、パラメータ ID によってアプレットのフィールドパラメータをクエリします。データは、パラメータ 4 で指定されたデータ構造を介して通信されます。 |
|
戻り値 |
0: OK。 <0 : Error querying the array. |
|
機能 |
|
|---|---|
|
パラメータ 1 |
次からのhapハンドル: |
|
パラメータ 2 |
パラメータ ID。 |
|
パラメータ 3 |
Applet にデータを送信するために使用されるデータ構造へのポインタ。 |
|
説明 |
指定された名前でアプレットパラメータを設定します。データはデータ構造(パラメータ 4)によって提供されます。フィールドパラメータを設定するには、以下を使用します。
v |
|
戻り値 |
0: OK。 <0 : Error setting the parameter. |
|
機能 |
|
|---|---|
|
パラメータ 1 |
次からのhapハンドル: |
|
パラメータ 2 |
パラメータ ID。 |
|
パラメータ 3 |
アプレットに値を送信するために使用されるデータ構造へのポインタ。 |
|
パラメータ 4 |
パラメータフィールド内の開始インデックス。 |
|
パラメータ 5 |
設定する要素の数。 |
|
説明 |
データ要素の配列を送信して、指定された名前のアプレットのフィールドパラメータを設定します。データはデータ構造(パラメータ 3)を介して提供されます。 |
|
戻り値 |
0: OK。 <0 : Error setting the parameter field. |
|
機能 |
|
|---|---|
|
パラメータ 1 |
次からのhapハンドル: |
|
パラメータ 2 |
グローバルイネーブルを設定する状態(1または0)。 |
|
説明 |
グローバルイネーブルを1(アクティブ=1)または0(アクティブ=0)に設定します。 |
|
戻り値 |
0: OK <0 : Error setting the global enable state. |
|
機能 |
|
|---|---|
|
パラメータ 1 |
次からのhapハンドル: |
|
パラメータ 2 |
プロセス番号、またはすべてのプロセスを一度に指定する場合は ((unsigned int)-1)。 |
|
パラメータ 3 |
イネーブルを設定する状態(1または0)。 |
|
説明 |
プロセス(またはすべてのプロセス)のイネーブルを1(アクティブ=1)または0 (アクティブ=0)に設定します。 |
|
戻り値 |
0: OK。 <0 : Error setting the process enable state. |
|
機能 |
|
|---|---|
|
パラメータ 1 |
次からのhapハンドル: |
|
パラメータ 2 |
プロセス番号、またはすべてのプロセスを一度に指定する場合は ((unsigned int)-1)。 |
|
説明 |
指定された論理プロセス番号のプロセス(またはすべてのプロセス)をリセットします。
対応するプロセスリセット信号がアサートされてから、再びネゲートされます。対応するプロセスの
イネーブル信号は変更されません。次を使用します:
|
|
戻り値 |
0: OK。 <0 : Cannot reset the process. |
|
機能 |
|
|---|---|
|
パラメータ 1 |
次からのhapハンドル: |
|
Parameter2 |
次のコード: |
|
説明 |
指定されたエラーコードのエラーメッセージ文字列をクエリします。 |
|
戻り値 |
NULL以外:エラーの説明(0で終了するC文字列) NULL:利用可能な説明はありません |
指定されたデザインに対して、VisualAppletsはGenICam XMLコードを生成できます。ターゲットプラットフォームがGenICam互換インターフェースを介してソフトウェアに接続されている場合、このオプションにより、画像処理パラメータをGenICam APIにシームレスに統合できます。追加のソフトウェアコンポーネントは必要ありません。
パラメータアクセスの統合を既存のマスターGenICam XMLファイルに行う必要がある場合は、いくつかのポストプロセッシングを実行する必要があります。これは通常、VA IPコアを埋め込む前に、プラットフォームがすでにGenICamを介して制御されている場合に発生します。
パラメータアクセスを既存のマスターGenICam XMLファイルに統合するには:
-
VisualAppletsによって生成されたXMLファイルのヘッダーをカットします。
-
カテゴリ、変数、およびレジスタ用の残りのコードをマスター XMLファイルにコピーします。
VisualAppletsはカスタムのポストプロセッシングタスクを呼び出すことができるため、このステップを自動化できます。
指定されたデザインに対して、VisualAppletsは汎用C APIコードを生成できます。このコードはプラットフォーム非依存のANSI-Cコードです。このアプローチは、組み込みシステム(Zynq7000など)でのソフトウェア統合に最適です。
生成されたコードは次のインターフェースを提供します:
#include <stdint.h>
typedef int (*write_func_t)(void* boardHandle,int address, uint64_t value, size_t sizeInBytes);
int (*read_func_t)(void* boardHandle,int address, uint64_t *value, size_t sizeInBytes);
enum VariableTypes_enum{
TYPE_UNKNOWN = 0,
TYPE_INT = 1,
TYPE_FLOAT = 2,
TYPE_STRING = 3
};
typedef enum VariableTypes_enum VariableType_t;
enum AccessMode_enum{
RO,
WO,
RW
};
typedef enum AccessMode_enum AccessMode_t;
int va_init(void* boardHandle, write_func_t wrFunc, read_func_t rdFunc);
int va_set_property(const char* propName, const char* propValue);
int va_get_int_value(const char* varName, int64_t *retValue);
int va_set_int_value(const char* varName, int64_t value);
int va_get_float_value(const char* varName, double *retValue);
int va_set_float_value(const char* varName, double value);
int va_get_string_value(const char* varName, const char **retValue);
int va_get_enum_value(const char* varName, const char** retValue);
int va_set_enum_value(const char* varName, const char* value);
int va_get_enum_item_count(const char* varName, int64_t *itemCount);
int va_get_enum_item_info(const char* varName, int64_t index, const char** itemName, int64_t *itemValue);
int va_query_variables_count(int32_t *retCount);
int va_query_variable_name(int32_t index, const char** retName);
int va_query_variable_type(const char* varName, VariableType_t *type);
int va_query_int_variable_properties(const char* varName,
int64_t *from,
int64_t *to,
int64_t *inc,
AccessMode_t *access);
int va_query_float_variable_properties(const char* varName,
double *from,
double *to,
double *inc,
AccessMode_t *access);
次を呼び出してインターフェースを初期化します: va_init().
VA IPコアのレジスタスレーブインターフェースへの書き込みおよび読み取りアクセスのコールバック関数が登録されます。指定された boardHandle は保存され、これらのおよび読み取り関数のトリガーされた呼び出しごとに提供されます。一連のクエリ関数は、汎用ランタイムインターフェースを実装するためのベースラインメカニズムを提供します。特定のデザインに対して、セット関数とゲット関数は、パラメータが名前で指定されるパラメータアクセスを提供します。これらの関数は、レジスタアクセスのコールバック関数を介して、デザインパラメータへのアクセスからハードウェア上のレジスタへのアクセスへの変換を実行します。

前へ

