ハードウェアの制御 - 2023.2 日本語

Vitis 高位合成ユーザー ガイド (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 日本語
ヒント: 次に示す例は、Vivado IP フローのデフォルトである ap_ctrl_hs ブロック制御プロトコルを示しています。Vitis カーネル フローのデフォルトである ap_ctrl_chain プロトコルの詳細および説明については、ブロック レベルの制御プロトコル を参照してください。

この例では、ハードウェア ヘッダー ファイル (xexample_hw.h) で AXI4-Lite スレーブ インターフェイスにまとめられたポートのメモリ マップド ロケーションのリストを示しています (S_AXILITE 制御レジスタ マップ を参照)。

// 0x00 : Control signals
//        bit 0  - ap_start (Read/Write/SC)
//        bit 1  - ap_done (Read/COR)
//        bit 2  - ap_idle (Read)
//        bit 3  - ap_ready (Read)
//        bit 7  - auto_restart (Read/Write)
//        others - reserved
// 0x04 : Global Interrupt Enable Register
//        bit 0  - Global Interrupt Enable (Read/Write)
//        others - reserved
// 0x08 : IP Interrupt Enable Register (Read/Write)
//        bit 0  - Channel 0 (ap_done)
//        bit 1  - Channel 1 (ap_ready)
// 0x0c : IP Interrupt Status Register (Read/TOW)
//        bit 0  - Channel 0 (ap_done)
//        others - reserved
// 0x10 : Data signal of a
//        bit 7~0 - a[7:0] (Read/Write)
//        others  - reserved
// 0x14 : reserved
// 0x18 : Data signal of b
//        bit 7~0 - b[7:0] (Read/Write)
//        others  - reserved
// 0x1c : reserved
// 0x20 : Data signal of c_i
//        bit 7~0 - c_i[7:0] (Read/Write)
//        others  - reserved
// 0x24 : reserved
// 0x28 : Data signal of c_o
//        bit 7~0 - c_o[7:0] (Read)
//        others  - reserved
// 0x2c : Control signal of c_o
//        bit 0  - c_o_ap_vld (Read/COR)
//        others - reserved
// (SC = Self Clear, COR = Clear on Read, TOW = Toggle on Write, COH = Clear on 
Handshake)

s_axilite インターフェイスのレジスタを正しくプログラムするには、ハードウェア ポートがデフォルト ポート プロトコルまたはカスタム プロトコルでどのように動作するかを理解する必要があります (S_AXILITE およびポート レベル プロトコル を参照)。

たとえば、ブロック操作を開始するには ap_start レジスタを 1 に設定する必要があります。次にデバイスがレジスタから AXI4-Lite スレーブ インターフェイスにまとめられた入力を読み出します。ブロックの演算が終了すると、ハードウェアの出力ポートにより ap_doneap_idle、および ap_ready が設定され、AXI4-Lite スレーブ インターフェイスにまとめられた出力ポートの結果が適切なレジスタから読み出されます。

例の関数引数 c のインプリメンテーションは、ハードウェア ポートの動作をある程度理解しておくことが重要であることも示しています。関数引数 c は読み出しおよび書き込みの両方に使用されるので、S_AXILITE の例に示すように、入力ポート c_i および出力ポート c_o として別々にインプリメントされます。

s_axilite スレーブ インターフェイスをプログラムするには、関数を 1 回だけ実行するフローがまず推奨されます。

  • C ドライバー ファイル で提供されている割り込み関数標準 API インプリメンテーションを使用して、割り込みの動作方法を決定します。
  • ブロックの入力ポートにレジスタ値を読み込みます。上記の例では、これは API 関数の XExample_Set_aXExample_Set_b および XExample_Set_c_i を使用して実行されます。
  • XExample_Start を使用して ap_start ビットを 1 に設定し、関数を開始します。このレジスタには、上記のヘッダー ファイルに記述されているように、セルフ クリーニング機能があります。トランザクションが 1 つ終了すると、ブロックは動作を一時停止します。
  • 関数が実行されます。生成された割り込みが処理されます。
  • 出力レジスタが読み出されます。上記の例では、これは API 関数の XExample_Get_c_o_vld (データが有効なことを確認) と XExample_Get_c_o を使用して実行されます。
    注記: s_axilite インターフェイスのレジスタは、ポートと同じ I/O プロトコルに従います。この場合、出力 valid がロジック 1 に設定されて、データが有効かどうかが示されます。
  • 次のトランザクションでも繰り返します。

2 つ目に推奨されるフローは、ブロックの継続実行です。このモード (詳細は次のセクションで説明) では、AXI4-Lite インターフェイスに含まれる入力ポートは、コンフィギュレーションを実行するポートのみである必要があります。ブロックは通常、CPU よりもかなり高速で実行されます。ブロックが入力を待つ必要がある場合、ブロックはほとんどの時間を待機に費やすことになります。

  • 割り込み関数を使用して、割り込みの動作方法を決定します。
  • ブロックの入力ポートにレジスタ値を読み込みます。上記の例では、これは API 関数の XExample_Set_aXExample_Set_a および XExample_Set_c_i を使用して実行されます。
  • API XExample_EnableAutoRestart を使用して自動開始関数を設定します。
  • 関数が実行されます。各ポートの I/O プロトコルにより、ブロックを介して処理されるデータが同期されます。
  • 生成された割り込みが処理されます。出力レジスタにはこの操作中アクセスできますが、データが頻繁に変更される可能性があります。
  • API 関数 XExample_DisableAutoRestart を使用して、これ以上実行されないようにします。
  • 出力レジスタが読み出されます。上記の例では、これは API 関数の XExample_Get_c_o および XExample_Set_c_o_vld を使用して実行されます。