組み込まれたエンジニア

我輩は石である。名前はまだ無い。

ビットマップディスプレイとキャラクターディスプレイ

2011-06-17 07:48:18 | Weblog

学生と話をしていて、キャラクターディスプレイのことがよく伝わらなかったので、サンプルプログラムを作った。ビットマップディスプレイは直感的だけれど、キャラクターディスプレイは一度間接参照が入るので、初心者には分かりにくいのかも?

サンプルは、VGAの640x480画面にドットクロック25MHzで80桁x24行(程度)表示する。デバッグ用に、トップモジュールはsimという名前になっているので、FPGAベンダーのツールを使うときには注意が必要。(ファイル名!=トップモジュール)

フォントは、X11の8x16.bdfを同封し、これからキャラジェネのパターンを抽出するスクリプト、初期画面のデータを作成するスクリプトを用意して、合成可能なVerilogHDLファイルを生成するMakefileも入っている。

さくっと3時間ほどで作ったので、整理はされていないけれど、短いプログラムなので、じっくり読むと分かると思う。

ALTERAのDE0で動作確認済み。

 

DE0は、nCEとVGA出力ピンがぶつかっていて、そのままだとQuartusIIがエラーを出してコンパイルできない。設定から、nCEをユーザーIOに切り替える必要があるそうだ。

 


NSL: 構造体の初期化

2011-06-13 09:22:06 | Weblog

NSLでは、regタイプの構造体インスタンスには初期値を与えられます。

struct st {
  a[4];
  b[8];
  c[12];
  } ;

declare x {}

module x{
  st reg mm = {5,0x21,543};
  }



注意が必要なのは、

{5,0x21,543}

を通常の実行文において記述すると、連結演算子とみなして、連結しようとしてしまうことです。この場合、ビット数推定ができないので、エラーになります。各フィールドのビット数を厳密に指定して記述すれば、初期化でも実行文でも使える記述になるので、好ましいでしょう。

個々に設定せずに、まとめて0に初期化したい場合、


st reg mm =0;


と書くこともできます。


念のため書いておきますが、wireタイプには初期値は設定できません。