C 语言驱动程序文件始终使用 32 位无符号整数 (U32) 数据进行数据传输。在以下示例中,该函数使用浮点类型实参 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 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);