連載
» 2008年10月09日 00時00分 公開

完全マスター! 電子回路ドリル III(6):【問題6】 7セグメントLEDデコーダを作成しよう

今回は、Verilog HDLで記述された10進カウンタの“テスト・ベンチ”を作成し、シミュレーションと波形表示にチャレンジする。

[横田一弘 埼玉県立新座総合技術高等学校 教諭,@IT MONOist]

【問題5】の解答

 前回の宿題【問題5】は、“Verilog HDLで記述された10進カウンタをコンピュータを使用してシミュレーションし、タイムチャートを作成する”という問題でした。皆さん解けましたでしょうか?

 解けた方も解けなかった方も答え合わせをして、次項の解説までぜひ読んでみてください。毎週コツコツ問題を解いて、ハードウェア記述言語によるデジタル回路設計の基礎知識を身に付けましょう。

 それでは、解答を発表します! なお、今回はシミュレーションと波形表示にツールを使用しています(詳しくは解説編をご覧ください)。


問題5

答え.

答え


【問題5】の解説

 【問題5】は実際にコンピュータを使ってシミュレーションを行う問題ですので、戸惑った人も多いのではないでしょうか。あらかじめ回路を動作させ、各部の信号を検証することで、確実に動作する回路を作ることができるため、HDLによる回路設計の世界では“コンピュータを使ったシミュレーション”が欠かせません。

 まず、図1をご覧ください。HDLで記述された回路のシミュレーションは「テスト・ベンチ」と呼ばれるモジュールによって行われます。

シミュレーションの概要 図1 シミュレーションの概要

 テスト・ベンチは、Verilog HDLで記述された回路に信号を与え、動作検証のための各部への信号を指示するプログラムで、テスト・ベンチ自身もVerilog HDLで記述されます。

 以下に、【問題5】の10進カウンタ用のテスト・ベンチ「counter_test」を示します。

module counter_test;
 
reg CLK, RES;
wire [3:0] Q;
 
counter i0(CLK, RES, Q);
 
always #5 CLK = ~CLK;
 
initial begin
        CLK = 0;
        RES = 0;
#23     RES = 1;
#150    $finish;
end
 
initial begin
        $monitor("CLK=%d, RES=%d, Q=%d", CLK, RES, Q);
        $dumpfile("counter.vcd");
        $dumpvars(0, counter_test);
end
 
endmodule

 それでは、テスト・ベンチの記述についてポイントを詳しく説明していきます。

テスト対象モジュールのインスタンス化

 図1のように、テスト・ベンチの中に対象モジュールcounterを組み込むために、

counter i0(CLK, RES, Q);

と記述し、counterをインスタンス化(実体化)します。識別子「i0」は実体化された10進カウンタの名前です。続く括弧(“(”と“)”)の中に接続する信号を記述します。

テスト信号を作る

 クロック信号CLKは、always文で作ります。

