2002.12.05 既存IPへのリンク追加
2002.11.05 beta2,インターレース、V同期信号、他もろもろ修正
2002.10.31 beta1,公開

NTSCコンポジットエンコーダー

まえがき

 NTSCコンポジット信号のエンコードは、FPGAの能力的には十分可能である。
 フリーIPか、アルゴリズムがすでに公開されているだろうとWeb上やエンコーダーICのデータシートを探し回ったが、必要な情報はついに見つけることが出来なかった。
人に教えてもらったのだが、すでにここにLFPも入った本格的なのがあった。俺の目は節穴ってことみたい
 なるほど、タイミング、同期信号、輝度信号、カラー信号の変換式などは何処にでも書いてあるが、実際デジタルエンコードする際に、サンプリングレートがいくつで、どのようにカラー信号を出力したらよいか等の情報はどこにもなかった。
 正弦波、位相、変調...アナログ回路は超苦手だけど、しょうがないから自分で試してみることにした。

概要

 SpartanIIを使って、RGB信号からNTSCコンポジット信号へデジタル変換する。
 DAC回路には、75/150ΩのR2R直結型ビデオDACをそのまま使う。


基板、表示画面

ボード全景beta1beta2,インタレース、V同期修正
vdac
クリックでDAC部拡大
ColorBar ColorBar
ColorBar
ColorBar

実験回路、条件
SpartanIIHDL製XSP005 (XC2S100PQ144+4x7SEG+8xLED+4xPSW+1xbuzzer)
VCCIO3.312V(実測)
DAC回路R2R-DAC部,XSP005部はこちらから
HDL回路 Beta1 Velilogソースリスト、操作説明
Beta2 Velilogソースリスト、操作説明
DAC用IOポートOBUF_S_24 (24mA出力,Slowポート)
DAC分解能8ビット
抵抗カーボン抵抗 75ohm 1/4W、2Rは75ohmを2本使用,全て同ロット品
測定器オシロスコープ、パチンコ用LCDモニタ、LCD−TV

Velilogソース説明(beta2)
top.vトップユーザーI/F、カラーバーなど
文法があまりにも汚いので絶対参考にはしないこと
hex4_led.v7セグLEDドライバビデオとは無関係
ntsc_enc.vYUVtoNTSCエンコーダYUVからNTSCコンポジットへ変換する。
各レベルは8bit/1.632VppDACへ調整済みで、
YUV値も調整済みの値が必要
rgb_yuv.vRGBtoYUVコンバータこちらも8bit/1.632Vppに調整済み。
RGB入力は8bitフルスケール
beta2よりYUV内部/出力ビット数、出力レベルを設定可能

ステップ0.DAC再生レート

 カラー信号は3.58MHzで変調されるが、3.58MHzの正弦波をデジタルDACでまともに再生するとなると、16倍〜32倍の周波数が必要になり、速度的にも発振源的にも辛い。
 しかし、とあるビデオチップの出力波形を見たところ、3.58MHzの4倍=14.318MHzでギザギザの波形を出力していたが、画面はまともに映っていた。
 なんだぁ、14.318MHzでいけるんじゃん。

ステップ1.NTSCタイミング

 まずは、同期信号関係のタイミングを実装/確認する。
 こいつは参考文献がたくさんあるし、HDLの例もあるのでその通りにすればよい。
 再生レートが14.318MHzなので、水平ライン=910clockである。
 モニタに繋いで同期があえば、Y信号だけをつかって即、モノクロモニタとして動作する。
 オシロがあれば、波形で確認できるため、難なく動かすことが出来た。
 ただしカラー信号をのせるため、バースト、表示エリアなどの管理はしっかりしておく。
 修正が楽になるようコンパレータを多様したため、現状は回路の無駄が多いので、コンパレーターの代わりに、カウンタ+ステートマシンなどにすべきだろう。
 なお、インターレース処理は省いてあるが、これは実用段階で実装する予定。<←beta2で対応

