へそ曲がりな勉強法(3/17/10)ハードの準備が出来たので、いよいよHDLの勉強に入る。VHDLかVerilogHDLか最後まで迷ったが、とりあえずコード量の少ないVerilogHDLに決める。これまでにFPGAに関する特集の雑誌が貯まっている。付属FPGA基板を使った回路設計FPGA基板が付録になった号で、Xilinxの開発環境のインストールと使い方の解説が主で、応用回路も高度なものが多く、HDLの勉強には役に立たない。付録基板を使うときの解説。画像処理回路とSDカードアクセスのVHDLの一部の紹介があるがこれも入門レベルでない。CPLD/FPGA活用回路&サンプル記述集10以上のアプリケーションのVHDLやVerilogHDLのサンプルソースがある。7セグLEDのドライバーもあり、当面これが役に立ちそう。手軽にはじめるFPGA手軽という割にはある程度のレベル以上のハードエンジニア向けの内容で、FPGAの内部の解説や高度な応用の紹介でソースコードは殆どない。ソフトウエア技術者のためのFPGA入門ソフトウエア技術者向けというだけあって、VHDLとVerilogHDLのコードを並べたサンプルコードがあったり、ステートマシンの解説があったりして有用。HDL設計超入門の2冊もあり、合わせると何と8冊のFPGA特集号が揃った。これだけ沢山情報があっても、結論から言えば、コーディングに役に立ったのは、(ニ)の7セグLEDをダイナミックドライブするVHDLのソースコードと、(へ)の7セグLEDのVerilogHDLのコードだけであった。何か適当な入門書を買って来て、最初から素直にやるのが結局は一番早道なのだろうが、このやりかたは昔からである。入門書に書いてある通り何かを習得していくというのが嫌いなのだ。へそ曲がりで人の言うことに唯々諾々とついていくのに我慢できない。マニュアルも最初から読んだことがない。年をとったのでなおさらその傾向が強まっている。それとこの世界に40年つきあっている。つまみ食いで何とかなるという横着な気持ちもある。今まで一冊の入門書だけでマスターできたものはひとつもないという経験も加勢している。これが吉と出るか、凶と出るか。論理合成が通らない(3/23/10)まずブロックダイアグラムを描き、お手本どおり入出力を決める。おお、これは擬似コーディングと同じではないか。典型的なトップダウン設計だ。UARTはサンプルコードがあるし、今度の演習問題では、エコーバックさせるだけなのでバッファーも考える必要がない。7セグLEDも沢山サンプルがあるので、必要な信号線も決めやすい。順調にブロックダイアグラムが出来た。Xilinxの開発環境ISEを立ち上げて、コーディングを開始する。VerilogHDLでソースを書き始めた。今後のことを考えて、ひとつのモジュールに全部を書き込むのではなく、機能ごとにモジュールを分け、サブモジュールにする。このあたりから、開発のスピードが落ち始めた。サブモジュールの呼び出しが今までの感覚と違う。何かおかしいのである。サブモジュールを呼び出す順番がわからない。調べているうち、はたと気づいた。これは論理回路の記述なのでモジュールにわけても動作は同時なのだ。それとwireとregの区別がつかない。functionとmoduleの区別が分からない。assignの意味が分からない。段々不安になってきた。自信がなくなってきたので、UARTの実装の前に、7セグLEDのところだけ動かしてみることにことにした。UARTのモジュールはダミーにして、とりあえずXSTで論理合成(synthesize、コンパイルと同じ)をしてみる。予感は当たって、膨大なエラーに見舞われる。トップモジュールを作り、4ビットのBCDデータから7セグLEDのエレメントにデコードするサブモジュール、それに入力のバイナリから4つの7セグLEDをダイナミックドライブするサブモジュールだけなのだが、殆どのデータの受け渡しでエラーが出ている。Webの情報を頼りに少しづつエラーを減らしていく。データの受け渡しはreg変数だと思っていたが、wireでないと通らないところがある。regはフリップフロップ、wireは単なる接続と習った。どちらでも良いような気がするが良く分からない。遅延の関係かもしれないが、今は調べている暇はない。言われるまま直して行って、データの受け渡しでエラーはなくなった。次のエラーでは参った。2何い、HDLでは除算は2のべき乗でしか割れないのか。そんなこと聞いたことがないぞ。16ビットのバイナリカウンターを作り、UARTからの入力をカウントアップしていく。7セグLEDに9999まで表示させるため、バイナリーの各桁の10進数をだすのに、1000や100で割り、余りを計算しているところだ。あわててWebに助けを求める。これはHDLの仕様のようだ。除算ができなければ、引き算を繰り返せばよい。HDLにはwhileもforループもある。気楽にwhileループを作り、回数を商にして回路を組み直した。おやあ、論理合成(コンパイル)が終わらない。何がおかしいのだろう。いつまで待っても終わらないので、解析の中止ボタンを押す。何回か押して、やっと止まった。おかしいのでタスクマネージャーを立ち上げてみたらCPUの使用率は100%になったままだ。いけないISEが暴走している。