jerryzeng bcefbebd6d v0.1
基本版本:所有模块中每个Peak的处理时钟不超过9个clock
2026-10-14 20:28:58 +08:00

232 lines
7.4 KiB
C++
Raw Blame History

#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;
}