ステップ2.カラーバースト信号

 ブランク部分にカラーバーストをのせてみる。
 カラー信号も同様だが、出力信号へ単純に加減算すればよい
 再生レートは14.318MHzなので、4cycleでカラーサブキャリアの3.58MHzとなるため、0/90/180/270°の繰り返しとなる。
 カラーバーストの最初、最後の部分は少し減衰させるようだ。
 ↑カラー信号のLFPが作用していると推測される。
 こいつは単体で画面チェックが出来ないので、オシロで他のビデオ信号と波形を比べる。

ステップ3.カラー信号

 Y信号を適当な値にして、適当なカラー信号を変調してみる。
 が、実際に色が出なくて輝度が変化してしまい、ここでさんざん時間を費やしてしまった。
 サブキャリアの角度を水平同期でリセットしていたため、位相が狂っていたのだ。
 ソースをいじりまくり、カット&トライでようやく原因を突き止めたが、同期/Y信号と違いオシロの波形や画面からを捕まえることは困難だった。

ステップ4.YUV出力

 電卓で、あらかじめRGB値をYUV値に変換し、YUV値を出力したときに期待通りのRGB色が出ることを確認する。
 ここでも、正しい色が出なく、UVをひっくり返したり、IQに換えてみたりとさんざん試した結果、色信号の変調角度が間違っていただけだとわかったので、とりあえず色が合うようにパッチをあてた。
 で、色信号の基本は14.314MHzでV、U、−V、−Uを順番に出力することで良いことが判明した。これが一番知りたかった情報である。
 と、思ったが、もしかしたらカラー信号にはLPFを実装する必要があるかもしれない。

ステップ5.RGBtoYUV(コンポーネント)変換

 RGBからYUVを得る変換式はどこにでも書いてあるので、その通りに変換すればよい。
 かけ算回路は、単純に足し算ロジックへ変換したため回路規模は膨らんだが、そのおかげか、ほぼストレートで動作した。
 色信号は、変換レート=サブキャリアでよいはずなので、Y/V/Y/Uという具合に、1つの乗算回路を時分割で使用すれば、回路規模が小さくなるかもしれない
 最終的にはNTSCエンコーダーに含めた方が、実用的である。
 カラー信号には、I=1.3MHz、Q=0.4MHzのLPFを通すという資料がある。V,U信号にはLPF回路が必要かもしれない。


ステップ6.beta2修正

 その後、beta2にていくつか修正を行った。
 1.V同期タイミングがメチャメチャだったので、直した。
  エッジ部に見えていたギザギザが無くなった。
 2.インターレースタイミングを実装した。
  オシロで同期部のみ確認ずみ。
 3.出力電圧レベルの調整
  全体的に低かったので、ちゃんと計算して修正した。
 4.ついでに、適当な最適化してみた。

ステップX.その後

・画質については、色はそこそこ出ているような気がするが、カラーバーだけではなんとも判断できない。
・グラデーション部やY出力のすじに気が付いただろうか?
 これがDACの桁上がり不具合と思われる。
 100/200Ω辺りでDACを作り直した方がよいかもしれない。
・カラー信号には、LPFが必要かもしれない。

展望

 思ったよりも回路規模が大きく、傍らにちょっと置くというサイズにはなりそうにない。
 最適化して書き直しても、半分にはならないかも...

 とりあえず、FPGA-PACMANへ実装して実用上の能力を確かめてみたい。
 その際には、エンコーダーに外部同期でタイミング調整を行う機能や、1ラインのバッファリングなどが必要になるだろう。
 PACMANを含め、RGB出力の同期タイミングはNTSCのそれと多少異なっているケースがほとんどだ。

参考文献

CQ出版社 ドランジスタ技術スペシャルNo.65 パソコン周辺インターフェース,第2−3 NTSC
CQ出版社 インターフェース 2000.1 ディジタルテレビんも映像信号/動画像処理の基礎
 P57 図10 NTSCエンコーダーの構成
 P59 図17 サンプリングされたNTSC信号
 P71 表3.A 映像信号レベル(電圧)、表8 輝度・色差信号とRGB信号の関係
なひたふ新聞、電子回路の豆知識、第6章 画像信号の豆知識