« 2010年5月9日 - 2010年5月15日 | トップページ | 2010年5月23日 - 2010年5月29日 »

2010年5月16日 - 2010年5月22日の1件の記事

2010年5月17日 (月)

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

カラーバーが出るあと少しのところでFPGAを壊してしまった
 がた老AVR研究所始まって以来の悲劇が起きた。FPGA基板を、液晶モニターの12V電源線とオシロのプローブが接触する事故で、一瞬にして失ったのである。外見は全く変わりがないが、ISEのiMPACTは無情にも赤のエラーメッセージを出してディバイスを認識しない。

 当研究所は開所以来、レギュレーター、フォトカップラー、秋月のリアルタイマーモジュール、Mega168など数多くの犠牲者を出しているけれど、今度の事故は替わりがないということでは一番深刻である。このFPGA基板は、今は、デジタルデザインテクノロジーと名を換えた雑誌デザインウェーブマガジン2007年7月号の付録基板で、XilinxのSpartan3E XC3S250Eが載っている。版元ではとうに売り切れと表示されており、手に入れることはできない。

 こちらも新刊で手に入れたわけではなく、2年前偶然、新宿の紀伊国屋でバックナンバーで発見し入手した。これまでLEDチカチカから始まって、フォトフレームプロジェクトとして7セグLED、UART、SRAMアクセスと演習問題をこなし、いよいよビデオ信号発生のステップまで進んできた。

 日曜の昼下がり、動かなくなった時は、暫し呆然となった。もうちょっとのところで、液晶モニターに色が出るところだったのである。オシロとロジアナの活躍で波形を見る限りでは、ほぼ満足できるコンポジット同期信号と、色信号(一色だけだが)の発生までこぎつけていたのに。

コーディングは短期勝負(5/13/2010)

A5172882_3

 事故が起きる前までのプロジェクトの進行は順調だった。前の記事にあるようにRGBインターフェースの開発はHDLソースの擬似コーディングのレベルで暫く止まっていたのだが、再開してからは速かった。詳細設計に当たるステップレベルの擬似コーディングを2枚のメモ用紙に清書し、ISEの新規プロジェクトを立ち上げてコーディングを開始する。

 コーディングはなるべく一度に全部一気に書き上げるのもコツのうちだ。短期記憶を活用できるので仕上がりに漏れが少なくなる。日にちを空けると、モジュール間の接続などをいちいち確認する手間が増えて効率が低下する。今回も半日くらいで、すべてのコードを書き終えた。

 VGAのコネクターの配線がまだだったことに気が付き、FPGA基板のベース基板にVGAソケットと、DCアダプター、電源スイッチを半田付けする。アナログ回路が懸案のまま残っている。カラーバーの色信号は1と0だけだが、FPGAのLVCMOSの3.3Vからアナログ電圧に変換しなければ、こわれないにしても液晶モニターで正しい色が出ないだろう。

 アナログ色信号のところは、トランジスタ技術の2009年11月号の「入門!画像表示回路の作り方」が詳しい。小型液晶のサイトで有名な京谷豊氏の記事が実践的でとても参考になった。分圧抵抗で単に出力を0.7Vに落とし、カプリングコンデンサーを入れれば良いようだ。調整が必要なのでとりあえず1信号だけの回路を組む。

 SRAMからのデータ読み込みはコメントではずしておき、8色のカラーバーをifステートメントを8行並べて即席で作る。色信号をひとつづつ変えて8色を作る。いわゆるグレイコードというやつである。

 コードが完成した。メインモジュールで色信号を制御し、1ライン毎の水平ブランキング、1画面毎の垂直ブランキングのパルスは、サブモジュールをリクエストし、終了をビジーフラグで待つ。これで動くはずだ。早く試してみたい気持ちで気がせく。

 どきどきしながら論理合成(コンパイルというかシンタックスチェック)に進む。うーむ、モジュールとの接続でやっぱりエラーが沢山出る。まだ、regとwireの違いが飲み込めない。早く動かしたいので、対症療法で前のコードの書き方を真似てエラーをなくす。

 ところが、論理合成の次のステップ、implement design(リンカーのようなものか)で、ドットクロックを作っているDCM(デジタルクロックマネージャー)モジュールが次のようなメッセージを吐いてうまく組み込めなくなった。

