From 9d4db3772f0e85606de09f4b415a4de19c9dc3f8 Mon Sep 17 00:00:00 2001 From: jerryzeng Date: Mon, 24 Nov 2025 10:11:47 +0800 Subject: [PATCH] add function in testbench to read simulation parameters --- globals/tbGlobals.h | 11 +++ peakCentering/sourceCode/peakCentering_tb.cpp | 95 ++++++++++++------- 2 files changed, 74 insertions(+), 32 deletions(-) diff --git a/globals/tbGlobals.h b/globals/tbGlobals.h index b39a57d..9001f04 100644 --- a/globals/tbGlobals.h +++ b/globals/tbGlobals.h @@ -10,6 +10,17 @@ #include #include +typedef struct +{ + uint16_t L; + uint16_t T; + uint16_t W; + uint16_t H; + uint32_t FrmNo; + uint32_t TimeStamp; + uint32_t encInfo; +}Luma_frameInfo; + typedef struct { uint16_t WinRdx;//窗口在图像内的起始坐标 diff --git a/peakCentering/sourceCode/peakCentering_tb.cpp b/peakCentering/sourceCode/peakCentering_tb.cpp index 911c022..caa3948 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閿熻鑺傦綇鎷稡GR閿熸枻鎷 + // 闁跨喐鏋婚幏鐑芥晸閺傘倖瀚瑰В蹇涙晸閺傘倖瀚归柨鐔告灮閹风兘鏁撻弬銈嗗缁炬悂鏁撻弬銈嗗闁跨噦鎷 + int bytes_per_row = RGN_DATA_WIN_SIZE * 3; // 濮e繘鏁撻弬銈嗗闁跨喐鏋婚幏鐑芥晸閺傘倖瀚3闁跨喕顢滈懞鍌︾秶閹风āGR闁跨喐鏋婚幏锟 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,26 +51,67 @@ void save_bmp_2( .colors_important = 0 }; - // 鍐欓敓鏂ゆ嫹澶撮敓鏂ゆ嫹鎭 + // 閸愭瑩鏁撻弬銈嗗婢舵挳鏁撻弬銈嗗閹拷 fwrite(&file_header, 1, sizeof(BMPFileHeader), file); fwrite(&info_header, 1, sizeof(BMPInfoHeader), file); - // 鍐欓敓鏂ゆ嫹閿熸枻鎷烽敓鏂ゆ嫹閿熸枻鎷烽敓鎹凤綇鎷烽敓鏂ゆ嫹閿熸枻鎷烽敓鎻紮鎷烽攲閿熺粸纭锋嫹閿燂拷 + // 閸愭瑩鏁撻弬銈嗗闁跨喐鏋婚幏鐑芥晸閺傘倖瀚归柨鐔告灮閹风兘鏁撻幑鍑ょ秶閹风兘鏁撻弬銈嗗闁跨喐鏋婚幏鐑芥晸閹活厺绱幏鐑芥敳闁跨喓绮哥涵閿嬪闁跨噦鎷 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]; - // 閿熸枻鎷稲GB杞负BGR椤洪敓鏂ゆ嫹 + // 闁跨喐鏋婚幏绋睪B鏉烆兛璐烞GR妞ゆ椽鏁撻弬銈嗗 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); } +Luma_frameInfo readParaFile(const char* file) +{ + std::ifstream inputFile(file); + Luma_frameInfo frameInfo; + std::string strLineTxt; + + int data; + getline(inputFile, strLineTxt); //XL + sscanf(strLineTxt.c_str(), "XL:%d", &data); + frameInfo.L = (uint16_t)data; + + getline(inputFile, strLineTxt); //XR + + getline(inputFile, strLineTxt); //TL + sscanf(strLineTxt.c_str(), "TL:%d", &data); + frameInfo.T = (uint16_t)data; + + getline(inputFile, strLineTxt); //TR + + getline(inputFile, strLineTxt); //W + sscanf(strLineTxt.c_str(), "W:%d", &data); + frameInfo.W = (uint16_t)data; + + getline(inputFile, strLineTxt); //H + sscanf(strLineTxt.c_str(), "H:%d", &data); + frameInfo.H = (uint16_t)data; + + getline(inputFile, strLineTxt); //FrmNO + sscanf(strLineTxt.c_str(), "FrmNO:%x", &data); + frameInfo.FrmNo = (uint32_t)data; + + getline(inputFile, strLineTxt); //TimStp + sscanf(strLineTxt.c_str(), "TimStp:%x", &data); + frameInfo.TimeStamp = (uint32_t)data; + + getline(inputFile, strLineTxt); //EncInfo + sscanf(strLineTxt.c_str(), "EncInfo:%x", &data); + frameInfo.encInfo = (uint32_t)data; + + return frameInfo; +} std::vector readTestFile( const char* file, @@ -125,32 +166,26 @@ std::vector readTestFile( void genTestSream( std::vector& srcData, hls::stream& inStream, - const uint32_t FrmNo, - const uint32_t timeStamp, - const uint32_t encInfo, - const uint16_t frameROI_w, - const uint16_t frameROI_h, - const uint16_t frameROI_x, - const uint16_t frameROI_y) + const Luma_frameInfo frameInfo) { RgnPix VSync = {0,0,0,0,0,0,0}; ap_uint<32> data_32; //1st:FrmNo - data_32 = FrmNo; + data_32 = frameInfo.FrmNo; VSync.Sync = 0b10; VSync.LazerWinX(11,0) = data_32.range(11,0); VSync.LazerWinY(11,0) = data_32.range(23,12); VSync.LazerWinRid(7,0) = data_32.range(31,24); inStream.write(VSync); //2nd:FrmNo - data_32 = timeStamp; + data_32 = frameInfo.TimeStamp; VSync.Sync = 0b00; VSync.LazerWinX(11,0) = data_32.range(11,0); VSync.LazerWinY(11,0) = data_32.range(23,12); VSync.LazerWinRid(7,0) = data_32.range(31,24); inStream.write(VSync); //3rd:encInfo - data_32 = encInfo; + data_32 = frameInfo.encInfo; VSync.Sync = 0b00; VSync.LazerWinX(11,0) = data_32.range(11,0); VSync.LazerWinY(11,0) = data_32.range(23,12); @@ -158,22 +193,22 @@ void genTestSream( inStream.write(VSync); //4th:frmW(12bit), frmH(12bit) ap_uint<16> data16_1, data16_2; - data16_1 = frameROI_w; - data16_2 = frameROI_h; + data16_1 = frameInfo.W; + data16_2 = frameInfo.H; VSync.Sync = 0b00; VSync.LazerWinX(11,0) = data16_1.range(11,0); VSync.LazerWinY(11,0) = data16_2.range(11,0); inStream.write(VSync); //5th: frmX, WinNum int winNum = (int)srcData.size(); - data16_1 = frameROI_x; + data16_1 = frameInfo.L; data16_2 = (uint16_t)winNum; VSync.Sync = 0b00; VSync.LazerWinX(11,0) = data16_1.range(11,0); VSync.LazerWinY(11,0) = data16_2.range(11,0); inStream.write(VSync); //6th: frmY - data16_1 = frameROI_y; + data16_1 = frameInfo.T; VSync.Sync = 0b00; VSync.LazerWinX(11,0) = data16_1.range(11,0); VSync.LazerWinY(11,0) = 0; @@ -373,22 +408,18 @@ int main() char outFileName[200]; #if defined(__linux__) sprintf(fileName, "%s%d_L_verilog.txt", InDataPath[n], fi); + sprintf(paraFileName, "%s%d_para_verilog.txt", InDataPath[n], fi); sprintf(outFileName, "%s%d_L_pkCenter.txt", OutDataPath[n], fi); #else sprintf_s(fileName, "%s%d_L_verilog.txt", InDataPath[n], fi); + sprintf_s(paraFileName, "%s%d_para_verilog.txt", InDataPath[n], fi); sprintf_s(outFileName, "%s%d_L_pkCenter.txt", OutDataPath[n], fi); #endif std::vector testData = readTestFile(fileName, &winSize); + Luma_frameInfo framwInfo = readParaFile(paraFileName); //gen test stream hls::stream inStream; - uint32_t FrmNo = 0x1; - uint32_t timeStamp = 0x2; - uint32_t encInfo = 0x3; - uint16_t frameROI_w = 0x100; - uint16_t frameROI_h = 2048; - uint16_t frameROI_x = 0; - uint16_t frameROI_y = 0; - genTestSream(testData, inStream, FrmNo, timeStamp, encInfo, frameROI_w, frameROI_h, frameROI_x, frameROI_y); + genTestSream(testData, inStream, framwInfo); hls::stream outStream; peakCentering(inStream,outStream);