VGA信号解析
DVI-D→VGA変換ケーブルでPCから映像を出せました!
自力で生成するVGA信号の目標が垂直同期60Hzあたりなので、PCからの出力を60Hzに設定して……
こんな形で信号線をブレッドボードに引き出し、AnalogDiscovery2のオシロで波形を観測してみます。
まずは水平同期パルスまわりの拡大。
画面には RGB(255, 0, 0) を全体に表示するようにしているので、可視範囲では赤の信号がが最大レベルの0.7Vで出力されています。
可視範囲を抜けて水平同期が立ち下がるまでがフロントポーチで0.4usほど。
パルスが約2us続いて、非アクティブに立ち上がってから次の可視範囲が始まるまでがバックポーチで約2.5us。
XGA Signal 1024 x 768 @ 60 Hz timing
上記サイトの値と合致していますね。
水平同期の周期は約20.7us。Vertical refresh 48.363095238095 kHz やモニタに表示されていた 48.3 kHz の逆数に合致します。
垂直同期信号の全景はこんな感じ(タイミングを見やすくするよう上下にずらしています)。
水平同期6ライン分、アクティブが続いています。
水平同期が立ち下がるタイミングでフリップするのはこうして測ってみないと分からなかったかも。
これだと垂直同期のフロントポーチ、バックポーチが測れないので、垂直同期と赤レベルで比べてみます。
お、なんとなく水平同期のタイミングもわかるのでこのまま数えられそうですね。
フロントポーチが3ライン、バックポーチが29ライン分あります。
ここも前掲のサイトと合致してます。なるほど。
さて、以上の計測でなにがわかったかというと……
- モニタはちゃんと映る
- 先日のVGA信号生成実験で参照していたデータも合ってる
よってArduinoで愚直に書くのでは信号のタイミングを合わせるのは難しいという結論が裏付けされたのかな?と思います。 NOPでタイミング微調整したりとか、内蔵タイマを厳密に使って同期信号を作るとか、そもそもコンパイラでは遅すぎる処理なんかもアセンブラで書くとか、カリッカリのチューニングが必要なようです。
んーどうしましょう。 カジュアルに実験できると思ってのArduinoだったので、アセンブラのレベルまでテクるようならもうハード設計した方が良い気がしてきました。 タイミングはばっちり把握できたことですし。
あ、なんとなく買ってみたPSoCは試してみよう。
参考ページ
- http://tinyvga.com/vga-timing
- http://diode.matrix.jp/VGA/index.htm
- http://www.net.c.dendai.ac.jp/~anada/
大変勉強になりました!