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_done
、ap_idle
、および ap_ready
が設定され、AXI4-Lite スレーブ インターフェイスにまとめられた出力ポートの結果が適切なレジスタから読み出されます。
例の関数引数 c
のインプリメンテーションは、ハードウェア ポートの動作をある程度理解しておくことが重要であることも示しています。関数引数 c
は読み出しおよび書き込みの両方に使用されるので、S_AXILITE の例に示すように、入力ポート c_i
および出力ポート c_o
として別々にインプリメントされます。
s_axilite
スレーブ インターフェイスをプログラムするには、関数を 1 回だけ実行するフローがまず推奨されます。
- C ドライバー ファイル で提供されている割り込み関数標準 API インプリメンテーションを使用して、割り込みの動作方法を決定します。
- ブロックの入力ポートにレジスタ値を読み込みます。上記の例では、これは API 関数の
XExample_Set_a
、XExample_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_a
、XExample_Set_a
およびXExample_Set_c_i
を使用して実行されます。 - API
XExample_EnableAutoRestart
を使用して自動開始関数を設定します。 - 関数が実行されます。各ポートの I/O プロトコルにより、ブロックを介して処理されるデータが同期されます。
- 生成された割り込みが処理されます。出力レジスタにはこの操作中アクセスできますが、データが頻繁に変更される可能性があります。
- API 関数
XExample_DisableAutoRestart
を使用して、これ以上実行されないようにします。 - 出力レジスタが読み出されます。上記の例では、これは API 関数の
XExample_Get_c_o
およびXExample_Set_c_o_vld
を使用して実行されます。