« 2010年4月25日 - 2010年5月1日 | トップページ | 2010年5月16日 - 2010年5月22日 »

2010年5月9日 - 2010年5月15日の1件の記事

2010年5月11日 (火)

FPGAでビデオ信号を作りカラーバーを出す(1)

 FPGAによるフォトフレーム制作プロジェクトは第三ステップで、やっと画像に関係のある工程に入った。FPGAでビデオ(アナログRGB)インターフェースを作り、手持ちのTFT液晶モニター(カシオの5.5インチ、パチンコ(?)液晶の中古)にカラーバーを出力するステップである。

 当研究所の所長は学校を出て30数年、放送通信関連企業でシステム開発をしていたので、直接ではないが、ビデオインターフェースには昔から馴染みがある。さらにその昔、ラジオ少年だったころ、テレビの自作は最高峰の技術として憧れ(勿論、全部真空管の時代)の的だった。おおよそのことは理解しているつもりである。それに、このアプリケーションはFPGAの恰好の題材なので、雑誌やウェブに沢山実装例やソースコードが出ている。参考情報は豊富にある。

 しかし懸念していた通り、理屈で理解していることと実際に回路を組んで動かすことの間には想像を越えた大きな隔たりがあった。具体的にどう決めればよいのか分からないことが山ほどある。調べ始めるとさらに別の疑問が発生し、その解明を求めてまた道草を食うという繰り返しで中々先に進めない。

 まあフォトフレームを作るのは名目で、本当はこの道草が面白い。目的があるので真剣に理解しようとする。今までおぼろげで断片的な知識が少しづつ、つながって確かなものになっていく実感は、少しおおげさだが人生の充実感を覚える興奮である。この連休は殆ど外へ出かけずにビデオインターフェースをめぐる探検を楽しんでいた。

UARTが直ってしまった(5/2/2010)

A5012873

 はなばなしくFPGAフォトフレームプロジェクト第三ステップを宣言したものの、UARTの不具合は残ったままだ。このまま放置するのは、どうも後味が悪い。で、連休の前半は日もあるので、UARTのトラブルシューティングに時間をかけてみた。不具合は2つある。

①端末のリターンキーを押した直後の最初の文字が化けてANKでない2文字が出力される。

②FPGAリセットの直後は、正しくプロンプトの'>'が出ず、同じように字化けする。

 まず②の解明だ。ワンショットの波形ならオシロは最強の武器である。リセット直後のシリアル(UART)送信データを観測する。うはあ、直後に短期間、発振を起こしている。発振周波数は、マスタークロックの33MHz。クロック単位で送信データが暴れている。これでは送信データが化けるわけだ。

 あわてて、VerilogHDLのソースを確認する。原因ははっきりわからないが、親と子のモジュールがリセットに入ったときのわずかな時間差で、UART送信モジュールがレディ/ビジーを繰り返してシリアルラインが暴れているようだ。送信要求は必ず送信モジュールがレディになったことを確認してから出すことにして、発振は止まった。しかし相変わらず文字化けは直らない。時々、正常になるというのがどうも怪しい。

 ①の解明は厄介だ。文字化けしているシリアルラインをロジアナで観測しても、文字化けしたコードが見えるだけだし、オシロでは全体を見られない。状況は、送信の立ち上がりの1文字がおかしく、無効な2文字になったあとは正常になる。このあと大量の文字を送っても一切問題ない。

 気分が悪い。このUARTはデバッグ用に、この先も使いたいので根本的に直しておきたいが、原因がつかめない。万策尽きてデバッグはあきらめ、少し、出力の状況を換えようとリセットのあとにWelcomeメッセージを出したり、SRAMからの出力を行を一行ずらして出るようにステートマシンを改修した。

Uart

 ところが、これで直ったのである。???である。最初の1文字から何の問題もなく表示される。②は前と変わらないが、①の不具合はきれいさっぱり直ってしまった。何回やっても問題ない。直ってしまったのは良いが、原因がわからないというのが始末が悪い。

 ということで、VerilogHDLのソースの公開は迷っている。SRAMにデータを入れて、それをUARTに吐き出すだけのテストベンチのHDLソースが役に立つとは思えないが、何かの参考にはなると思う。しかしUARTがこの状態ではどうも気が進まない。(もし、必要ならコメントを下さい)。

