Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

Zynq ワークフローの AXI4-Stream インターフェイス入門

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

はじめる前に

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

ZedBoard を設定するには、例Getting Started with Targeting Xilinx Zynq Platformの「Set up Zynq hardware and tools」セクションを参照してください。

はじめに

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

  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 ハードウェアに配布します。詳しい手順については、Getting Started with Targeting Xilinx Zynq Platformの例を参照してください。

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 コアの生成] が選択され、[ターゲット プラットフォーム] については [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.ソフトウェア インターフェイス モデルからコードを生成する前に、次を実行します。

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

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

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

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

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

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

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

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

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

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

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

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

  4. モデル ツールストリップで [実行] ボタンをクリックします。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 ハードウェアに送信されます。