4bitカウンタを作成して「順序回路」の基本をマスターしよう。また、スイッチによるカウントダウン動作や10進カウンタへの変更についても解説
前回は、7セグメントLEDのデコーダとテストベンチを作成してシミュレーションを行いました。皆さん正しく動作させることができたでしょうか? しつこいようですが、実機で動かす前にシミュレーションを実施する癖を付けましょう。
さて、今回は「4bitのカウンタ」を作成しながら「順序回路」の基本について解説します。ちなみに、これまでの連載で紹介した回路は「組み合わせ回路」という種類の回路です。
関連記事: | |
---|---|
⇒ | いまさら聞けない FPGA入門 |
まず、今回のテーマ「4bitのカウンタ」について簡単に説明します。
4bitのカウンタとは、「0000(0x0)」〜「1111(0xF)」の間を1つずつカウントアップ(ダウン)していく回路です。ちなみに、4bitなので出力は赤色LEDで行います。
このカウントは、入力されたクロック信号(0から1への変化)によって行われます。クロックが0から1へ立ち上がったら、カウンタを+1にして値を保持します。そして、直接その値を赤色LEDに出力します。
また、クロックの立ち下がり(1から0への変化)が起きても、立ち上がり(0から1への変化)の時にカウントアップしたカウンタの値はそのまま保持されます。
例えば、カウンタの値が「0101(0x5)」であれば、カウンタの値を保持して図2のように赤色LEDが点灯します。
クロックの立ち下がりのタイミングでも、カウンタの値(0101)はそのまま保持されます。
さらにクロックが立ち上がり、先ほど保持していた値(0101)をカウントアップして保持します(0110)。そして、その結果を赤色LEDに出力します(図3)。
クロックの立ち下りの際は、先ほどと同様にカウンタの値(0110)はそのまま保持されます。
今回のポイントは、クロックの立ち上がり(0から1への変化)時にカウントアップして保持した値をクロックが立ち下がった(1から0へ変化)際にも、保持し続けているという点です。
この「値を保持する動き」こそが順序回路の動作なのです。
それでは、今回も「論理よりも実践」です! まずは、単純な機能を持つフリーランのカウンタをシミュレーション上で動作させてみましょう。
「4bitフリーランカウンタ」のVerilog-HDLソースを以下に示します(注)。
1 module COUNT4(RESET, CLK, COUNT); 2 input RESET, CLK; 3 output [3:0] COUNT; 4 5 reg [3:0] COUNT; 6 7 always @(posedge CLK or negedge RESET) 8 begin 9 if (RESET == 1'b0) 10 COUNT <= 4'h0; 11 else 12 COUNT <= COUNT + 4'h1; 13 end
「COUNT」という信号は、7〜13行目のalways文の中で左辺として使用されているため、4bitのreg宣言を行う必要があります。
always文で、カウンタの動作を記述します(注1)。「()」のセンシティビティ・リストには、クロック信号の立ち上がり(positive edge)「CLK」、またはクロック信号の立ち下がり(negative edge)「RESET」を指定します(注2)。CLKの立ち上がり、RESETの立ち下がりごとに、always文中の「begin」〜「end」で囲まれた代入、つまりカウンタの動作が行われます。
if文を使用して、カウンタの動作を記述します。センシティビティ・リストにCLKの立ち上がり以外の信号としてRESETの立ち下がりを記述していますので、最初にRESET信号の条件について記述します(9行目)。これによりRESET信号が立ち下がれば(0であれば)、この条件が真になり10行目の代入が行われます。動作としては「非同期リセット」が掛かったことになります。
12行目は、RESET信号が「1」のときの条件が記述されています。ここでは、カウントアップ(+1)の動作を行います。この代入は、CLK信号が立ち上がっていて、かつRESET信号が「1」のときだけに実行されます。つまり、クロックの立ち上がりのときにカウンタがアップします。
以上のことから、この記述の動作は「非同期リセット付き同期カウンタ」になります。
Copyright © ITmedia, Inc. All Rights Reserved.