アフィリエイト広告
アフィリエイト広告

VerilogHDL 4ビットカウンタのシミュレーション

少しづつですが、なんだか、わかってきましたね (^_^;) 今回は、この問題をやってみます。

【問題4】 always文でカウンタを作ろう
Verilog HDLで記述したOR回路をFPGAボードで動作させたところ、なぜかANDで動作した……。その原因について詳しく解説する。

4 ビットカウンタをシミュレーションする

図 1 4ビットカウンタ

4 ビットカウンタは、クロックをカウントして 4 ビットの値を出力する、順序回路です。過去記事で、じっさいにつくりましたね。

図 1 のブロック図、クロック CLK は立ち上がりエッジでカウントするという表示になっています。RES はリセットですが、◯ がついているので、アクティブロー (0 でリセットされる) とします。

回路記述

回路をつくりましょう。

  1. module counter_4bit(CLK, RES, Q);
  2.   input CLK, RES;
  3.   output [3:0] Q;
  4.   wire CLK, RES;
  5.   reg [3:0] Q;
  6.   always @(posedge CLK) begin
  7.     if(RES == 1'b0)
  8.       Q = 4'd0;
  9.     else
  10.       Q = Q + 4'd1;
  11.   end
  12. endmodule

9 行目。組み合わせ回路では assign でしたが、順序回路では always を使います。posedge は CLK の立ち上がりエッジを意味します。立ち下がりエッジは negedge です。
7 行目。always を使う場合、出力信号は reg として「変数宣言」します。wire は「ネット宣言」といいます。変数は値を記憶する、ネットは信号を流す、ってことなのかな。
10~13 行目は if 文。1’b0 は定数で、サイズが 1 ビットの 2 進数で 0b0 です。RES が 0 なら、Q を 4’d0、つまりサイズが 4 ビットの 10 進数で 0 にする。つまり、リセットする。esle ならば、Q をカウントアップする。
ちなみに、定数のサイズを指定しないと 32 ビットになります。そうだ、前回、for() 文のループ変数 i を integer で宣言したけど、これも 32 ビットです。

なお、CLK の立ち上がりエッジだけで動作するので、リセットも CLK に同期します。
非同期リセットにするときは、

  1.   always @(posedge CLK, negedge RES) begin

とします。RES の立ち下がりエッジで、非同期リセットされます。

テストベンチ

テストベンチファイルです。

  1. module counter_4bit_test;
  2.   reg CLK, RES;
  3.   wire [3:0] Q;
  4.   counter_4bit ctr0(CLK, RES, Q);
  5.   always begin
  6.     #5 CLK = ~CLK;
  7.   end
  8.   initial begin
  9.           CLK = 0;
  10.           RES = 0;
  11.     #30 RES = 1;
  12.     #200 RES = 0;
  13.     #30 RES = 1;
  14.     #50 $finish;
  15.   end
  16.   initial begin
  17.     $monitor("CLK = %d RES = %d Q = %d", CLK, RES, Q);
  18.     $dumpfile("counter_4bit.vcd");
  19.     $dumpvars(0, counter_4bit_test);
  20.   end
  21. endmodule

8~10 行目。クロック CLK を always で発生させます。5 ユニット時間ごとに反転させる、ってことは、周期が 10 ユニット時間のクロックになる。
12~19 行目が、入力信号。RES を 1 にするとカウントスタート、0 にするとリセット。

図 2 4ビットカウンタのシミュレーション波形

図 2 が、シミュレーション波形です。

RES が 1 のときに、カウントアップし、0xF までカウントしたら 0 に戻る 16 進カウンタです。RES が 0 になると、CLK に同期して 0 になっています。

タイトルとURLをコピーしました