複数DMAチャンネルのデザイン

ほとんどのVisualAppletsアプリケーションでは、カメラ画像の取得、画像処理アルゴリズムによる画像の処理、そしてホストPCへの結果の出力が必要です。 それに加え、ユーザーは元の監視画像もモニタリングしたいと考えます。 したがって、2つの画像出力が必要になります。 1つは元の監視画像、もう1つはアルゴリズムの実装による処理結果です。 以下では、次の仕様を満たすVisualAppletsデザインを実装します。

  • ベースコンフィギュレーションモードの Camera Link カメラを使用したグレースケール画像
  • 最大解像度 = 1024 x 1024 pixel @ 8Bit/pixel
  • 画像をバッファリングし、取得した画像のうち10枚に1枚をホストPCに転送する(モニタリング)
  • しきい値処理を使用して取得した画像をそれぞれ2値化し、結果の画像をホストPCに出力する
  • 2値化された出力画像のフォーマットは、0 = 黒、白 = 255(8Bit/Pixel)とする

仕様書を使用してブロック図を作成できます。

モニタリング付きしきい値2値化デザインのブロック図

図 206: モニタリング付きしきい値2値化デザインのブロック図


ご覧のとおり、画像が取得され、バッファリングされます。 バッファの後、処理パイプラインは2つのパスに分岐します。 最初のパスは、モニタリング用に10枚に1枚の画像を出力する役割を担います。 2番目のパスには、2値化と2値画像出力が含まれます。

ほとんどのVisualAppletsの実装は同じ原則に従っています。 最初に画像の取得とバッファリングを行います。 バッファリングの後に、画像処理ロジックが配置されます。 VisualAppletsの処理パイプラインとデザインの基本設定の詳細については、'Data Flow'をご覧ください。 以下では、仕様を1つずつ満たすVisualAppletsデザインの実装を進めていきます。 VisualAppletsの実装に加えて、組み込みシミュレーションを使用してデザインを検証し、実際のハードウェアでデザインを使用します。