Reading NGO file "E:/Xlinx/Gataro/studyprg/Video/RGBif/RGB_top.ngc" ...
Reading in constraint information from 'PicCLK_arwz.ucf'...
Gathering constraint information from source properties...
Done.

ERROR:NgdBuild:981 - Could not find any associations for the following
   constraint:
       '<INST DCM_SP_INST CLK_FEEDBACK = 1X;> [PicCLK_arwz.ucf(4)]'
ERROR:NgdBuild:981 - Could not find any associations for the following
   constraint: .......(以下略)

DCMがコンパイルできないのは解決(5/14/10)

Ws000001

 ビデオのドットクロック生成は、Xilinxの無償IPコアのひとつ、CoreGeneratorのDCMを使っている。初めてのIP利用だ。ウェブで勉強し、一番簡単なユニット(Single DCM SP9.1i)を使った。ドットクロックは厳密には6.05Mhzが必要だが、今のマスタークロックが33Mhzなので、1/5.5に分周して6.0Mhzにしている。これくらいの誤差は問題ないはずだ。

 上記のエラーメッセージは、何かファイルがないとか言っている。困った。ウェブで調べる。英語のQ&Aがいくつかヒットしたが、英文そのものより、中味の意味が全く理解できない。DCMのしくみそのものがわかっていないので、何を言っているのかがわからない。恐らく日本語で書かれていても何のことか理解できなかっただろう。

 ただ、少し思い当たる節がある。ウェブにはもう一度プロジェクトを作り直すと良いかもしれないという記述があった。そう言えば一度プロジェクトを作ってDCMを作ってから、フォルダーを作り直しDCMの本体(.axw)を移した。もしかしたら他にも必要なファイルがあったのかもしれない。

 だめもとで、もう一度プロジェクトを新規に作り直し、DCMもあらたに定義する。他のソースファイルは前のものをそっくり持ってくる。やってみた。やったー、通った。implement designが通って先に進んだ。

DCMクロックが出ない(5/15/10)
 いよいよコンフィギュレーション(ファーム書き込み)である。まだ液晶モニターは接続していないので、動いたかどうかは目で確認できない。各端子にさしたオシロのプローブから出る波形が頼りだ。ファーム書き込みが終わった。しかし、オシロからは全く反応がない。

 まあ、こういうのには慣れている。FPGAが動いていることは、リセットのところにLEDが入れてありボタンを押すと点灯するので確認できる。マスタークロックの端子をオシロで見る。33MHzもちゃんと出ている。 

 それでは、次はDCMのドットクロックだ。外に出ていないので、空いているピンにこのクロックを出し、論理合成し直す。そうか、FPGAは中が見えないけれどデバッグにはこうして臨時に外に出力してみれば良いのだ。ロジアナと同じだ。

 あれえ、ドットクロックが出ていない。考えてみればこのインターフェースの殆どの駆動はこのドットクロックなので、これが動かなければ確かに全く進まない。

 しかし、DCMが何故動いていないのだ。難しいことは何もやっていない。単にマスタークロックを分周しているだけである。ウェブにも特に注意書きはない。簡単に動かしている。クロックをinternalやexternalに変えて見たり、色々いじってみるが、ガンとして動かない。

 仕方がないので、ドットクロックをDCMからとらず、マスタークロックに直結してみる。おお、動いた動いた。時間の換算が必要だが、ちゃんと想定どおり同期パルスが出ている。オシロで動いていることを確認し、ロジアナに換えてコンポジット同期のややこしい垂直同期の部分のデータを観測する。

 良いぞ。ちゃんと等価パルスも切り込みパルスも想定どおり出ている。素晴らしい。このパルスの生成では、なひたふ電子情報のサイトに大変お世話になった。

Ws000000

