Main Content

Zynq ワークフローでの AXI-Stream インターフェイスを使用したモデルの展開

この例では、Zynq® ハードウェアのプロセッサと FPGA の間の高速データ転送を可能にする AXI4-Stream インターフェイスの使用方法を説明します。

はじめる前に

この例を実行するには、次のソフトウェアとハードウェアをインストールして設定していなければなりません。

はじめに

以下の例では、次のような操作方法を説明します。

  1. 簡易ストリーミング プロトコルを使用したストリーミング アルゴリズムのモデル化。

  2. AXI4-Stream インターフェイスを使用した HDL IP コアの生成。

  3. DMA コントローラーを使用した Zedboard リファレンス設計への生成された IP コアの統合。

  4. AXI4-Stream ドライバー ブロックを使用した ARM プロセッサで実行する C コードの生成。

上記の図は、Zynq プラットフォームでのプロセッサと FPGA ファブリックの間のストリーミング データ転送を示すアーキテクチャの概要図です。通常、AXI4-Stream インターフェイスは、プロセッサから FPGA に大規模なデータのチャンクを転送するために、直接メモリ アクセス (DMA) コントローラーと共に使用されます。データは通常、ソフトウェアでベクトル データとして表されます。DMA コントローラーは、メモリからベクトル データを読み取り、それを AXI4-Stream インターフェイスを介して FPGA IP にストリーミングします。ストリーミング プロセスは、サンプルあたり 1 つのデータ要素を送信します。これは、FPGA IP のストリーミング アルゴリズムのデータ パスがスカラー データ型を使用していることを意味します。

FPGA IP には、制御信号またはパラメーター調整のために AXI4-Lite インターフェイスを含めることもできます。AXI4-Lite インターフェイスと比べて、AXI4-Stream インターフェイスは、データをより高速に転送するため、アルゴリズムのデータ パスにより適しています。

プロセッサへの接続以外に、AXI4-Stream インターフェイスをもつ FPGA IP を AXI4-Stream インターフェイスをもつその他の IP にも接続して、FPGA 内部のデータを転送することができます。

簡易ストリーミング プロトコルを使用するストリーミング アルゴリズムのモデル化

Zynq ハードウェアで単純な対称 FIR フィルターを展開するには、そのフィルターを FPGA に実装します。ARM プロセッサはソース データを生成し、AXI4-Stream インターフェイスを介してそれを FPGA にストリーミングします。

sfir_fixed モデルを考えます。

open_system('sfir_fixed')
set_param('sfir_fixed', 'SimulationCommand', 'Update')

このモデルのデータ パス (x_in から y_out まで) は、スカラーの入力データを処理していることに注意してください。これは、ストリーミング インターフェイスに適しています。

ソフトウェアからフィルター アルゴリズムへのデータ転送を有効にするために、データ パス端子を AXI4-Stream インターフェイスにマッピングする必要があります。AXI4-Stream インターフェイスにはデータ (Data) に加え、データ有効 (Valid)、バック プレッシャー (Ready)、データの境界 (TLAST) などの制御信号が含まれます。

AXI4-Stream IP コア生成機能では、少なくとも Data 信号と Valid 信号を DUT でモデル化する必要があります。Data 信号は、インターフェイスを超えて送信するプライマリ ペイロードです。Valid 信号は、Data 信号が有効であることを示します。その他の制御信号はオプションです。

メモ: IP コアを生成するには、"Data""Valid" は簡易ストリーミング プロトコルに従います。完全な AXI4-Stream プロトコルをモデル化する必要はありません。HDL Coder は、簡易ストリーミング プロトコルを完全な AXI4-Stream プロトコルに変換するために、HDL IP コアのストリーミング インターフェイス モジュールを自動的に生成します。以下の図に示すように、プロトコルでは、"Data" 信号が有効なときには常に、"Valid" 信号もアサートされなければなりません。

sfir_fixed アルゴリズムを簡易ストリーミング プロトコルにマッピングするために、"Valid" 信号を追加する必要があります。"Valid" 信号をモデルに追加するには、次のモデリング パターンを使用します。

  1. アルゴリズム サブシステムを Enabled Subsystem に変換します。

  2. 入力制御端子 Valid_In と出力制御端子 Valid_Out を追加します。

  3. Valid_In を使用して、アルゴリズム サブシステムのイネーブル端子と Valid_Out を駆動します。

このパターンでは、入力ストリーミング チャネルと出力ストリーミング チャネルの両方が、簡易ストリーミング プロトコルに従います。

モデル例を開きます。

open_system('hdlcoder_sfir_fixed_stream');

サブシステム DUT は、FPGA ファブリックをターゲットにするハードウェア サブシステムです。このサブシステム内で、symmetric_fir サブシステムはフィルター アルゴリズムを表します。入力端子 x_in_datax_in_valid および出力端子 y_out_datay_out_valid は、フィルターのデータ パス端子です。h_in1 などのその他の入力端子は、フィルター パラメーターを調整する制御端子です。

