« Spartan-7でUSB-AXI-DDR3に成功。次はカメラだ | トップページ | iMX219の水平垂直タイミングとデータレートの関係を理解した »

2022.08.13

RasPiカメラ2をSpartan-7ボードにつないで画像が撮れた

RasPiカメラ2はiMX219型番のCMOSイメージセンサだそうです。

ようやく綺麗な画像が得られるようになりました。

最初に撮れた装置の自画像がこちらです。

Sp7image1

ちょっと暗いかな~と思っていたのですが、イメージのデータは10bitなのに[11:2]だけを見ていたのが原因でした。

FPGAから制御できるコントロールレジスタを作り、10bitの生画像データに0~63の値を掛けて16で割った値を取り出せるようにしました。つまり、ゲインを0~4でコントロールできるというわけです。

Sp7image2

暗いところが見えるようになりましたが、今度は明るすぎる感じですね。

iMX219はコントラストの調整などがないようなのですが、どうやったらもっと鮮やかな色が出るのでしょうか??ガンマ補正みたいなテーブルを用意したり取り込んだPC側で処理するしかないのでしょうか。

 

結局のところ、最終的なBlockDesignは下の図のようになりました。

Structure

Video DMA coreと書かれているvideo_bloganaというのはAXI Streamで送られてくる画像をAXIに投げるものです。tuser(0)をフレームの開始としてtlastを水平ラインの終了として、AXIのトランザクションを発生させるものです。

XILINXのVideo DMAは正直言ってわけがわからないので自分で作ったほうが早いと思いつくりました。

 

なお、カメラレジスタの設定(一部を抜粋)はTrenz社の設定を参考にして以下のようにしています。

x"0114" & x"01",-- CSI_LANE_MODE = 2-lane
x"0128" & x"00",-- DPHY_CTRL = auto mode
x"012A" & x"13",-- EXCLK_FREQ[15:8]
x"012B" & x"34",-- EXCLK_FREQ[7:0] = 4916 MHz
x"0160" & x"04",-- FRM_LENGTH_A[15:8]
x"0161" & x"60",-- FRM_LENGTH_A[7:0] = 1120
x"0162" & x"0D",-- LINE_LENGTH_A[15:8]
x"0163" & x"78",-- LINE_LENGTH_A[7:0] = 3448
x"0164" & x"01",-- XADD_STA_A[11:8]
x"0165" & x"58",-- XADD_STA_A[7:0] = X top left = 344
x"0166" & x"0B",-- XADD_END_A[11:8]
x"0167" & x"77",-- XADD_END_A[7:0] = X bottom right = 2935
x"0168" & x"01",-- YADD_STA_A[11:8]
x"0169" & x"F0",-- YADD_STA_A[7:0] = Y top left = 496
x"016A" & x"07",-- YADD_END_A[11:8]
x"016B" & x"AF",-- YADD_END_A[7:0] = Y bottom right = 1967
x"016C" & x"05",-- x_output_size[11:8]
x"016D" & x"10",-- x_output_size[7:0] = 1296
x"016E" & x"02",-- y_output_size[11:8]
x"016F" & x"E0",-- y_output_size[7:0] = 736
x"0170" & x"01",-- X_ODD_INC_A
x"0171" & x"01",-- Y_ODD_INC_A
x"0174" & x"01",-- BINNING_MODE_H_A = x2-binning
x"0175" & x"01",-- BINNING_MODE_V_A = x2-binning
x"0176" & x"01",-- BINNING_CAL_MODE_H_A
x"0177" & x"01",-- BINNING_CAL_MODE_V_A
x"018C" & x"0A",-- CSI_DATA_FORMAT_A[15:8]
x"018D" & x"0A",-- CSI_DATA_FORMAT_A[7:0]

iMX219は本来3296×2512という8MpixelのCMOSイメージセンサなのですが、ビニングといって2つのピクセルをオンチップでまとめる機能があります。それを使うと1920×1080や、1280×720といったハイビジョンサイズの画像をチップ上で作り出してくれるようです。

Binning

上の設置絵では画像サイズを1296×736にして(おそらく1280×720で端に8pixelの余白を付けている)いるのですが、XADDとYADDのサイズは2935-244=2591、1967-496=1471で2倍のサイズにして2x2のビニングを有効にして1296×736で出力しています。

今回作ったvideo_bloganaコアは、video dmaのほかロジアナ機能が内蔵されていて波形のパルス長のカウントができるようにしてデバッグに大いに役立ちました。

tvalidが有効になっている期間の長さや、tuser(0)が来る間隔のtlastの回数を数えてみると、確かにtvalidは1296クロック、tlastは736個来ているのがわかります。また水平ラインの周期は約31usであるようです。

Hvcount

レジスタの設定を変えれば画面の解像度を変えることができるはずなので、次はI2CをUSB経由で操作して解像度やデータレートを変えたりできるようにしてみたいと思います。

 

|

« Spartan-7でUSB-AXI-DDR3に成功。次はカメラだ | トップページ | iMX219の水平垂直タイミングとデータレートの関係を理解した »

コメント

コメントを書く



(ウェブ上には掲載しません)




« Spartan-7でUSB-AXI-DDR3に成功。次はカメラだ | トップページ | iMX219の水平垂直タイミングとデータレートの関係を理解した »