1.使用软件
版本号不一定都需要对齐。整个流程以FPGA浮点协处理为例。
2.Vivado HLS
2.1创建工程
1为创建新工程,2为打开已创建工程,3为打开例子工程。
Project name 创建工程名字,建议和后续.c文件一致
Top function可以现在填,也可以后续改:
包括后续修改top文件都是在这选取,其会将多个函数名显示在3处,选择即可。 ?
一直next到下图,选择器件
一般来说,1,2,3,4点就可以确定到最终的型号了。
点击finish后进入下图界面,1为需要编写的源文件文件夹,2为TestBench源文件存放文件夹,分别右键New…就可以创建新的文件。
创建如下文件。
2.2打开test_float.cpp文件,输入以下代码:
#include <string.h> ?
double sum; ?
void float_sum(float *src, int num) { int len; float cachebuff[64]; #pragma HLS STREAM variable=cachebuff depth=64 ?
for(int i=0;i<num;i+=64)
{
#pragma HLS loop_tripcount min=0 max=1024 #pragma HLS dataflow len = ((num-i) >= 64) ? 64 : num-i; memcpy(cachebuff, src+i, len*4); for(int j=0;j<len;j++) { #pragma HLS pipeline sum += cachebuff[j]; } } } ?
float average_float(float *src, int num) { #pragma HLS INTERFACE m_axi depth=1024 offset=slave port=src #pragma HLS INTERFACE s_axilite port=num #pragma HLS INTERFACE s_axilite port=return ?
sum = 0;
float_sum(src, num);
return (float)(sum/num);
} TestBench输入以下代码test.cpp: #include <stdio.h> ?
float average_float(float *src, int num); ?
int main(void) { float floatAry[1024]; float average_local; float average_call; double sum; int num = (int)sizeof(floatAry)/sizeof(floatAry[0]); //初始化数据 for(int i=0; i<num; i++) { floatAry[i] = 1.1f; } floatAry[101] += 0.1*1024; //软件计算平均值 for(int i=0; i<num; i++) { sum += floatAry[i]; } average_local = (float)sum/num; ?
//调用ip顶层函数
average_call = average_float(floatAry, num);
if(average_local != average_call)
{
printf("app test fail, local=%f call=%f!\n", average_local, average_call);
return -1;
}
printf("app test ok!\n");
return 0;
} ?
2.3仿真:
仿真完成后会出现Console的消息
接下来编译,编译前确保Top function正确。
编译完成后可以查看一些数据
2.4生成RTL,在工作目录下找到,解压到接下来的VivadoProject文件夹
3.Vivado
3.1创建工程
|