Main Content

フレームベースのアルゴリズムからの HDL コード生成

FPGA デバイスや ASIC デバイスなどの I/O に制限のあるプラットフォームでは通常、大規模なデータセットをストリーミング ピクセルまたはサンプルとして処理します。フレームベースのモデルをこれらのデバイスに展開するには、データのストリームに対して動作するように手動でアルゴリズムを変換する必要があります。HDL Coder™ のフレームからサンプルへの最適化を使用することで、このプロセスを自動化し、フレームベースのモデルまたは行列の入力をもつ MATLAB® 関数から HDL コードを生成できます。この最適化は、フレームベースのベクトルまたは行列の入力を HDL コード生成用により小さいサイズのサンプルまたはピクセルに変換して、ストリームベースのハードウェアをターゲットにし、大規模な入出力信号の処理に必要な FPGA I/O を削減します。イメージ処理、デジタル信号処理、レーダー アプリケーション、オーディオ処理などの大きな入力をもつ領域における各種ユース ケースで、アルゴリズムの開発時間を削減しながら、ハードウェアの設計を最適化できます。

フレームからサンプルへの最適化を使用すると、HDL Coder は、ライン バッファーへの DUT 内のサンプルの格納、ストリームの整列、データ パスの均衡化に必要なロジックをもつ、ハードウェアに対応した HDL コードをフレームベースのアルゴリズムから生成します。要素単位の演算、近傍の演算、反復演算とリダクション演算などの複数のモデリング パターンを使用して、フレームからサンプルへの最適化でサポートされているフレームベースのアルゴリズムを作成できます。

フレームベースのアルゴリズムからの HDL コードの生成

フレームからサンプルへの変換を使用してフレームベースのアルゴリズムから HDL コードを生成すると、HDL Coder はフレームベースのアルゴリズムを合成可能な HDL コードに変換します。このコードは、valid 制御信号と ready 制御信号を含むサンプルベースのロジックおよびフレームベースのアルゴリズムから直接データ ストリームを処理して整列するロジックをもちます。フレームからサンプルへの変換は、Simulink® モデルまたは MATLAB 関数とともに使用できます。

Frame-to-sample high-level conversion in a workflow

フレームベースのアルゴリズムから HDL コードを生成すると、ストリームベースの HDL コードおよび生成されたモデルには、サンプルベースのロジックが含まれます。このロジックには、data 信号、valid 制御信号、および ready 制御信号が含まれています。次のタイミング図には、Valid 信号、Data 信号、Ready 信号の間の関係のマッピングが示されています。

Timing diagram for frame-to-sample conversion optimization

Valid 信号は、データが利用可能かどうかを示します。Ready 信号は、DUT でデータを受け入れて処理できることを示します。データの転送は、Valid 信号と Ready 信号がともに High である場合にのみ行われます。これは、イメージ内でデータ パケット A、B、C として表されています。Ready 信号が Low の場合、DUT はそれ以上データを処理できません。Ready 信号のアサート前に Valid 信号および Data 信号を送信した場合、Data 信号はドロップされます。Ready 信号が High のときに、Valid 信号をデアサートしてデータを送信しないことも可能です。Ready 信号をデアサートし、Valid 信号が High の場合、Data 信号はドロップされます。これは、イメージ内でデータ パケット D として表されています。

HDL コード生成でサポートされている要素単位の演算、近傍の演算、反復演算とリダクション演算を使用して、行列またはフレームベースのアルゴリズムを作成できます。以下を作成できます。

  • MATLAB 関数の関数 hdl.npufun または Simulink モデルの Neighborhood Processing Subsystem ブロックを使用した近傍の演算。DUT 内の MATLAB Function ブロックで hdl.npufun を使用して、カーネルでのフィルター処理など、近傍の処理および要素単位の演算を入力イメージまたは行列に適用できます。

  • 関数 hdl.iteratorfun を使用した反復演算。たとえば、DUT 内の MATLAB Function ブロックで hdl.iteratorfun を使用して配列をループ処理し、ヒストグラム均等化のために入力イメージまたは行列に対して単一の出力を生成したり、minmax などの統計量を計算したりすることができます。

  • GainProductSumSubtractDivide ブロックなどの要素単位の関数やブロックを使用した要素単位の演算。

