HDLを用いて回路を作る際、いきなりコーディングするのではなく、最初にブロック図で回路構成をしっかりとイメージすることが大切だ。
前回の宿題【問題9】は、“6MHzのクロックを入力し、1秒間隔でカウントアップする8ビットバイナリカウンタを設計する”という問題でした。皆さん解けましたでしょうか?
解けた方も解けなかった方も答え合わせをして、次項の解説までぜひ読んでみてください。毎週コツコツ問題を解いて、ハードウェア記述言語によるデジタル回路設計の基礎知識を身に付けましょう。
それでは、解答を発表します!
【問題9】は、いままでの知識を基に少し複雑な回路を作る問題です。現実の回路として「FPGAトレーナ EDX-002」を想定し、1秒間隔でLEDにカウント出力をさせます。それでは詳しく見ていきましょう!
HDLを用いて回路を作る際、いきなりコーディングをしてもうまくいきません。そこで最初にブロック図で回路構成を考えます(図1)。図1の「秒カウンタ」は1Hzの信号を出力します。そして、その信号を「8ビットバイナリカウンタ」にクロック入力しています。
それでは、このブロック図を基に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のタイムチャートをご覧ください。
変数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ビットバイナリカウンタにイネーブル信号を入力しています。ココがポイントです。
それでは図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)。
単相同期設計の要(かなめ)は、
です。
人間の思考は時系列に考えることに慣れているので、はじめのうちは単相同期設計を難しく感じるかもしれません。しかし、“電子回路とは並行動作するもの”です。この設計手法をぜひマスターしてください。
Copyright © ITmedia, Inc. All Rights Reserved.