またもやChaNさんのサイトに戻る(5/5/2010)
 これから作るのは、ビデオインターフェースと言っても正確にはアナログRGBインターフェースで、いわゆるテレビ用のNTSCインターフェースではない。NTSCは一本の信号線に、水平・垂直同期から色信号まですべてを盛り込むので規格が非常に厳格で、専用ICでもないと作るのは大変だが、パソコンモニターなどへのRGBインターフェースは、信号線が分かれているので、だいぶ簡単だ。

 しかも、今ターゲットとしているモニターは、QVGAというVGA(NTSCとほぼ同じ)クラスの1/4のデータ量(320×240)で、液晶モニターにはコンポジット(NTSC)入力でこの液晶を表示できる変換基板アダプターがおまけについている。この波形をそっくり真似て入れてやれば問題なく画像が出る理屈である。

A5112880

 部品棚にしまってあった液晶モニターを取り出し、デジカメのビデオ信号を入れて、同期信号をオシロで調べる。おやあ、このカシオのTFT液晶モニターには、同期信号線が一本しかない。ということはコンポジット同期だ。あわててウェブや、雑誌の参考資料を調べ直す。うむ、そう難しくはない。垂直同期の長いパルスが水平同期信号に重畳しているだけである。

 オシロでは長期間、測れないので、ロジアナを取り出してさらに調べる。ふむふむ、単に重畳しているだけでなく、NTSCのように、等価パルスと切り込みパルスというのが垂直同期期間に出ている。素晴らしい。雑誌や教科書でしか見なかった波形を自分の手で実際に調べている。世界が広がった気分である(いや最近、感動しやすくなっただけか)。

C_sync

 問題は色信号である。オシロでみると、マイナス電位が出ている。良く分からない。ここは0-0.7V P-Pと規定されているが、これはNTSCの同期パルスを含んでいる時の規定で、RGBインターフェースの規定ではない。それにマイナス電位などとは、どこにも書かれていない。

 用意していたビデオDAC(BU3616)が5Vベースであることにこのあいだ気づいて、厄介なので最初は自前の簡単なR-2Rラダー抵抗DACでアナログ色信号を作ろうと思っているが、どうやって1Vにするのか見当がつかない。しかも色信号線のインピーダンスは75Ωで、FPGAの出力ピンがこれをドライブできるとは思えない。やっぱり最後はアナログのところがネックになりそうだ。

 めげていても先に進まない。ここのステップの目標はカラーバーを画面に出すことだけなので、とりあえずは色信号の問題は先で考えることにする。カラーバーだけなら、RGB信号を1,0にするだけで8色でる。同期信号発生のコードの開発の方が先である。

 ウェブや雑誌には、色々なコーディング例がある。どれにするか迷う。いくつかのサイトから、それらしい規格とタイミングチャートを収集する。NTSCと違って、RGBインターフェースはそう厳密ではないが、QVGAの情報が少ない。

 分かりやすいページを見つけたと喜んだら、ChaNさんのサイトの技術情報だった。そういえばここにはQVGAのRGBインターフェースをCPLDで作る記事があったことを思い出した。10年近く前のページである。やれやれ、またChaNさんのところへ帰ってきた。このあいだのLPC2388のときと同じだ。悔しいけれどまたお世話になるしかない。

アナログRGBインターフェースの擬似コーディング完成(5/7/2010)
 勉強の結果、FPGAでアナログRGBの同期信号を作るのはそう難しくないことがわかった。ピクセルクロック(1画素の色信号を出す時間)を数えて、決められた時間に水平同期と垂直同期パルスを1ライン毎と1画面毎に出し、それを繰り返すだけである。どのタイミングで出すかは決まっているし、NTSCと違ってノンインターレースなので気が楽だ。最悪でも今のアダプターが出している通りにすればよい。

 これを、どれだけ簡便にスマートに実現するかが腕の見せどころだ。頭を捻る。モジュールの構成に一工夫した。垂直同期の前後の等価パルスを出すところは全く同じ形である。ひとつのロジックで使い回しが効くように相対クロックにして親から呼ぶようにする。呼ぶといっても、同じ同期信号線を別々のモジュールでドライブすることは出来ない(複数のソースを持つ論理回路は作れない)ので、ひとつのループの中に置き、それぞれリクエストで駆動する。

 擬似コードのレベルだが順調に進んだ。当初は、カラーバーを出すだけのプログラムにするつもりだったが、少し欲を出して、SRAMを読み、そのデータを色信号として表示するところまで作りこむことにする。ただ、SRAMにデータを入れるのは大変なので、カラーバーのテストのときはデータを決め打ちにしておく。

 思いのほか早く目処がついて、あとはコーディングするだけとなった。ところが出来た途端に安心してしまって、次のコーディングに進む気力がなくなってしまった。これはどうも昔からの癖で、思い立ったときは自分でも驚くくらい体が勝手に動くが、一旦安心して落ち着いてしまうと、再開するのに偉く時間がかかる。

 要するに気まぐれとしか言いようがないのだが、ここはアマチュアの特権である。リニアPCMプレーヤーの残りのロット(あと4台)の制作を始めたり、R-2RラダーDACのブレッドボード版を作ったりして気分が乗るのを待つ。このR-2RラダーDACも結構、奥が深くて面白い。

