FPGAでVGA映像信号を生成する
目的
今回の目的は、FPGAボード内で生成した映像をテレビへ出力することです。以下の画像では多色を表示していますが、本記事で実装したRTLは1色のみ表示しています。
開発環境
PC環境
- Ryzen7 pro 4750g
- windows10 64bit
- メモリ 16GB
使用ソフト
- Vivado 2019.2
Basys3について
Basys3はDigilent社が販売するFPGA評価ボードです。安価に購入でき、周辺回路も豊富に搭載されているため、入門機には最適だと思います。また、同社がPmodという規格の製品を販売しています。これをBasys3に接続すれば機能拡張することができます。
今回はこのボードに搭載されているDsubコネクタを使用してVGA信号を生成します。
VGA信号とは
VGAは「Video Graphics Array」の略称で、PCモニター用の映像信号規格のことです。
主に使用する信号は以下の5本です。
- 水平同期信号(HSYNC)
- 垂直同期信号(VSYNC)
- 赤信号
- 緑信号
- 青信号
1,2の同期信号に合わせて3~5の信号を設定します。
VGAについての詳細はBasys3のデータシートに記載されています。
https://reference.digilentinc.com/reference/programmable-logic/basys-3/reference-manual
水平同期信号
データシートにあるタイミングはすべて25MHzで記載されています。
表内の「Display time」内でRGBの信号を出力させます。
垂直同期信号
水平同期信号の立ち下がりまでを1Lineとしています。
こちらも同様に「Display time」内でRGBの信号を出力させます。
回路構成
以下は回路全体の流れです。Basys3のクロックはデフォルトで100MHzになっています。VGA信号は約25MHzなので、分周してタイミング生成します。
データの取り出しでは、画像領域のタイミングでのみ出力します。
これらをまとめてものが以下のブロック図です。
実装
後日記載します
追記(2021/06/05):
ファイル紛失しました...
失敗談
はまったポイントとして、割り当てたリセットスイッチの仕様を確認していなかったことです。Basys3のスイッチは押したら1になる正論理な回路ですが、筆者が実装したRTLでは信号が0のときリセットされる設計になっていました。つまりスイッチが押されている間FFが動作する設計になっていたため正常な動作ができていませんでした。
当初はシミュレーション結果を見ても波形は理想通りなのに、ボードに書き込んだ後テレビ側で確認しても認識しないため、VGA信号の形式を疑っていました。というのも、シミュレーション結果の正しく、ボードとして完成されているためハードウェアのエラーも無いと思っていました。とりあえずで搭載したリセット機能でこんなにも悩むとは思ってもいませんでした。