232 lines
7.4 KiB
C++
232 lines
7.4 KiB
C++
#include "convolve.h"
|
||
#include "stdlib.h"
|
||
|
||
void convolve(
|
||
hls::stream<RgnPix> &InRgnPnt,
|
||
hls::stream<RgnPixConvolve> &OutConvolvePnt)
|
||
{
|
||
#if !(VITIS_HLS)
|
||
#pragma HLS DATA_PACK variable=InRgnPnt
|
||
#pragma HLS DATA_PACK variable=OutConvolvePnt
|
||
#else
|
||
#pragma HLS aggregate variable=InRgnPnt compact=bit
|
||
#pragma HLS aggregate variable=OutConvolvePnt compact=bit
|
||
#endif
|
||
#pragma HLS INTERFACE axis register both port=OutConvolvePnt
|
||
#pragma HLS INTERFACE axis register both port=InRgnPnt
|
||
|
||
//ap_uint<32> frmNo=0;
|
||
//ap_uint<32> timeStamp=0;
|
||
//ap_uint<32> encInfo=0;
|
||
//ap_uint<16> frmW=0, frmH=0, frmX=0, frmY=0;
|
||
ap_uint<CAM4K_Y_WIDTH> WinNum = 0;
|
||
RgnPix InData;
|
||
InData = InRgnPnt.read();
|
||
if(0b10 != InData.Sync) //wait for syncFirst
|
||
return;
|
||
|
||
RgnPixConvolve outData = {0,0,0,0,0,0, 0, 0, 0};
|
||
//1st: frameNo
|
||
outData.Sync = InData.Sync;
|
||
outData.LazerWinFlag = InData.LazerWinFlag;
|
||
outData.LazerWinRsv = 0;
|
||
outData.LazerWinX = InData.LazerWinX;
|
||
outData.LazerWinY = InData.LazerWinY;
|
||
outData.LazerWinRid = InData.LazerWinRid;
|
||
OutConvolvePnt.write(outData);
|
||
//2nd: timeStamp
|
||
InData = InRgnPnt.read();
|
||
outData.Sync = InData.Sync;
|
||
outData.LazerWinFlag = InData.LazerWinFlag;
|
||
outData.LazerWinRsv = 0;
|
||
outData.LazerWinX = InData.LazerWinX;
|
||
outData.LazerWinY = InData.LazerWinY;
|
||
outData.LazerWinRid = InData.LazerWinRid;
|
||
OutConvolvePnt.write(outData);
|
||
//3rd:encInfo
|
||
InData = InRgnPnt.read();
|
||
outData.Sync = InData.Sync;
|
||
outData.LazerWinFlag = InData.LazerWinFlag;
|
||
outData.LazerWinRsv = 0;
|
||
outData.LazerWinX = InData.LazerWinX;
|
||
outData.LazerWinY = InData.LazerWinY;
|
||
outData.LazerWinRid = InData.LazerWinRid;
|
||
OutConvolvePnt.write(outData);
|
||
//4th: frmW, frmH
|
||
InData = InRgnPnt.read();
|
||
outData.Sync = InData.Sync;
|
||
outData.LazerWinFlag = InData.LazerWinFlag;
|
||
outData.LazerWinRsv = 0;
|
||
outData.LazerWinX = InData.LazerWinX;
|
||
outData.LazerWinY = InData.LazerWinY;
|
||
outData.LazerWinRid = InData.LazerWinRid;
|
||
OutConvolvePnt.write(outData);
|
||
//5th: frmX, WinNum
|
||
InData = InRgnPnt.read();
|
||
outData.Sync = InData.Sync;
|
||
outData.LazerWinFlag = InData.LazerWinFlag;
|
||
outData.LazerWinRsv = 0;
|
||
outData.LazerWinX = InData.LazerWinX;
|
||
outData.LazerWinY = InData.LazerWinY;
|
||
outData.LazerWinRid = InData.LazerWinRid;
|
||
WinNum(CAM4K_Y_WIDTH-1,0) = InData.LazerWinY.range(CAM4K_Y_WIDTH-1,0);
|
||
OutConvolvePnt.write(outData);
|
||
//6th: frmY
|
||
InData = InRgnPnt.read();
|
||
outData.Sync = InData.Sync; // <20><><EFBFBD><EFBFBD>
|
||
outData.LazerWinFlag = InData.LazerWinFlag;
|
||
outData.LazerWinRsv = 0;
|
||
outData.LazerWinX = InData.LazerWinX;
|
||
outData.LazerWinY = InData.LazerWinY;
|
||
outData.LazerWinRid = InData.LazerWinRid;
|
||
OutConvolvePnt.write(outData);
|
||
|
||
int dataIn[16];
|
||
RgnPix HSyncData_d1 = {0,0,0,0,0,0,0};
|
||
ap_uint<8> peakValue = 0;
|
||
ap_uint<1> lastData = false;
|
||
|
||
int maxLoop = (WinNum+1) * 9;
|
||
for(int counter = 0; counter < maxLoop; counter ++)
|
||
{
|
||
#pragma HLS LOOP_TRIPCOUNT min=9 max=3072*9
|
||
#pragma HLS PIPELINE II=1
|
||
|
||
int n = counter / 9;
|
||
int i = counter % 9;
|
||
|
||
RgnPix InData = InRgnPnt.read();
|
||
if(0 == i) //HSync
|
||
{
|
||
//compute pre-line subpix; output
|
||
if(n > 0)
|
||
{
|
||
RgnPixConvolve a_pnt;
|
||
if(0b11 == InData.Sync)
|
||
a_pnt.Sync = 0b11;
|
||
else if(n == 1)
|
||
a_pnt.Sync = 0b01;
|
||
else
|
||
a_pnt.Sync = 0b00;
|
||
a_pnt.LazerWinX = HSyncData_d1.LazerWinX;
|
||
a_pnt.LazerWinY = HSyncData_d1.LazerWinY;
|
||
a_pnt.LazerWinRid = HSyncData_d1.LazerWinRid;
|
||
a_pnt.LazerWinFlag = HSyncData_d1.LazerWinFlag;
|
||
a_pnt.LazerWinRsv = 0;
|
||
a_pnt.value = peakValue;
|
||
a_pnt.nD1 = dataIn[0] * mask_1st[0] + dataIn[1] * mask_1st[1] + dataIn[2] * mask_1st[2] + dataIn[3] * mask_1st[3] +
|
||
dataIn[4] * mask_1st[4] + dataIn[5] * mask_1st[5] + dataIn[6] * mask_1st[6] + dataIn[7] * mask_1st[7] +
|
||
dataIn[8] * mask_1st[8] + dataIn[9] * mask_1st[9] + dataIn[10] * mask_1st[10] + dataIn[11] * mask_1st[11] +
|
||
dataIn[12] * mask_1st[12] + dataIn[13] * mask_1st[13] + dataIn[14] * mask_1st[14] + dataIn[15] * mask_1st[15];//nD1;
|
||
a_pnt.nD2 = dataIn[0] * mask_2nd[0] + dataIn[1] * mask_2nd[1] + dataIn[2] * mask_2nd[2] + dataIn[3] * mask_2nd[3] +
|
||
dataIn[4] * mask_2nd[4] + dataIn[5] * mask_2nd[5] + dataIn[6] * mask_2nd[6] + dataIn[7] * mask_2nd[7] +
|
||
dataIn[8] * mask_2nd[8] + dataIn[9] * mask_2nd[9] + dataIn[10] * mask_2nd[10] + dataIn[11] * mask_2nd[11] +
|
||
dataIn[12] * mask_2nd[12] + dataIn[13] * mask_2nd[13] + dataIn[14] * mask_2nd[14] + dataIn[15] * mask_2nd[15];//nD2;
|
||
|
||
OutConvolvePnt.write(a_pnt);
|
||
}
|
||
if(0b11 == InData.Sync)
|
||
{
|
||
lastData = 1;
|
||
break;
|
||
}
|
||
HSyncData_d1 = InData;
|
||
}
|
||
else//for(int i = 0; i < 8; i ++)
|
||
{
|
||
ap_uint<8> data_0 = InData.LazerWinX.range(7,0);
|
||
ap_uint<8> data_1 = InData.LazerWinY.range(7,0);
|
||
if(i == 5)
|
||
peakValue = data_0;
|
||
|
||
dataIn[i*2-2] = (int)data_0;
|
||
dataIn[i*2-1] = (int)data_1;
|
||
}
|
||
}
|
||
#if 0
|
||
for(int n = 0; n <= WinNum; n ++)
|
||
{
|
||
#pragma HLS LOOP_TRIPCOUNT min=4096 max=4096
|
||
if(1 == lastData) //frmae done
|
||
break;
|
||
|
||
for(int i = 0; i <= 8; i ++)
|
||
{
|
||
#pragma HLS PIPELINE II=1
|
||
|
||
RgnPix InData = InRgnPnt.read();
|
||
if(0b11 == InData.Sync)
|
||
{
|
||
lastData = 1;
|
||
break;
|
||
}
|
||
if(0 == i) //HSync
|
||
{
|
||
//compute pre-line subpix; output
|
||
if(n > 0)
|
||
{
|
||
RgnPixConvolve a_pnt;
|
||
if(n == 1)
|
||
a_pnt.Sync = 0b01;
|
||
else
|
||
a_pnt.Sync = 0b00;
|
||
a_pnt.LazerWinX = HSyncData_d1.LazerWinX;
|
||
a_pnt.LazerWinY = HSyncData_d1.LazerWinY;
|
||
a_pnt.LazerWinRid = HSyncData_d1.LazerWinRid;
|
||
a_pnt.LazerWinFlag = HSyncData_d1.LazerWinFlag;
|
||
a_pnt.LazerWinRsv = 0;
|
||
a_pnt.value = peakValue;
|
||
a_pnt.nD1 = dataIn[0] * mask_1st[0] + dataIn[1] * mask_1st[1] + dataIn[2] * mask_1st[2] + dataIn[3] * mask_1st[3] +
|
||
dataIn[4] * mask_1st[4] + dataIn[5] * mask_1st[5] + dataIn[6] * mask_1st[6] + dataIn[7] * mask_1st[7] +
|
||
dataIn[8] * mask_1st[8] + dataIn[9] * mask_1st[9] + dataIn[10] * mask_1st[10] + dataIn[11] * mask_1st[11] +
|
||
dataIn[12] * mask_1st[12] + dataIn[13] * mask_1st[13] + dataIn[14] * mask_1st[14] + dataIn[15] * mask_1st[15];//nD1;
|
||
a_pnt.nD2 = dataIn[0] * mask_2nd[0] + dataIn[1] * mask_2nd[1] + dataIn[2] * mask_2nd[2] + dataIn[3] * mask_2nd[3] +
|
||
dataIn[4] * mask_2nd[4] + dataIn[5] * mask_2nd[5] + dataIn[6] * mask_2nd[6] + dataIn[7] * mask_2nd[7] +
|
||
dataIn[8] * mask_2nd[8] + dataIn[9] * mask_2nd[9] + dataIn[10] * mask_2nd[10] + dataIn[11] * mask_2nd[11] +
|
||
dataIn[12] * mask_2nd[12] + dataIn[13] * mask_2nd[13] + dataIn[14] * mask_2nd[14] + dataIn[15] * mask_2nd[15];//nD2;
|
||
OutConvolvePnt.write(a_pnt);
|
||
}
|
||
//nD1 = 0;
|
||
//nD2 = 0;
|
||
HSyncData_d1 = InData;
|
||
}
|
||
else//for(int i = 0; i < 8; i ++)
|
||
{
|
||
ap_uint<8> data_0 = InData.LazerWinX.range(7,0);
|
||
ap_uint<8> data_1 = InData.LazerWinY.range(7,0);
|
||
if(i == 5)
|
||
peakValue = data_0;
|
||
|
||
ap_uint<8> rdPos_0 = i * 2 - 2;
|
||
ap_uint<8> rdPos_1 = i * 2 - 1;
|
||
|
||
dataIn[i*2-2] = (int)data_0;
|
||
dataIn[i*2-1] = (int)data_1;
|
||
//int d_0 = (int)data_0;
|
||
//int d_1 = (int)data_1;
|
||
//nD1 += d_0 * mask_1st[rdPos_0] + d_1 * mask_1st[rdPos_1];
|
||
//nD2 += d_0 * mask_2nd[rdPos_0] + d_1 * mask_2nd[rdPos_1];
|
||
}
|
||
}
|
||
}
|
||
|
||
//send out last one
|
||
if(WinNum > 0)
|
||
{
|
||
RgnPixConvolve a_pnt;
|
||
a_pnt.Sync = 0b11;
|
||
a_pnt.LazerWinX = HSyncData_d1.LazerWinX;
|
||
a_pnt.LazerWinY = HSyncData_d1.LazerWinY;
|
||
a_pnt.LazerWinRid = HSyncData_d1.LazerWinRid;
|
||
a_pnt.LazerWinFlag = HSyncData_d1.LazerWinFlag;
|
||
a_pnt.LazerWinRsv = 0;
|
||
a_pnt.value = peakValue;
|
||
a_pnt.nD1 = nD1;
|
||
a_pnt.nD2 = nD2;
|
||
OutConvolvePnt.write(a_pnt);
|
||
}
|
||
#endif
|
||
|
||
return;
|
||
}
|