コンテンツにスキップ

オペレータータイプと同期#

オペレータリファレンスの Memory Library — メモリタイプ別のオペレータ概要 SYNC, InsertLine, InsertImage、または SourceSelector この記事では、VisualAppletsがどのようにオペレータを分類し、分岐が合流するときにデータストリームを同期させる方法について説明します。このトピックを読むことで、O型、M型、P型の動作、O型ネットワークルール、同期入力と非同期入力、および

主要用語

VisualAppletsでは、種類を示す形状で各オペレーターが表示されます。丸型のアイコンはO型オペレーターです。四角型のアイコンはM型またはP型オペレーターです。M型とP型はいずれも四角型のアイコンを使用するため、形状だけで判別することはできません。種類については、製品内ヘルプまたはオペレーターリファレンスを確認してください。主な違いとして、M型オペレーターは入力をブロックできますが、P型オペレーターは積極的にブロックしません。

ブロックとは、生成されたFPGAステージが、それ以上のデータを受け入れる準備ができていないときに入力を一時停止できることを意味します。2つの独立したカメラストリームはタイミングが異なるため、通常のオペレーターで接続することはできません。データストリームを同期させるには、バッファを備えた同期オペレーターを使用してください。

オペレーター種類の識別#

VisualAppletsは、オペレーターを3つのタイプに分類します。デザインペインのモジュールアイコンの形状で種類を識別できます。製品内ヘルプおよびオペレーターリファレンスに、各オペレーターの種類が記載されています。

タイプ 形状 主な動作
Oタイプ 丸型:

O型オペレーター
  • シンプルな処理
  • ピクセル数は変更されません
  • 直列または並列でチェーン接続
Mタイプ 四角型:

M型オペレーター
  • 複雑な処理
  • ピクセル数と寸法を変更できます
  • 入力をブロックできます
Pタイプ 四角型:

P型オペレーター
  • Mタイプに似ていますが、入力を能動的にブロックしません

カメラモジュールなどのすべてのソースオペレータはMタイプオペレータです。次のようなすべての最終的な宛先 DmaToPCはMタイプオペレータです。

O型オペレーター#

Oタイプオペレータは、簡単な処理ステップを実行します。これらは次のルールに従います。

  • 出力上のピクセル数は、入力上のピクセル数と等しくなります。
  • 入力と出力の間には、一定のクロックサイクル数の遅延があります。このタイミング遅延は、タイミング同期中に補正する必要があります。
  • 制限なしで直列または並列に組み立てることができます。Oタイプパイプラインの分割とマージに追加の同期は必要ありません。
  • データストリーム自体をブロックすることはできませんが、下流のモジュールからブロッキング条件を伝播させます。

情報

アルゴリズムに適している場合は、Oタイプオペレータを使用することをBaslerはお勧めします。通常、Mタイプオペレータよりも少ないFPGAリソースを使用します。

M型オペレーター#

