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

完全マスター! 電子回路ドリル III(8):【問題8】 ブロッキング代入とノン・ブロッキング代入

「10進カウンタ」と「7セグメントLEDデコーダ」の接続を例に、大規模回路などの設計に用いられる“モジュール階層構造”について解説。

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

【問題7】の解答

 前回の宿題【問題7】は、“10進カウンタと7セグメントLEDデコーダを接続した回路をVerilog HDLで作成する”という問題でした。皆さん解けましたでしょうか?

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

 それでは、解答を発表します!


問題7

答え.

答え


【問題7】の解説

 【問題7】は「あるモジュールに別のモジュールを接続して1つの回路を作る」という問題です。ここでは図1のように、10進カウンタ(counter.v)の出力に、7セグメントLEDデコーダ(dec7seg.v)を接続します。この2つのモジュールはこれまでの連載ですでに完成しているので労を要せず10進カウンタの出力をLED表示できるはずです。

モジュールの階層構造 図1 モジュールの階層構造

 それでは詳しく解説していきましょう。

 図1では、モジュールtopの中にモジュールcounterとモジュールdec7segを収めていますが、このような回路構成を「モジュールの階層構造」と呼びます。大規模な回路などは、機能ごとに回路をモジュール化して、それらを接続するように作ります。

 また、あるモジュールの中にほかのモジュールを組み込むことを「インスタンス化」と呼びます。Verilog HDLでの記述スタイルは、

(1) モジュール名 インスタンス名 ( 信号 , 信号 , ……) ;

(2) モジュール名 インスタンス名 ( . ポート名 ( 信号 ) , . ポート名 ( 信号 ) , …… ) ;



のように、(1)モジュールに接続する信号を順番で指定する方法と、(2)ポート名で指定する方法がありますが、今回は記述が少ない(1)の方法を用いて説明していきます。

 10進カウンタのインスタンス化は、

counter i0(CLK, RES, count);

で行います。

 一方、10進カウンタモジュール(counter.v)は、【問題5】で扱いましたが、

module counter(CLK, RES, Q);
(中略)

のように定義されています。モジュールtopとモジュールcounterとの信号接続は、記述順序によるので、CLKとCLK、RESとRES、countとQが接続されます(図1)。

 7セグメントLEDデコーダも同様に、そのインスタンス化は、

dec7seg i1(count, LED);

で行います。

 7セグメントLEDデコーダ(dec7seg.v)は、【問題6】で扱いましたが、そのモジュール定義は、

module dec7seg(data, LED);
(中略)

なので、モジュールtopとの信号接続は、countとdata、LEDとLEDになります(図1)。

 モジュールtopから見れば、モジュール接続信号は単なる信号線なのでwire宣言します。また、モジュール名は「回路機能」、インスタンス名は「個々の部品」ととらえるとよいでしょう。なお、インスタンス名はユーザーが適切な識別子を付けます。

 以上でモジュール接続の説明を終わりますが、一般的に、このような小さい単位でのモジュール分割は行われません。そこで1つのモジュールにまとめたパターンを以下に示します(dcount.v)。

module dcount(CLK, RES, LED);
input CLK, RES;
output [7:0] LED;
 
wire CLK, RES;
reg [7:0] LED;
reg [3:0] count;
 
always @(posedge CLK or negedge RES)
    if (RES == 1'b0)
        count = 4'd0;
    else if (count == 4'd9)
        count = 4'd0;
    else
        count = count + 4'd1;
 
always @(count)
    case (count)
    4'd0: LED = 8'b11000000;
    4'd1: LED = 8'b11111100;
    4'd2: LED = 8'b10010010;
    4'd3: LED = 8'b10011000;
    4'd4: LED = 8'b10101100;
    4'd5: LED = 8'b10001001;
    4'd6: LED = 8'b10000001;
    4'd7: LED = 8'b11001100;
    4'd8: LED = 8'b10000000;
    4'd9: LED = 8'b10001000;
    default: LED = 8'bxxxxxxxx;
    endcase
 
endmodule

 どうですか? より本格的なVerilog HDLの回路設計ができましたね。1つ目のalways文で10進カウンタを、2つ目のalways文で7セグメントLEDデコーダを記述しているのが分かります。

 以上のようにHDLの回路設計では抽象度の高い記述が可能です。もう、ゲートやフリップフロップによる回路設計とサヨナラして、図1のようなブロックで回路を描けばよいのです。

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

問題8

Verilog HDLには、“=”と“=>”の2種類の代入があります。以下の2つのVerilog HDLをテストして動作の違いを調べてください

問題8

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



Copyright © ITmedia, Inc. All Rights Reserved.