そこで、parameterの値の受け渡し機能(Verilog-HDLの機能)を使用します。この方法を用いれば、RTL記述に手を加えることなくシミュレーションを実行できます。
具体的には、リスト3の8行目にあるように、テストベンチの「10進のアップ・ダウンカウンタ」をインスタンスしている部分に渡したいparameterの値を記述します。
1 module TEST_UPDOWN10; 2 reg clk, reset, dec; 3 wire [3:0] count; 4 5 parameter CYCLE = 100; 6 parameter SIM_SEC1_MAX = 4; 7 8 UPDOWN #(.SEC1_MAX(SIM_SEC1_MAX)) i1(.RESET(reset), .CLK(clk), .DEC(dec), .COUNT(count)); 9 10 always #(CYCLE/2) 11 clk = ~clk; 12 13 initial 14 begin 15 reset = 1'b0; clk = 1'b0; dec = 1'b1; 16 #CYCLE reset = 1'b1; 17 #(15*CYCLE*SIM_SEC1_MAX) dec = 1'b0; 18 #(10*CYCLE*SIM_SEC1_MAX) $finish; 19 end 20 21 initial 22 $monitor($time,,"clk=%b reset=%b count=%b", clk, reset, count); 23 24 endmodule
6行目のように記述することで、10進のアップ・ダウンカウンタ内で使用されているparameterの値が「4」として扱われて、シミュレーションが実行されます。
インスタンスしたポートと信号を接続するイメージで記述すれば大丈夫です。このテストベンチとリスト1のRTL記述を使用してシミュレーションを行います。この結果を画面2に示します。
いかがでしょうか? 見事に4クロックに1回、カウンタの値が変化している様子が分かります。このようにシミュレータ上では“1秒の動作を確認する”のではなく、“ENABLE信号が正しく10進のアップ・ダウンカウンタに効いているか”を検証するのです。1秒動作の確認は実機で行えばよいのです。
このように検証する項目を分けて、効率的にRTLの動作を確認することがとても重要です。
それでは、出来上がった10進のアップ・ダウンカウンタをFPGA上で動作させてみましょう。
テストベンチでparameterの値を渡したので、リスト1のRTL記述を特に変更する必要はありません。論理合成・配置配線を行って、FPGA上にダウンロードします。
見事に単相同期回路の方式を採用して、LEDが1秒でアップ・ダウンの動作をしているはずです。
今回は、「単相同期回路」と「1秒で動作するようなカウンタをいかにしてシミュレーションするか」について解説しました。実践でも役に立つ重要な内容となります。特に単相同期回路に慣れていない設計者の方は、この記述スタイルや考え方をしっかりとマスターしてください。高速・複雑な設計になればなるほど必要な技術要素になるはずです。
さて、次回は“10進カウンタの出力を7セグメントLEDに出力”させます。すでに10進のアップ・ダウンカウンタとデコーダが完成していますので、これらをどのように接続して記述するのかを中心に解説します。(次回に続く)
Copyright © ITmedia, Inc. All Rights Reserved.