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信号の形式を疑っていました。というのも、シミュレーション結果の正しく、ボードとして完成されているためハードウェアのエラーも無いと思っていました。とりあえずで搭載したリセット機能でこんなにも悩むとは思ってもいませんでした。
近況
久しぶりに自分のブログを覗いて見ましたが、ほとんど投稿がなくてびっくりしました。
元々は電子工作を中心にアウトプットしたいなと思いこのブログを立ち上げました。
ですが何を書けばいいのかわからない、そもそも書くのが面倒だったため始めから挫折していました。元々飽き性なので電子工作も最後まで作りきらずによく他のものに移ってしまい、投稿を躊躇したのが原因です。
そこで今更ながらにどうせ誰も見ていないので雑に書いてもいいじゃないかと思いまた再開してみようと思い立ちました。このブログはURLさえわかれば見れるので、オンライン自由帳みたいなノリでやって行きたいです。
もし何かの縁でこのブログに辿り着いた方がいれば、変なこと言ってるなと思いながら見ていただければ幸いです。今後とも不定期な投稿ですがよろしくおねがいします。
セブン&アイ、米コンビニを一転買収:日本経済新聞
セブン&アイが米石油精製会社のコンビニ併設型ガソリンスタンド部門を買収した。店舗網を広めて顧客との接点を増やすことが狙い。
コロナの影響もあってガソリンの需要が減りつつある。今後ガソリンからEVの給電機に置き換えることが必要になるかもしれない。
セブン&アイ、米コンビニを一転買収:日本経済新聞 https://www.nikkei.com/article/DGKKZO62029060Z20C20A7MM0000/