Image Ver3

概要

Ver3 は jelly3_ 系の Image 実装群です。mat_if ベースの接続を中核に設計されています。

可能な範囲で OpenCV の命名に近づくようにしています。

画像としても行列としても扱いそうなデータは Mat を命名のベースとし、明らかに画像にしか施さない演算を行うものは Img を命名のベースとしています。

jelly3_mat_if インターフェースの仕様

Ver3 では、画像データの受け渡しに jelly3_mat_if.sv でインターフェースを定義しています。

これは主に、valid/ready のハンドシェーク記述が苦手な方でも画像パイプラインを組みやすくするための設計です。valid/ready で厳密にストール制御する設計とは思想が異なるため、HLS との相性は良くありません。

インターフェースのパラメータ

jelly3_mat_if は、用途に合わせてインタフェース幅や有効信号の扱いを変更できるようにパラメータ化されています。

特に Ver3 では TAPS により、1 サイクルで複数ピクセルを同時に処理する構成を取りやすくなっています。

parameter description
USE_DE de 信号を使用するかを指定します。
USE_USER user 信号を使用するかを指定します。
USE_VALID valid 信号を使用するかを指定します。
TAPS 1 サイクルで同時に扱う画素タップ数です。data[TAPS-1:0] の形で並列処理できます。
DE_BITS de のビット幅です。既定値は TAPS です。用途に応じて 1bit 集約にもできます。
CH_DEPTH 1 画素あたりのチャネル数です。例: RGB なら 3 です。
CH_BITS 1 チャネルあたりのビット幅です。
ROWS_BITS 行数 (rows) を表現するビット幅です。
COLS_BITS 列数 (cols) を表現するビット幅です。
DATA_BITS データ総ビット幅です。通常 CH_DEPTH * CH_BITS です。
USER_BITS user 信号のビット幅です。

TAPS を増やすとスループットを上げやすくなりますが、周辺のバッファ構成や演算器リソースも合わせて設計する必要があります。

jelly3_mat_if の信号仕様

jelly3_mat_if の主な信号は以下の通りです。

signal name description
reset リセット信号
clk クロック
cke クロックイネーブル。処理可能なサイクルを示す
rows 画像の行数
cols 画像の列数
row_first 先頭行を示す
row_last 最終行を示す
col_first 行内先頭列を示す
col_last 行内最終列を示す
de 有効画素を示す。DE_BITS 幅のビット列
data 画素データ。TAPS 本分を同時に扱える
user ユーザー拡張信号
valid 信号有効を示す

jelly3_mat_if.sv では TAPSCH_DEPTHCH_BITS などをパラメータ化しており、フィルタや並列処理の都合に合わせてデータ形状を合わせられます。

jelly3_mat_if の cke の扱い

jelly3_mat_if のバスは有効ピクセルが無い場合や出力側が受けられない(バックプレッシャー)時に cke(クロックイネーブル)をネゲートするのが特徴です。

したがって、cke の有効な期間のみを処理すれば、データはすべて連続となり、パイプラインステージにおいてステージ前後のデータが左右のピクセルに必ず対応することを保証できます。

つまり

always_ff @(posedge mat.clk) begin
    if ( mat.reset ) begin
        ...
    end
    else if ( mat.cke ) begin
        ...
    end
end

という形を保っている限りにおいて、データは常に連続してやってきているとみなしてハンドシェークを意識しないプログラミングが可能です。

jelly3_mat_if の valid の扱い

jelly3_mat_if には多くの信号線があり、すべてにリセットを掛けるのは非効率です。

そこで、reset と cke 以外の信号については、valid が 1 の時のみ有効とするというルールの元、valid のみにリセットを掛ければ良いように設計しています。

AXI4-Stream との対応

jelly3_axi4s_to_mat.svjelly3_mat_to_axi4s.sv により、AXI4-Stream との相互変換が可能です。

  • jelly3_axi4s_to_mat.sv

    • tuser[0] をフレーム開始として解釈します。

    • param_rows/param_cols を基準に row_first/row_last/col_first/col_last を生成します。

    • 必要に応じて param_blank 行のブランキングを挿入します。

  • jelly3_mat_to_axi4s.sv

    • row_first && col_first をフレーム開始として tuser[0] を立てます。

    • col_lasttlast に対応させます。

    • tvalidde && valid && cke を使って生成します。

実装配置

  • rtl/v3/image

主要モジュール

  • jelly3_mat_if.sv

  • jelly3_axi4s_to_mat.sv

  • jelly3_mat_to_axi4s.sv

  • jelly3_img_demosaic_acpi.sv

  • jelly3_img_color_matrix.sv

  • jelly3_img_bayer_white_balance.sv

  • jelly3_img_gamma_correction.sv

  • jelly3_img_moment.sv

  • jelly3_img_max_pooling.sv

主要モジュール補足

  • jelly3_mat_if.sv

    • Ver3 画像処理の基本インタフェースです。

  • jelly3_axi4s_to_mat.sv

    • AXI4-Stream 入力を mat_if へ変換します。

  • jelly3_mat_to_axi4s.sv

    • mat_if を AXI4-Stream 出力へ戻します。

  • jelly3_img_demosaic_acpi.sv

    • Bayer 画像向け ACPI デモザイクを行います。

  • jelly3_img_color_matrix.sv

    • 色変換行列による RGB 変換を行います。

  • jelly3_img_bayer_white_balance.sv

    • Bayer 生データにホワイトバランス補正を適用します。

  • jelly3_img_gamma_correction.sv

    • ガンマ補正を適用します。

  • jelly3_img_moment.sv

    • 画像モーメント算出に利用できます。

  • jelly3_img_max_pooling.sv

    • DNN 系前処理で使う MaxPooling を行います。

移行観点

  • Ver2 のフラット信号接続から Ver3 mat_if 接続へ段階移行する構成を推奨します。

  • 制御プレーンは jelly3_ 系 library/dma と合わせると設計整合性が高まります。