モニタリング機能付き二値化のVisualApplets実装

  1. 前の例で使用した基本演算子から始めます。 これらは、カメラ演算子 CameraGrayAreaBase、バッファ ImageBuffer、および結果をホストPCに転送するための演算子である DmaToPC です。 対照的に、今回は元の画像と2値化された結果の両方を転送するために、デザイン内に2つ目の DmaToPC モジュールが必要になります。 次のデザインに示すように、すべての演算子を見つけて名前を変更します。

  2. ご覧のとおり、DMAモジュールの名前を DMA0_OriginalImages と DMA1_BinarizedImages に変更しました。これにより、インデックスが与えられました。 これは、各DMAチャネルがチャネルインデックスを使用するためです。 このチャネルインデックスは、任意のPCソフトウェアからデータにアクセスするために使用されます。 FPGA内部リソース以外のほとんどのリソースは、その場所を指定するためにインデックスを使用します。 FPGA外部のハードウェアを使用する演算子の一部には、カメラ演算子、ImageBufferなどのDRAMを使用する演算子、 トリガー信号などの汎用入出力を使用する演算子、およびDMA演算子があります。 実際、これまでにデザインに含まれているすべての演算子は外部リソースを使用しており、インデックスを割り当てることができます。 カメラ演算子は、Camera LinkポートAまたはBに割り当てることができます。 バッファは、microEnable IV VD4-CL上の4つのDRAMのいずれかに割り当てることができ、DMAはDMAチャネルのいずれかに割り当てることができます。 デバイスリソースの使用に関する詳細な説明は、'Allocation of Device Resources'に記載されています。 サポートされているすべてのハードウェアプラットフォームで使用可能なデバイスリソースのリストは、Device Resourcesに示されています。

    デバイスリソースのほとんどは、VisualAppletsのリソースダイアログウィンドウを使用して変更できます。 一部のリソースは、演算子のパラメータを使用して変更できます。 デバイスリソースを変更するには、Design → Resource からアクセスできるリソースダイアログウィンドウを開くか、編集メニューバーのアイコンを使用する必要があります。

    DMAモジュール DMA0_OriginalImages がインデックス0に割り当てられ、DMA1_BinarizedImages がインデックス1に割り当てられていることを確認してください。 カメラモジュールは、Camera LinkポートAを表すインデックス0に割り当てる必要があります。 バッファが使用するDRAMチップについては特に指定しないため、一部のメモリ演算子間で競合がある場合は、VisualAppletsにインデックスを自動的に選択させます。 一般に、VisualAppletsは常に未使用のインデックスを選択します。 2つのカメラモジュールがあり、インデックス0を使用しているモジュールを削除した場合、残りのカメラモジュールはインデックス1を使用します。 そのため、アプレットのビルドを開始する前に、すべてのデバイスリソースインデックスを必ず確認してください。 リソースインデックスは合成後に変更することはできません。

  3. 次に、画像処理アルゴリズムを取り込む必要があります。 2つの異なる画像処理アルゴリズムを実装する必要があるため、パイプラインを2つのパスに分岐させる必要があります。 これは、分岐演算子によって簡単に行うことができます。ベース演算子ライブラリで演算子を見つけ、デザインにドラッグします。 マウスボタンを離すと、ユーザーが出力リンクの数、つまり分岐の数を指定できるウィンドウがポップアップ表示されます。 2つを選択し、「OK」をクリックします。これで、2つの出力リンクと1つの入力リンクを持つ分岐モジュールがデザインに追加されます。 モジュールをバッファの隣に移動し、接続します。

    これでパイプラインが分岐し、分岐とDMAモジュールの間に両方の画像処理アルゴリズムを実装できるようになりました。

    1. まず、10枚に1枚の画像のみを出力する必要がある元の画像出力パスを実装します。 必要なすべての演算子をメインのデザインレベルに配置する代わりに、階層ボックスを使用します。 階層モジュールを使用すると、デザインに階層構造を実装し、任意の数の演算子を組み合わせて新しい演算子を作成するのに便利です。 階層モジュールを使用すると、作業領域の概要を把握しやすくなります。 1つの入力と1つの出力を持つ階層ボックスをデザインに挿入します。 階層ボックスは、ベース演算子ライブラリ、デザイン領域のポップアップメニュー、またはメインメニューの「Design」から見つけることができます。

      HierarchicalBox モジュールを分岐とDMAの間に配置し、接続します。 モジュールの名前は、コンテキストメニューを使用するか、モジュールを選択してF2キーを押すことで変更できます。

      階層モジュールの内容を編集するには、モジュールをダブルクリックします。 新しい空白のデザインウィンドウが開き、入力コネクタと出力コネクタのみが含まれています。 必要な演算子をその間に配置し、ポートに接続します。 階層モジュールを終了するには、Backspaceキーまたはアイコンを押します .

      10枚中9枚の画像を削除するには、以下に示す演算子が必要です。

      およびパラメータ設定:

      • CountFrames モジュールのプロパティ

      • CountFrames モジュールの出力のリンクプロパティ

      • Not0 モジュールのプロパティ

      動作原理: CountFrames モジュールは、各画像のピクセルを 0 から 9 の間の値に置き換えます。 したがって、画像ごとに 0 から 9 まで繰り返しカウントします。 Not0 モジュールは、現在のカウント値が 0 でない場合、各画像のすべてのピクセルを値 1 に置き換えます。 RemoveImage モジュールは、2つ目の入力「Rem」のピクセル値が値 1 である場合、各画像を削除します。 これにより、画像番号 0、10、20、30、... がバイパスされます。その他の画像はすべて削除されます。

    2. 二値化の実装のために、別の階層モジュールをデザインに追加します。

      この階層モジュール内のオペレータは、「Is_GreaterThan」と「Scale」です。

      ThresholdFromモジュールは実際の二値化を表します。 Numberパラメータで指定された値より大きい各入力ピクセル値に対して、値1が出力され、そうでない場合は0が出力されます。 したがって、モジュールの出力ビット深度は1ビットになります。これはリンクのプロパティを開くことで確認できます。 1ビットの値を出力するのではなく、結果を8ビットの値にする必要があります。 これを実行する非常におおらかな解決策は、各値を255でスケーリングすることです。これにより、バイナリ値の1は255になり、 バイナリ値の0は0のままになります。ScaleBy255モジュールのパラメータを次のように設定します。

      ご覧のとおり、ScaleFactorパラメータのパラメータタイプをStaticに設定しています。このオペレータにとってこれは非常に重要であり、 動的なパラメータと比較して、必要なFPGAリソースがはるかに少なくなります。 一般に、合成後に変更する必要がないことがわかっている場合は、常にパラメータを静的タイプに設定してください。

  4. 実装の最終ステップは、デザインルールエラーのチェックです。DRCを実行してエラーを確認します。 エラーがない場合は、デザインをビルドしてハードウェアで使用できるようになります。 あるいは、次のセクションで示すシミュレーションを使用して実装を検証することもできます。 随時デザインを保存することを忘れないでください。

シミュレーションを使用した二値化デザインの検証

