単相同期回路で設計する理由:触って学ぼう FPGA開発入門(4)(3/4 ページ)
今回は、「単相同期回路」で設計する理由について解説します。ここで単相同期回路の記述スタイルや考え方をしっかりとマスターしましょう
シミュレーション(1)
連載第3回「順序回路の基本! カウンタを作成しよう」では、「動作を遅くした10進カウンタ」のシミュレーションを実施しませんでした。今回は、きちんと単相同期回路にしたことですし、確実にシミュレーションを行うことにします。
ここで前回使用したテストベンチにちょっと手を加えて(DECという信号を追加)、シミュレーションしてみましょう(リスト2)。
1 module TEST_UPDOWN10; 2 reg clk, reset, dec; 3 wire [3:0] count; 4 5 parameter CYCLE = 100; 6 7 UPDOWN i1(.RESET(reset), .CLK(clk), .DEC(dec), .COUNT(count)); 8 9 always #(CYCLE/2) 10 clk = ~clk; 11 12 initial 13 begin 14 reset = 1'b0; clk = 1'b0; dec = 1'b1; 15 #CYCLE reset = 1'b1; 16 #(15*CYCLE) dec = 1'b0; 17 #(10*CYCLE) $finish; 18 end 19 20 initial 21 $monitor($time,,"clk=%b reset=%b count=%b", clk, reset , count); 22 23 endmodule
テストベンチの流れとしては、
- resetを「0」にすることで、10進カウンタを初期化
- resetを「1」にすることで初期化を解除して、15回アップカウントさせる(0→9→0→5)
- decを「0」にすることで、10回ダウンカウントさせる(5→0→9→5)
となります。一番検証したいアップカウント時の「9」→「0」の変化とダウンカウント時「0」→「9」の変化を確認できるはずです。
このテストベンチを使用して、シミュレーションを行うと画面1のようになります(カウンタの出力はLEDが負論理であることを考慮して、反転して出力されます)。
画面1にもあるようにリセットが正常に動作して、最初のカウンタの値を「0」(画面1では1111)にしていますが、その後はまったく動作していません。なぜでしょうか?
それは、10進のアップ・ダウンカウンタを1秒動作にしたので、6000000クロック進まないと、この10進のアップ・ダウンカウンタが動作しないからです。つまり、クロック数が足りていないということです。
単純に「分かった! クロック数を増やせば解決だ」とは決して思わないでください。これくらい小さい回路ですから、検証に必要なサイクル数(6000000クロック×(1+15+10)=156000000クロック)を行っても何とかシミュレーションできるかもしれません。しかし、このクロック数をまともにシミュレーションするとなるとかなり非効率的です。
ここでは、まともに1秒のシミュレーションは行わないで「ENABLE信号がきちんと役目を果たしているのか?」そこに焦点を当ててシミュレーション行います。
ここでポイントになるのが、前述した10進のアップ・ダウンカウンタのRTL記述内で使用したparameter文です。このparameterの値を減らせば、現実的な時間で10進のアップ・ダウンカウンタを動作できます。ここで、「そんなのRTL記述のparameter文を(以下のように)変更すれば簡単にできるよ」と思った方もいらっしゃるでしょう。
//parameter SEC1_MAX = 6000000; // 6MHz parameter SEC1_MAX = 4; // For Simulation
確かにこうすればシミュレーションのときには下のparameter文を使用し、FPGAに回路を作成するときにはコメントアウトされている6MHz用のparameterを使用すればいいことになります。しかし、この方法では目的に応じて書き換えなければならないので、間違いが生じる(誤ってシミュレーション用のparameter文を使用するなど)可能性が高くなります。それではあまり効率的とはいえません。
Copyright © ITmedia, Inc. All Rights Reserved.