为了在每个周期都能得到一个3x3的卷积窗口,我们可以通过linebuffer来实现,具体方法为:对于一个KxK的卷积核和一个NxN输入特征图的卷积,我们可以设置K-1个深度为N的FIFO,然后将第i个FIFO的读出连接到第i+1个FIFO的读入端,第0个FIFO的读入则直接从特征图按序获取。下面是HLS的代码实现,为了简单起见,本代码仅支持步长S=1,卷积核大小为K=3的情形,支持可变大小的N: HLS顶层设计文件
#include
#include
#include"my_cnn.h"
#include
void shift_linebuffer(volatile data_t *shift_in,int length,data_t filter[3][3],data_t out[900]){
hls::stream line1;
#pragma HLS STREAM variable=line1 depth=32 dim=1
hls::stream line2;
#pragma HLS STREAM variable=line2 depth=32 dim=1
int len1=0,len2=0,addr=0;
data_t W[3][3];
#pragma HLS ARRAY_PARTITION variable=W complete dim=0
shift_linebuffer_label0:
for(int i=0;i2*length+1)&&((i-2)%length
关注
打赏