FPGA PACMANをTVに出力

 FPGA PACMANはNTSCをコンポジットビデオやS信号に出力するには、サブキャリアの大きな壁があります。
 beta2ではNTSC出力もやっていますが、かなり無理矢理です。
 TVに繋ぐなら、はやりD端子などのYCrCbコンポーネント信号でしょう。

1.DAC回路の拡張

 FPGA PACMANのRGB出力は、オリジナルと同様で、R,Gが3ビット、Bが2ビットの合計8ビットで、抵抗をビット毎に並列に繋いだラダー抵抗DACです。
 出力段のドライバは無く75Ωインピーダンスマッチングは取っていません。VGAに繋ぐと、反射によるゴーストが多少出ます。
R=470Ω,1KΩ,2KΩ
R=470Ω,1KΩ,2KΩ
B=470Ω,1KΩ

 YCrCbで出力する場合、R,G,Bから下記式で変換できます。
Y = 0.299*R +0.587*G +0.114*B (+CSYNC)
CR= -0.172*R -0.339*G +0.511*B
CB= +0.511*R -0.428*G -0.083*B

 除算してから加算されるため、元RGBよりも多くのビット数が無いと、画質が劣化することになります。そこでY=6bit,Cr=5bit,Cb=5bitの計16ビットにしました。

Y =250Ω,500Ω,1KΩ,2KΩ,3.9KΩ,8.2KΩ
Cr=250Ω,500Ω,1KΩ,2KΩ,3.9KΩ
Cb=250Ω,500Ω,1KΩ,2KΩ,3.9KΩ
 MSB側は精度に影響大なので、上位2ビットは1Kx8のチップ抵抗アレイを、4パラ、2パラしてます。(でも±5%品なので無意味)
 出力レベルは1Vppに合いませんが、Y信号にはSYNCを含んでいて、受信側にAGC回路があればSYNCの電圧から、振幅幅を自動的に調整してくれるはずです。
 Cr,CbにもAGCが働くかどうかはわかりません。



2.RGB -> YCrCb変換回路

 RGBからYCrCbへの変換は、あらかじめパソコンで計算してしまいます。
 RGBの計8bit入力に対して、YCrCbの計16bitがどの値になるかをROMテーブルとして組み込めば、除算、加算回路などは一切不要になります。
 入力8bitに対して出力16bitを得るので、合計4096ビット...SpartanIIのブロックセレクトRAM1個にちょうどおさまります。

 走査タイミングは、基本的にそのまま出力します。D端子の正規信号からは少しはずれるのでTV依存になりますが、480iに近い値ですが、ノンインターレスなので規格を作るとすると"240p"相当といったとろでしょうか。
 カラーサブキャリア等の制約はないので、TV側でタイミングエラーとして拒否されない限り映ると思います。

使用したTVは、TOSHIBA製(へぼ)プログレッシブワイドTV 28ZP30です。D3端子を2系統持っています。
画面はこんな感じで、色、解像度共に遜色なく再現されています。

 全体的に暗いのはデジカメのせいです。
 白の輝度が少し暗く感じます。YとCr,Cbとのバランスが合っていないのかもしれません
 多少ゴーストが出ます。画質を求めるなら1KΩ/2KΩ程度のR2Rと75Ωドライブ回路を持ったDACにすべきですね。


3.実装

 今回は、自宅でTVに繋ぐ必要があるため、携帯性とデバッグのしやすさから、EZ-FPGAEZ-ARCADEを使用しました。
 準備段階のPBSRAMへのピン割り当て等にけっこう時間がかかり、ROMインターフェース構造の不備を痛感しましたが、YCrCb変換部分はvencモジュールファイルの差し替えだけで対応できました。
 デバッグは非常にスムーズに行きました。
 ドラッグ&ドロップでコンフィグ+ダウンロードな環境は楽ちんです。

4.余談

 フリーのZ80コアT80を使うと、XC2S100にPACMANはサウンド無しでも入りません。
 なんでもXSTのエリア最適化は頭が悪く、Mentor GraphicsのFPGA Advantageにあるleonardo Spectrumを使うと50%位小さくなることがあるとかないとか
 評価版もあるので使ってみたいけど、趣味で買えるほど安くはないのだろう
 XSTであと100slice小さくなればなぁ...

おことわり

ソースを整備していないので、実験回路の一般公開はしてません。
試して見たい方には、不完全な形ですが直接配布可能です。

おまけ情報

Y信号をコンポジットビデオ入力に接続すると、モノクロ映像が映ります。
これはDVDでも同様ですが...