From 1849b598d752c1e2e2a76176dd37511693503fe2 Mon Sep 17 00:00:00 2001 From: jerryzeng Date: Sun, 23 Nov 2025 23:52:09 +0800 Subject: [PATCH] 1. fix logic bug 2. add frame ending signal --- peakCentering/sourceCode/peakCentering.cpp | 123 ++++++++++++++++-- peakCentering/sourceCode/peakCentering_tb.cpp | 36 +++-- 2 files changed, 137 insertions(+), 22 deletions(-) diff --git a/peakCentering/sourceCode/peakCentering.cpp b/peakCentering/sourceCode/peakCentering.cpp index 8300697..1ad3e2f 100644 --- a/peakCentering/sourceCode/peakCentering.cpp +++ b/peakCentering/sourceCode/peakCentering.cpp @@ -20,8 +20,7 @@ void peakCentering( 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 + if(0b10 != InData.Sync) //wait for syncFirst return; //1st: frameNo @@ -87,6 +86,7 @@ void peakCentering( ap_uint<1> evenFlag = 0; ap_uint<5> pkRng_S, pkRng_E; ap_uint<1> outFlag = 0; + ap_uint<1> lastSync = 0; for(int n = 0; n <= WinNum; n ++) { #pragma HLS LOOP_TRIPCOUNT min=3072 max=3072 @@ -95,24 +95,33 @@ void peakCentering( #pragma HLS PIPELINE II=1 RgnPix InData; - if(n < WinNum) + if(0 == lastSync) InData = InRgnPnt.read(); else InData = zeroData; - if(InData.LazerWinY == 0x07ac) + if(InData.Sync == 0b11) + lastSync = 1; + + if(InData.LazerWinY == 510) int kkk = 1; //debug point if(0 == i) //HSync { evenFlag = n%2; + if(0 == linePk.len) - pkCenter = RGN_DATA_WIN_SIZE/2; + { + if(linePk.value >= 240) + pkCenter = RGN_DATA_WIN_SIZE/2; + else + pkCenter = 0; + } else pkCenter = linePk.start + (linePk.len >> 1); HSyncData_d1.LazerWinX = LazerWinX_d1 + pkCenter; - if ((n > 0) &&( linePk.len>0)) + if ((n > 0) && ( pkCenter > 0)) { OutCenteringPnt.write(HSyncData_d1); outFlag = 1; @@ -172,14 +181,91 @@ void peakCentering( currPeak.len = 1; currPeak.value = data_1; SM = 0b01; + linePk.value = data_1; //record initial value } else if(data_0 > data_1) //falling + { SM = 0b10; + currPeak.value = data_0; + linePk.value = data_0; //record initial value + } + else + { + currPeak.start = wrPos_1; + currPeak.len = 1; + currPeak.value = data_1; + SM = 0b11; + linePk.value = data_0; //record initial value + } + break; + case 0b11: //wait state + if(lastData < data_0) + { + if(data_0 < data_1) //rising + { + currPeak.start = wrPos_1; + currPeak.len = 1; + currPeak.value = data_1; + SM = 0b01; + } + else if(data_0 > data_1) //falling + { + if( (wrPos_0 >= pkRng_S) && (wrPos_0 <= pkRng_E) ) + { + linePk.start = wrPos_0; + linePk.len = 1; + linePk.value = data_0; + } + SM = 0b10; + } + else //data_0 == data_1 + { + currPeak.start = wrPos_0; + currPeak.len = 2; + currPeak.value = data_0; + SM = 0b01; + } + } + else if(lastData > data_0) + { + if(data_0 < data_1) //peak is at edge (pos:0,1,2...), invalid + { + if( (lastData > data_0)&& (wrPos_0 > pkRng_S)) + { + linePk = currPeak; + } + currPeak.start = wrPos_1; + currPeak.len = 1; + currPeak.value = data_1; + SM = 0b01; + } + else if(data_0 >= data_1)//falling + { + SM = 0b10; + } + } + else //lastData == data_0 + { + if(data_0 < data_1) //rising + { + currPeak.start = wrPos_1; + currPeak.len = 1; + currPeak.value = data_1; + SM = 0b01; + + } + else if(data_0 > data_1) //falling + { + SM = 0b10; + } + else + currPeak.len += 2; + } break; case 0b01: //rising if(lastData < data_0) { - if(data_0 < data_1) + if(data_0 <= data_1) { currPeak.start = wrPos_1; currPeak.len = 1; @@ -201,7 +287,6 @@ void peakCentering( currPeak.len = 2; currPeak.value = data_0; } - } else if(lastData > data_0) { @@ -238,7 +323,16 @@ void peakCentering( SM = 0b10; //change to falling } else //data_0 == dta_1 + { currPeak.len += 2; + if(i == 8) //last one + { + if( (currPeak.start <= pkRng_E) && (currPeak.value > linePk.value)) + { + linePk = currPeak; + } + } + } } break; case 0b10: //falling @@ -290,12 +384,21 @@ void peakCentering( stmOut.Sync = 0b00; stmOut.LazerWinX(7,0) = out_0; stmOut.LazerWinY(7,0) = out_1; - if( (n > 0 ) && (pkCenter > 0) &&(outFlag == 1)) + if( outFlag == 1) { OutCenteringPnt.write(stmOut); } } } } - + //add Last sync data + RgnPix VSync; + VSync.LazerWinFlag = 0; + VSync.LazerWinRid = 0; + VSync.LazerWinRsv = 0; + VSync.LazerWinX = 0; + VSync.LazerWinY = 0; + VSync.RltvRdx = 0; + VSync.Sync = 0b11; + OutCenteringPnt.write(VSync); } diff --git a/peakCentering/sourceCode/peakCentering_tb.cpp b/peakCentering/sourceCode/peakCentering_tb.cpp index cc1389d..911c022 100644 --- a/peakCentering/sourceCode/peakCentering_tb.cpp +++ b/peakCentering/sourceCode/peakCentering_tb.cpp @@ -18,17 +18,17 @@ void save_bmp_2( fopen_s(&file, filename, "wb"); #endif if (!file) { - printf("�޷����ļ� %s\n", filename); + printf("锟睫凤拷锟斤拷锟侥硷拷 %s\n", filename); return; } - // ����ÿ������ֽ��� - int bytes_per_row = RGN_DATA_WIN_SIZE * 3; // ÿ������3�ֽڣ�BGR�� + // 锟斤拷锟斤拷每锟斤拷锟斤拷锟斤拷纸锟斤拷锟� + int bytes_per_row = RGN_DATA_WIN_SIZE * 3; // 每锟斤拷锟斤拷锟斤拷3锟街节o拷BGR锟斤拷 int padding = (4 - (bytes_per_row % 4)) % 4; int row_size = bytes_per_row + padding; int height = testSamples.size(); - // ��ʼ���ļ�ͷ + // 锟斤拷始锟斤拷锟侥硷拷头 BMPFileHeader file_header = { .file_type = 0x4D42, // 'BM' .file_size = sizeof(BMPFileHeader) + sizeof(BMPInfoHeader) + row_size * height, @@ -36,11 +36,11 @@ void save_bmp_2( .reserved2 = 0, .offset_data = sizeof(BMPFileHeader) + sizeof(BMPInfoHeader) }; - // ��ʼ����Ϣͷ + // 锟斤拷始锟斤拷锟斤拷息头 BMPInfoHeader info_header = { .size = sizeof(BMPInfoHeader), .width = RGN_DATA_WIN_SIZE, - .height = height, // ������ʾ�������ݴ��µ������� + .height = height, // 锟斤拷锟斤拷锟斤拷示锟斤拷锟斤拷锟斤拷锟捷达拷锟铰碉拷锟斤拷锟斤拷锟斤拷 .planes = 1, .bit_count = 24, .compression = 0, @@ -51,21 +51,21 @@ void save_bmp_2( .colors_important = 0 }; - // д��ͷ��Ϣ + // 写锟斤拷头锟斤拷息 fwrite(&file_header, 1, sizeof(BMPFileHeader), file); fwrite(&info_header, 1, sizeof(BMPInfoHeader), file); - // д���������ݣ������һ�п�ʼ�� + // 写锟斤拷锟斤拷锟斤拷锟斤拷锟捷o拷锟斤拷锟斤拷锟揭伙拷锌锟绞硷拷锟� uint8_t padding_bytes[3] = { 0, 0, 0 }; for (int y = height - 1; y >= 0; y--) { for (int x = 0; x < RGN_DATA_WIN_SIZE; x++) { uint8_t pixel = (uint8_t)testSamples[y].data[x]; - // ��RGBתΪBGR˳�� + // 锟斤拷RGB转为BGR顺锟斤拷 fputc(pixel, file); // B fputc(pixel, file); // G fputc(pixel, file); // R } - fwrite(padding_bytes, 1, padding, file); // ��� + fwrite(padding_bytes, 1, padding, file); // 锟斤拷锟� } fclose(file); @@ -203,6 +203,15 @@ void genTestSream( inStream.write(a_data); } } + //add Last sync data + VSync.LazerWinFlag = 0; + VSync.LazerWinRid = 0; + VSync.LazerWinRsv = 0; + VSync.LazerWinX = 0; + VSync.LazerWinY = 0; + VSync.RltvRdx = 0; + VSync.Sync = 0b11; + inStream.write(VSync); return; } @@ -254,10 +263,12 @@ void convertStreamToArray( data16_1(11,0) = VSync.LazerWinX.range(11,0); *frameROI_y = data16_1; //output data - for(int i = 0; i < winNum; i ++) + for(int i = 0; i <= winNum; i ++) { RgnPix Hsync = streamData.read(); - if(Hsync.Sync != 0b01) + if(Hsync.Sync == 0b11) + break; + else if(Hsync.Sync != 0b01) continue; Luma_rgnData a_line; @@ -358,6 +369,7 @@ int main() for(int fi = 0; fi < fileSize; fi++) { char fileName[200]; + char paraFileName[200]; char outFileName[200]; #if defined(__linux__) sprintf(fileName, "%s%d_L_verilog.txt", InDataPath[n], fi);