HLS
// test.cpp
#define SIZE 50
void test(float *A,float *B)
{
#pragma HLS INTERFACE s_axilite port=return bundle=CTRL //与start,done信号相关
#pragma HLS INTERFACE m_axi depth=50 port=B offset=slave bundle=output
#pragma HLS INTERFACE m_axi depth=50 port=A offset=slave bundle=input
for(int i=0;i<SIZE;i++)
{
#pragma HLS PIPELINE
*(B+i)=*(A+i);
}
}
// tb_test.cpp
#include <stdio.h>
void test(float *A,float *B);
int main()
{
float A[50],B[50];
for(int i=0;i<50;i++)
A[i]=i+0.5;
test(&A[0],&B[0]);
for(int i=0;i<50;i++)
printf("%f\n",B[i]);
return 0;
}
Vivado
SDK
float数据传输时可能有些小误差,属于正常现象。
#include <stdio.h>
#include "platform.h"
#include "xparameters.h"
#include "xil_printf.h"
#include "xil_cache.h"
#include "xtest.h"
int main()
{
float A[50],B[50];
for(int i=0;i<50;i++)
A[i]=i+0.233;
init_platform();
XTest hlsconv;
XTest_Config *ExamplePtr;
printf("Look up the device configuration.\n");
ExamplePtr=XTest_LookupConfig(XPAR_TEST_0_DEVICE_ID);
if(!ExamplePtr){
printf("Error, lookup failed!");
return XST_FAILURE;
}
printf("Initialize the Device\n");
int status=XTest_CfgInitialize(&hlsconv,ExamplePtr);
if(status!=XST_SUCCESS)
{
printf("Error, can't initialize accelerator.\n");
return XST_FAILURE;
}
/*
int status=XTest_Initialize(&hlsconv, XPAR_TEST_0_DEVICE_ID);
if(status!=XST_SUCCESS)
{
printf("Error, can't initialize accelerator.\n");
return XST_FAILURE;
}
*/
Xil_DCacheFlushRange((u32)A,50*sizeof(float)); // Cache
Xil_DCacheFlushRange((u32)B,50*sizeof(float));
XTest_Set_A(&hlsconv,(u32)A); // 关联
XTest_Set_B(&hlsconv,(u32)B);
XTest_Start(&hlsconv); // start
while(XTest_IsDone(&hlsconv)==0); // done
Xil_DCacheInvalidateRange((u32)B,50*sizeof(float));
for(int i=0;i<50;i++)
printf("%f\n",B[i]);
print("Hello World\n\r");
cleanup_platform();
return 0;
}
运行结果:有点小Bug
XTest_LookupConfig和XTest_CfgInitialize,前两个数据出错,出错数据一直相同,暂时懒得找原因了。
用XTest_Initialize,前一个数据出错,出错数据不变。