C 语言驱动程序文件和浮点类型 - 2023.2 简体中文

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文

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