ビジョン/イメージ処理では、これらのフレーム演算を使用して、フィルター処理、ヒストグラム作成、ヒストグラム均等化、エッジ検出などの 2 次元ベースのアルゴリズムをモデル化できます。信号処理では、大規模な入力信号で移動平均を計算できます。

フレームからサンプルへの変換の最適化の指定

Simulink モデルまたは MATLAB 関数から、フレームからサンプルへの変換の最適化を行った HDL コードを生成できます。

Simulink でのフレームからサンプルへの変換の最適化の指定

Simulink モデルに対してフレームからサンプルへの変換の最適化を有効にするには、以下のようにします。

  1. DUT の Inport ブロックの HDL ブロック プロパティ ConvertToSamples を個別に有効にして、フレームからサンプルへの変換の最適化を使用して、入力ベクトルまたは行列入力信号をサンプルに変換します。フレームからサンプルへの変換の入力信号として Inport ブロックを指定するには、以下を入力します。

    hdlset_param("<path/to/Inport>", ConvertToSamples = "on")
    

  2. [コンフィギュレーション パラメーター] ウィンドウで、[フレームからサンプルへの変換を有効にする] パラメーターを選択します。フレームからサンプルへの変換のパラメーターを使用して、フレームからサンプルへの最適化のオプションを設計に適用します。Simulink モデルでフレームからサンプルへの変換を有効にするには、コマンド ラインで次のように入力します。

    hdlset_param("<model_name>", FrameToSampleConversion = "on")
    
    詳細については、[フレームからサンプルへの変換を有効にする] を参照してください。

  3. MATLAB Function ブロックを使用してフレームベースのアルゴリズムを設計した場合は、MATLAB Function ブロックの HDL ブロック プロパティ [アーキテクチャ][MATLAB Datapath] に設定します。

HDL コードの生成後、生成されたモデルおよび HDL コードを確認すると、ストリームされた各行列入力に sample、valid、ready のバンドルが含まれていることがわかります。検証モデルを使用して、元のフレームベースのモデルと生成されたサンプルベースのモデルを比較できます。また、IP コアの生成ワークフローを使用して、生成された HDL コードを FPGA に展開することもできます。例については、Deploy a Frame-Based Model with AXI4-Stream Interfacesを参照してください。

MATLAB でのフレームからサンプルへの変換の指定

MATLAB 関数に対してフレームからサンプルへの変換の最適化を有効にするには、以下のようにします。

  1. MATLAB HDL ワークフロー アドバイザーを開きます。MATLAB HDL ワークフロー アドバイザーの使用を開始するには、MATLAB からの基本の HDL コード生成と FPGA 合成を参照してください。

  2. 左側のペインで、[HDL コード生成] タスクをクリックします。右側のペインで、[最適化] タブに移動し、[アグレッシブなデータフロー変換] を選択します。

  3. [フレームからサンプルへの変換] タブをクリックし、[フレームからサンプルへの変換を有効にする] を選択します。このタブでフレームからサンプルへの変換のパラメーターを使用して、最適化のオプションを設計に適用します。

フレームベースのモデル例からの HDL コードの生成

Simulink モデル hdlFrame_Blur_2D_MLFB は、近傍処理パターンを使用する、一般的なイメージ処理のフレームベースのぼかしアルゴリズムをモデル化します。

モデルを開いて、フレームベースのぼかしアルゴリズムを表示します。モデルは、イメージぼかしカーネルをイメージ cameraman.tif に適用します。

open_system("hdlFrame_Blur_2D_MLFB");
set_param(gcs,'SimulationCommand','Update');

DUT の MATLAB Function ブロックに image_blur という名前の MATLAB 関数が含まれています。関数 image_blur はフレームからサンプルへの変換でサポートされる関数 hdl.npufun を呼び出して、関数 blur のぼかしカーネルを入力イメージに適用します。詳細については、hdl.npufunを参照してください。

open_system("hdlFrame_Blur_2D_MLFB/DUT/MATLAB Function")

