在下面的SystemC SC_THREAD中,我尝试执行以下操作:image_buffer是3行x 720列的矩阵,其中填充有从端口p_in传入的字节。当image_buffer有2行并且前5个字节已填充时,它必须开始将字节复制到另一个名为img的矩阵中,该矩阵的大小为576行x 720列。只要字节h_intrue,便保存该字节。 img完成后,将生成png格式的图像。我编写的代码存在的问题是ij始终分别为2和4,仅将第一行的2行和第三行的4个像素保存到图像中。您能给我一个提示,告诉我如何实施此方法吗?

void FILTER::filtering(){

    while(1){

        while(!h_in) wait(h_in.posedge_event());

        for(i=0; i<3; i++){
            for(j=0; j<720; j++){
                image_buffer.pixel[i*image_buffer.width+j] = p_in;
                wait();
                while(!h_in) wait();

            //Begin of the block code I'm trying to test with
            if ( (i > 1) && (j > 3) ){
                for(int bi=0; bi<576; bi++){
                    for(int bj=0; bj<720; bj++){
                        if (bi < 3){
                            img.pixel[bi*img.width+bj] = image_buffer.pixel[bi*image_buffer.width+bj];
                        }
                        else{
                            img.pixel[bi*img.width+bj] = image_buffer.pixel[(bi%3)*image_buffer.width+bj];
                        }

                        cout << "i: " << i << " j: " << j << endl;

                        if ( (bi == 575)&&(bj == 719) ){
                            image_write( &img, "test.png" );
                            exit(1);
                        }
                    }
                }
            }
            wait();
            //End of the block code I'm trying to test with

            }

        }

    }
}


更新资料
我修改了代码,如下所示,但是当我这样做时,新的计数器bibj总是0

while(1){

    while(!h_in) wait(h_in.posedge_event());

    k = 0;

    for(i=0; i<3; i++){
        for(j=0; j<720; j++){
            image_buffer.pixel[i*image_buffer.width+j] = p_in;
            wait();
            while(!h_in) wait();

            if( (i == 2 )&&(j > 4) ){

                for(bi=i-2; bi<576; i++){
                    for(bj=j-5; bj<720; j++){
                            cout << "bi: " << bi << "   bj: " << bj << endl;
                            img.pixel[bi*img.width+bj] = image_buffer.pixel[bi*image_buffer.width+bj];
                    }
                }

            }
        }
    }
}

最佳答案

要执行单线程解决方案,您将遍历最终图像的尺寸,并跟踪(row,col)和计算出的(bufrow,bufcol)。您可能不希望为此使用for循环,因为您将拥有可以增加图像位置和缓冲区位置的迭代。每次迭代可以具有以下条件之一:


缓冲区最初正在填充-(bufrow,bufcol)增量,
(row,col)不要
缓冲区正在填充并复制到图像-h
是&&(bufrow,bufcol)在某些时候超过(2,5)
(粘性buffer_is_ready指示器)
缓冲区未填充(!h),
但是正在复制到图像-增量(row,col)


您可能希望将while(row<576&&col<720)作为唯一循环(在while(1)内部)。在每次迭代中,手动处理(row,col)和(bufrow,bufcol)的增量。不要忘记缓冲区的环绕:

  if (h) {
    bufrow = (bufcol == 719 && bufrow == 2) ? 0
             (bufcol == 719)                ? bufrow+1 : bufrow;
    bufcol = (bufcol == 719) ? 0 : bufcol+1;
  }


它还可以简化代码以使用两线程解决方案。使用两个线程还可以使缓冲区填充与任何计算和复制到最终映像脱钩。

07-25 20:19