#include "stdio.h"
#include "pool_core.h"
#define MODE 0
#define IN_WIDTH 6
#define IN_HEIGHT 6
#define IN_CH 1
#define KERNEL_WIDTH 3
#define KERNEL_HEIGHT 3
#define OUT_WIDTH (IN_WIDTH/KERNEL_WIDTH)
#define OUT_HEIGHT (IN_HEIGHT/KERNEL_HEIGHT)
int main(void)
{
Dtype_f feature_in[IN_HEIGHT][IN_WIDTH][IN_CH];
Dtype_f feature_out[OUT_HEIGHT][OUT_WIDTH][IN_CH];
for(int i=0;i<IN_HEIGHT;i++)
for(int j=0;j<IN_WIDTH;j++)
for(int cin=0;cin<IN_CH;cin++)
feature_in[i][j][cin]=i*IN_WIDTH+j;
Pool(IN_CH,IN_HEIGHT,IN_WIDTH,
KERNEL_WIDTH,KERNEL_HEIGHT,MODE,
feature_in[0][0],feature_out[0][0]
);
for(int i=0;i<OUT_HEIGHT;i++)
for(int j=0;j<OUT_WIDTH;j++)
for(int cout=0;cout<IN_CH;cout++)
{
printf("OUT[%d][%d][%d]=%f\n",i,j,cout,feature_out[i][j][cout]);
}
}
#include "pool_core.h"
#define max(a,b) ((a>b)?a:b)
#define min(a,b) ((a>b)?b:a)
void Pool(ap_uint<16> CHin,ap_uint<16> Hin,ap_uint<16> Win,
ap_uint<8> Kx,ap_uint<8> Ky,ap_uint<2> mode,
Dtype_f feature_in[],Dtype_f feature_out[]
)
{
#pragma HLS INTERFACE m_axi depth=4294967295 port=feature_out offset=slave
#pragma HLS INTERFACE m_axi depth=4294967295 port=feature_in offset=slave
#pragma HLS INTERFACE s_axilite port=Win
#pragma HLS INTERFACE s_axilite port=Kx
#pragma HLS INTERFACE s_axilite port=Hin
#pragma HLS INTERFACE s_axilite port=mode
#pragma HLS INTERFACE s_axilite port=Ky
#pragma HLS INTERFACE s_axilite port=CHin
#pragma HLS INTERFACE s_axilite port=return
ap_uint<16> Hout,Wout;
Wout=Win/Kx;
Hout=Hin/Ky;
for(int c=0;c<CHin;c++)
for(int i=0;i<Hout;i++)
for(int j=0;j<Wout;j++)
{
Dtype_f sum;
if(mode==0)
sum=0;
else
if(mode==1)
sum=99999999999999999;
else
sum=-99999999999999999;
for(int ii=0;ii<Ky;ii++)
for(int jj=0;jj<Kx;jj++)
{
ap_int<16> h=i*Ky+ii;
ap_int<16> w=j*Kx+jj;
switch(mode)
{
case 0:{sum+=feature_in[h*CHin*Win+w*CHin+c];break;}
case 1:{sum=min(sum,feature_in[h*CHin*Win+w*CHin+c]);break;}
case 2:{sum=max(sum,feature_in[h*CHin*Win+w*CHin+c]);break;}
default:break;
}
}
if(mode==0)
sum=sum/(Kx*Ky);
feature_out[i*Wout*CHin+j*CHin+c]=sum;
}
}
#include "stdio.h"
#include "conv_core.h"
#define IN_WIDTH 10
#define IN_HEIGHT 10
#define IN_CH 16
#define KERNEL_WIDTH 5
#define KERNEL_HEIGHT 5
#define X_STRIDE 1
#define Y_STRIDE 1
#define RELU_EN 0
#define MODE 0
#define X_PADDING (MODE?(KERNEL_WIDTH-1)/2:0)
#define Y_PADDING (MODE?(KERNEL_HEIGHT-1)/2:0)
#define OUT_CH 1
#define OUT_WIDTH ((IN_WIDTH+2*X_PADDING-KERNEL_WIDTH)/X_STRIDE+1)
#define OUT_HEIGHT ((IN_HEIGHT+2*Y_PADDING-KERNEL_HEIGHT)/Y_STRIDE+1)
int main(void)
{
Dtype_f feature_in[IN_HEIGHT][IN_WIDTH][IN_CH];
Dtype_w W[KERNEL_HEIGHT][KERNEL_WIDTH][IN_CH][OUT_CH];
Dtype_w bias[OUT_CH];
Dtype_f feature_out[OUT_HEIGHT][OUT_WIDTH][OUT_CH];
for(int i=0;i<IN_HEIGHT;i++)
for(int j=0;j<IN_WIDTH;j++)
for(int cin=0;cin<IN_CH;cin++)
feature_in[i][j][cin]=i*IN_WIDTH+j;
for(int i=0;i<KERNEL_HEIGHT;i++)
for(int j=0;j<KERNEL_WIDTH;j++)
for(int cin=0;cin<IN_CH;cin++)
for(int cout=0;cout<OUT_CH;cout++)
W[i][j][cin][cout]=i*KERNEL_WIDTH+j;
for(int cout=0;cout<OUT_CH;cout++)
bias[cout]=0;
printf("1234\n");
Conv(IN_CH,IN_HEIGHT,IN_WIDTH,OUT_CH,
KERNEL_WIDTH,KERNEL_HEIGHT,X_STRIDE,Y_STRIDE,MODE,RELU_EN,
feature_in[0][0],W[0][0][0],bias,feature_out[0][0]
);
for(int i=0;i<OUT_HEIGHT;i++)
for(int j=0;j<OUT_WIDTH;j++)
for(int cout=0;cout<OUT_CH;cout++)
{
printf("OUT[%d][%d][%d]=%f\n",i,j,cout,feature_out[i][j][cout]);
}
return 0;
}
#include "conv_core.h"
void Conv(ap_uint<16> CHin,ap_uint<16> Hin,ap_uint<16> Win,ap_uint<16> CHout,
ap_uint<8> Kx,ap_uint<8> Ky,ap_uint<8> Sx,ap_uint<8> Sy,ap_uint<1> mode,ap_uint<1> relu_en,
Dtype_f feature_in[],Dtype_w W[],Dtype_w bias[],Dtype_f feature_out[]
)
{
#pragma HLS INTERFACE m_axi depth=4294967295 port=feature_out offset=slave
#pragma HLS INTERFACE m_axi depth=4294967295 port=bias offset=slave
#pragma HLS INTERFACE m_axi depth=4294967295 port=W offset=slave
#pragma HLS INTERFACE m_axi depth=4294967295 port=feature_in offset=slave
#pragma HLS INTERFACE s_axilite port=relu_en
#pragma HLS INTERFACE s_axilite port=CHout
#pragma HLS INTERFACE s_axilite port=Sx
#pragma HLS INTERFACE s_axilite port=Hin
#pragma HLS INTERFACE s_axilite port=CHin
#pragma HLS INTERFACE s_axilite port=Kx
#pragma HLS INTERFACE s_axilite port=mode
#pragma HLS INTERFACE s_axilite port=Sy
#pragma HLS INTERFACE s_axilite port=Ky
#pragma HLS INTERFACE s_axilite port=Win
#pragma HLS INTERFACE s_axilite port=return
ap_uint<8> pad_x,pad_y;
if(mode==0)
{
pad_x=0;pad_y=0;
}
else
{
pad_x=(Kx-1)/2;pad_y=(Ky-1)/2;
}
ap_uint<16> Hout,Wout;
Wout=(Win+2*pad_x-Kx)/Sx+1;
Hout=(Hin+2*pad_y-Ky)/Sy+1;
for(int cout=0;cout<CHout;cout++)
for(int i=0;i<Hout;i++)
for(int j=0;j<Wout;j++)
{
Dtype_acc sum=0;
for(int ii=0;ii<Ky;ii++)
for(int jj=0;jj<Kx;jj++)
{
ap_int<16> h=i*Sy-pad_y+ii;
ap_int<16> w=j*Sx-pad_x+jj;
if(h>=0 && w>=0 && h<Hin && w<Win)
{
for(int cin=0;cin<CHin;cin++)
{
Dtype_mul tp=feature_in[h*CHin*Win+w*CHin+cin]*W[ii*Kx*CHin*CHout+jj*CHin*CHout+cin*CHout+cout];
sum+=tp;
}
}
}
sum+=bias[cout];
if(relu_en & sum<0)
sum=0;
feature_out[i*Wout*CHout+j*CHout+cout]=sum;
}
}