XILINXのMIPI CSI-2 Rx SubsystemをRasPiカメラV2で使う方法
MIPI CSI-2 Rx Subsystemの使い方が分かりました。このコアを使うとMIPIの信号をデコードしてAXI Streamにして出力してくれるので、RasPiカメラV2の信号をデコードしてみたいと思います。
MIPI CSI-2 RX Subsystemというコアは中にMIPI D-PHYと、MIPI CSI-2 RX ControllerとVideo Frame Bufferが入っています。コアの内部構造を下の図に示します。
Vivado 2019の頃は無償ではMIPI D-PHYしか使えなかったのですが、Vivado 2020からはRX ControllerやVideo Bufferまで入ったMIPI CSI-2 RX Subsystemも無償で使えるようになったというわけです。
まず、IP Integratorを使ってBlock DesignにMIPIコアを置いたら、ダブルクリックして以下のようにカスタマイズします。
一番重要なのはPixel Formatで、RAW10にします。このパラメータは必須でカメラの出力フォーマットと一致していないと出力が何も出てこなくなります。RasPiカメラV2の出力フォーマットはRAW10かRAW8で設定で買えられますが、普通はRAW10で使うと思います。とにかくカメラの出力フォーマットと合わせてください。
その右にあるSerial Data Linesは2にします。2レーンということです。
次のLine Rateは555にしましたが、効果があるのかどうかはわかりません。少なくともPLLの発振周波数とかを決めているわけではなさそうなので適当でもいいのかもしれません。
デバッグを便利にするオプションとして、CSI2 Controller Register Interfaceというチェックボックスがあります。
ONにするとAXI Liteでレジスタを操作することでコアを動かしたり止めたり、ステータスを見たりすることができるようになりますが、AXI Liteを使うのも面倒なので、好みの問題ですがOFFにしておきます。なお、デフォルトでコアは動作開始になっているのでAXI Liteのマスタには何もつながなくても動くはずです。
OFFにするとAXI Liteのコントロース・ステータスポートが消えて、個別信号が出てきます。それが、ctrl_core_enや、dl0_stopstate_intrなどのバラバラとした信号です。ロジアナで見ればよいので楽です。ctrl_core_enは適当なタイミングで1にします。
Pixels Per Clockは1のままでよいでしょう。MIPIの速度が速くAXI Streamが追い付かない場合に2や4にすると複数のピクセルを同時に出してくれるようになるのだと思います。
このようにして作ったBlock Designを下の図に示します。右上のRTLのブロックはI2Cのシーケンスを出してカメラを設定するためのもので、右下のvideo_bloganaというコアはAXISの信号をキャプチャするためのロジアナです。
MIPI CSI-2 RX Subsystemの入力側のポイントは2つです。
- CLK,DP0,DP1はHSとLPの両方をすべてつなぐ
- dphyのCLKは200MHz
実際に動かしてみた波形を示します。
AXI Streamで出力されますが、XILINXのVideo AXI Streamはライン0の先頭でtuser(0)が立ちます。したがって下の波形はライン0のものです。
このAXI Streamにはtdest[9:0]というサイドバンド信号があるのですが、Product Guide PG232を読むと、tdest[9:4]はData Typeと書いてあります。
Data Typeとは何ぞやということなのですが、RAW10やRAW8といったデータのタイプのことを示す6bitの値のようです。RAW10の場合は0x2Bとなります。上の表を見るとライン番号などもtuserから出てくるようなのでtuserを広げればデバッグも楽になりそうですね。
tdataの開始部分から拡大してみてみると、tvalidとともに10bitのデータがやって来るのがわかります。
青いLEDをカメラの間近で見せると
小・大・小・大という並びになったので、IMX219のデータシートどおりライン0はGb・B・Gb・Bという並びなのかもしれません。
これがそのままAXI Streamで出ているのではないかと思われます。なお、tvalidの長さは1296でした。
この1296という長さはIMX219にI2C経由で0x016C <= 0x05、0x016D <= 0x10と設定しているので想定どおりです。
デコードしたデータが綺麗な画像になっているかどうかはDDR3メモリに展開してUSBで吸い上げてみないとわかりませんが、ここまでのところ不安定さは全くなく、制御コード等は必ず同じデータが取れていました。
いろいろ苦労しましたが、一番大事なポイントはカメラの出力フォーマットとコアのフォーマットを合わせないと全く何も動かないというところでした。
早くDDR3メモリとつないで画像をキャプチャしてみたくなります。
| 固定リンク
コメント