モデルは、簡易ストリーミング プロトコルのモデリング パターンに従います。symmetric_fir サブシステムは、Enabled Subsystem です。入力制御信号 x_in_validsymmetric_fir サブシステムのイネーブル端子を制御し、出力制御信号 y_out_valid の駆動も行います。

AXI4-Stream IP コアの生成を使用すると、他のストリーミング制御信号をオプションでモデル化できます。たとえば、バック プレッシャー信号 Ready をモデル化できます。AXI4-Stream インターフェイスはマスター/スレーブ モードで通信します。このモードでは、マスター デバイスがデータをスレーブ デバイスに送信します。Ready 信号は、スレーブ デバイスからマスター デバイスへの、スレーブ デバイスが新しいデータを受け入れるかどうかを示すバック プレッシャー信号です。次の図に示すように、スレーブ デバイスが新しいデータを受け入れることができるときに "Ready" 信号がアサートされます。スレーブ デバイスが新しいデータを受け入れられなくなったときに、Ready 信号をデアサートする必要があります。マスター デバイスが Ready 信号のデアサートを認識した時点から最大 1 サンプル後にデータ転送が停止されます。この 1 サンプルの許容は、プロトコルに組み込まれます。

メモ: 次の図は、簡易ストリーミング プロトコルに従った "Data" 信号、"Valid" 信号、"Ready" 信号の間の関係を示しています。IP Core Generation ワークフローを実行すると、コード ジェネレーターによってストリーミング インターフェイス モジュールが HDL IP コアで追加され、それにより簡易プロトコルが完全なストリーミング プロトコルに変換されます。

FIFO ブロックを使用して着信ストリーミング データのフレームを収集するときに、"Ready" 信号を使用できます。このデータは次にアルゴリズムで処理されます。データ処理中は、Ready 信号をデアサートしてデータがさらに着信しないようにします。

AXI4-Stream インターフェイスを使用した HDL IP コアの生成

次に、HDL ワークフロー アドバイザーを起動し、Zynq ハードウェア ソフトウェア協調設計ワークフローを使用して、この設計を Zynq ハードウェアに展開します。詳しい手順については、Xilinx Zynq プラットフォームをターゲットにする方法の概要の例を参照してください。

1. MATLAB コマンド ウィンドウで次のコマンドを使用して Xilinx Vivado 合成ツール パスを設定します。コマンドを実行するときに独自の Vivado インストール パスを使用します。

  hdlsetuptoolpath('ToolName', 'Xilinx Vivado', 'ToolPath', 'C:\Xilinx\Vivado\2019.1\bin\vivado.bat')

2.DUT サブシステム hdlcoder_sfir_fixed_stream/DUT から HDL ワークフロー アドバイザーを起動します。このモデル例では、ターゲット インターフェイスの設定は既に保存されているため、タスク 1.1 と 1.2 の設定は自動的に読み込まれます。モデルのターゲット インターフェイス設定の保存の詳細については、Save Target Hardware Settings in Modelの例を参照してください。

タスク 1.1 では、[ターゲット ワークフロー] については [IP Core Generation] が選択され、[ターゲット プラットフォーム] については [Zedboard] が選択されます。タスク 1.2 では、[リファレンス設計] については [Default system with AXI4-Stream interface] が選択され、次の図に示すように [ターゲット プラットフォーム インターフェイス テーブル] が読み込まれます。データ パス端子 x_in_datax_in_validy_out_data、および y_out_valid は AXI4-Stream インターフェイスにマッピングされ、h_in1 などの制御パラメーター端子は AXI4-Lite インターフェイスにマッピングされます。

AXI4-Stream インターフェイスはマスター/スレーブ モードで通信します。このモードでは、マスター デバイスがデータをスレーブ デバイスに送信します。したがって、データ端子が入力端子である場合、これを AXI4-Stream スレーブ インターフェイスに割り当て、データ端子が出力端子である場合、これを AXI4-Stream マスター インターフェイスに割り当てます。

3.タスク 3.2 [RTL コードと IP コアの生成] を右クリックして、[選択したタスクまで実行] を選択し、IP コアを生成します。生成された IP コア レポート内の IP コアについては、レジスタ アドレス マッピングおよびその他のドキュメントを参照してください。

AXI4-Stream 互換のリファレンス設計への IP の統合

次に、HDL ワークフロー アドバイザーで、[組み込みシステムの統合] タスクを実行して、生成された HDL IP コアを Zynq ハードウェアに展開します。

