mabuchiのブログ

日々の電子工作メモ

FPGAでVGA映像信号を生成する

目的

今回の目的は、FPGAボード内で生成した映像をテレビへ出力することです。以下の画像では多色を表示していますが、本記事で実装したRTLは1色のみ表示しています。

f:id:mabuchii:20210111110735p:plain

今回の目的

 


開発環境 

PC環境

  • Ryzen7 pro 4750g
  • windows10 64bit
  • メモリ 16GB

使用ソフト

  • Vivado 2019.2


Basys3について

 Basys3はDigilent社が販売するFPGA評価ボードです。安価に購入でき、周辺回路も豊富に搭載されているため、入門機には最適だと思います。また、同社がPmodという規格の製品を販売しています。これをBasys3に接続すれば機能拡張することができます。 

今回はこのボードに搭載されているDsubコネクタを使用してVGA信号を生成します。

 BASYS3 Artix-7 FPGAボード

VGA信号とは

 VGAは「Video Graphics Array」の略称で、PCモニター用の映像信号規格のことです。

主に使用する信号は以下の5本です。

  1. 水平同期信号(HSYNC)
  2. 垂直同期信号(VSYNC)
  3. 赤信号
  4. 緑信号
  5. 青信号

1,2の同期信号に合わせて3~5の信号を設定します。

VGAについての詳細はBasys3のデータシートに記載されています。

https://reference.digilentinc.com/reference/programmable-logic/basys-3/reference-manual

水平同期信号

データシートにあるタイミングはすべて25MHzで記載されています。

表内の「Display time」内でRGBの信号を出力させます。

f:id:mabuchii:20210111145919p:plain

水平同期信号
垂直同期信号

水平同期信号の立ち下がりまでを1Lineとしています。

こちらも同様に「Display time」内でRGBの信号を出力させます。

f:id:mabuchii:20210111150322p:plain

垂直同期信号


回路構成

以下は回路全体の流れです。Basys3のクロックはデフォルトで100MHzになっています。VGA信号は約25MHzなので、分周してタイミング生成します。

データの取り出しでは、画像領域のタイミングでのみ出力します。

f:id:mabuchii:20210111121633p:plain

回路の流れ

これらをまとめてものが以下のブロック図です。

f:id:mabuchii:20210111133829p:plain

ブロック図


実装

 後日記載します

追記(2021/06/05):

ファイル紛失しました...

 

失敗談

はまったポイントとして、割り当てたリセットスイッチの仕様を確認していなかったことです。Basys3のスイッチは押したら1になる正論理な回路ですが、筆者が実装したRTLでは信号が0のときリセットされる設計になっていました。つまりスイッチが押されている間FFが動作する設計になっていたため正常な動作ができていませんでした。

当初はシミュレーション結果を見ても波形は理想通りなのに、ボードに書き込んだ後テレビ側で確認しても認識しないため、VGA信号の形式を疑っていました。というのも、シミュレーション結果の正しく、ボードとして完成されているためハードウェアのエラーも無いと思っていました。とりあえずで搭載したリセット機能でこんなにも悩むとは思ってもいませんでした。