ベアメタル アプリケーションでのカーネルのアドレス指定 - 2023.2 日本語

AI エンジン ツールおよびフロー ユーザー ガイド (UG1076)

Document ID
UG1076
Release Date
2023-12-04
Version
2023.2 日本語

ベアメタル アプリケーションの場合、エンベデッド アプリケーションから PL カーネルをアドレス指定するには、制御レジスタを使用する必要がありますが、ハードウェアに実装されている場合は、カーネルの適切なベース アドレスとオフセット値について読み出し/書き込みを実行します。前述のアプリケーションの場合、エンベデッド アプリケーションは、MM2S カーネルにデータを送信し、Interpolator カーネルと Classifier カーネル用として AI エンジン グラフにデータを取り込むことができます。その後 S2MM カーネルからデータを読み取ってエンベデッド アプリケーションで処理を続けることができます。この場合、MM2SS2MM カーネルは固定プラットフォームの PL 領域に実装されているため、これらのカーネルをアドレス指定します。

サンプルの main.cpp には、特定レジスタのカーネル ベース アドレスとオフセット アドレスを示す #define 文が含まれています。次に例を示します。

#define MM2S_BASE XPAR_MM2S_S_AXI_CONTROL_BASEADDR
#define S2MM_BASE XPAR_S2MM_S_AXI_CONTROL_BASEADDR

#define MEM_OFFSET 0x10
#define SIZE_OFFSET 0x1C
#define CTRL_OFFSET 0x0

カーネルのアドレスとオフセットを判断するには、固定プラットフォーム内のファイルを確認します。実装されたカーネルのベース アドレスは、固定プラットフォームの xparameters.h ファイルで確認できます。このファイルは、<platform_name>/standalone_domain/bspinclude/include フォルダーにあります。サンプル デザインでは、xparameters.h で次のエントリを使用して、これらのカーネルのベースアドレスを決定しています。

/* Definitions for peripheral MM2S */
#define XPAR_MM2S_S_AXI_CONTROL_BASEADDR 0xA4020000
#define XPAR_MM2S_S_AXI_CONTROL_HIGHADDR 0xA402FFFF

/* Definitions for peripheral S2MM */
#define XPAR_S2MM_S_AXI_CONTROL_BASEADDR 0xA4030000
#define XPAR_S2MM_S_AXI_CONTROL_HIGHADDR 0xA403FFFF
注記: xparameters.h ファイルが生成されるたびに、アドレスは動的に変化します。このため、ハード コードするよりも、カーネルのアドレス マクロを参照することを推奨しています。

アドレス オフセットの場所は、AMD Vitis™ コンパイラで生成されたコンパイル済みカーネルの _x/<kernel>/<kernel>/<kernel>/solution/impl/ip/drivers/<kernel>_v1_0/src フォルダーの中にある <kernel_driver>_hw.h ファイルで確認できます。たとえば、MM2S カーネル ドライバーの xmm2s_mm2s_hw.h では次のようなデータが表示されます。

#define XMM2S_MM2S_CONTROL_ADDR_AP_CTRL    0x00
#define XMM2S_MM2S_CONTROL_ADDR_GIE        0x04
#define XMM2S_MM2S_CONTROL_ADDR_IER        0x08
#define XMM2S_MM2S_CONTROL_ADDR_ISR        0x0c
#define XMM2S_MM2S_CONTROL_ADDR_MEM_V_DATA 0x10
#define XMM2S_MM2S_CONTROL_BITS_MEM_V_DATA 64
#define XMM2S_MM2S_CONTROL_ADDR_SIZE_DATA  0x1c
#define XMM2S_MM2S_CONTROL_BITS_SIZE_DATA  32

これらのオフセットを使用して、カーネルへの読み出しまたは書き込みを実行します。たとえば、アプリケーション例の main.cpp ファイルでは、次のようにしてメモリ ロケーションへの書き込みを実行しています。

Xil_Out32(MM2S_BASE + MEM_OFFSET, (uint32_t) memAddr);