C ドライバー ファイルは、常にデータ転送に 32 ビット符号なし整数 (U32) を使用します。次の例では、関数で float 型の引数 a
と r1
が使用されています。a
の値が設定され、r1
の値が返されます。
float calculate(float a, float *r1)
{
#pragma HLS INTERFACE mode=ap_vld register port=r1
#pragma HLS INTERFACE mode=s_axilite port=a
#pragma HLS INTERFACE mode=s_axilite port=r1
#pragma HLS INTERFACE mode=s_axilite port=return
*r1 = 0.5f*a;
return (a>0);
}
合成後、Vitis HLS ですべてのポートがデフォルトの AXI4-Lite インターフェイスにまとめられ、C ドライバー ファイルが作成されますが、次の図に示すように、ドライバー ファイルでは U32 型が使用されています。
// API to set the value of A
void XCalculate_SetA(XCalculate *InstancePtr, u32 Data) {
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
XCalculate_WriteReg(InstancePtr->Hls_periph_bus_BaseAddress,
XCALCULATE_HLS_PERIPH_BUS_ADDR_A_DATA, Data);
}
// API to get the value of R1
u32 XCalculate_GetR1(XCalculate *InstancePtr) {
u32 Data;
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Data = XCalculate_ReadReg(InstancePtr->Hls_periph_bus_BaseAddress,
XCALCULATE_HLS_PERIPH_BUS_ADDR_R1_DATA);
return Data;
}
これらの関数が float 型で直接使用できる場合は、書き込み値および読み出し値が予測される float 型と一貫しません。これらの関数をソフトウェアで使用する場合は、次を使用して型を変換します。
float a=3.0f,r1;
u32 ua,ur1;
// cast float “a” to type U32
XCalculate_SetA(&calculate,*((u32*)&a));
ur1=XCalculate_GetR1(&calculate);
// cast return type U32 to float type for “r1”
r1=*((float*)&ur1);