hls::LineBuffer<MATRIX_DIM,IMG_WIDTH,unsigned char>
以下是LineBuffer的类定义,可以看到初始化,需要的数据包括行、列、类型名字(如char)和转置(默认行列) 本质上是一个二维数组
/* Template class of Line Buffer */
template<int ROWS, int COLS, typename T, int RESHAPE=0>
class LineBuffer;
template<int ROWS, int COLS, typename T>
class LineBuffer<ROWS, COLS, T, 0> {
public:
LineBuffer() {
#pragma HLS array_partition variable=val dim=1 complete //对这样一个二维数组,HLS采取的优化是将每行数据放在寄存器当中
#pragma HLS dependence variable=val inter false
#pragma HLS dependence variable=val intra false
};
/* LineBuffer main APIs */
void shift_pixels_up(int col);
void shift_pixels_down(int col);
void insert_bottom_row(T value, int col);
void insert_top_row(T value, int col);
void get_col(T value[ROWS], int col);
T& getval(int row, int col);
T& operator ()(int row, int col);
/* Back compatible APIs */
void shift_up(int col);
void shift_down(int col);
void insert_bottom(T value, int col);
void insert_top(T value, int col);
//T& getval(int row, int col);
//T& operator ()(int row, int col);
T val[ROWS][COLS];
#ifdef _HLSCLIB_DEBUG_
void restore_val();
void linebuffer_print(int col);
T val_t[ROWS][COLS];
#endif
};
lineBuf.shift_pixels_up(j);
lineBuf.insert_bottom_row(pix,j);
lineBuf.shift_pixels_up(int col);
该函数实现的是将linebuf某一列的数组向上移动1位
template<int ROWS, int COLS, typename T> void LineBuffer<ROWS, COLS, T, 1>::shift_pixels_up(int col) {
#pragma HLS inline
assert(col >= 0 && col < COLS);
#ifdef _HLSCLIB_DEBUG_
std::cout << "LineBuffer Elements in col=" << col << ":";
linebuffer_print(col);
restore_val();
#endif
HLS_SIZE_T i; //核心代码
for(i = 0; i < ROWS-1; i++) {
#pragma HLS unroll //#pragma HLS unroll 循环并行化
val[i][col] = val[i+1][col];
}
#ifdef _HLSCLIB_DEBUG_
std::cout << "=== After " << __FUNCTION__ << ": ===\n\n";
std::cout << "LineBuffer Elements Update in col=" << col << ":";
linebuffer_print(col);
HLS_SIZE_T j;
for(i = 0; i < ROWS; i++) {
for(j = 0; j < COLS; j++) {
if(j==col)
if(i==ROWS-1)
assert(val_t[i][j] == val[i][j] && "*** window shift_pixels_up mismatch! ***");
else
assert(val_t[i+1][j] == val[i][j] && "*** window shift_pixels_up mismatch! ***");
else
assert(val_t[i][j] == val[i][j] && "*** window shift_pixels_up mismatch! ***");
}
}
#endif
}
lineBuf.insert_bottom_row(value,col);
该函数是将某一列的最后一行的数据赋值成新数据,通常与shift_pixels_up连用
/* LineBuffer insert bottom row
* Inserts a new value in bottom row= ROWS-1 of the linebuffer
*/
template<int ROWS, int COLS, typename T> void LineBuffer<ROWS, COLS, T, 1>::insert_bottom_row(T value, int col) {
#pragma HLS inline
assert(col >= 0 && col < COLS);
#ifdef _HLSCLIB_DEBUG_
std::cout << "LineBuffer Elements in col=" << col << ":";
linebuffer_print(col);
restore_val();
#endif
val[ROWS-1][col] = value; //核心代码
#ifdef _HLSCLIB_DEBUG_
std::cout << "=== After " << __FUNCTION__ << ": ===\n\n";
std::cout << "LineBuffer Elements Update in col=" << col << ":";
linebuffer_print(col);
HLS_SIZE_T i, j;
for(i = 0; i < ROWS; i++) {
for(j = 0; j < COLS; j++) {
if(j==col && i==ROWS-1)
assert(val[i][j] == value && "*** window insert_bottom_row mismatch! ***");
else
assert(val_t[i][j] == val[i][j] && "*** window insert_bottom_row mismatch! ***");
}
}
#endif
}