カウンタ、すなわち“順序回路”をVerilog HDLで記述するには、always文の記述スタイルをきちんと理解することが大切だ。
前回の宿題【問題4】は、“4ビットカウンタをVerilog HDLで記述する”という問題でした。皆さん解けましたでしょうか?
解けた方も解けなかった方も答え合わせをして、次項の解説までぜひ読んでみてください。毎週コツコツ問題を解いて、ハードウェア記述言語によるデジタル回路設計の基礎知識を身に付けましょう。
それでは、解答を発表します!
【問題4】はカウンタ、すなわち「順序回路」を記述する問題です。
【問題1】から【問題3】までは、assign文により「組み合わせ回路」を作りましたが、今回の順序回路はalways文を使って記述します。それでは詳しく解説していきましょう。
HDLでは、順序回路を“クロックが変化するタイミング、すなわちエッジ信号により出力が設定される回路”とシンプルにとらえます。これを念頭に置いて、次のalways文の記述スタイルを見てください。
always @( エッジ信号 or エッジ信号 ・・・ ) 文
always文では予約語alwaysの後に、アットマーク(“@”)とそれに続く括弧(“(”と“)”)で動作タイミングを指定します。Verilog HDLでは信号の「立ち上がりエッジ」を予約語posedgeで、信号の「立ち下がりエッジ」を予約語negedgeで表します。
posedge 信号名 ←立ち上がりエッジ
negedge 信号名 ←立ち下がりエッジ
【問題4】のカウンタはCLKの立ち上がりで動作するため、always文を
always @(posedge CLK)
と記述します。
続いて、カウンタ本体ですが、加算器で簡単に構成できます。ただしリセット機能が必要なのでif文を使って、
if (RES == 1'b0) Q = 4'd0; else Q = Q + 4'd1;
のように記述します。これにより、「RESが“0”のとき、変数Qは“0”になり、それ以外のときは変数Qをカウントアップ」と機能定義されます。
以上で4ビットカウンタが完成しましたが、Verilog HDLでは「always文の出力(結果)をreg宣言」しなければなりません。
reg [ MSB : LSB ] 変数名 , 変数名 , ・・・ ;
reg宣言された識別子は「変数」を意味し、Verilog HDLでは“レジスタ型のデータ”と呼ばれます。【問題4】では、always文の出力Qを
reg [3:0] Q;
とreg宣言し、4ビットの変数として扱います。
それでは、このカウンタ回路の動作を検証してみましょう。図1にそのタイムチャートを示します。
回路の動作開始時、変数Qの値は不定です。そこで起動時に信号RESを“0”とし、1つ目のクロックでカウンタをゼロクリアします。信号RESが“1”になると変数Qが1ずつカウントアップされます。
いかがでしょうか? always文を使いこなすことがVerilog HDLによる回路設計の第一歩といえます。その仕組みを機械的(シンプル)にとらえ、理解するとよいでしょう。
最後に、Verilog HDLの定数について触れておきましょう。定数の記述スタイルは、
サイズ ' 基数 整数値
です。約束事としては、
があります。
Copyright © ITmedia, Inc. All Rights Reserved.