欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

加速卷积神经网络:HLS代码解析

最编程 2024-08-10 20:20:45
...

原作者项目:https://github.com/dhm2013724/yolov2_xilinx_fpga

加速器整体结构

在这里插入图片描述
上图是加速器中所有函数的调用关系,可以看到卷积层,池化层,重拍序层都采用乒乓方式。下面就对每一个函数来进行理解。若有疏漏和理解不对的地方,欢迎留言讨论。
hls c仿真 hls_c_sim 结果,电脑配置低了,vivado hls的c仿真时间大概需要一个半小时,比较慢的。

yolov2图像分类识别加速器ip-hls代码解读

1.参数定义

#define MAX(x,y) ((x)>(y)?(x):(y))			//定义最大值函数
#define MIN(x,y) ((x)<(y)?(x):(y))          //定义最小值函数
#define S 2                                 //卷积核的步长
#define K 3                                 //卷积核的大小
                                            
#define Tn 4                                //Tn为输入特征图数 N 维度的并行度
#define Tm 32                               //输出特征图数M维度的并行度/展开度
#define Tr 26                               //输出特征图高度
#define Tc 26                               //输出特征图宽度
                                            
#define OnChipIB_Width  ((Tc-1)*S+K)        //输出Tc所需要的输入像素快的高度  
#define OnChipIB_Height ((Tr-1)*S+K)        //输出Tr所需要的输入像素快的宽度
#define MAX_BETA_LENGTH (1024)              //
#define INTERWIDTH 20 					    //
typedef unsigned char UCHAR;  				//

2.四个输入端口

memcpy 函数

void mmcpy_inputport(int *input,int input_memcpy_buffer[(OnChipIB_Width+3)/2],ap_uint<3> TN_MIN,int RowOffset,UCHAR RowIntNum)
{
	bool enable = TN_MIN > 0;
	if(!enable)
		return;

	memcpy(input_memcpy_buffer,(int *)(input + RowOffset),RowIntNum*sizeof(int));

}

void mmcpy_inputport1(int *input,int input_memcpy_buffer[(OnChipIB_Width+3)/2],ap_uint<3> TN_MIN,int RowOffset,UCHAR RowIntNum)
{
	bool enable = TN_MIN > 1;
	if(!enable)
		return;

	memcpy(input_memcpy_buffer,(int *)(input + RowOffset),RowIntNum*sizeof(int));

}

void mmcpy_inputport2(int *input,int input_memcpy_buffer[(OnChipIB_Width+3)/2],ap_uint<3> TN_MIN,int RowOffset,UCHAR RowIntNum)
{
	bool enable = TN_MIN > 2;
	if(!enable)
		return;

	memcpy(input_memcpy_buffer,(int *)(input + RowOffset),RowIntNum*sizeof(int));


}

void mmcpy_inputport3(int *input,int input_memcpy_buffer[(OnChipIB_Width+3)/2],ap_uint<3> TN_MIN,int RowOffset,UCHAR RowIntNum)
{
	bool enable = TN_MIN > 3;
	if(!enable)
		return;

	memcpy(input_memcpy_buffer,(int *)(input + RowOffset),RowIntNum*sizeof(int));

}