こんにちは。梅おにぎりです。Verilog HDL の研修で 4 bit カウンタを作成しました。そのプログラムがこちら。
クロックが立ち上がるごとに “0001” ずつカウントアップしてくように設計しました。要求通りに機能するかを確認するために、テストベンチを作成して ModeleSim®-Altera でシミュレーションをしてみました。クロックの周期は 20 ns となるように設定。そのシミュレーション結果がこちら。
なんと、出力が不定になってしまいました。なぜでしょうか?とりあえずもう一度プログラムを見直してみましょう。
ここでは確かにクロックの立ち上がりで count に “0001” が足されるように記述してあります。でもここで気付いたことがひとつ。最初のクロックの立ち上がりの際に count の元の値が定まっていないので “0001” を足すことができずに不定になっているのでは。そう、 count の初期値を設定してあげればいいんだ。
というわけで、プログラムを以下のように書き換えてみました。
書き換えたのは 6 行目の赤下線の部分。この記述で count の初期値を定義しました。そして、そのシミュレーション結果がこちら。今度はちゃんと出力がカウントアップしていく様子を観察することができました。
インテルのCPLD/FPGA では立ち上げ後、レジスタの初期値は “0” となるように設計されています。また、RAM として実現したメモリ・ブロックでは論理設計時に .mif や .hex などのファイルで初期値を定義していない場合の初期値は “0” となります (ROM として実現したメモリ・ブロックは初期値の定義が不可欠)。
注意:レジスタやメモリの初期値はデバイス・ファミリによって異なる場合があります。
そのため インテル® Quartus® Prime 開発ソフトウェア で論理合成や配置配線を行う際には、初期値の記述をしていなくてもデバイスの動作に影響を与えることがないので問題ありません。
しかし、シミュレーションを行う際には必要に応じて初期値を定義しないと波形がうまく出てこないことがあります。
そのためシミュレーションを行う前には初期値が定義されているかをきちんと確認することが大切であると気付かされました。