Vivado HLSで作ったAXI4-Lite IPのAPI

Vivado HLSで高位合成を行うと、RTLと共にSDK用のAPIが生成されます。APIの利用方法をベアメタルで確認しました。

確認用のC関数

float_topという名前の関数です。aとbに単精度の浮動小数点形式の値を設定すると、cに乗算結果が格納されます。InterfaceはAXI4-Liteです(別ファイルのDirectiveで指定しています)。

float_topを高位合成し、そのIPコアを組込んだシステムの詳細はこちらです。

SDKの準備

通常の手順でVivadoのSDKを起動します。具体的な手順は次のとおりです。
まず、Vivado上で次の処理を実行します。

  • File->Export->Export Hardwareを実行
  • File->Launch SDKを実行

SDK起動後、SDK上で次の処理を実行します。

  • File->New->Board Support Packageを実行
  • File->New->Application Projectを実行

この時点で、SDKのProject Explorerは次のような構成になります。この例では、testという名前でApplication Projectを作成しています。

Projectの内容

Projectの内容

IPコアのAPI

APIに必要な処理

関数float_topは、aとbが入力で、cが出力(演算結果)です。このため、Vivado HLSが生成したAPIには次の処理を行う関数が存在するはずです。

  • aに値を設定する関数
  • bに値を設定する関数
  • cの値を読み出す関数

また、ハードウェアを制御するために、次の処理を行うAPIが存在するはずです。

  • 演算を開始する関数
  • 演算の完了を認識する関数

実際のAPI

IPコアのAPIは、次のディレクトリに格納されています(この例の場合)。

  • design_1_wrapper_hw_platform_0->drivers->float_top_v1_0->data->src

ディレクトリには、次のファイルが格納されています。

xfloat_top_hw.h
xfloat_top_linux.c
xfloat_top_sinit.c
xfloat_top.c
xfloat_top.h

float_topを制御するAPIを定義したファイルがxfloat_top.hです。また、そのソースコードがxfloat_top.cです。定義されているAPIの意味は、ug902-vivado-high-level-synthesis.pdfに記載されていました。主なAPIの意味は次のとおりです。生成されるAPIは、Directiveの記述などで多少変わるようです。

API 内容
XFloat_top_Config* XFloat_top_LookupConfig(u16 DeviceId);  コンフィギュレーション情報の取得
int XFloat_top_CfgInitialize(XFloat_top *InstancePtr, XFloat_top_Config *ConfigPtr);  MMUが使われているシステムで、デバイスを初期化
void XFloat_top_Start(XFloat_top *InstancePtr); 処理を開始
u32 XFloat_top_IsDone(XFloat_top *InstancePtr); 処理が終了
u32 XFloat_top_IsIdle(XFloat_top *InstancePtr); IDLE状態
u32 XFloat_top_IsReady(XFloat_top *InstancePtr); 次のデータを受付可能
void XFloat_top_Set_a(XFloat_top *InstancePtr, u32 Data); aに値を設定
u32 XFloat_top_Get_a(XFloat_top *InstancePtr); aの値を取得
void XFloat_top_Set_b(XFloat_top *InstancePtr, u32 Data); bに値を設定
u32 XFloat_top_Get_b(XFloat_top *InstancePtr); bの値を取得
u32 XFloat_top_Get_c(XFloat_top *InstancePtr); c(演算結果)の値を取得
u32 XFloat_top_Get_c_vld(XFloat_top *InstancePtr); cが有効であることを示す情報

テストプログラム

このテストプログラムでは、10回のループで適当なfloatの値a,bを生成し、その乗算結果cを求めています。乗算結果は、IPコアとプログラムの両方で計算し、違いがあるかをチェックしています。floatの値は、32ビットのバイナリに変換してからfloat_topに渡しています。同様に、float_topの演算結果は32ビットのバイナリからfloatに変換する必要があります。

IDの扱いやXFloat_top_LookupConfig, XFloat_top_CfgInitializeの設定方法は、SDKのサンプルに付属するGPIOなどと同様です。

実行結果

IPコアの処理結果と期待値が完全に一致しました。

まとめ

AXI4-Liteインターフェースの場合、次の手順でIPコアにアクセスできました。

  1. 初期設定(XDut_LookupConfig,XDut_CfgInitialize)
  2. ステータスを確認(XDut_IsReady)
  3. 引数に値を設定(XDut_Set_ARG)
  4. 処理を開始(XDut_Start)
  5. 処理終了待ち(XDut_IsDone)
  6. 処理結果を取得(XDut_Get_ARG)
スポンサーリンク







  • このエントリーをはてなブックマークに追加
スポンサーリンク