2025-06-08 11:37:52 +08:00
|
|
|
#include "subPix.h"
|
|
|
|
|
#include "stdlib.h"
|
|
|
|
|
|
|
|
|
|
void subpix(
|
|
|
|
|
hls::stream<RgnPixConvolve> &InConvolvePnt,
|
2025-10-26 00:11:16 +08:00
|
|
|
hls::stream<RgnSubPix> &OutSubpixPnt,
|
2025-06-08 11:37:52 +08:00
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
#pragma HLS DATA_PACK variable=InConvolvePnt
|
|
|
|
|
#pragma HLS DATA_PACK variable=OutSubpixPnt
|
|
|
|
|
#pragma HLS INTERFACE axis register both port=OutSubpixPnt
|
|
|
|
|
#pragma HLS INTERFACE axis register both port=InConvolvePnt
|
|
|
|
|
|
|
|
|
|
ap_uint<12> WinNum = 0;
|
2025-10-26 00:11:16 +08:00
|
|
|
ap_uint<12> frmH = 0;
|
|
|
|
|
ap_uint<12> frmY = 0;
|
2025-06-08 11:37:52 +08:00
|
|
|
RgnPixConvolve InData;
|
|
|
|
|
InData = InConvolvePnt.read();
|
|
|
|
|
ap_uint<1> VSync = InData.Sync.range(1,1);
|
|
|
|
|
if(0b0 == VSync) //wait for syncFirst
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
RgnSubPix outData = {0,0,0,0,0,0};
|
2025-10-26 00:11:16 +08:00
|
|
|
RgnSubPix nullOut = {-1.0f,0,0,0,0,0};
|
2025-06-08 11:37:52 +08:00
|
|
|
//1st: frameNo
|
|
|
|
|
outData.Sync = InData.Sync;
|
|
|
|
|
outData.rsv = 0;
|
|
|
|
|
ap_uint<32> data_32;
|
|
|
|
|
data_32(11,0) = InData.LazerWinX.range(11,0);
|
|
|
|
|
data_32(23,12) = InData.LazerWinY.range(11,0);
|
|
|
|
|
data_32(31,24) = InData.LazerWinRid.range(7,0);
|
|
|
|
|
UintFloat tmp;
|
|
|
|
|
tmp.unData = (unsigned int)data_32;
|
|
|
|
|
outData.x = tmp.fdata;
|
|
|
|
|
OutSubpixPnt.write(outData);
|
|
|
|
|
//2nd: timeStamp
|
|
|
|
|
InData = InConvolvePnt.read();
|
|
|
|
|
outData.Sync = InData.Sync;
|
|
|
|
|
data_32(11,0) = InData.LazerWinX.range(11,0);
|
|
|
|
|
data_32(23,12) = InData.LazerWinY.range(11,0);
|
|
|
|
|
data_32(31,24) = InData.LazerWinRid.range(7,0);
|
|
|
|
|
tmp.unData = (unsigned int)data_32;
|
|
|
|
|
outData.x = tmp.fdata;
|
|
|
|
|
OutSubpixPnt.write(outData);
|
|
|
|
|
//3rd:encInfo
|
|
|
|
|
InData = InConvolvePnt.read();
|
|
|
|
|
outData.Sync = InData.Sync;
|
|
|
|
|
data_32(11,0) = InData.LazerWinX.range(11,0);
|
|
|
|
|
data_32(23,12) = InData.LazerWinY.range(11,0);
|
|
|
|
|
data_32(31,24) = InData.LazerWinRid.range(7,0);
|
|
|
|
|
tmp.unData = (unsigned int)data_32;
|
|
|
|
|
outData.x = tmp.fdata;
|
|
|
|
|
OutSubpixPnt.write(outData);
|
|
|
|
|
//4th: frmW, frmH
|
|
|
|
|
InData = InConvolvePnt.read();
|
|
|
|
|
outData.Sync = InData.Sync;
|
|
|
|
|
data_32(11,0) = InData.LazerWinX.range(11,0);
|
|
|
|
|
data_32(23,12) = InData.LazerWinY.range(11,0);
|
|
|
|
|
data_32(31,24) = 0;
|
2025-10-26 00:11:16 +08:00
|
|
|
frmH(11,0) = InData.LazerWinY.range(11,0);
|
2025-06-08 11:37:52 +08:00
|
|
|
tmp.unData = (unsigned int)data_32;
|
|
|
|
|
outData.x = tmp.fdata;
|
|
|
|
|
OutSubpixPnt.write(outData);
|
|
|
|
|
//5th: frmX, WinNum
|
2025-10-26 00:11:16 +08:00
|
|
|
int nLines = (int)frmH;
|
|
|
|
|
int nLoops = nLines * 2;
|
|
|
|
|
if(nLoops >= 4096)
|
|
|
|
|
nLoops = 4095;
|
|
|
|
|
ap_uint<12> outSize = (ap_uint<12>)nLoops;
|
2025-06-08 11:37:52 +08:00
|
|
|
InData = InConvolvePnt.read();
|
|
|
|
|
outData.Sync = InData.Sync;
|
|
|
|
|
data_32(11,0) = InData.LazerWinX.range(11,0);
|
2025-10-26 00:11:16 +08:00
|
|
|
data_32(23,12) = outSize.range(11,0); //InData.LazerWinY.range(11,0);
|
2025-06-08 11:37:52 +08:00
|
|
|
data_32(31,24) = 0;
|
|
|
|
|
tmp.unData = (unsigned int)data_32;
|
|
|
|
|
outData.x = tmp.fdata;
|
|
|
|
|
WinNum(11,0) = InData.LazerWinY.range(11,0);
|
|
|
|
|
OutSubpixPnt.write(outData);
|
2025-10-26 00:11:16 +08:00
|
|
|
//6th: frmY, validDataSize
|
2025-06-08 11:37:52 +08:00
|
|
|
InData = InConvolvePnt.read();
|
|
|
|
|
outData.Sync = InData.Sync;
|
|
|
|
|
data_32(11,0) = InData.LazerWinX.range(11,0);
|
2025-10-26 00:11:16 +08:00
|
|
|
data_32(23,12) = WinNum.range(11,0); //validDataSize
|
2025-06-08 11:37:52 +08:00
|
|
|
data_32(31,24) = 0;
|
2025-10-26 00:11:16 +08:00
|
|
|
frmY(11,0) = InData.LazerWinX.range(11,0);
|
2025-06-08 11:37:52 +08:00
|
|
|
tmp.unData = (unsigned int)data_32;
|
|
|
|
|
outData.x = tmp.fdata;
|
|
|
|
|
OutSubpixPnt.write(outData);
|
|
|
|
|
|
2025-10-26 00:11:16 +08:00
|
|
|
int nStart = (int)frmY;
|
|
|
|
|
ap_uint<12> lastLine = frmY + frmH - 1;
|
|
|
|
|
ap_uint<16> readNum = 0;
|
|
|
|
|
ap_uint<1> readFlag = 1;
|
|
|
|
|
|
|
|
|
|
InData = InConvolvePnt.read();
|
|
|
|
|
readNum ++;
|
|
|
|
|
RgnPixConvolve currData;
|
|
|
|
|
for(int n = 0; n < nLoops; n ++)
|
2025-06-08 11:37:52 +08:00
|
|
|
{
|
2025-10-26 00:11:16 +08:00
|
|
|
#pragma HLS LOOP_TRIPCOUNT min=4096 max=4096
|
2025-06-08 11:37:52 +08:00
|
|
|
#pragma HLS PIPELINE II=1
|
|
|
|
|
|
2025-10-26 00:11:16 +08:00
|
|
|
int lineIndx = n / 2 + nStart;
|
2025-06-08 11:37:52 +08:00
|
|
|
|
2025-10-26 00:11:16 +08:00
|
|
|
ap_uint<1> vldFlag = 0;
|
|
|
|
|
if( InData.LazerWinY <= lineIndx)
|
|
|
|
|
{
|
|
|
|
|
if(readNum <= WinNum)
|
|
|
|
|
{
|
|
|
|
|
currData = InData;
|
|
|
|
|
vldFlag = 1;
|
|
|
|
|
if(readNum < WinNum)
|
|
|
|
|
{
|
|
|
|
|
InData = InConvolvePnt.read();
|
|
|
|
|
}
|
|
|
|
|
readNum ++;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-06-08 11:37:52 +08:00
|
|
|
|
|
|
|
|
RgnSubPix a_pnt;
|
2025-10-26 00:11:16 +08:00
|
|
|
if(vldFlag == 0)
|
|
|
|
|
{
|
|
|
|
|
a_pnt = nullOut;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
float fx;
|
|
|
|
|
if(currData.nD2 == 0)
|
|
|
|
|
fx = 0;
|
|
|
|
|
else
|
|
|
|
|
fx = (float)currData.nD1/(float)currData.nD2;
|
|
|
|
|
|
|
|
|
|
a_pnt.flag = currData.LazerWinFlag;
|
|
|
|
|
a_pnt.y = currData.LazerWinY;
|
|
|
|
|
a_pnt.rid = currData.LazerWinRid;
|
|
|
|
|
a_pnt.value = currData.value;
|
|
|
|
|
a_pnt.x = (float)currData.LazerWinX + 8.0f + fx + 0.5; //adjust point to pixel center
|
|
|
|
|
a_pnt.rsv = 0;
|
|
|
|
|
}
|
2025-08-22 20:28:26 +08:00
|
|
|
if(n == 0)
|
2025-06-08 11:37:52 +08:00
|
|
|
a_pnt.Sync = 0b01;
|
|
|
|
|
else
|
|
|
|
|
a_pnt.Sync = 0b00;
|
|
|
|
|
OutSubpixPnt.write(a_pnt);
|
|
|
|
|
}
|
|
|
|
|
}
|