卷积神经网络(CNN)加速器ip设计—1.HLS代码解读
加速器整体结构上图是加速器中所有函数的调用关系,可以看到卷积层,池化层,重拍序层都采用乒乓方式。下面就对每一个函数来进行理解。若有疏漏和理解不对的地方,欢迎留言讨论。hls_c_sim 结果,电脑配置低了,vivado hls的c仿真时间大概需要一个半小时,比较慢的。yolov2图像分类识别加速器ip-hls代码解读参数定义在这里插入代码片...
·
原作者项目:https://github.com/dhm2013724/yolov2_xilinx_fpga
加速器整体结构
上图是加速器中所有函数的调用关系,可以看到卷积层,池化层,重拍序层都采用乒乓方式。下面就对每一个函数来进行理解。若有疏漏和理解不对的地方,欢迎留言讨论。
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));
}
更多推荐
所有评论(0)