1. タスク 4.1 [プロジェクトを作成] を実行します。このタスクでは、生成された IP コアが [Default system with AXI4-Stream interface] リファレンス設計に挿入されます。このリファレンス設計には、FPGA ファブリック データ ストリーミングへのプロセッサを処理するための Xilinx AXI DMA IP が含まれます。最初の図に示すように、または IP コア レポートでは、データは ARM プロセッシング システムから、DMA コントローラーと AXI4-Stream インターフェイスを介して、生成された HDL FIR フィルター IP コアに送信されます。次に、フィルター IP コアの出力はプロセッシング システムに送り返されます。

2.必要に応じて、[結果] ペインのリンクをクリックして、生成された Vivado プロジェクトを開きます。Vivado ツールで、[Open Block Design] をクリックして Zynq 設計図を表示します。これには、生成された HDL IP コア、AXI DMA コントローラーおよびプロセッサが含まれます。

3.HDL ワークフロー アドバイザーで、残りのタスクを実行してソフトウェア インターフェイス モデルを生成し、FPGA ビットストリームを作成およびダウンロードします。

AXI4-Stream ドライバー ブロックを使用した ARM 実行可能ファイルの生成

次の図に示すように、ソフトウェア インターフェイス モデルはタスク 4.2 [ソフトウェア インターフェイス モデルを生成] で生成されます。

ソフトウェア インターフェイス モデルで AXI4-Lite ドライバーは自動的に生成されますが、AXI4-Stream ドライバー ブロックは自動的に生成できません。その理由は、AXI4-Stream ドライバー ブロックは、ソフトウェア側ではベクトル端子に接続されると想定されますが、x_in_data DUT 端子はスカラー端子であるためです。

1. ソフトウェア インターフェイス モデルからコードを生成する前に、次を実行します。

a. [Simulink ライブラリ ブラウザー][Embedded Coder Support Package for Xilinx Zynq Platform] ライブラリから AXI4-Stream IIO Read ドライバー ブロックと AXI4-Stream IIO Write ドライバー ブロックを追加します。

b. ベクトル データ ソースを使用して x_in_data 端子を駆動します。

c. x_in_data 端子をドライバー ブロックに接続します。

d. AXI4-Stream IIO Write ブロックをダブルクリックして [タイムアウト] を [inf] ではなく [0] に設定します。これを以下に示します。

e. AXI4-Stream IIO Write ブロックの優先順位を 1 に設定して、読み取りの前に書き込みが発生するようにします。優先順位を設定するには、ブロックを右クリックしてプロパティを開き、優先順位を 1 に設定します。これを以下に示します。

f. AXI4-Stream IIO Read ブロックをダブルクリックして、[フレーム サイズ] を [100]、[サンプル時間] を [Ts]、[タイムアウト] を [10] に設定します。これを以下に示します。

g. AXI4-Stream IIO Read ブロックの優先順位を設定する必要はありません。Write ブロックの優先順位を 1 に設定するだけで、書き込みが読み取りの前に発生することになります。

この例では、更新されたソフトウェア インターフェイス モデル hdlcoder_sfir_fixed_stream_sw が提供されます。このモデルでは 100 個のデータ要素をもつベクトル データ ソースが使用され、AXI4-Stream DMA ドライバー ブロックに接続されます。これは、プロセッサのサンプル時間ごとに、DMA コントローラーは、AXI4-Stream インターフェイスを介して HDL IP コアに対して 100 個の 32 ビット データ サンプルをストリーミングし、100 個の 32 ビット ストリーミング データ サンプルを受信することを意味します。

2.エクスターナル モードのソフトウェア インターフェイス モデルを構成してビルドします。

a. 生成されたモデルで、[ハードウェア] ペインをクリックして [ハードウェア設定] に移動し、[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。

b. [ソルバー] を選択して [終了時間] を [inf] に設定します。

c. [ハードウェア] ペインから [監視と調整] ボタンをクリックします。

d. モデル ツールストリップで [実行] ボタンをクリックします。Embedded Coder は、モデルを構築し、ARM 実行可能ファイルを ZedBoard ハードウェアにダウンロードして、これを実行し、モデルを ZedBoard ハードウェアで実行しているこの実行可能ファイルに接続します。

3.これで、設計のハードウェア部分とソフトウェア部分が Zynq ハードウェアで実行されます。ARM プロセッサは、DMA コントローラーと AXI4-Stream インターフェイスを介してソース データを FPGA IP に送信します。ARM プロセッサは、FPGA IP からフィルター結果データを受信し、エクスターナル モードを介して結果データを Simulink に送信します。時間スコープ y_out で、Zynq ハードウェアからの FIR フィルター IP コアの出力を確認します。

4.ソフトウェア インターフェイス モデルの FIR フィルター パラメーターを調整して、パラメーターの調整に従って FIR フィルターの出力がどのように変化するかを観察します。パラメーター値は、エクスターナル モードと AXI4-Lite インターフェイスを介して Zynq ハードウェアに送信されます。