Raspi CameraのI2Cから読み出し
RasPiカメラV2をFPGAで扱うため、まずはI2CのコントロールロジックをVHDLで開発しています。
どうせならちゃんとしたコアを作ろうと思い、NACKリトライまで付けています。
3層のステートマシンが階層間でREQやACKを渡して、精巧な歯車のように連携して動作するコアです。
一番最下層のステートマシン「state_l」は、Start ConditionやStop Condition、Tx、Rxなどの処理を行います。
中間のステートマシン「state_m」は、state_lに指示を出してReadやWriteといったシーケンスを行います。
上位のステートマシン「state_h」は、書き込みたいアドレスとデータのシーケンスをROMから取ってきてstate_mに指示を出します。
このくらいの規模の回路だとHLSやソフトウェアを使うよりRTLの方が楽ですね。
まず、シミュレーションでちゃんと意図したように動いているのを確認します。
実機でやってみると、何かおかしい。
I2CのReadのときにはStart→Devアドレス送信→サブアドレス送信→Start→Devアドレス送信→受信→Stopというのを行うのですが、FPGAが受信するときにNACKで返さないとI2CのターゲットがStopを受け付けずに次のを送ってくるなどして少しハマりました。
無事、RasPiカメラV2のI2CからのACKが確認できて、MODEL_IDが0x02 0x19と正しく読めるようになりました。
ターゲットから返って来る波形を目でみて確認しているのですが、I2Cのクロックを100Hzくらいまで落とせば、ILAとか入れなくてもMITOUJTAGのバウンダリスキャンでI/Oの波形が見えます。
デバッグ回路をわざわざ入れる必要がなく、すぐに確認できるのが便利です。
| 固定リンク
コメント