コマンド ラインからモデル コンフィギュレーション パラメーター FrameToSampleConversionon に設定して、フレームからサンプルへの変換の最適化を適用します。

hdlset_param("hdlFrame_Blur_2D_MLFB", FrameToSampleConversion = "on");

入力の HDL Inport ブロック プロパティ ConvertToSampleson に設定して、サンプルベースの信号に変換するフレームベースの入力信号を指定します。この例では、DUT サブシステムの Inport ブロック I についてのみ ConvertToSamples プロパティを on に設定します。

hdlset_param("hdlFrame_Blur_2D_MLFB/DUT/I", ConvertToSamples = "on");

フレームベースのモデルからサンプルベースのバージョンへの変換を確認するには、モデル生成を有効にします。DUT サブシステムから HDL コードおよび生成されたモデルを生成します。

hdlset_param("hdlFrame_Blur_2D_MLFB", GenerateModel = "on");
makehdl('hdlFrame_Blur_2D_MLFB/DUT');

bdclose('hdlFrame_Blur_2D_MLFB/Original');
bdclose('hdlFrame_Blur_2D_MLFB/Equalized1');
### Working on the model <a href="matlab:open_system('hdlFrame_Blur_2D_MLFB')">hdlFrame_Blur_2D_MLFB</a>
### Generating HDL for <a href="matlab:open_system('hdlFrame_Blur_2D_MLFB/DUT')">hdlFrame_Blur_2D_MLFB/DUT</a>
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlFrame_Blur_2D_MLFB', { 'HDL Code Generation' } )">hdlFrame_Blur_2D_MLFB</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlFrame_Blur_2D_MLFB'.
### Begin compilation of the model 'hdlFrame_Blur_2D_MLFB'...
### Working on the model 'hdlFrame_Blur_2D_MLFB'...
### The code generation and optimization options you have chosen have introduced additional pipeline delays.
### The delay balancing feature has automatically inserted matching delays for compensation.
### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays.
### Output port 1: 127 cycles.
### Output port 1: The first valid output of this port will be after an initial latency of 257 valid inputs.
### Output port 2: 127 cycles.
### Output port 2: The first valid output of this port will be after an initial latency of 257 valid inputs.
### Working on... <a href="matlab:configset.internal.open('hdlFrame_Blur_2D_MLFB', 'GenerateModel')">GenerateModel</a>
### Begin model generation 'gm_hdlFrame_Blur_2D_MLFB'...
### Rendering DUT with optimization related changes (IO, Area, Pipelining)...
### Model generation complete.
### Generated model saved at <a href="matlab:open_system('hdlsrc/hdlFrame_Blur_2D_MLFB/gm_hdlFrame_Blur_2D_MLFB.slx')">hdlsrc/hdlFrame_Blur_2D_MLFB/gm_hdlFrame_Blur_2D_MLFB.slx</a>
### Delay absorption obstacles can be diagnosed by running this script: <a href="matlab:run('hdlsrc/hdlFrame_Blur_2D_MLFB/highlightDelayAbsorption')">hdlsrc/hdlFrame_Blur_2D_MLFB/highlightDelayAbsorption.m</a>
### To clear highlighting, click the following MATLAB script: <a href="matlab:run('hdlsrc/hdlFrame_Blur_2D_MLFB/clearhighlighting.m')">hdlsrc/hdlFrame_Blur_2D_MLFB/clearhighlighting.m</a>
### Begin VHDL Code Generation for 'hdlFrame_Blur_2D_MLFB'.
### MESSAGE: The design requires 65536 times faster clock with respect to the base rate = 1.
### Working on counterNetwork as hdlsrc/hdlFrame_Blur_2D_MLFB/counterNetwork.vhd.
### Working on NeighborhoodCreator_3x3/row3_col2 as hdlsrc/hdlFrame_Blur_2D_MLFB/row3_col2.vhd.
### Working on NeighborhoodCreator_3x3/row2_linebuffer/SimpleDualPortRAM_generic as hdlsrc/hdlFrame_Blur_2D_MLFB/SimpleDualPortRAM_generic.vhd.
### Working on NeighborhoodCreator_3x3/row2_linebuffer as hdlsrc/hdlFrame_Blur_2D_MLFB/row2_linebuffer.vhd.
### Working on NeighborhoodCreator_3x3 as hdlsrc/hdlFrame_Blur_2D_MLFB/NeighborhoodCreator_3x3.vhd.
### Working on boundaryCounters_3_3 as hdlsrc/hdlFrame_Blur_2D_MLFB/boundaryCounters_3_3.vhd.
### Working on BoundaryCheck_3x3 as hdlsrc/hdlFrame_Blur_2D_MLFB/BoundaryCheck_3x3.vhd.
### Working on I_NeighborhoodCreator as hdlsrc/hdlFrame_Blur_2D_MLFB/I_NeighborhoodCreator.vhd.
### Working on hdlFrame_Blur_2D_MLFB/DUT/MATLAB Function/blur/nfp_div_single as hdlsrc/hdlFrame_Blur_2D_MLFB/nfp_div_single.vhd.
### Working on hdlFrame_Blur_2D_MLFB/DUT/MATLAB Function/blur/nfp_add_single as hdlsrc/hdlFrame_Blur_2D_MLFB/nfp_add_single.vhd.
### Working on hdlFrame_Blur_2D_MLFB/DUT/MATLAB Function/blur as hdlsrc/hdlFrame_Blur_2D_MLFB/blur.vhd.
### Working on hdlFrame_Blur_2D_MLFB/DUT/MATLAB Function as hdlsrc/hdlFrame_Blur_2D_MLFB/MATLAB_Function.vhd.
### Working on hdlFrame_Blur_2D_MLFB/DUT/Input_FIFOs/I_FIFO as hdlsrc/hdlFrame_Blur_2D_MLFB/I_FIFO.vhd.
### Working on hdlFrame_Blur_2D_MLFB/DUT/Input_FIFOs as hdlsrc/hdlFrame_Blur_2D_MLFB/Input_FIFOs.vhd.
### Working on hdlFrame_Blur_2D_MLFB/DUT/Output_FIFOs/I_out_FIFO as hdlsrc/hdlFrame_Blur_2D_MLFB/I_out_FIFO.vhd.
### Working on hdlFrame_Blur_2D_MLFB/DUT/Output_FIFOs as hdlsrc/hdlFrame_Blur_2D_MLFB/Output_FIFOs.vhd.
### Working on hdlFrame_Blur_2D_MLFB/DUT as hdlsrc/hdlFrame_Blur_2D_MLFB/DUT.vhd.
### Generating package file hdlsrc/hdlFrame_Blur_2D_MLFB/DUT_pkg.vhd.
### Code Generation for 'hdlFrame_Blur_2D_MLFB' completed.
### Generating HTML files for code generation report at <a href="matlab:hdlcoder.report.openDdg('/tmp/Bdoc24a_2528353_2772718/tp80d2818f/hdlcoder-ex36441221/hdlsrc/hdlFrame_Blur_2D_MLFB/html/hdlFrame_Blur_2D_MLFB_codegen_rpt.html')">hdlFrame_Blur_2D_MLFB_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/Bdoc24a_2528353_2772718/tp80d2818f/hdlcoder-ex36441221/hdlsrc/hdlFrame_Blur_2D_MLFB/DUT_report.html
### HDL check for 'hdlFrame_Blur_2D_MLFB' complete with 0 errors, 0 warnings, and 2 messages.
### HDL code generation complete.

