(日々の記録)デジタルオシロを買った。(火)FPGAでビデオ信号を作りカラーバーを出す(1)FPGAによるフォトフレーム制作プロジェクトは第三ステップで、やっと画像に関係のある工程に入った。FPGAでビデオ(アナログRGB)インターフェースを作り、手持ちのTFT液晶モニター(カシオの5.5インチ、パチンコ(?)液晶の中古)にカラーバーを出力するステップである。システム開発をしていたので、直接ではないが、ビデオインターフェースには昔から馴染みがある。その昔、ラジオ少年だったころ、テレビの自作は最高峰の技術として憧れ(勿論、全部真空管の時代)の的だった。ことは理解しているつもりである。それに、このアプリケーションはFPGAの恰好の題材なので、雑誌やウェブに沢山実装例やソースコードが出ている。参考情報は豊富にある。懸念していた通り、理屈で理解していることと実際に回路を組んで動かすことの間には想像を越えた大きな隔たりがあった。具体的にどう決めればよいのか分からないことが山ほどある。調べ始めるとさらに別の疑問が発生し、その解明を求めてまた道草を食うという繰り返しで中々先に進めない。フォトフレームを作るのは名目で、本当はこの道草が面白い。目的があるので真剣に理解しようとする。今までおぼろげで断片的な知識が少しづつ、つながって確かなものになっていく実感は、少しおおげさだが人生の充実感を覚える興奮である。この連休は殆ど外へ出かけずにビデオインターフェースをめぐる探検を楽しんでいた。UARTが直ってしまった(5/2/2010)はなばなしくFPGAフォトフレームプロジェクト第三ステップを宣言したものの、UARTの不具合は残ったままだ。このまま放置するのは、どうも後味が悪い。連休の前半は日もあるので、UARTのトラブルシューティングに時間をかけてみた。1端末のリターンキーを押した直後の最初の文字が化けてANKでない2文字が出力される。2FPGAリセットの直後は、正しくプロンプトの'>'が出ず、同じように字化けする。ワンショットの波形ならオシロは最強の武器である。リセット直後のシリアル(UART)送信データを観測する。うはあ、直後に短期間、発振を起こしている。発振周波数は、マスタークロックの33MHz。クロック単位で送信データが暴れている。これでは送信データが化けるわけだ。あわてて、VerilogHDLのソースを確認する。原因ははっきりわからないが、親と子のモジュールがリセットに入ったときのわずかな時間差で、UART送信モジュールがレディ/ビジーを繰り返してシリアルラインが暴れているようだ。送信要求は必ず送信モジュールがレディになったことを確認してから出すことにして、発振は止まった。相変わらず文字化けは直らない。時々、正常になるというのがどうも怪しい。文字化けしているシリアルラインをロジアナで観測しても、文字化けしたコードが見えるだけだし、オシロでは全体を見られない。状況は、送信の立ち上がりの1文字がおかしく、無効な2文字になったあとは正常になる。このあと大量の文字を送っても一切問題ない。このUARTはデバッグ用に、この先も使いたいので根本的に直しておきたいが、原因がつかめない。万策尽きてデバッグはあきらめ、少し、出力の状況を換えようとリセットのあとにWelcomeメッセージを出したり、SRAMからの出力を行を一行ずらして出るようにステートマシンを改修した。ところが、これで直ったのである。最初の1文字から何の問題もなく表示される。2は前と変わらないが、1の不具合はきれいさっぱり直ってしまった。何回やっても問題ない。直ってしまったのは良いが、原因がわからないというのが始末が悪い。いうことで、VerilogHDLのソースの公開は迷っている。SRAMにデータを入れて、それをUARTに吐き出すだけのテストベンチのHDLソースが役に立つとは思えないが、何かの参考にはなると思う。UARTがこの状態ではどうも気が進まない。(もし、必要ならコメントを下さい)。ChaNさんのサイトに戻る(5/5/2010)これから作るのは、ビデオインターフェースと言っても正確にはアナログRGBインターフェースで、いわゆるテレビ用のNTSCインターフェースではない。NTSCは一本の信号線に、水平・垂直同期から色信号まですべてを盛り込むので規格が非常に厳格で、専用ICでもないと作るのは大変だが、パソコンモニターなどへのRGBインターフェースは、信号線が分かれているので、だいぶ簡単だ。今ターゲットとしているモニターは、QVGAというVGA(NTSCとほぼ同じ)クラスの1/4のデータ量(320×240)で、液晶モニターにはコンポジット(NTSC)入力でこの液晶を表示できる変換基板アダプターがおまけについている。この波形をそっくり真似て入れてやれば問題なく画像が出る理屈である。部品棚にしまってあった液晶モニターを取り出し、デジカメのビデオ信号を入れて、同期信号をオシロで調べる。おやあ、このカシオのTFT液晶モニターには、同期信号線が一本しかない。いうことはコンポジット同期だ。あわててウェブや、雑誌の参考資料を調べ直す。うむ、そう難しくはない。垂直同期の長いパルスが水平同期信号に重畳しているだけである。オシロでは長期間、測れないので、ロジアナを取り出してさらに調べる。ふむふむ、単に重畳しているだけでなく、NTSCのように、等価パルスと切り込みパルスというのが垂直同期期間に出ている。雑誌や教科書でしか見なかった波形を自分の手で実際に調べている。世界が広がった気分である(いや最近、感動しやすくなっただけか)。オシロでみると、マイナス電位が出ている。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ソケットは余計といえば余計だが、このあいだのスケルトンのプレーヤーケースと言い、自己満足だけれど無骨なつくりがかえって中古のケースに似合って気分が良い。上機嫌で、VGAソケットから実際の信号を送って画面が出るかテストする。15ピンのVGAインターフェースは、本当に使っているピンは9本しかなく、しかもグランドが各信号線単位にあるので有効な線は、5~6本、残りは使っていない。このうちの1本を電源線とした。VGAケーブルをソケットにつなぎ通電する。