見ると、4つのLEDとも同じ形で激しく点滅しているだけだが、全くの無反応ではない。少なくとも暴走もせず(FPGAは暴走しないか)、何か動いている。タクトスイッチを押してみる。数字にはなっていないが2番目の桁の形が変わったようだ。よーし、一歩前進したぞ。FPGAのデバッグは確かに大変だ(3/27/10)最初のFPGA自作プログラムは、無茶苦茶な点滅だけれど、とりあえず目的の7セグLEDを光らせることには成功した。黙(だんま)りと違って何か動いている。激しく点滅するというのはダイナミック点灯の時間間隔が長すぎるからだろう。テレビのフレーム1/60秒に合わせて20msにしたが遅すぎるようだ。LEDが文字になっていないのはエレメントのアサインがおかしいからに違いない。LEDのピンアサインとソースコードをもういちど照合する。7セグ以外のエレメント、ドットポイントの位置を間違えている。ucfファイルでピンアサインを変える。ダイナミック点灯の間隔を1/10の2msに変更し、また最初の論理合成から始まる5つのステップを実行する。予想通り点滅は止まった。それにタクトスイッチを押して変わるLEDが一番右の桁にならない。ここも間違えているか。いちどピンアサインを確認する。おやビットの定義がこれまでと違う。A[1]、A[2]はMSB(左から)からじゃないのか。ここの配列はLSB(右)から数えるらしい。アサインを逆にして、やっと7セグLEDに数字が戻った。タクトスイッチを押すと数字が変わる。1づつ増えていかない。それに桁の位置がおかしい。うーむ、今日はこれくらいにしておこう。同時に動くという仕組みを少し理解する(3/28/10)FPGAのデバッグは難しい。考えてみたらロジアナでは内部変数を外から見ることが出来ない。シミュレーターを入れれば良いのだろうが、そう簡単には入らない。それに7セグLEDくらいのアプリケーションで余りおおげさにしたくないという気持ちもある。冷静になって最初からHDLコードを調べ直すことにする。数字が大きく変わる不具合は新しく入れたスイッチのロジックが怪しい。スイッチがONになった直後、ただちにフラグをあげて、それ以上カウンターが動かないようにしているが、そのフラグが効いていないように見える。すると気になるところが見つかった。//このelseはif(A)のelseのつもりE;F;endAが成立してBが成立すれば、CとD、そうでなければ何もしない。Aが成立しなければEとFを実行するという文だ。beginとendは複文の時だけ必要で単文のときはいらないので省略してあるが、よーく見ると、次のif(A)のつもりのelseは、字下げはしてあっても、if(B)の方のelseになってしまっている。昔々PASCALに凝っていた頃、さんざんやったミスだ。//これでやっとこのelseはif(A)のelseになるE;F;endとしなければいけない。数字が大きく増える原因はここにちがいない。あせる気持ちでコンパイルしなおす。長い手順がもどかしい。コンフィギュレーションが出来たので動かしてみる。よーし、数字の増え方がひとつづつになった。おやあ、まだ時々1以上増える時があるぞ。スイッチの押し方で様子が変わる。チャタリング防止が機能していないようだ。300カウント待って同じならONとしている。待てよ、クロックは33Mhzだ。これでは少なすぎるのではないか。10マイクロ秒しか待っていない。千倍の300000(10ms)にしてチャタリングは完全に防止できた。表示される桁がおかしいのはもっと深い理由があった。ソフト屋はどうしてもステートメントが表記の順序で実行され、それが終わってから次のステートメントが実行されるという意識が頭から抜けない。always節の中は、順序回路だと言っても、実際の動作はわずかな遅延を伴って同時に処理される。ダイナミック点灯のデータの指示をしたあと点灯する位置をシフトしているが、実際に点灯の処理がすんでからシフトが行われる保証はない。回路の具合で点灯する前に表示桁が移動するかもしれない。桁のずれがシフトの方向にずれているのが何よりの証拠だ。これは、シフトをブロッキング代入で最初にやり、点灯のデータの指示をノンブロッキング代入(always節の最後で一括変更)すれば解決するはずだ。これで遂に7セグLEDは正しい桁で数字が表示された。いやいや、良い勉強になった。参考書や雑誌に書いてあるブロッキング代入とノンブロッキング代入の違いをデバッグを通して肌で理解することができた。コーディングに自信がついてきた。(木)FPGAの言語の習得で最初からつまづく行事の連続が終わって、やっと電子工作に専念する時間が出来た。前の記事では勇ましくFPGAのプロジェクト計画をぶちあげたが、その後は一向に進んでいない。モチベーションが下がったわけではない。初っ端のステップであるハードウエア記述言語(以下HDL)の習得にえらく手間取っているのだ。;がないところがある)言語にそっくりなので、HDLの習得は簡単だろうと考えていた。雑誌のソースコードを読んでいても何をしているかおおよその見当がつく。ところがいざ、実際にスクラッチからコードを書き始めると、そんな甘いものではないことを思い知らされた。雑誌や参考書のソースリストをそのまま忠実に書き移せば動くのだろうが、こちらは言語の習得が目的なので、少し欲張って自分でロジックを考え、自前の回路を作って動かそうとしている。7セグLEDを表示装置、UARTを入力にし、キーボードからのリターンキーの回数を数える4桁のカウンターを作ろうというのが、練習問題の課題である。考えてみれば、今まで順序処理に慣れてきた計算機屋が、形は似ていても同時処理の多いハードを作る回路屋の言語をマスターしようというのだから、一筋縄で行くわけがない。悪戦苦闘の連続で、簡単な回路の論理合成がいまだに通らない。日暮れて道遠しというところである。表示ディバイスは7セグLEDである。名古屋で行われた全国集会の旅行前に既に買ってあった。神田で安売り切符を買ったついでに秋葉に立ち寄って、秋月で緑の7セグLEDを調達した。7セグLEDなんかと偉そうに言っていたが、恥ずかしながら当研究所では始めてのディバイスである。カソードコモンかアノードコモンかで迷う。前にLEDマトリックスを使った電光掲示板を作ったとき余分に買ってあったトランジスタアレイ(TD62083)をコモン側につけるつもりなので、これを間違えると別のトランジスタアレイを揃えないといけない。前の電光掲示板の回路図を探したが見つからない。秋葉原に行く途中で必死に思い出し、うろ覚えでカソードコモンを指定して買ってきた。家に帰り恐る恐るトランジスタアレイ(TD62083)のデータシートを取り出した。