always #5 CLK = ~CLK;

 ここでシャープ(“#”)は遅延時間を表し、このalways文では5ユニット時間ごとに変数CLKを反転します。

 リセット信号RESは、initial文で作ります。

initial begin
        CLK = 0;
        RES = 0;
#23     RES = 1;
#150    $finish;
end

 initial文は、シミュレーション開始から1回だけ実行される文です。

 まず、開始時にCLKとRESを“0”にクリアします。23ユニット時間経過後、RESに“1”をセットしています。さらに150ユニット時間経過後、$finishシステム・タスクでシミュレータが終了します。

観察する信号を指示する

 $monitorは、指定した信号が変化するたびにコンソールに信号の値を表示するシステム・タスクです。

$monitor("CLK=%d, RES=%d, Q=%d", CLK, RES, Q);

 上記の記述により、CLK、RES、Qのいずれかが変化したとき、各信号が1行表示されます。$monitorはC言語のprintfのような書式が指定でき、“%d”の部分に信号の値を出力します。

 続く、$dumpfileと$dumpvarsは波形データをファイルに出力するシステム・タスクです。

$dumpfile("counter.vcd");
$dumpvars(0, counter_test);

 今回は、後述の波形表示ツール「GTKWave」を使用するため、波形データをVCDファイル形式で出力します。$dumpfileでは波形データのファイル名を指定し、$dumpvarsでは波形出力を行う開始時間とモジュールを指定します。

シミュレータ環境とVerilog HDLの準備

 それでは、実際にシミュレータで回路を動作させみましょう。はじめに、ご自身のPCに波形データを作成するためのシミュレータ「IcarusVerilog」と、波形を表示する「GTKWave」をインストールします(ここではWindows Vista環境を例に解説します)。

 IcarusVerilogのWindows版はIcarus Verilog for Windowsから入手できます。ここから「iverilog-0.8.6_setup.exe」をダウンロードして、インストーラを起動します。

 インストールの途中で、IcarusVerilogのインストール先を聞かれますので任意のディレクトリを指定します(今回は「C:\iVerilog」と指定しています)(画面1)。後は標準設定のままインストールしてください。

IcarusVerilogのインストール・パスの設定 画面1 IcarusVerilogのインストール・パスの設定

 続いて、GTKWaveのインストールを行います。

 GTKWaveのWindows版はThe Win32 GTKWave Homepageから入手できます。ここから、「GTKWave-win32-1.3.19.zip」「DLL-19990828.zip」「zlib114.zip」の3つのファイルをダウンロードします。そして、Cドライブの直下に「GTKWave」というディレクトリを作成し、ダウンロードした3つのファイルをそれぞれ解凍し、その中身をすべて「C:\GTKWave」以下に移動します。

 ここでPCのシステムプロパティから、環境変数「Path」の変数値の末尾に「;C:\GTKWave」を追加してください(画面2)。

環境変数Pathの追加 画面2 環境変数Pathの追加

 次に、Verilog HDLファイルを準備します。テキストエディタで【問題5】の10進カウンタ(counter.v)と前述のテスト・ベンチ(counter_tes.vt)の2つを作成し、これらを任意のディレクトリに保存します(今回は「D:\verilog\counter」以下に配置)。

シミュレータの起動と波形表示

 これで準備は完了です。それではシミュレーションを行います。

 Windowsのプログラムから「コマンドプロンプト」を起動して、ファイルの置かれているディレクトリ「D:\verilog\counter」に移動します。そして、「iverilog」コマンドでシミュレーションのためのオブジェクトファイル(デフォルトではa.out)を作成します。続いて、「vvp」コマンドでシミュレータを実行すると、$monitorによる結果が表示されます。ここで、変数Qの値が「9」の次で「0」に戻る(10進カウンタとして動作している)ことを確認してください。

Microsoft Windows [Version 6.0.6001]
Copyright (c) 2006 Microsoft Corporation.  All rights reserved.
 
C:\Users\xxxx>d:  ←ドライブの移動
 
D:\>cd \verilog\counter ←ディレクトリの移動
 
D:\verilog\counter>iverilog counter.v counter_test.v ←オブジェクトの作成
 
D:\verilog\counter>vvp a.out ←シミュレータの実行
VCD info: dumpfile counter.vcd opened for output.  ←シミュレーションの結果
CLK=0, RES=0, Q= 0
CLK=1, RES=0, Q= 0
CLK=0, RES=0, Q= 0
CLK=1, RES=0, Q= 0
CLK=0, RES=0, Q= 0
CLK=0, RES=1, Q= 0
CLK=1, RES=1, Q= 1
CLK=0, RES=1, Q= 1
CLK=1, RES=1, Q= 2
CLK=0, RES=1, Q= 2
CLK=1, RES=1, Q= 3
CLK=0, RES=1, Q= 3
CLK=1, RES=1, Q= 4
CLK=0, RES=1, Q= 4
CLK=1, RES=1, Q= 5
CLK=0, RES=1, Q= 5
CLK=1, RES=1, Q= 6
CLK=0, RES=1, Q= 6
CLK=1, RES=1, Q= 7
CLK=0, RES=1, Q= 7
CLK=1, RES=1, Q= 8
CLK=0, RES=1, Q= 8
CLK=1, RES=1, Q= 9
CLK=0, RES=1, Q= 9
CLK=1, RES=1, Q= 0 ←「9」の次が「0」になっている
CLK=0, RES=1, Q= 0
CLK=1, RES=1, Q= 1
 
(以下、略)

 「vvp」コマンドを実行すると、波形ファイル(counter.vcd)が「C:\verilog\counter」に作成されますので、以下のように「winwave」コマンドを実行し、GTKWaveを起動します。

D:\verilog\counter>winwave counter.vcd ←波形ファイルの表示

 画面3が表示されたら、メニューの「Search」−「Signal Search Tree」を選択します。すると「Signal Search Tree」ウィンドウが表示されるので表示したい信号を選択します。

GTKWaveによる波形表示 画面3 GTKWaveによる波形表示

 以上のように、シミュレーション環境があればVerilog HDLの回路をあらかじめ動作させることが可能です。動作確認や検証に役立ちますのでぜひ試してみてください。

次回までの宿題 ― 【問題6】

問題6

4ビットの入力により、以下の7セグメントLEDを表示するデコーダを作成してください

問題6

答え. 解答はこちら(←クリック)



Copyright © ITmedia, Inc. All Rights Reserved.