”FPGAで遊んでみる”では、セミナー用に作成したサンプル回路などを整理して少しづつ紹介していきます。


セミナ開催します
手ぶらでOK!実習・ゼロから始めるZynq SoC開発「超」入門
-- 初心者大歓迎!ハード,ソフトのいいとこどり開発に挑戦 
2024年5月11日(土) CQ出版社セミナ・ルーム
詳しくはこちらへ

ZYBOの本
FPGAパソコンZYBOで作るLinux I/Oミニコンピュータ CQ出版 発売中

Papilioの本
FPGA版Arduino!!Papilioで作るディジタル・ガジェット CQ出版 発売中


第4回 FPGAからSVGAモニタへグラフィック表示してみる

 今回は、SVGA画像出力回路を紹介します。
前回までに紹介したLED制御やシリアル通信は、マイコンで実現可能ですので
今回は、マイコンではちょっと処理の難しい画像出力をFPGAで実現してみます。
また、モニターへ接続する為のRGBデータをアナログ変換する簡易DA変換回路も紹介します。

SVGA画像出力回路のソース(svga_if.v zip形式で圧縮してあります)

svga_if.v
 このファイルは画像出力回路のみです。
 周辺回路、テストベンチはこちらにあります。

ソースコードが長いのダウンロードして中身を見てください。

仕様説明

 動作概要
 4レイヤの画像を入力して重ね合わせをおこない
 SVGA(800x600,画素クロック=40MHz)のRGB888を出力する
 
 

 入力信号
  clk:クロック入力/40MHz
  rstb:リセット入力/0でリセット。
  in_a_data_en:レイヤaの座標(h_c,v_c)のデータイネーブル 
  in_a_da_r[7:0]:レイヤaの座標(h_c,v_c)の赤色データ
  in_a_da_g[7:0]:レイヤaの座標(h_c,v_c)の緑色データ
  in_a_da_b[7:0]:レイヤaの座標(h_c,v_c)の青色データ
  in_b_data_en:レイヤbの座標(h_c,v_c)のデータイネーブル 
  in_b_da_r[7:0]:レイヤbの座標(h_c,v_c)の赤色データ
  in_b_da_g[7:0]:レイヤbの座標(h_c,v_c)の緑色データ
  in_b_da_b[7:0]:レイヤbの座標(h_c,v_c)の青色データ
  in_c_data_en:レイヤcの座標(h_c,v_c)のデータイネーブル 
  in_c_da_r[7:0]:レイヤcの座標(h_c,v_c)の赤色データ
  in_c_da_g[7:0]:レイヤcの座標(h_c,v_c)の緑色データ
  in_c_da_b[7:0]:レイヤcの座標(h_c,v_c)の青色データ
  in_d_data_en:レイヤdの座標(h_c,v_c)のデータイネーブル 
  in_d_da_r[7:0]:レイヤdの座標(h_c,v_c)の赤色データ
  in_d_da_g[7:0]:レイヤdの座標(h_c,v_c)の緑色データ
  in_d_da_b[7:0]:レイヤdの座標(h_c,v_c)の青色データ

 出力信号
  out_vsync:垂直同期信号
  out_hsync:水平同期信号
  out_da_r[7:0]:赤色の画像データ出力
  out_da_g[7:0]:緑色の画像データ出力
  out_da_b[7:0]:青色の画像データ出力
  out_data_en:画像データ出力のデータイネーブル 
  h_c_en_:入力画素データの座標指定イネーブル、有効時に1
  v_c[9:0]:入力画素データの水平座標指定
  h_c[9:0]:入力画素データの垂直座標指定

 パラメータ
  パラメータはSVGA(800x600)で画素クロックが40MHzのケースに合わせてあります
  hsync_max:水平方向同期カウンタ最大値=1055
  vsync_max:巣直方向同期カウンタ最大値=627
  h_c_max:水平方向の有効画素カウンタ最大値=799
  v_c_max:垂直方向の有効画素カウンタ最大値=599
  hsync_off_h:out_hync_nが0になる水平方向カウンタ値=839
  hsync_on_h:out_hync_nが1になる水平方向カウンタ値=967
  vsync_off_h:out_vync_nが0になる水平方向カウンタ値=839
  vsync_off_v:out_vync_nが0になる垂直方向カウンタ値=600
  vsync_on_h:out_vync_nが1になる水平方向カウンタ値=389
  vsync_on_v:out_vync_nが1になる垂直方向カウンタ値=604
  da_on_h:有効画素が始まる水平方向カウンタ値=0
  da_on_v:有効画素が始まる垂直方向カウンタ値=0
  da_off_h:有効画素が終わる水平方向カウンタ値=800
  da_off_v:有効画素が終わる垂直方向カウンタ値=599
 

 詳細動作
  内部カウンタの従って入力座標指定(h_c,v_c)とネーブル(h_c_en)を出力する。
 h_c,v_cで示された座標のRGBデータ(in_[a-d]_da_[r,g,b])を1クロック後にsvag_ifへ入力する。
 表示するデータが無い場合はin_[a-d]_da_en=0にする。
 入力する画像データは4系統でa>b>c>dの優先で、重ね合わせをします。
 in_a_da_en=0の場合は、in_b_*のデータが有効
 in_b_da_en=0の場合は、in_c_*のデータが有効
 in_c_da_en=0の場合は、in_d_*のデータが有効
 in_d_da_en=0の場合は、無効データとそしてR=0,B=0,G=0とななります。
 画像データ入力の1クロック後に重ね合わせした画像データを出力(out_da_[r,g,b])します。
 


 内部カウンタに従って同期信号(out_hsync,out_vsync)と画像データ(out_da_[r,g,b])をモニタへ出力する。
 
 


FPGAでの動作確認
 
 トップモジュール(svga_ap.v)追加
 svga_ifにデータ入力をするモジュールを追加してFPGAで動作確認を行っています。
 svga_ifから出力データは8bitで出力されるのですが、この後に紹介する簡易DA変換回路が4bitのため
 トップモジュールでout_da_*[7:4]->da_*[3:0]として外部出力しています。

 トップモジュールの構成は以下になります。
 

  トップモジュールおよびlayer_a,b,c,dのソースファイル、ucfファイルおよびテストベンチは、下のファイルです。

  svga_if_files.zip

  UCFファイルのピン配置指定は動作確認をしたMFPGA_SPAR3Eに合わせてあります。
  layer_a,b,c,dを変更すると表示する画像を変更できます。


出力データのアナログ変換

 RGBアナログモニタに接続するためにはデータをアナログ変換します。製品であればビデオ用DACを使用するところですが、
 今回の動作確認では以下のような簡易的なAD変換回路を作成して試験ています。
 

 MFPGA_SPAR3Eを接続する評価用のベースボードの配線は以下の様になっています。
 CN2はMFPGA_SPAR3EのCN2に接続します。ucfファイルのピン配置はこの接続に合わせあります。

 


動作の様子

 FPGAとモニタを接続して動作させた様子です。
 


紹介した回路を試す場合は、自己責任でお願いします。
次回は、FPGA内部RAMを使用したサンプルとして入力信号の変化をRAMへ保存して、LEDをチカチカさせてみます

リンクフリーです。
リンクされた場合にご連絡をいただけると嬉しです。
メール 


変更履歴
(2010/09/27) 初版
(2010/10/16) 項目の先頭にを追加、周辺回路、テストベンチへのリンク追加


TOPへ戻る