DCMモジュールのリセットは正論理(5/15/2010)
 マスタークロックの駆動で、RGBインターフェースの同期線も色信号線もそれらしい信号が出ていることは確認できた。しかし、ドットクロックの速度にしなければ、実際の液晶モニターは駆動できない。

 自分で分周しても良いが、今度の周波数は正確に出す必要があり、5.5分の一に分周することは簡単ではない。仕方がないので、全く新しいプロジェクトにDCMモジュールだけ入れて、動くかどうか調べてみることにした。

 ありゃりゃ、これでも動かない。No Errorで組み込まれたらあとは調べるところがない。思いあぐねて、基板を前に何気なくリセットボタンを押した時である。オシロに何か変化が起きた。

 何ということだ。リセットボタンを押すとDCMモジュールが動く。このモジュールのリセット信号は、正論理だった。やれやれ。普通、リセットピンはプルアップで1に上げておき、スイッチでグランドに落としリセットするという負論理が常識なので、このDCMもそうだとばっかり信じていた。

 これはきっとはまった人が私以外にもいるにちがいない。恥ずかしいので言わないだけだろう。それにしても、どんなことでも疑ってみるというデバッグの基本を思い知らされた一幕である。

画面にわずか色がでたのも束の間(5/16/2010)
 DCMでちゃんとしたドットクロック(6.00Mhz)が出て、いよいよ液晶モニターでテストする段階である。オシロで、色信号レベルが1V以下であることを確認してVGAコネクターをつなぐ。緊張の一瞬である。

 今のところ色信号は青しか配線していないので(分圧抵抗を調整するため)、想定では右半分が青になり、左が黒になるはずである。

 電源を入れる。おお、何かでたぞ、上の10ラインぐらい斜めに鮮やかな青色が出たが、下は薄暗い。電圧を測ってみる。液晶モニターをつけると0.4Vまで下がってしまう。

 斜めになっているのは同期がずれているからだろう(写真をとるまがなかった)。ロジアナで時間を測る。うーむ、少し長すぎる。色表示区間は正確だが、水平同期期間がおかしい。

 水平同期のロジックを確かめる。おや、数字が間違っていた。ケアレスミスだ。FPGAのプログラムを修正する。これでどうだ。おやあ、上部の斜め線がなくなって全体に薄い半分青の画面に変わった。色信号の電圧が低すぎるのか。

A5172884

 液晶モニターに実際につなぎながら、あちこち波形を確認する。オシロのプローブで、色信号のアナログの部分をチェックしていたときである。、何気なく同期信号のところを触れたはずみで、プローブが隣のピンに接触した。気のせいかも知れないが小さな火花が飛んだように見えた。

 隣のピンが電源線であることに気が付いて、背筋に冷たいものが走った。あ、あ、あ、もしかして。オシロでクロックをチェックするが、真っ直ぐな線のまま。あわてて、ISEのiMPACTでディバイスを確認するが真っ赤なエラーメッセージ。

 油断していたのが悪かった。100Vなら警戒するが(それでもフォトカプラーを壊した)、12Vなので、余り気にしていなかった。しかも、勘違いして電源ピンは同期信号ピンの隣ではなく、左端だとばかりと思っていた。

 手持ちのFPGAは、このXilinxのSpartan以外にLatticeのXP2基板(これも雑誌付録だが)があるので、FPGAフォトフレームプロジェクトを続けることは可能だ。しかし基板上のSRAMの配線などを最初から作り直さなければならない。今まで基板にかけた手間はすべて無駄になってしまった。ここまでの環境に戻すのは、相当時間がかかりそうである。

A5172885

 まあ、Xilinxでなくても今まで得たノウハウが無駄になることはない。ソースはそのまま使える。今度のXP2はi/oピンが多いので、フルカラーも問題ないはずである。今まで出番がなく気にしていたLattice基板も活躍できそうだ。なるべく前向きの思考をして、事故のショックを忘れようと努める。

 反省点?今さら悔やんでみても始まらない。これで懲りただろう。これからは異電圧のところはボンドかなにかで絶縁することくらいか。みなさんも、電源逆ざしと電位差のある回路をいじるときは、くれぐれもご注意下さい。

続きを楽しみに期待していただいていた読者の方には申し訳ないが、暫くフォトフレームプロジェクトはお休みである。

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

« 2010年5月9日 - 2010年5月15日 | トップページ | 2010年5月23日 - 2010年5月29日 »