add function in testbench to read simulation parameters

This commit is contained in:
jerryzeng 2025-11-24 10:11:47 +08:00
parent 1849b598d7
commit 9d4db3772f
2 changed files with 74 additions and 32 deletions

View File

@ -10,6 +10,17 @@
#include <iostream> #include <iostream>
#include <fstream> #include <fstream>
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 typedef struct
{ {
uint16_t WinRdx;//窗口在图像内的起始坐标 uint16_t WinRdx;//窗口在图像内的起始坐标

View File

@ -18,17 +18,17 @@ void save_bmp_2(
fopen_s(&file, filename, "wb"); fopen_s(&file, filename, "wb");
#endif #endif
if (!file) { if (!file) {
printf("锟睫凤拷锟斤拷锟侥硷拷 %s\n", filename); printf("閿熺潾鍑ゆ嫹閿熸枻鎷烽敓渚ョ》鎷<EFBFBD> %s\n", filename);
return; return;
} }
// 锟斤拷锟斤拷每锟斤拷锟斤拷锟斤拷纸锟斤拷锟<EFBFBD> // 閿熸枻鎷烽敓鏂ゆ嫹姣忛敓鏂ゆ嫹閿熸枻鎷烽敓鏂ゆ嫹绾搁敓鏂ゆ嫹閿燂拷
int bytes_per_row = RGN_DATA_WIN_SIZE * 3; // 每锟斤拷锟斤拷锟斤拷3锟街节拷BGR锟斤拷 int bytes_per_row = RGN_DATA_WIN_SIZE * 3; // 姣忛敓鏂ゆ嫹閿熸枻鎷烽敓鏂ゆ嫹3閿熻鑺傦綇鎷稡GR閿熸枻鎷<EFBFBD>
int padding = (4 - (bytes_per_row % 4)) % 4; int padding = (4 - (bytes_per_row % 4)) % 4;
int row_size = bytes_per_row + padding; int row_size = bytes_per_row + padding;
int height = testSamples.size(); int height = testSamples.size();
// 锟斤拷始锟斤拷锟侥硷拷头 // 閿熸枻鎷峰閿熸枻鎷烽敓渚ョ》鎷峰ご
BMPFileHeader file_header = { BMPFileHeader file_header = {
.file_type = 0x4D42, // 'BM' .file_type = 0x4D42, // 'BM'
.file_size = sizeof(BMPFileHeader) + sizeof(BMPInfoHeader) + row_size * height, .file_size = sizeof(BMPFileHeader) + sizeof(BMPInfoHeader) + row_size * height,
@ -36,11 +36,11 @@ void save_bmp_2(
.reserved2 = 0, .reserved2 = 0,
.offset_data = sizeof(BMPFileHeader) + sizeof(BMPInfoHeader) .offset_data = sizeof(BMPFileHeader) + sizeof(BMPInfoHeader)
}; };
// 锟斤拷始锟斤拷锟斤拷息头 // 閿熸枻鎷峰閿熸枻鎷烽敓鏂ゆ嫹鎭ご
BMPInfoHeader info_header = { BMPInfoHeader info_header = {
.size = sizeof(BMPInfoHeader), .size = sizeof(BMPInfoHeader),
.width = RGN_DATA_WIN_SIZE, .width = RGN_DATA_WIN_SIZE,
.height = height, // 锟斤拷锟斤拷锟斤拷示锟斤拷锟斤拷锟斤拷锟捷达拷锟铰碉拷锟斤拷锟斤拷锟斤拷 .height = height, // 閿熸枻鎷烽敓鏂ゆ嫹閿熸枻鎷风ず閿熸枻鎷烽敓鏂ゆ嫹閿熸枻鎷烽敓鎹疯揪鎷烽敓閾扮鎷烽敓鏂ゆ嫹閿熸枻鎷烽敓鏂ゆ嫹
.planes = 1, .planes = 1,
.bit_count = 24, .bit_count = 24,
.compression = 0, .compression = 0,
@ -51,26 +51,67 @@ void save_bmp_2(
.colors_important = 0 .colors_important = 0
}; };
// 写锟斤拷头锟斤拷息 // 鍐欓敓鏂ゆ嫹澶撮敓鏂ゆ嫹鎭<EFBFBD>
fwrite(&file_header, 1, sizeof(BMPFileHeader), file); fwrite(&file_header, 1, sizeof(BMPFileHeader), file);
fwrite(&info_header, 1, sizeof(BMPInfoHeader), file); fwrite(&info_header, 1, sizeof(BMPInfoHeader), file);
// 写锟斤拷锟斤拷锟斤拷锟斤拷锟捷拷锟斤拷锟斤拷锟揭伙拷锌锟绞硷拷锟<EFBFBD> // 鍐欓敓鏂ゆ嫹閿熸枻鎷烽敓鏂ゆ嫹閿熸枻鎷烽敓鎹凤綇鎷烽敓鏂ゆ嫹閿熸枻鎷烽敓鎻紮鎷烽攲閿熺粸纭锋嫹閿燂拷
uint8_t padding_bytes[3] = { 0, 0, 0 }; uint8_t padding_bytes[3] = { 0, 0, 0 };
for (int y = height - 1; y >= 0; y--) { for (int y = height - 1; y >= 0; y--) {
for (int x = 0; x < RGN_DATA_WIN_SIZE; x++) { for (int x = 0; x < RGN_DATA_WIN_SIZE; x++) {
uint8_t pixel = (uint8_t)testSamples[y].data[x]; uint8_t pixel = (uint8_t)testSamples[y].data[x];
// 锟斤拷RGB转为BGR顺锟斤拷 // 閿熸枻鎷稲GB杞负BGR椤洪敓鏂ゆ嫹
fputc(pixel, file); // B fputc(pixel, file); // B
fputc(pixel, file); // G fputc(pixel, file); // G
fputc(pixel, file); // R fputc(pixel, file); // R
} }
fwrite(padding_bytes, 1, padding, file); // 锟斤拷<EFBFBD> fwrite(padding_bytes, 1, padding, file); // 閿熸枻鎷烽敓<EFBFBD>
} }
fclose(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<Luma_rgnData> readTestFile( std::vector<Luma_rgnData> readTestFile(
const char* file, const char* file,
@ -125,32 +166,26 @@ std::vector<Luma_rgnData> readTestFile(
void genTestSream( void genTestSream(
std::vector<Luma_rgnData>& srcData, std::vector<Luma_rgnData>& srcData,
hls::stream<RgnPix>& inStream, hls::stream<RgnPix>& inStream,
const uint32_t FrmNo, const Luma_frameInfo frameInfo)
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)
{ {
RgnPix VSync = {0,0,0,0,0,0,0}; RgnPix VSync = {0,0,0,0,0,0,0};
ap_uint<32> data_32; ap_uint<32> data_32;
//1st:FrmNo //1st:FrmNo
data_32 = FrmNo; data_32 = frameInfo.FrmNo;
VSync.Sync = 0b10; VSync.Sync = 0b10;
VSync.LazerWinX(11,0) = data_32.range(11,0); VSync.LazerWinX(11,0) = data_32.range(11,0);
VSync.LazerWinY(11,0) = data_32.range(23,12); VSync.LazerWinY(11,0) = data_32.range(23,12);
VSync.LazerWinRid(7,0) = data_32.range(31,24); VSync.LazerWinRid(7,0) = data_32.range(31,24);
inStream.write(VSync); inStream.write(VSync);
//2nd:FrmNo //2nd:FrmNo
data_32 = timeStamp; data_32 = frameInfo.TimeStamp;
VSync.Sync = 0b00; VSync.Sync = 0b00;
VSync.LazerWinX(11,0) = data_32.range(11,0); VSync.LazerWinX(11,0) = data_32.range(11,0);
VSync.LazerWinY(11,0) = data_32.range(23,12); VSync.LazerWinY(11,0) = data_32.range(23,12);
VSync.LazerWinRid(7,0) = data_32.range(31,24); VSync.LazerWinRid(7,0) = data_32.range(31,24);
inStream.write(VSync); inStream.write(VSync);
//3rd:encInfo //3rd:encInfo
data_32 = encInfo; data_32 = frameInfo.encInfo;
VSync.Sync = 0b00; VSync.Sync = 0b00;
VSync.LazerWinX(11,0) = data_32.range(11,0); VSync.LazerWinX(11,0) = data_32.range(11,0);
VSync.LazerWinY(11,0) = data_32.range(23,12); VSync.LazerWinY(11,0) = data_32.range(23,12);
@ -158,22 +193,22 @@ void genTestSream(
inStream.write(VSync); inStream.write(VSync);
//4th:frmW(12bit), frmH(12bit) //4th:frmW(12bit), frmH(12bit)
ap_uint<16> data16_1, data16_2; ap_uint<16> data16_1, data16_2;
data16_1 = frameROI_w; data16_1 = frameInfo.W;
data16_2 = frameROI_h; data16_2 = frameInfo.H;
VSync.Sync = 0b00; VSync.Sync = 0b00;
VSync.LazerWinX(11,0) = data16_1.range(11,0); VSync.LazerWinX(11,0) = data16_1.range(11,0);
VSync.LazerWinY(11,0) = data16_2.range(11,0); VSync.LazerWinY(11,0) = data16_2.range(11,0);
inStream.write(VSync); inStream.write(VSync);
//5th: frmX, WinNum //5th: frmX, WinNum
int winNum = (int)srcData.size(); int winNum = (int)srcData.size();
data16_1 = frameROI_x; data16_1 = frameInfo.L;
data16_2 = (uint16_t)winNum; data16_2 = (uint16_t)winNum;
VSync.Sync = 0b00; VSync.Sync = 0b00;
VSync.LazerWinX(11,0) = data16_1.range(11,0); VSync.LazerWinX(11,0) = data16_1.range(11,0);
VSync.LazerWinY(11,0) = data16_2.range(11,0); VSync.LazerWinY(11,0) = data16_2.range(11,0);
inStream.write(VSync); inStream.write(VSync);
//6th: frmY //6th: frmY
data16_1 = frameROI_y; data16_1 = frameInfo.T;
VSync.Sync = 0b00; VSync.Sync = 0b00;
VSync.LazerWinX(11,0) = data16_1.range(11,0); VSync.LazerWinX(11,0) = data16_1.range(11,0);
VSync.LazerWinY(11,0) = 0; VSync.LazerWinY(11,0) = 0;
@ -373,22 +408,18 @@ int main()
char outFileName[200]; char outFileName[200];
#if defined(__linux__) #if defined(__linux__)
sprintf(fileName, "%s%d_L_verilog.txt", InDataPath[n], fi); 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); sprintf(outFileName, "%s%d_L_pkCenter.txt", OutDataPath[n], fi);
#else #else
sprintf_s(fileName, "%s%d_L_verilog.txt", InDataPath[n], fi); 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); sprintf_s(outFileName, "%s%d_L_pkCenter.txt", OutDataPath[n], fi);
#endif #endif
std::vector<Luma_rgnData> testData = readTestFile(fileName, &winSize); std::vector<Luma_rgnData> testData = readTestFile(fileName, &winSize);
Luma_frameInfo framwInfo = readParaFile(paraFileName);
//gen test stream //gen test stream
hls::stream<RgnPix> inStream; hls::stream<RgnPix> inStream;
uint32_t FrmNo = 0x1; genTestSream(testData, inStream, framwInfo);
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);
hls::stream<RgnPix> outStream; hls::stream<RgnPix> outStream;
peakCentering(inStream,outStream); peakCentering(inStream,outStream);