ほとんどのデザインにおいて、実際のFPGAハードウェアで使用する前にシミュレーションを使用して実装の機能を検証することは非常に便利です。 以下では、シミュレーションを使用してデザインを検証します。

  1. 準備

    まず、シミュレーション用の画像が必要になります。 TIFFまたはBMP形式の画像ファイルを使用する必要があります。 例のようにグレースケール画像を使用する画像処理パイプラインに画像データを注入する場合は、単一のカラーコンポーネントを持つ画像を使用する必要があります。 シミュレーションに使用できる画像ファイルの詳細については、「Simulation」を参照してください。 VisualAppletsのインストールフォルダには、いくつかのサンプル画像が含まれています。

  2. ソースとプローブ

    Image files can be injected to any image transporting link using "simulation_source"" modules and can be monitored on any other link using "simulation_probe" modules. In our example, we add a simulation source to the link between the camera and the buffer and simulation probes according to the following screenshot. You can add simulation sources and probes from the "Analysis" menu, from the context menu of the design window, or simply from the icons marked in the Figure.

  3. 画像ファイルの追加

    画像ファイルをシミュレーションソースに追加するには、デザイン内のソースをダブルクリックしてSimulation Source Viewerを開きます。 次に、画像ファイルをSimulation Source Viewerウィンドウにドラッグアンドドロップするか、 File → Open メニューを使用します。

    画像ファイルがシミュレーションソースに追加されました。モジュールまたはウィンドウにドラッグするだけで、ソースにさらにファイルを追加できます。 Simulation Source Viewerウィンドウの下部で、シーケンス内のすべての画像を確認できます。

  4. シミュレーションの開始

    シミュレーションを開始する準備が整いました。 Analysis → Start Simulation ( F9 ) を選択して、メインのSimulationウィンドウを開きます。 このウィンドウを開くたびに、デザインルールチェックが自動的に実行されます。 デザインルールチェックに失敗したデザインをシミュレートすることはできません。

    VisualAppletsでは、シミュレーションはサイクル単位で処理されます。 各サイクルは、デザイン内のすべてのシミュレーションソースからの画像の注入を表します。 Startをクリックするだけでシミュレーションが開始されます。 VisualAppletsによってシミュレーションが実行されます。 デザインの複雑さによっては、これに数秒かかる場合があります。

  5. 結果の確認

    シミュレーション結果を確認できるようになりました。 Simulationウィンドウを閉じます。 シミュレーションプローブに結果が入力されているはずです。

    二値化の後ろにあるプローブのSimulation Probe Viewerを開くと、シミュレーションが機能したかどうかをすぐに確認できます。 画像には、値0および255を持つピクセルが含まれている必要があります。

    必要に応じて、結果をディスクに保存できるようになりました。

  6. シーケンスシミュレーション

    前のステップで二値化を検証できました。 ただし、ホストPCに転送されるのは10枚に1枚の画像のみであると想定されているため、単一のシミュレーション画像ではモニタリング出力を検証するには不十分です。 したがって、一連の画像をシミュレートする必要があります。

    1. Simulationウィンドウをもう一度開きます。

    2. Resetをクリックして、前回のシミュレーションからのシーケンスをリセットします。 一般に、新しいシミュレーションを開始する場合は、ユーザーエラーを回避するために常にシミュレーションをリセットすることが役立ちます。

    3. Startをクリックして1つの画像をシミュレートします。 各シミュレーションプローブで結果が得られます。 現時点でSimulationウィンドウを閉じる必要はありません。 デザインウィンドウ内のモジュールの番号を確認することで、シミュレーションプローブ内の現在の画像数を取得できます。

    4. Startをクリックして、もう一度サイクルを実行します。 今回は、DMA0モジュールのプローブを除き、すべてのシミュレーションプローブの画像番号が2に増加しているはずです。

      合計11サイクルをシミュレーションするまで、このステップを繰り返します。 これでDMA 0のプローブには2つの画像が含まれているはずです。これにより、実装が正しく機能していることが示されます。

    5. Startを11回クリックする代わりに、シミュレーションウィンドウのスピンボックスを使用して処理サイクル数を設定できます。 シミュレーション結果は同じになります。 また、10シミュレーションサイクルを設定して開始し、その後に次の10サイクルを開始することもできます。お好みでどうぞ...

ハードウェアでの二値化デザインの検証

実装の機能を確認したら、ハードウェアでテストして使用できます。 ハードウェアアプレットファイルHAPを取得するには、デザインをビルドする必要があります(ユーザーマニュアル:'Build')。 デザインが、この例のmE4VD4-CLなどのハードウェアプラットフォームと一致していることを確認してください。 さらに、プロジェクトがWindows 64 Bitなどの正しいアーキテクチャを使用していることを確認してください。 インストールされているFramegrabber SDKと同じである必要があります。 Build → Synthesize ( F7 )からビルドを開始します。 VisualAppletsがFPGAメーカーのツールを使用して、デザインをFPGAビットストリームに変換します。

合成の結果、HAPファイルが生成されます。 これには、FPGAビットストリームと、データおよびパラメータにアクセスするためのソフトウェアインターフェースが含まれています。 HAPファイルは、Framegrabber SDKのインストールディレクトリのサブディレクトリ「Hardware Applets」にあります。または、 Framegrabber SDKがインストールされていない場合や別のターゲットランタイムを選択した場合は、システム設定で指定されたフォルダにあります ('System Settings'を参照)。

Framegrabber SDKのツールであるmicroDisplayでデザインをテストします。microDisplayは、アプレットの最初のテストを行うためのツールです。 microDisplayを開いてアプレットを読み込みます。 microDisplayには2つのDMA画像ウィンドウが表示されます。 具体的には、10枚に1枚の画像のみが表示される元の画像ウィンドウと、二値化された画像を表示する2番目のDMAウィンドウです。 Framegrabber SDKでのアプレットの使用に関する詳細な説明は、Framegrabber SDK documentationを参照してください。

microDisplayでのBinarization Appletの使用

図207:microDisplayでのBinarization Appletの使用