Mタイプオペレータは、より複雑な処理を実行します。これらは次のルールに従います。

  • 入力と出力の間でピクセル数を変更できます。
  • 出力を遅延させることができます。
  • これ以上データを受け入れる準備ができていない場合に入力をブロックできます。
  • 接続する際は、リンクルールに従う必要があります。
  • 異なるM-typeソースからのデータストリームを結合するには、非同期入力を持つ専用のオペレーターを使用する場合のみ可能です(例: SYNC、または SourceSelectorを使用します。

カメラオペレーターおよびバッファオペレーターは常にM-typeオペレーターです。多くのフィルタオペレーターや同期オペレーターもM-typeです。

P-Type Operator#

P型オペレーターはM型オペレーターに似ています。主な違いは、入力を積極的にブロックしない点です。また、リンク上の帯域幅を削減せず、受信したデータよりも多くのデータを生成することもありません。停止不能なソースで使用できます。

主要用語

停止不能なストリームは連続して実行されます。停止不能なソースは、生成されたFPGAデザインのフロー制御ロジックによって一時停止させることはできません。典型的な例は、ピクセルを送り続けるカメラです。対照的に、停止可能なストリームは、次のオペレーターの準備ができていないときに一時停止できます。カメラと後続処理の間のバッファにより、停止不能なストリームが停止可能なストリームに変換されることがよくあります。

停止可能および停止不可能なデータストリームの詳細については、Stoppable and Non-Stoppable Data Streamsのチュートトピックを参照してください。

Operator Referenceに例外が明記されている場合を除き、P型およびM型オペレータの両方に同じリンク規則が適用されます。ただし、M型オペレータとは異なり、P型オペレータは停止不可能なソースで使用できます。

同期および非同期入力#

複数の入力を持つM型オペレータは、同期入力、非同期入力、またはその両方を受け入れます。オペレータによっては、相互に非同期である可能性がある同期入力のグループを提供するものもあります。製品内ヘルプおよびOperator Referenceには、各ポートに必要な入力タイプが記載されています。

同期入力#

Many operators require synchronous inputs on all or on a subset of their input ports. Synchronous means that the data streams on these inputs are aligned: The protocol, the number of incoming pixels, and the timing of the data must all match exactly.

同期動作は、すべての入力が、O-typeオペレーターのネットワークを通じてのみルーティングされる共通のM-typeソースに由来する場合に保証されます。これらの入力は、他のソース(つまりM-typeオペレーター)が導入されない限り、任意の数のO-typeオペレーターを介して接続できます。

同じ同期グループに属するすべての入力は、常に単一のM-typeソースを共有します。

典型的な例は RemoveImage であり、同じ LineBuffer:

同期入力

非同期入力#

からの2つの画像入力を備えています。

非同期画像入力をサポートするオペレーターには以下が含まれます:

  • SYNC
  • InsertLine
  • InsertImage
  • SourceSelector.

FrameBufferRandomRead および FrameBufferMultiRoiDyn も非同期画像リンクを受け入れますが、それらの座標入力は同期している必要があります。

通常のマルチ入力オペレーターでは、2つの独立したM-typeソースを結合できません。これを行うには、非同期入力をサポートするオペレーターが必要です:

非同期入力

同期ルール#

O-typeネットワークでは、ネットワークの複雑さに関係なく、すべてのO-typeモジュールは同じM-typeまたはP-typeモジュールから供給される必要があります。このソースからのリンクは、他のO-typeモジュールまたはO-typeサブネットワークを通過できます。

O-typeパイプラインの分割と結合は簡単であり、追加の同期を必要としません。

O型ネットワーク

M-typeまたはP-typeオペレーターがネットワークに導入されると、新しいデータソースになります。異なるソースから発信された分岐が下流で結合される場合、結合には同期が必要です。つまり、次のような非同期入力を持つオペレーターを追加する必要があります SYNC, InsertLine, InsertImage、または SourceSelector。これらの分岐を標準のマルチ入力オペレーターに接続することはできません。

VisualAppletsでは、デザインペイン内で同期違反が紫色のリンクで強調表示されます。

VisualApplets:紫色のリンクによる同期違反のマーク

このO型ネットワークルールにより、同期入力が保証されます。同じ同期入力グループに属するすべての分岐は、単一のM型またはP型ソースから発生し、O型オペレータのみを通過する必要があります。

O-typeネットワークルールは、 Image Protocol = VALT_SIGNALの詳細については、以下を参照してください。 シグナルリンクの異なるルール ユーザーズマニュアルを参照してください。

独立したソースの合流#

2つ以上の独立したソースが1つの処理パスにフィードする場合、タイミングと画像寸法を同期させる必要があります。

  • タイミング同期は、各ブランチにピクセルが到着するタイミングを合わせます。
  • 画像寸法同期は、幅、高さ、および画像プロトコルを合わせます。

同期は通常、オペレーター SYNCを使用して行われます。状況によっては、同期のためのその他のオプションがいくつかあります。

タイミング同期が正しくないと、デッドロック、帯域幅の不足、またはデータ損失が発生する可能性があります。

情報

デッドロックを回避するには、ソースが異なる速度で動作する場合や、いずれかのブランチで遅延が発生する場合、次のようなMemoryオペレーターを ImageFifo または ImageBufferの前に SYNC オペレーター配置します。Memory要素のサイズも適切に設定する必要があります。十分なバッファサイズを選択するには、予想される遅延を把握しておく必要があります。

デッドロックはVisualAppletsのシミュレーションでは確実に検出できず、ハードウェア上でのみ発生します。これらを検出するには、microDisplay Xなどにおいて、フレームグラバー上の FillLevel の ImageFifo オペレータまたはその他のバッファオペレータ フレームグラバー上(例えば microDisplay Xなど)。FIFOが100%のままである場合、多くはデッドロックの発生源を示しています。VisualAppletsのデザインペインでは、そのFillレベルを確認することはできません。

デッドロックの詳細については、Troubleshooting: Deadlockを参照してください。

非同期ストリームをマージする場合は、ラインレート、フレームレート、およびピクセルレートが一致していることを確認してください。一方のカメラの動作がもう一方よりも速い場合、バッファが一杯になってオーバーフローし、データが失われます。複数のカメラから同じレートで長期的な取り込みを行う必要がある場合は、トリガーシステムを使用してください。

SYNCオペレーターによる同期#

イメージ SYNC オペレーターは、すべての入力リンクのタイミングと画像サイズを同期します。入力の数は、オペレーターをインスタンス化する際に固定されます。すべての出力は同期されます。その後、下流のOタイプオペレーターがマージされたストリームを処理できます。

イメージ SYNC オペレーターは、すべての入力に対してバルブのように機能します。すべての入力に有効なピクセルが存在するまで待機します。その後、すべての出力に同時にピクセルを転送します。

入力画像のサイズが異なる場合、 SYNC がそれらを揃えます。パラメータ設定に応じて、小さい画像を拡張するか、大きい画像を切り抜きます。オペレータの説明を参照してください。 SYNC (Operator Reference内)およびセクション SyncToMinおよびSyncToMaxパラメータ値の使用 のために SyncToMin および SyncToMax の動作。

情報

設定するピクセルのカラーコンポーネントを指定するには、 SYNC カメラが同期してトリガーされる場合にのみ、デザイン内のカメラの近くにあるオペレーターを使用してください。そうしないと、バッファがすぐに一杯になる可能性があります。

一般的な2台カメラのパスは次のようになります。

SYNCオペレーターによる同期

バッファは、カメラ間のタイミングのズレを吸収します。バッファがなく、かつ SYNCもない場合、デザインでデッドロックやDRC警告のリスクが生じます。

オーバーレイとスティッチングの手順に関する詳細なウォークスルーについては、ユーザーマニュアルのSynchronization of Asynchronous Image Pipelinesを参照してください。

SyncToMinおよびSyncToMaxパラメータ値の使用#

ソースに 異なるサイズの画像が含まれている場合は、 SyncMode の SYNC オペレーターを使用してそれらのサイズを整列させます。値を選択できます SyncToMin および SyncToMax.

同期により、すべての出力画像のサイズが同じになります。 SYNC オペレーターは2つのモードをサポートします。

  • SyncToMin: 大きな画像を切り抜くことで、すべての画像を最小の画像サイズに合わせます。

    SyncToMinによる大きめの画像のクロッピング

  • SyncToMax: 小さな画像を拡大することで、すべての画像を最大の画像サイズに合わせます。 SyncToMax モードでは、追加された領域はダミーのゼロピクセル(黒として表示)でFillされます。

    SyncToMaxによる大きめの画像のパディング

シミュレーションでは、次のようになります。

SyncToMin: 大きい方の画像が切り抜かれます。

シミュレーションでの SyncToMin

SyncToMax: 小さい方の画像はダミーピクセルで埋められます。

シミュレーションでの SyncToMax

InsertLineおよびInsertImageオペレーターによる同期#

InsertLine 複数のソースからのラインを挿入して画像を組み立てます。両方のソースが順番にラインを供給するラインベースのステッチングに使用します。

カメラが同期してトリガーされる場合、 ImageFifo オペレーターの代わりに、より小さな LineBuffer オペレーターを使用できます。これによりリソースの使用量が削減されます。

InsertLine による同期

情報

InsertLine および InsertImage は、多くの場合、 CONST オペレーターと一緒に使用されます。この文脈において、 CONST は、画像またはラインが出力ストリームに含まれるかどうかを指定します。データは常に処理されますが、 CONST は、それが出力ストリームに表示されるか、内部で破棄される(つまり、内部のトラッシュパスに送られる)かを決定します。

InsertImage 複数のソースからの画像を挿入して画像シーケンスを組み立てます。2台のカメラからの画像を1つの出力シーケンスに多重化するために使用します。

InsertImage による同期

どちらのオペレーターも非同期入力を受け付けます。これらのオペレーターを停止不可能なソースで使用する場合は、デッドロックを回避するために、十分なサイズのバッファをその前に配置してください。オペレーターリファレンスの InsertLine および InsertImage も参照してください。

SourceSelectorオペレーターによる同期#

SourceSelector 複数の画像ソース(たとえば2台のカメラ)の間で選択を行います。受信した画像の整合性を維持しながら、非同期ソース間で切り替えます。

選択された入力のみが出力に転送され、他のすべての入力は破棄されます。入力で画像の転送中に切り替えが発生した場合、新しいソースがアクティブになる前に現在の転送が完了します。

設定するピクセルのカラーコンポーネントを指定するには、 SelectSource パラメータを使用して、実行時にアクティブなソースを制御します。

オペレーターは、別の入力に切り替える前に、現在のフレームを完了します。カメラが入力に供給している場合は、 InfiniteSource を ENABLED を設定します。入力がバッファリングされた停止可能なストリームからのものである場合は、 DISABLED を設定します。

SourceSelector による同期

Baslerでは、すべての入力が同じMタイプモジュールから供給されている場合は、 IF または CASE の代わりに SourceSelector を使用することを推奨しています。これらのオペレーターはより少ないリソースを使用します。たとえば、次のようなデザインを参照してください。 CASE オペレーター:

SourceSelector の代わりに CASE を使用する

オペレーターリファレンスの SourceSelector も参照してください。

同期の回避#

同期およびバッファリング用のオペレータは多くの FPGA リソースを消費するため、可能な限り同期が必要にならないようにしてください。多くの場合、これは、必要な M 型オペレータの前でデータを結合し、その後でデータを分割するという代替設計手法を適用することで実現できます。次のスクリーンショットは、同様のワークフローの 2 つの実装を示しています。1 つ目は MergePixel および ADDを使用し、2 つ目は SYNC:

同期の回避

トラブルシューティング:デッドロック#

最も一般的で最も困難な同期エラーの 1 つがデッドロックです。

デッドロックは、例えばバッファを使用せずに、2 つのソースが SYNC オペレータによって直接同期される場合に発生します。この状況では、各ソースが相手を待ちます (A は B を待ち、B は A を待ちます)。その結果、データは転送されません。

下の図は、下側のパスにあるブランチ モジュールを示しています。このモジュールは停止信号を受信するため、入力でのデータ受け入れを停止します。その結果、上側のパスもデータの受信を停止し、パイプライン全体が停止します。

デッドロック

デッドロックは、システムが正常に実行されているように見えるシミュレーションでは確認できないことがよくあります。しかし、ハードウェア上では、通常、出力が得られないという結果になります。このような場合、ハードウェア アプレットがフリーズし、PC へのデータ転送が停止し、最終的に DMA タイムアウトが発生します。

情報

デッドロックは、シミュレーションでは表示されないことが多いため、検出が困難です。デッドロックの可能性を特定するには、microDisplay X などのランタイムツールを使用して、ハードウェア内の FIFO の Fill レベルを監視します。100% の容量で留まる FIFO は、デッドロックまたはボトルネックの可能性を示しています。

デッドロックの一般的な原因:

  • バッファの不足
  • 誤った同期

デッドロックの修正方法:

デッドロックを解消するには、例えば FIFO ベースのバッファリングを挿入します。 ImageBuffer または ImageFifoの前に SYNC オペレータ。これにより、一方のソースをわずかに先行させ、相互待機状態を防ぐことができます:

デッドロックの解決

DRCによるデザインの検証#

分岐が合流する配線を行った後、Analysis → Design Rules Check Level 1 を実行します。Level 1 は同期違反を報告し、影響を受けたリンクを紫色でマークします。

Design Rules Check Level 2 は拡張チェックを実行し、FPGA リソースを見積もります。ビルドする前に、Level 1 からの構文エラーを修正してください。

DRCログをハイライトされたモジュールおよびリンクとあわせて確認してください。完全なワークフローについては、チュートリアルトピックの空のデザインから実行可能なアプレットまでを参照してください。