はじめに
当サイトではこちらのような、物理層にMIPIコネクタを利用したカメラを開発しております。フルセットのMIPI規格そのものはオープンな仕様ではありませんので、オープンハードウェアを目指す当方の趣旨とは少し異なるのですが、それでもMIPI対応を謡うデバイス側で公開されている範囲の電気仕様とデバイス性能はそれだけでも十分活用に値すると考えております。
ざっと調べた限り
- KV-260 や ZYBO などのMIPIコネクタを備えたFPGAボードにおいては、安価なフレキケーブルが使える高速差動100Ωの信号ラインとみなせる。
- UltraScale+ ではネイティブで対応しており I/O電圧が1.2Vで 1260~2500Mbps が可能
- 7-Series では外付け抵抗が必要で4ピン使うが 1.8VのI/Oバンクで送信でき、受信は1.2Vから3.3VのI/Oバンクで対応できそうで速度は 950~1250Mbps
といった感じになっているようです。
仕様について
KV260 の仕様(双方向)
ここでは KV-260 を主なターゲットとして考えています。KV-260で使われている K26 SoM のデータシートである DS987 によれば、K26 SoM (XCK26-SFVC784-2LV) は、スピードグレード -2 で Vccint = 0.72V の条件で DS925 を読むように記載されています。
UltraScale+ 自体はスピードグレードやパッケージタイプで最大速度が変わってくるようですが、どうやら KV-260(K26 SoM) では、2500Mbps が上限となるようです。
なかなかの高帯域ですが、さらに UltraScale+ においてはネイティブで MIPI-DPHY に対応しているため、同じ端子を送信に切り替えて利用できる可能性もあるのではないかと考えています。
ひょっとすると KV-260 同士の高速通信にも使えるかもしれません。
ZYBO-Z7 の仕様(受信)
Zybo Z7 の XC7Z020-1CLG400C のデータシートは DS189 になっています。ここで DDR の LVDS reveiver の性能を見ると -1 グレードの最大速度は 950 Mbps となっています。
7-Series で MIPI D-PHY を受信するにはFPGAに外付け抵抗を付ける必要があるようで、その方法は XAPP894 に記載があります。
ZYBO-Z7 の回路図を見ると 3.3V の BANK35 に 接続されているようですが、100Ωと150Ωを組み合わせた XAPP894 と同じ回路構成で問題なく受信できるようです。
一方で 7-Series では外部回路の関係上、受信もしくは送信専用となってしまうようで、ZYBOの場合は受信専用です。
Spartan-7 の仕様(送信)
今回、当方は イメージセンサとMIPIコネクタとの中継に XC7S6-2FTGB196C を選択しております。Spartan-7 のデータシートは DS189 となりますが、今回スピードグレード -2 品を選択しておりますので DDR LVDS transmitter の最大速度は 1250Mbps となっています。
やはり外付け回路は必要で送信専用となりますが XAPP894 に記載があり、DIFF_HSTL_II_18 と LVCMOS18 を組み合わせ 150Ω、120Ω、60Ω などの抵抗を組み合わせて外部回路を構成することになるようです。なお、当初 「60Ω?」 となりましたが、実際のリファレンスボードを調べるとちゃんと 60.4Ω という入手用意な抵抗値で大丈夫なようでした。
こちらも外部回路によって送信専用となりますが、幸い 1.8V はまだ1.2Vよりも他の回路と共存しやすく、バンク数の少ない小容量品でもなんとかなりました。
無償の D-PHY コアの仕様
AMDでは MIPI CSI Controller Subsystems として、MIPI-CSI2 のシステムを一式供給しているようです。一方で当サイトでは今回は物理層の性能を限界まで使いたいため、D-PHY のみのコアを利用しており、この説明は PG202 にあります。
MIPI はもともと携帯電話内で低消費電力向けに設計されており、どうやら最大性能よりも電力効率を重視しているようですが、今回は性能が欲しいですので、CSI2 の規格は無視して独自仕様での通信を検討しています。一方で、MIPI向けの物理層を活用する上で AMD の D-PHY コアのみ使うのは有効そうでしたので、活用を試みることにします。
受信コア
私が行ったKV260での受信の設定が下記です。Spartan-7 と接続するために速度は 1250Mbps で設定しています。

なお、上記とは異なりますが、ラズパイカメラを繋いだ時の波形が下記となっています。

MIPI D-PHY には LPモード(低速低消費電力)とHSモード(高速)の2つがあるようで、HSモードのパケットが rxactive で示されるようです。私が実験した範囲では
- 1レーンにつき8bit幅に SERDES でデシリアライズされる
- rxactivehs と同時に rxsynchs が立ち上がり、その次のサイクルからパケットが始まる
- 末尾にはゴミが入る模様
- レーン間のタイミングは揃っている
- 受信コアを先に起動しないと init_done が来な
などが見えてきました。受信だけならそれほど難しくありません。また独自プロトコルではSERDESの区切りコードが悩みになりがちですが、 rxsynchs でのパケット先端の検出を D-PHY コアがやってくれますので、これは活用する価値がありそうです。
送信コア
Spartan-7 での送信コアも同じコアが使えるようです。

ただし、送信においては、送信要求の txrequesths を出しても、送信可能な txreadyhs が上がるまでかなりのサイクルを要するようです。

MIPIの仕様の詳細は把握していませんが、これは LPモードからHSモードへの遷移に時間がかかるためと思われます。
どうもラズパイカメラなどを見ていると、ライン単位で小まめにLPモードへ遷移させて電力効率を上げる設計のようです。
またパケットを解析しているとどうやらパケットの総バイトサイズを示すフィールドが16bitしかないようで、そもそもライン単位でパケットを区切ることを前提としているように思えます。
独自プロトコルの検討
当然ながらライン単位で送信不能区間を入れてしまうと、物理層を性能に振った使い方ができません。ただし D-PHY 自身は特にパケット長に制約はないようで、実験してみるといくらでも長いパケットが送れそうでした。
そこで、今回は1フレーム期間をずっと HSモードで一気に送ってしまうという独自プロトコルを検討中です。
今回使っている PYTHON300 センサーは、ラズパイカメラのIMX219同様に 10bit の RAW を出力してくるので、10bit-8bit 変換をする必要はありますが、AMDのD-PHY コアを使えば、AMDの物理層の扱いが楽になるのと、パケット先頭の区切りを認識する心配がなくなるメリットはあります。
もう一点課題となるのが水平ブランキングの挿入です。イメージセンサの速度とD-PHYの速度は必ずしも一致しませんので、FIFOが枯渇した際にパディングが必要です。
ただし今回はRAW画像を送るという特性上、黒レベルオフセットが載った情報を送ります。これは画像処理特有の話になりますが、本来のゼロレベルは少しオフセットが載っています。
従って画像データに 10’h000 が出てくることはほぼないですし、10’h000 を 10’h001 にクリップしてもそれほど問題にはなりません。
そこで今回は「データ無し」を扱う値を 10’h000 として、万一本当に画像に 10’h000 が出てきてしまったら 10’h001 にクリップしてしまうという手を取りました。
今のところこれは問題なく機能しているようです。
おわりに
別のお仕事の合間になりますが、カメラ開発は引き続き続けております。Spartan-7 のコンフィギュレーションROM をミスして JTAG からしか書き込めないとか、KV260 の3.3V を使っていたら電圧降下が大きかった(昇圧DC-DCが必要そう)とか、まだいくつか回路改善中の事項が残っていますが、ある程度課題が解決したら、いろいろ公開したいなと思っております。
引き続き、よろしくお願いいたします。
コメント