FPGA(DE1-SoC)からVGA出力する方法

DE1-SoCを使って色々遊んでまして今回はVGA出力をしてみたので、手順等を残しておきます。

用意したもの

  • DE1-SoC
  • VGA入力のあるモニタ
  • VGAケーブル

VGA出力タイミング

VGAのタイミングに関しては以下のサイトが参考になります。
http://ele-tech.net/vga-doc1/
(上記サイトにて「その後は8クロック待機したのち、2行目の描画が始まります(図中右端の0)。」とありますが、8クロックではなく48クロックかと思われます。タイプミスかと思われます。)

あとはDE1-SoCのユーザーマニュアルも参考になります。(というか見ないと色々わからないことがあった。)
https://www.terasic.com.tw/cgi-bin/page/archive_download.pl?Language=Taiwan&No=836&FID=fb723f964a1d785b94cd7880d8f210e5

ユーザーマニュアル見ると以下の図があるので、RGBデータだけでなく、DACのクロックやらが必要のようです。

今回は、VGA_CLK = 50MHz、VGA_SYNC_N = 1、VGA_BLANK_N = 1とすることで動作しました。
(SYNCとBLANKが良くわかってないです。。。)

また、タイミングに関しては以下の図と規定のクロック数を満たせば良いようです。

今回は640*480としましたので、水平方向のタイミングはマニュアルにある表3-14より
Sync = 3.8us(96clk), Back porch = 1.9us(48clk), Display interval = 25.4us(640clk), Front porch = 0.6us(16clk), Clock = 25MHz
とします。

Display intervalの期間に640pix分のデータを出力するわけですね。

疑問点として、他のサイトを参考にするとsync=96clkとしているのでそうしますが、3.8us/40ns=95clkとなって計算が合わないのはなんでなんでしょうか。良くわからないのですっ飛ばします。

垂直方向に関しても上の図と同じタイミングで定義できます(Display intervalに480本分のラインが入るイメージ)。
マニュアルの表3-15から、
Sync = 2line, Back porch = 33line, Display interval = 480line, Front porch = 10line, Clock = 25MHz
となります。

ここまでわかってしまえばあとはHDL入力するだけかと思います。

出力画像に関しては、RGBそれぞれ諧調値をノコギリ波上にして出力するようにしました。

作成したVerilogコード

今回はシミュレーションやってません。

ピンアサインに関しても前回やったようにSystem Builderで生成したものをインポートすれば自動でやってくれます。

出力結果

まずオシロスコープでタイミング等問題ないか確認しました。
黄色:HSYNC, 水色:Bの値, 青:Rの値(Gの値に関してはなぜかオシロで安定した波形にならなかったのでとってません。)

モニタに出力するとこんな画像になります。

大体所望の結果が得られてますが、良く見るとノイズがあったりします。青と緑はきれいなんですが、赤が少し不連続になったりします。

恐らくDACの直線性がきれいになっていないからだと思うので、なんかしら調整すればきれいになるかもしれません。

まぁ大体うまくいったので良しとします。次はCMOSカメラをつなげてみたい。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です