連載
» 2008年11月06日 00時00分 公開

完全マスター! 電子回路ドリル III(10):【問題10】 波形から回路を作ろう

HDLを用いて回路を作る際、いきなりコーディングするのではなく、最初にブロック図で回路構成をしっかりとイメージすることが大切だ。

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

【問題9】の解答

 前回の宿題【問題9】は、“6MHzのクロックを入力し、1秒間隔でカウントアップする8ビットバイナリカウンタを設計する”という問題でした。皆さん解けましたでしょうか?

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

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


問題9

答え.

答え


【問題9】の解説

 【問題9】は、いままでの知識を基に少し複雑な回路を作る問題です。現実の回路として「FPGAトレーナ EDX-002」を想定し、1秒間隔でLEDにカウント出力をさせます。それでは詳しく見ていきましょう!

 HDLを用いて回路を作る際、いきなりコーディングをしてもうまくいきません。そこで最初にブロック図で回路構成を考えます(図1)。図1の「秒カウンタ」は1Hzの信号を出力します。そして、その信号を「8ビットバイナリカウンタ」にクロック入力しています。

【問題9】の回路構成(その1) 図1 【問題9】の回路構成(その1)

 それでは、このブロック図を基にVerilog HDLを記述していきましょう。

 まずは秒カウンタですが、6MHzから1Hzを得るために「6000000進カウンタ」を作ります。このカウンタは0〜5999999までカウントするので、

5999999 = ( 10110111000110101111111 )2



により、23ビットの変数scaleをreg宣言します。

reg [22:0] scale;

 続いて秒カウンタですが、こちらは次のように記述します。

always @(posedge CLK or negedge RES)
    if (RES == 1'b0)
        scale <= 23'd0;
    else if (scale == 23'd5999999)
        scale <= 23'd0;
    else
        scale <= scale + 23'd1;

 また、1Hzの信号SECは組み合わせ回路により、

assign SEC = scale == 23'd5999999;

で作ることができます。

 それでは、ここでまでの回路の動作を説明します。まず、図2のタイムチャートをご覧ください。

秒カウンタの動作 図2 秒カウンタの動作

 変数scaleはクロックCLKの立ち上がりでカウントアップしていきます。そして、その値が5999999になると、次のクロックで変数scaleはゼロクリアされます。

 変数scaleが5999999のとき信号SECが“1”(High)になるので、信号SECの立ち下がりエッジで8ビットバイナリカウンタを動作させます。Verilog HDLの記述は次のとおりです。

always @(negedge SEC or negedge RES)
    if (RES == 1'b0)
        Q <= 8'd0;
    else
        Q <= Q + 8'd1;

 これで【問題9】の回路(seccnt0.v)が完成しました。実際にこの回路はFPGAトレーナ EDX-002で動作しますが、実はあまり良いものではありません。

 なぜなら、今日の回路設計では「単相同期設計(=すべての機能をクロックに同期させる)」の定石があります。それでは定石に従って、【問題9】の回路を設計変更してみましょう。

 図3をご覧ください。今度は秒カウンタと8ビットバイナリカウンタにクロックが入力されています。秒カウンタで1Hzの信号を作るという点は変わりありませんが、8ビットバイナリカウンタにイネーブル信号を入力しています。ココがポイントです。

【問題9】の回路構成(その2) 図3 【問題9】の回路構成(その2)

 それでは図3のブロック図を基に回路を記述してみましょう(seccnt1.v)。ここでは変更点のみを解説します。

 イネーブル信号は変数scaleで作ります。

assign EN = scale == 23'd5999999;

 そして、「イネーブル付き8ビットバイナリカウンタ」は次のように記述します。

always @(posedge CLK or negedge RES)
    if (RES == 1'b0)
        Q <= 8'd0;
    else if (EN == 1'b1)
        Q <= Q + 8'd1;

 このalways文は“posedge CLK”により、秒カウンタと同様にクロックCLKの立ち上がりで動作します。これで“1つのクロックに同期して、秒カウンタと8ビットバイナリカウンタが動作する”ことになります。

 さらにif文では、EN=“1”(High)でカウンタQをカウントアップしています。つまり、クロックCLKの立ち上がりで、かつイネーブル信号に制御されて8ビットバイナリカウンタは動作するのです(図4)。

クロック同期8ビットバイナリカウンタの動作 図4 クロック同期8ビットバイナリカウンタの動作

 単相同期設計の要(かなめ)は、

  1. 1つのクロックに同期するようにalways文を記述する
  2. 各機能はイネーブル信号によって制御される

です。

 人間の思考は時系列に考えることに慣れているので、はじめのうちは単相同期設計を難しく感じるかもしれません。しかし、“電子回路とは並行動作するもの”です。この設計手法をぜひマスターしてください。

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

問題10

4MHzクロックにより、以下のタイムチャートに示す信号を出力する回路を作ってください

問題10

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



Copyright © ITmedia, Inc. All Rights Reserved.