- - PR -
前回は、7セグメントLEDのデコーダとテストベンチを作成してシミュレーションを行いました。皆さん正しく動作させることができたでしょうか? しつこいようですが、実機で動かす前にシミュレーションを実施する癖を付けましょう。
さて、今回は「4bitのカウンタ」を作成しながら「順序回路」の基本について解説します。ちなみに、これまでの連載で紹介した回路は「組み合わせ回路」という種類の回路です。
| 補足:「組み合わせ回路」と「順序回路」 |
| 組み合わせ回路とは、「入力の変化に対応して、出力が変化する回路」のことを指します。組み合わせ回路の場合は、値を保持することができません。 順序回路とは、「現在の入力のみで出力が決まるのではなく、過去の入力にも依存する回路」のことを指します。最近の順序回路はほとんど、Dフリップフロップです。このDフリップフロップにあるようにクロックを使用して値を保持します。 |
| 注:「ISE WebPACK」などツールの使用方法は、第1回 理論より実践! FPGA開発をスタートしようを参考にしてください。 |
| 関連記事: | |
| いまさら聞けない FPGA入門 | |
| 連載:触って学ぼう 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が点灯します。
![]() |
| 図2 赤色LEDの点灯イメージ(0101の場合) |
クロックの立ち下がりのタイミングでも、カウンタの値(0101)はそのまま保持されます。
さらにクロックが立ち上がり、先ほど保持していた値(0101)をカウントアップして保持します(0110)。そして、その結果を赤色LEDに出力します(図3)。
![]() |
| 図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」のときだけに実行されます。つまり、クロックの立ち上がりのときにカウンタがアップします。
以上のことから、この記述の動作は「非同期リセット付き同期カウンタ」になります。
関連記事 半導体/エレクトロニクス
- 連載:イチから作って丸ごと学ぶ! H8マイコン道
- 特集:組み込みシステムに吹く“仮想化”の風
- 連載:組み込みマルチコア進化論(連載中)
- 連載:必修! FPGAタイミング解析の基礎(全5回)
- 連載:−ザ・組み込み−ソフトウェアのハードウェア化(連載中)
- 連載:S08ではじめるマイコン制御プログラミング(全6回)
- 連載:マイコン制御基礎の次(連載中)
- 連載:マイコン制御基礎の基礎(全10回)
- 連載:マイコン制御基礎以前(全10回)
- 連載:H8で学ぶマイコン開発入門(全13回)
- 連載:触って学ぼう FPGA開発入門(全6回)
- 連載:FPGA開発テクニック、チューニングの心得(全6回)
- 特集:いまさら聞けない FPGA入門
- 連載:バラして納得! 電子部品入門(全18回)
- 連載:完全マスター! 電子回路ドリル III(全14回)
- 連載:完全マスター! 電子回路ドリル II(全25回)
- 連載:完全マスター! 電子回路ドリル(全25回)
- 目指せ! 電子回路マスターへの道
- 目指せ! 電子回路マスターへの道 Part2
- 分かっておきたい、IP活用の落とし穴
組み込み開発フォーラム 新着記事
- フルスクラッチの“Hello World”を動かしてみよう(2011/3/31)
- FlexRayプロトコルの概要(その2)(2011/3/29)
- JASA、東北地域に拠点を置く会員企業を支援(2011/3/25)
- NEC、震災の影響を受けた4拠点の生産再開を発表(2011/3/23)
- 内部ブロック図の基礎と共通要素(2011/3/22)
- インテル、被災地におけるITインフラの復旧を支援(2011/3/22)
- Facts on AUTOSAR/AUTOSAR導入の現実(2011/3/18)
- 計測器・震災被害ホットラインを開設、テクトロニクス(2011/3/18)
- ZMP、地震の揺れを多角的に計測するアプリ無償配布(2011/3/16)
- メンター、3Dテレビ・マルチメディア検証プラットフォーム(2011/3/16)
- 【番外編】タチの良い計測値、悪い計測値とは?(2011/3/15)
- tarファイルシステムをAndroidに組み込む!!(2011/3/10)