生成されたモデル gm_hdlFrame_Blur_2D_MLFB を開きます。このモデルには、DUT のサンプルベースのバージョン、Valid 信号、Ready 信号、および Data 信号が含まれています。

open_system('gm_hdlFrame_Blur_2D_MLFB');
Simulink.BlockDiagram.arrangeSystem('gm_hdlFrame_Blur_2D_MLFB');

生成されたモデル DUT を開きます。サンプルベースの生成されたモデルに含まれているハードウェア詳細は、元のフレームベースのモデルより大幅に多くなっています。DUT サブシステムには、生成されたストリーミング行列分割からのデータを処理して格納する入出力 FIFO があります。ストリーミング行列分割には、ぼかしアルゴリズム、およびアルゴリズムをストリームベースのハードウェアに展開するために必要なその他のサンプルベースのロジックが含まれています。

open_system('gm_hdlFrame_Blur_2D_MLFB/DUT');

生成されたモデルを実行すると、出力イメージの取得にかかる時間が元のモデルより長くなっていることがわかります。フレームベースのアルゴリズムを、イメージのピクセルを一度に 1 つずつストリームするサンプルベースのアルゴリズムに変換するには、各ピクセルの処理にフレームベースのバージョンより多くの時間が必要となります。元の入力フレームからの有効な入力ピクセルに対して有効な出力ピクセルを処理するレイテンシは、入力イメージのサイズ、サイクルあたりのサンプル数、アルゴリズムなどのいくつかの要素に左右されます。MATLAB コマンド ウィンドウの makehdl コマンドの出力に、追加されたレイテンシが表示されます。この例では、最初の有効な出力は、257 個の有効な入力の初期レイテンシ後に利用可能になっています。

