最適な境界ピクセルたたみ込み
このアルゴリズムの最後には、エッジ ピクセルを境界領域に複製します。一定したデータフローおよびデータ再利用を実現するため、ローカル キャッシュが使用されます。次の図に、境界サンプルがどのように画像に組み込まれるかを示します。
- 各サンプルが垂直たたみ込みからの vconv 出力から読み込まれます。
- サンプルが 4 つのピクセル タイプのいずれかとしてキャッシュに格納されます。
- サンプルが出力ストリームに書き出されます。

次に、境界ピクセルの位置を決定するコードを示します。
// Border pixels
pvconv=vconv_buffer; // set/reset pointer to start of buffer
Border:for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
T pix_in, l_edge_pix, r_edge_pix, pix_out;
#pragma HLS PIPELINE
if (i == 0 || (i > border_width && i < height - border_width)) {
// read a pixel out of the video stream and cache it for
// immediate use and later replication purposes
if (j < width - (K - 1)) {
pix_in = *pvconv++;
borderbuf[j] = pix_in;
}
if (j == 0) {
l_edge_pix = pix_in;
}
if (j == width - K) {
r_edge_pix = pix_in;
}
}
// Select output value from the appropriate cache resource
if (j <= border_width) {
pix_out = l_edge_pix;
} else if (j >= width - border_width - 1) {
pix_out = r_edge_pix;
} else {
pix_out = borderbuf[j - border_width];
}
*dst++=pix_out;
}
}
このコードの明らかな違いは、タスク内に条件文が多く使用されている点です。これにより、タスクがパイプライン処理された後、データが継続的に処理されるようになります。条件文の結果はパイプラインの実行には影響しません。結果は出力値に影響しますが、入力サンプルが使用可能である限り、パイプラインは継続的に処理されます。