基于SoC FPAG实现手写体识别(HLS编译的全连接算子)
由于流程过多,这里采用pdf文件下载的方式
点击操作手册下载
https://pan.baidu.com/s/1bG7SiEfTkkltgvKRacuThg
提取码:3333
完整代码:
根据手册来操作
1.HLS的代码
#include "HLS/hls.h"
#include <stdio.h>
#include "input_0.h"
#include "input_1.h"
#include "input_2.h"
#include "input_3.h"
#include "input_4.h"
#include "input_5.h"
#include "input_6.h"
#include "input_7.h"
#include "input_8.h"
#include "input_9.h"
#include "layer1_weight.h"
#include "layer1_bais.h"
#include "layer2_weight.h"
#include "layer2_bais.h"
#define IMG_SIZE 784
#define WEIGTH1_ROW 784
#define WEIGHT1_COL 64
#define WEIGHT2_ROW 64
#define WEIGHT2_COL 10
hls_avalon_slave_component
component int full_connect(
hls_avalon_slave_memory_argument(784*sizeof(float)) float *img_pixel,
hls_avalon_slave_memory_argument(784*64*sizeof(float)) float *weight1,
hls_avalon_slave_memory_argument(64*sizeof(float)) float *bais1,
hls_avalon_slave_memory_argument(64*10*sizeof(float)) float *weight2,
hls_avalon_slave_memory_argument(10*sizeof(float)) float *bais2
)
{
int ret,i,j;
static float a1[WEIGHT1_COL];
static float a2[WEIGHT2_COL];
float tmp=0.0;
for(i=0;i<WEIGHT1_COL;i++)
{
a1[i]=0.0f;
for(j=0;j<WEIGTH1_ROW;j++)
{
a1[i] = a1[i] + img_pixel[j]*weight1[i+WEIGHT1_COL*j] ;
}
//加偏置
a1[i] = a1[i] + bais1[i];
//再激活relu
a1[i] = a1[i] > 0 ? a1[i]:0.0;
}
for(i=0;i<WEIGHT2_COL;i++)
{
a2[i] = 0.0f;
for(j=0;j<WEIGHT2_ROW;j++)
{
a2[i] = a2[i] + a1[j]*weight2[i+WEIGHT2_COL*j];
}
//加偏置
a2[i] = a2[i] + bais2[i];
if(a2[i]>tmp)
{
tmp = a2[i];
ret = i;
}
}
return ret;
}
int main()
{
int ret;
// float *imgx[10]={
// input_0,
// input_1,
// input_2,
// input_3,
// input_4,
// input_5,
// input_6,
// input_7,
// input_8,
// input_9
// };
//for(int i=0;i<10;i++)
//{
ret = full_connect(input_9,layer1_weight,layer1_bais,layer2_weight,layer2_bais);
printf("ret:%d\n",ret);
//}
return 0;
}
2.SoC EDS 中 eclipse 测试代码:
/*
* main.c
*
* Created on: 2021年10月11日
* Author: awcloud
*/
//1.导入头文件
//2.接口定义(结构体的方式)
//3.定义初始化函数
// 例如:int led_init(void *virtual_base)
//4.主函数功能
//gcc标准头文件
#include <stdio.h>