camDev/convolve/sourceCode/convolve.cpp

148 lines
4.1 KiB
C++
Raw Normal View History

2025-06-08 11:37:52 +08:00
#include "convolve.h"
#include "stdlib.h"
void convolve(
hls::stream<RgnPix> &InRgnPnt,
hls::stream<RgnPixConvolve> &OutConvolvePnt)
{
#pragma HLS DATA_PACK variable=InRgnPnt
#pragma HLS DATA_PACK variable=OutConvolvePnt
#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<12> WinNum = 0;
RgnPix InData;
InData = InRgnPnt.read();
ap_uint<1> VSync = InData.Sync.range(1,1);
if(0b0 == VSync) //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(11,0) = InData.LazerWinY.range(11,0);
OutConvolvePnt.write(outData);
//6th: frmY
InData = InRgnPnt.read();
outData.LazerWinFlag = InData.LazerWinFlag;
outData.LazerWinRsv = 0;
outData.LazerWinX = InData.LazerWinX;
outData.LazerWinY = InData.LazerWinY;
outData.LazerWinRid = InData.LazerWinRid;
OutConvolvePnt.write(outData);
int nD1 = 0;
int nD2 = 0;
RgnPix HSyncData_d1 = {0,0,0,0,0,0,0};
ap_uint<8> peakValue = 0;
for(int n = 0; n < WinNum; n ++)
{
#pragma HLS LOOP_TRIPCOUNT min=3072 max=3072
for(int i = 0; i <= 8; i ++)
{
#pragma HLS PIPELINE II=1
RgnPix InData = InRgnPnt.read();
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 = nD1;
a_pnt.nD2 = 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;
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 = 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 = nD1;
a_pnt.nD2 = nD2;
OutConvolvePnt.write(a_pnt);
}
return;
}