もうちょっとで壊すところだった(5/10/2010)
 同期信号のコーディングにまだ取り掛かる気分になれない。プレーヤーの制作も部品が足らなくて先に進めない。こういうときは手作業が一番である。考えてみたら液晶モニターのおまけのNTSC変換基板はテストの時は使わないのに、電源供給を兼ねているので、はずすわけにはいかない。邪魔なので、モニターのケースに直接、本式のシュリンクDSUB15ピンのVGAソケットを固定し、空きピンで電源供給(12V)もFPGA基板からしてやることにした。FPGA基板に12Vのソケットをつけるか、5V供給と共通にする。

 ついでに、ケースの固定に仮のスタンドを、このあいだ買ったミニサーキュラーソーでアクリル板を切り、接着剤で固定した。最近の瞬間接着剤は強力で、あっという間にちょっとしたフォトフレーム風のモニターが出来上がる。FPGA基板は最終的には、このケースに固定するつもりで、VGAソケットは余計といえば余計だが、このあいだのスケルトンのプレーヤーケースと言い、自己満足だけれど無骨なつくりがかえって中古のケースに似合って気分が良い。

A5102878

 上機嫌で、VGAソケットから実際の信号を送って画面が出るかテストする。15ピンのVGAインターフェースは、本当に使っているピンは9本しかなく、しかもグランドが各信号線単位にあるので有効な線は、5~6本、残りは使っていない。このうちの1本を電源線とした。VGAケーブルをソケットにつなぎ通電する。全く動かない。あれえ、おかしいな。テスターで各ピンの導通テストをする。

A5102877問題ない。まさか、ショート?念のため、電源ラインから調べる。なんとなんと、しっかり0Ω。なんだとお、あわててケーブルを抜き、半田付けしたソケットのところを調べる。いや、大丈夫だ。するとケーブル? いやVGAケーブルはこのあいだ秋葉で買ってきた1mの同軸、高級極細タイプと銘打った新品だ。手持ちのVGAケーブルは全部ごつくて長いので、このためにわざわざ買ってきたものである。

 ケーブルをテスターで調べる。驚いたことに、このVGAケーブルはNC(Not Connected)のはずの11ピン(電源線にした)がグランドの10ピンとつながっている。中国製のケーブルだ。1本接続をケチったのかと、手持ちの別のVGAケーブルを調べてみたら、何と、このケーブルも10と11が導通している。しかも、このソケットにはそもそもNCの9ピン、グランドピンのひとつの5ピン、VESAで規定したデジタルラインの12、15のピンそのものがない。

 何が何やらわけがわからなくなってきた。いずれにしても空きピンの11ピンに電源を供給してショートさせてしまったことは事実である。恐る恐る元の配線に戻して電源を入れる。良かった。何事もなく画面が出た。11ピンから、別の12ピンに電源線を移して、再度テスト。無事、VGAケーブルから画面がでることを確認した。元のアダプターからの線が短かったので、長いケーブルによる色にじみなどの画質低下を心配していたが、全く問題はなかった。考えてみれば、75オームのインピーダンスの線なのだから少々引き回しても問題ないはずだ。

 それに、ショートさせたのはACからとる12V電源アダプターで、液晶やNTSC変換基板の方ではない(12Vが直接液晶にかかっている)。そう慌てることもなかったことにあとで気づく。

 ともあれ、これで実験環境は見違えるほど改善された。これまでは液晶モニターが自立して立たないので、どこかに立てかけ、変換基板アダプターをぶらぶらさせて画像を見るのに苦労していた。そろそろコーディングを始めよう。

| | コメント (0) | トラックバック (0)

« 2010年4月25日 - 2010年5月1日 | トップページ | 2010年5月16日 - 2010年5月22日 »