'Basic Principles'では、オペレーターとリンクを使用してFPGAアプリケーションを構築するというVisualAppletsのコンセプトについて説明しました。この章では、FPGAベースのデータ処理で使用されるデータフローモデルについて説明します。
FPGAの実装は、マイクロプロセッサ(CPU)上で実行されるソフトウェアプログラムとは異なります。CPUは画像が完全に転送された後にのみ処理を開始できますが、FPGAは画像の転送と処理を同時に行うことができます。
FPGA実装内のすべての機能は同時に(つまり並列に)動作できますが、マイクロプロセッサはプログラム命令をシーケンシャルに実行します。これは非常に重要な違いであり、FPGA実装の絶大な利点の1つです。すべてが並列で動作するため、データはパイプライン構造で処理されます。モジュール(つまりインスタンス化されたオペレーター)はリンクで接続されます。各モジュールは、データが利用可能になるとすぐに画像または信号データの処理を開始します。結果はリンクを介して次のモジュールに転送されます。ほとんどのモジュールは入力画像データをバッファリングしません。情報は利用可能になり次第、計算結果を出力します。デザイン内のデータ転送は次のようになります。
デザイン内のデータ転送は次のように示されます。
プロジェクトは、カメラ、バッファ、DMAオペレーターの3つのモジュールで構成されています。カメラオペレーターは画像ソースモジュールです。カメラから送信された画像を受信します。ただし、フルフレームを収集して完全な取得後に画像を出力するのではなく、モジュールはピクセルが到着し次第、次のモジュールに転送します。バッファモジュールImageBufferは画像データを保存できるバッファですが、出力がブロックされていない限り、利用可能なデータを直ちに出力します。DMAモジュールは画像をホストPCに転送します。
このパイプライン構造の結果、同じ画像の他のピクセルがまだカメラから転送されている間に、画像ピクセルがホストPCに転送されます。したがって、モジュール内に画像が保存されることはありません。この非バッファリングパイプラインの利点は、すべてのモジュールを並列実行でき、効率的に使用できることです。さらに、レイテンシ(ピクセルが完全に処理されるまでに必要な時間)が最小限に抑えられます。
パイプラインモデルに関する実践的なガイダンスについては、Pipeline Conceptのチュートリアルのトピックを参照してください。パイプラインでのレイテンシの処理方法については、Latencyのチュートリアルのトピックを参照してください。
![]() |
注意 |
|---|---|
|
すべてのモジュールは並列実行され、利用可能になり次第、出力がブロックされていなければ結果を出力できることを常に念頭に置いてください。パイプラインを、バルブ、分岐、大小のチューブを備えた水道管のように想像してください。 |
マイクロプロセッサプログラムとは異なり、すべてが並列で実行されるため、オペレーションの数、つまりオペレーターの数は処理速度に影響を与えません。ただし、アプレットで使用されるオペレーターが増えるほど、より多くのハードウェアリソースが必要になります。
アプレットプロセスは、対応するプロセスのすべてのDMAが開始された後にのみ、ハードウェアで使用できます。ただし、プロセスにDMAチャネルが含まれていない場合は、アプレットの初期化直後に開始されます。これは、画像取得の開始前に使用されるトリガーおよび信号処理アプリケーションに役立ちます。
ハードウェアでのVisualAppletsアプレットの初期化と使用方法の詳細については、'Running Your Applet on Hardware'セクションおよび/またはFramegrabber SDK documentationを参照してください。
アプレット内のパイプラインの帯域幅は、オペレーターの処理速度と接続リンクによって異なります。リンクには複数の“link properties”があります('Link Properties'を参照)。そのうちの1つが帯域幅を定義するParallelismです。Parallelismは、1つのデザインクロックサイクルで2つのオペレーター間で何ピクセルが並列転送されるかを定義します。Parallelismが高いほど、帯域幅も高くなります。オペレーターは、リンクの必要な帯域幅を満たすように自動的に適応します。これが不可能な場合は、帯域幅を再定義します。Parallelismに関する実践的なガイダンスについては、Parallelismのチュートリアルのトピックを参照してください。
簡単な例を考えてみましょう。Parallelismが4の場合、4つのピクセルが並列転送されます。これは、画像の最初の4つの連続するピクセルが、カメラモジュールから後続のモジュール(この場合はバッファ)に並列転送されることを意味します。次に、次の4つのピクセルがカメラモジュールからバッファモジュールに転送されます。その間に、最初の4つのピクセルがバッファモジュールで処理され、画像処理チェーンの次のモジュールに転送されます。
前述のように、Parallelismは、デザインクロック周波数の1クロックサイクルで並列転送されるピクセルの数を定義します。周波数は使用するハードウェアデバイスによって異なります。たとえば、microEnable IVシリーズのフレームグラバーは、62.5 MHzのデザインクロック周波数を使用します。
![]() |
帯域幅の計算 |
|---|---|
|
リンクの帯域幅bは、Parallelism pと周波数fの積によって決定されます。 ![]() |
したがって、Parallelismが4の場合、帯域幅は次のようになります。
。1ピクセルあたり8 Bit Widthと仮定すると、これにより250 MB/sの帯域幅が得られます。すべてのハードウェアプラットフォームの基本デザインクロック周波数の一覧は、 デバイスリソース.
オペレーターによって、入力リンクと出力リンクの間でParallelismを変更することができます。そのため、デザイン全体を通して帯域幅が一定になるとは限りません。これは、必要な帯域幅が変化する可能性があるためです。たとえば、あるオペレーターが画像サイズを縮小するとします。その結果、必要な出力帯域幅も減少します。
上記の式で計算される帯域幅は理論値です。実際の帯域幅は、理論値よりもわずかに小さくなります。
![]() |
重要 |
|---|---|
|
一部のオペレーターは、入力リンクで与えられた全帯域幅を処理できません。対象となるすべてのオペレーターの詳細情報については、Operator Referenceを参照してください。 |
帯域幅とレイテンシーの違いに注意してください。レイテンシーはオペレーターごとに個別に定義され、主にアルゴリズムの実装に依存します。
![]() |
GUI上の視覚化 |
|---|---|
|
対応するリンクプロパティを視覚化するために、VisualAppletsではプログラムウィンドウのツールバーに2つのGUIボタンが用意されています。
リンク情報の表示
![]()
リンクスループットの表示
![]()
|
前述のように、VisualAppletsでは、ピクセルはパイプラインを介して次々に転送されます。リンクのParallelismが1より大きい場合、複数のピクセルが並列に転送されます。画像またはライン内のピクセルの転送順序は次のとおりです。一般に、カメラからのフレーム(2次元画像)のピクセルは、左上隅の最初のピクセルから始まり、右下隅の最後のピクセルで終わる順序で転送されます。VisualAppletsのオペレーターが処理にピクセル位置を必要とする場合も、左から右、上から下という同じ順序が想定されます。次の図は、この順序を示しています。
ただし、カメラなどの一部のソースはこの順序に準拠していません。このような場合は、VisualAppletsのオペレーターとデザインを使用してピクセル順序を修正できます。これを行うには、ピクセル転送のプロトコルに関するある程度の知識が必要です。詳細な情報は、'Image Protocols, Image Dimensions and Data Structure'セクションに記載されています。
Image Protocolは、転送されるピクセルおよびデータの画像寸法とデータ構造を定義します。Image Protocolは、前述のリンクプロパティであるParallelism以外の、もう1つのリンクプロパティです。
画像プロトコルには3つのタイプがあります。
-
“2D” VALT_IMAGE2D
2D画像プロトコルは画像の転送に使用され、主にエリアスキャンカメラで使用されます。リンクは次の情報を伝送します。
-
ピクセルが転送されるとき(pixel valid信号)
-
ラインが完了したとき(end-of-line信号)
-
フレームが完了したとき(end-of-frame信号)
したがって、2D画像には以下の特徴を持たせることができます。
-
ライン内の任意の数のピクセル
-
任意の画像高さ
ラインまたは行内のピクセル位置自体は転送されません。位置は、先行するラインの数と、現在のライン内での先行するピクセルの数から算出されます。ライン内のピクセル間にギャップを設けることはできません。ラインの長さは任意に設定できます。ラインにピクセルが含まれていない場合、つまり空のラインが存在する可能性があります。フレームには最低でも1つの空のラインが含まれている必要があります。
-
-
“1D” VALT_LINE1D
1D画像プロトコルはラインの転送に使用され、主にラインスキャンカメラで使用されます。リンクは次の情報を伝送します。
-
ピクセルが転送されるとき(pixel valid信号)
-
ラインが完了したとき(end-of-line信号)
したがって、1Dイメージには以下の特徴があります:
-
ライン内の任意の数のピクセル
-
無制限のイメージハイト
繰り返しになりますが、ライン内のピクセル位置そのものは転送されません。位置は、先行するラインの数と、現在のライン内の先行するピクセルの数から算出されます。ライン内のピクセル間にギャップを設けることはできません。任意のライン長にすることは可能です。ラインにピクセルを含めないことも可能であり、つまり空のラインが許可されます。
-
-
“0D” VALT_PIXEL0D
0Dイメージプロトコルでは、イメージディメンションに関する情報は保持されません。単なるピクセルのストリームです。ただし、ピクセル間にタイムギャップが存在する場合があり、つまりピクセルに有効な信号が付随します。0Dプロトコルは、主に測定結果などのデータ転送に使用されます。
-
“Signal” VALT_SIGNAL
信号プロトコルにおいて、転送は常に有効な(すべてのクロックサイクルで有効な)単一ビットデータ転送に限定されます。そのため、このプロトコルには pixel valid や line/frame completed のような制御信号は含まれません。信号プロトコルは、トリガーおよび信号処理システムで使用される信号オペレーターに使用されます。
イメージプロトコルはLink Propertyです。各オペレーターは、どのLink Propertyを入力で受け入れ、出力で利用可能にするかを個別に決定します。リンクのパラメータ設定の詳細については、'Link Properties'を参照してください。
前のセクションでは、VisualAppletsデザインのパイプライン構造について説明しました。前述の通り、データはプロジェクトのモジュール間でリンクを介して転送されます。モジュールが入力ピクセルの処理を完了し、出力値の計算を終えるとすぐに、その結果が出力リンクに出力されます。しかし、次のモジュールが別のピクセルを処理中であるため、データを処理できない場合があります。この場合、VisualAppletsのフロー制御が適用され、パイプラインがブロックされます。したがって、モジュールは入力をブロックすることができます。この場合、先行するモジュールは結果を出力せず、ブロック状態をパイプライン内で逆方向に伝播させます。
図33「シンプルなVisualAppletsのデザイン」に示す簡単な例を見てみましょう。カメラによって生成された帯域幅を処理できない低速なPCが使用されていると仮定します。この場合、DmaToPCモジュールはホストPCにデータを転送できません。したがって、モジュールは時々入力をブロックします。ブロック信号はデザイン内をイメージバッファモジュールまで伝播します。これで、ブロックがアクティブな間、イメージバッファはデータを出力しなくなります。ImageBufferモジュールはバッファであるため、以降に入力されるすべてのデータがバッファリングされ、バッファのFillレベルが増加します。カメラがデータの送信を停止すると、新しい入力データがバッファに転送されなくなり、データが空になるまで出力されます。
![]() |
ヒント |
|---|---|
|
繰り返しになりますが、フロー制御は水のパイプラインのようなものだと想像できます。バルブが閉じられると、それ以上水を流すことができません。バッファオペレーターは、ドレインが入力ストリームを処理しきれない場合に水が溜まる貯水池のようなものです。 |
チュートリアルのトピックであるStoppable and Non-Stoppable Data Streamsも参照してください。



![[注]](../common/images/admon/note.png)

![[ヒント]](../common/images/admon/tip.png)

![[重要]](../common/images/admon/important.png)







前へ