サンプル レート、レイテンシ、およびイメージ サイズにより、生成されたモデルで必要なシミュレーション終了時間が決定されます。生成されたモデルでサンプルベースのアルゴリズムからぼかし処理された出力イメージを生成するために、元の生成されたモデルおよび後続の生成されたモデルで 2 秒の終了時間が設定されています。これは、レイテンシの追加後に出力イメージ全体を表示するために必要な時間です。

ハードウェアの考慮事項

ハードウェアへの展開用にフレームベースのアルゴリズムから HDL コードを生成する前に、以下のようにします。

  • ストリームベースのアルゴリズムの適用前後にメモリにフレームを格納するのに十分なメモリがターゲット ハードウェアにあることを確認します。サンプルベースのアルゴリズムでは追加のメモリが必要になりますが、使用される I/O は大幅に削減されます。

  • 設計である程度のレイテンシに対応できることを確認します。サンプルベースのアルゴリズムでは、アルゴリズム、設計、および入力データ サイズに応じて、レイテンシおよび遅延が追加されます。

サポートされているブロックと演算

フレームからサンプルへの変換では、以下のブロックと演算がサポートされています。

  • HDL ブロック プロパティ [アーキテクチャ][MATLAB Datapath] に設定された MATLAB Function ブロック。MATLAB 関数では、以下を使用できます。

    • hdl.npufunhdl.iteratorfun など、フレームからサンプルに焦点を合わせた関数。

    • ストリームデータ間の要素単位の演算。

    • スカラーとストリームデータ間の演算。

  • Neighborhood Processing Subsystem ブロック。

  • 要素単位の演算。たとえば、GainProductSumSubtractDivide の各ブロックなど、要素単位の演算をサポートしているブロックを使用できます。

  • 正方行列の積演算。たとえば、正方入力行列を指定して Matrix Multiply ブロックを使用できます。

  • 3 次元行列。

  • 定数の入力またはソース。

  • 飽和。

  • 三角関数演算。

  • ビットスライス、ビット論理積、ビット論理和などのビット単位の演算。

  • 比較演算。

  • Bias ブロック。

  • Abs ブロック。

  • Complex to Real-Imag ブロックおよび Real-Imag to Complex ブロック。

  • Sqrt ブロック。

  • Data type conversion ブロック。

  • Switch ブロック。

制限

フレームからサンプルへの変換では、以下はサポートされていません。

  • 列ベクトル。

  • 関数 hdl.iteratorfun の永続変数。

  • 非正方行列の積演算。

  • ストリームデータに対する行列演算。たとえば、Simulink のフレームからサンプルへの変換では、ストリームデータでの SelectorAssignment、または Reshape ブロックの使用はサポートされていません。

  • 要素の和演算。

  • 要素の積演算。

  • hdl.RAM などの MATLAB System object。

  • For Each Subsystem。

  • Delay ブロック。

  • 設計遅延を含むブロック。

  • データ型としての Bus オブジェクト。

  • MATLAB 関数からの IP コア生成。

参考

関数

ブロック

モデル設定

関連するトピック