順序回路の基本! カウンタを作成しよう触って学ぼう FPGA開発入門(3)(1/3 ページ)

4bitカウンタを作成して「順序回路」の基本をマスターしよう。また、スイッチによるカウントダウン動作や10進カウンタへの変更についても解説

» 2007年03月16日 00時00分 公開
[鳥海佳孝 設計アナリスト,@IT MONOist]

 前回は、7セグメントLEDのデコーダとテストベンチを作成してシミュレーションを行いました。皆さん正しく動作させることができたでしょうか? しつこいようですが、実機で動かす前にシミュレーションを実施する癖を付けましょう。

 さて、今回は「4bitのカウンタ」を作成しながら「順序回路」の基本について解説します。ちなみに、これまでの連載で紹介した回路は「組み合わせ回路」という種類の回路です。


※補足:「組み合わせ回路」と「順序回路」
組み合わせ回路とは、「入力の変化に対応して、出力が変化する回路」のことを指します。組み合わせ回路の場合は、値を保持することができません。
順序回路とは、「現在の入力のみで出力が決まるのではなく、過去の入力にも依存する回路」のことを指します。最近の順序回路はほとんど、Dフリップフロップです。このDフリップフロップにあるようにクロックを使用して値を保持します


※注
「ISE WebPACK」などツールの使用方法は、連載第1回「理論より実践! FPGA開発をスタートしよう」を参考にしてください。



4bitフリーランカウンタを作成しよう(1)

4bitのカウンタとは?

 まず、今回のテーマ「4bitのカウンタ」について簡単に説明します。

 4bitのカウンタとは、「0000(0x0)」〜「1111(0xF)」の間を1つずつカウントアップ(ダウン)していく回路です。ちなみに、4bitなので出力は赤色LEDで行います。

 このカウントは、入力されたクロック信号(0から1への変化)によって行われます。クロックが0から1へ立ち上がったら、カウンタを+1にして値を保持します。そして、直接その値を赤色LEDに出力します。

 また、クロックの立ち下がり(1から0への変化)が起きても、立ち上がり(0から1への変化)の時にカウントアップしたカウンタの値はそのまま保持されます。

クロックの立ち上がり、立ち下がり時のイメージ 図1 クロックの立ち上がり、立ち下がり時のイメージ

 例えば、カウンタの値が「0101(0x5)」であれば、カウンタの値を保持して図2のように赤色LEDが点灯します。

赤色LEDの点灯イメージ(0101の場合) 図2 赤色LEDの点灯イメージ(0101の場合)

 クロックの立ち下がりのタイミングでも、カウンタの値(0101)はそのまま保持されます。

 さらにクロックが立ち上がり、先ほど保持していた値(0101)をカウントアップして保持します(0110)。そして、その結果を赤色LEDに出力します(図3)。

赤色LEDの点灯イメージ(0110の場合) 図3 赤色LEDの点灯イメージ(0110の場合)

 クロックの立ち下りの際は、先ほどと同様にカウンタの値(0110)はそのまま保持されます。

 今回のポイントは、クロックの立ち上がり(0から1への変化)時にカウントアップして保持した値をクロックが立ち下がった(1から0へ変化)際にも、保持し続けているという点です。

 この「値を保持する動き」こそが順序回路の動作なのです。

 それでは、今回も「論理よりも実践」です! まずは、単純な機能を持つフリーランのカウンタをシミュレーション上で動作させてみましょう。

4bitフリーランカウンタのソース

 「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
リスト1 4bitのフリーランカウンタ(COUNT4.v

5行目

 「COUNT」という信号は、7〜13行目のalways文の中で左辺として使用されているため、4bitのreg宣言を行う必要があります。

7行目

 always文で、カウンタの動作を記述します(注1)。「()」のセンシティビティ・リストには、クロック信号の立ち上がり(positive edge)「CLK」、またはクロック信号の立ち下がり(negative edge)「RESET」を指定します(注2)。CLKの立ち上がり、RESETの立ち下がりごとに、always文中の「begin」〜「end」で囲まれた代入、つまりカウンタの動作が行われます。

※注1:
Verilog-HDLの手続きは、「initial」か「always」ブロックの中に記述する必要があります。また、initialブロックは時刻0に1度だけ、alwaysブロックは永久に繰り返し起動されます。


※注2:
「立ち上がり」とは、クロック信号が0から1へと変化する瞬間を指し、「posedge」を使って指定します。また、「立ち下がり」とは、クロック信号が1から0へと変化する瞬間を指し、「negedge」を使って指定します。


8〜13行目

 if文を使用して、カウンタの動作を記述します。センシティビティ・リストにCLKの立ち上がり以外の信号としてRESETの立ち下がりを記述していますので、最初にRESET信号の条件について記述します(9行目)。これによりRESET信号が立ち下がれば(0であれば)、この条件が真になり10行目の代入が行われます。動作としては「非同期リセット」が掛かったことになります。

 12行目は、RESET信号が「1」のときの条件が記述されています。ここでは、カウントアップ(+1)の動作を行います。この代入は、CLK信号が立ち上がっていて、かつRESET信号が「1」のときだけに実行されます。つまり、クロックの立ち上がりのときにカウンタがアップします。

 以上のことから、この記述の動作は「非同期リセット付き同期カウンタ」になります。

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.