#include "convolve.h" #include "stdlib.h" void convolve( hls::stream &InRgnPnt, hls::stream &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; }