回路を効率よくシミュレーションするために、今回は回路のパラメタ化について解説。険しかったHDLマスターへの道もゴール目前だ!!
前回の宿題【問題11】は、“【問題10】の回路(shift.v)を検証するテスト・ベンチを作成し、シミュレータでその動作を確認する”という問題でした。皆さん解けましたでしょうか?
解けた方も解けなかった方も答え合わせをして、次項の解説までぜひ読んでみてください。毎週コツコツ問題を解いて、ハードウェア記述言語によるデジタル回路設計の基礎知識を身に付けましょう。
それでは、解答を発表します!
【問題11】は、【問題10】で作った回路(shift.v)をシミュレータで検証する問題です。図1にその回路の構成を示します。
さて、図1の回路をシミュレーションするわけですが、1つ問題があります。それは、「1/4000カウンタ」のイネーブル信号ENが、4000回に1度しかイネーブル(ここでは“1”)にならないという点です。
そこで、このような回路を効率よくシミュレーションするために、今回は“回路のパラメタ化”について紹介していきます。それでは詳しく見ていきましょう!
パラメタを使うには、最初にパラメタの宣言をしなければなりません。Verilog HDLの記述スタイルは、
parameter 定数名 = デフォルト値 ;
のようになります。この記述スタイルに倣い、【問題10】で作った回路(shift.v)を変更していきます。
【問題11】では、1/4000カウンタの4000をパラメタ化するため、
parameter SCALECNT = 12'd4000;
とパラメタ宣言します。
そして、カウンタ本体を、
always @(posedge CLK or negedge RES) if (RES == 1'b0) scale <= 12'd0; else if (scale == (SCALECNT - 1)) scale <=12'd0; else scale <= scale + 12'd1;
と定数SCALECNTを使ってコーディングし直します。
同様にイネーブル信号ENを、
assign EN = scale == (SCALECNT - 1);
とパラメタ化します。
以上の作業で、【問題10】の回路が“柔らかく(?)”なりました(shift1.v)。
次にテスト・ベンチを作成していきますが、その際、次のdefparam文を使うとテスト・ベンチからパラメタ値を変更できます。
defparam インスタンス名 .定数名 = 値 ;
テスト・ベンチでは、以下のように対象モジュールをインスタンス化しています。
shift i0(CLK, RES, Q);
そして、インスタンスi0内の定数SCALECNTの値を「4」に変更します。
defparam i0.SCALECNT = 4;
以上のように、パラメタの値変更はモジュールのインスタンス化に伴い行われます。
図2はテスト・ベンチ(shift_test.v)によるシミュレーションの結果です。ご覧のとおり定数SCALECNTが「4」に置き換えられて、イネーブル信号ENがカウンタ“scale=3”で発生していることが分かります。
「パラメタによる柔軟性のある回路の実現」はHDLの特典です。今回はカウンタ定数をパラメタ化しましたが、この手法を使うとビット幅などさまざまな回路定数をパラメタ化することが可能です。
さて、本来であればここで12問目の宿題を提示するところなのですが、実は今回解説した【問題11】で最後になります。
3学期ではHDLについて、さまざまな問題をお届けしました。皆さん、いかがでしたか? 筆者が初めてVerilog HDLを学んだときは「プログラム言語で回路が作れるなんて!」と、非常に驚いたものです。そして、学べば学ぶほどその奥の深さに驚かされました。
HDLの出現は、
などが主な要因といえるでしょう。そして、いまもなお電子回路の進歩はとどまるところを知りません。回路図による設計からHDLによる回路設計へシフトしているいまだからこそ、本連載を通じて、この“新しいデジタル回路の設計技術”の習得を目指してみてはいかがでしょうか?
というわけで、次回は3学期編としてお届けした連載「完全マスター! 電子回路ドリル III」の【期末考査】を行います。いままでの連載の復習問題を掲載しますので、知識の確認のためにぜひチャレンジしてください。お楽しみに!(次回、3学期期末考査に続く)
Copyright © ITmedia, Inc. All Rights Reserved.