Image Ver1
img バス仕様
画像処理において、AXI4 Stream バスの信号をさらに簡易に扱うために、Jelly では img バスという独自仕様に変換して処理しています。
これは主に、valid/ready のハンドシェークの記述が苦手な初学者に素早く画像処理に触れてもらうためのものです(HLSなどとは相性が悪いのでご注意ください)。
img バスの主な信号は以下の通りであり、必要に応じて個別画像処理に付随する信号を追加します。
| signal name | description |
|---|---|
| reset | リセット信号 |
| clk | クロック |
| cke | クロックイネーブル。ピクセル入力が無い時は落とす |
| line_first | 先頭ラインを示す |
| line_last | 最終ラインを示す |
| pixel_first | ライン内で先頭ピクセルを示す |
| pixel_last | ライン内で最終ピクセルを示す |
| de | 有効ピクセルを示す |
| user | ユーザーデータ |
| data | 画像データ |
| valid | valid の立たないデータは他のすべての信号は無効とする |
img バスは有効ピクセルが無い場合や出力側が受けられない(バックプレッシャー)時に cke(クロックイネーブル)をネゲートするのが特徴です。
したがって、cke の有効な期間のみを処理すれば、データはすべて連続となり、パイプラインステージにおいてステージ前後のデータが左右のピクセルに必ず対応することを保証できます。
つまり
always @(posedge clk) begin
if ( reset ) begin
...
end
else if (cke) begin
...
end
end
という形を保っている限りにおいて、データは常に連続してやってきているとみなしてプログラミングが可能です。
また、画像処理で重要になることが多いボーダー処理では、画像ボーダーを示す 4 辺のフラグを用意することで、この処理を簡易化しています。
一方で、有効ピクセルを示す de 信号も備えています。基本的には、無効ピクセルは img バスに変換する段で cke が下がりますが、3x3 などのブロック処理を行う場合は最終ラインの掃き出しが必要になるため、de の下がった無効ラインの入力をオプションとして備えています。 また、画像処理の出力過程では、不要ピクセルの de を下げることで画像縮小などの処理が可能になります。
これらにより多くの制御信号を持ちますが、これらをすべて必須にするとリセットの接続先が増える課題があります。そこで valid 信号をオプショナルとして備えており、valid の立たないデータでは他のすべての信号を無効とすることで、リセット信号の接続を valid に関わる信号だけにすることも可能にしています。
jelly_axi4s_to_img
AXI4 Stream を img バスに変換し、画像処理後に再び AXI4 Stream に戻すコアです。
jelly_img_blk_buffer
画像を N×M のブロックに変換して画像処理をアシストするコアです。 ラインバッファとピクセルバッファを備え、ブロック処理に必要な単位で出力します。 M-1 ライン分の遅延が発生します。
その際、ボーダー処理として NONE, CONSTANT, REPLICATE, REFLECT, REFLECT_101 などの処理が選択可能であり、OpenCV のそれとほぼ一致します。
jelly_img_demosaic_acpi
ACPI 法によるデモザイクです。
jelly_img_color_matrix
カラーマトリックス処理です。
jelly_img_gaussian_3x3
3x3 限定のガウシアンフィルタです。
jelly_img_sobel_core
Sobel フィルタコアです。 固定値での演算のため、ホストから設定するレジスタはありません。
jelly_img_binarizer
2 値化コアです。
jelly_img_selector
画像セレクタです。 主にデバッグ時に中間データを切り替えて出力する用途で利用できます。
jelly_img_previous_frame
1 つ前のフレームを外部メモリに保存して利用するための DMA モジュールです。
jelly_img_dnn_maxpol
DNN 用の MaxPooling 層です。
縮小を行い de の立たないデータを出力するため、この後にさらに画像処理を行うには一度 AXI4 Stream に戻す必要があります。