前回はLogisimのライブラリから符号無整数の比較器「組み合わせ回路」をVerilogしてみました。今回はバイナリカウンタ「順序回路」をVerilogしてみます。端から部品を練習すれば、そのうち色々できるだろ~という勝手な思い込みです。記述のお作法もいろいろあるのだけれど、今のところ成り行き。徐々に修正する予定。
※かえらざるMOS回路 投稿順 INDEX
※使用させていただいとります「フリー」ツールのホームページへのリンクは以下です。
Logisim 画面上で論理回路の動作を観察できるツール。左記からダウンロードして実行可能ではあるものの、既に “suspended indefinitely” 状態。
Icarus Verilog 「商用でない」Verilogの定番。
GTKWave Verilog処理系などが出力する VCDフォーマットのファイルをタイミングチャートとしてみるためのビューワー
Logisim上のカウンタ
Logisimのライブラリから持ってきたカウンタの最小構成が以下です。とりあえずクロックCLK(ポジティブエッジでクロックアップ)と、リセット信号RST(ハイでカウンタクリア)だけで制御しています。ライブラリ・モジュール的には「カウンタに外部から値をロードするための端子あり」「カウントダウンもあり」なのですが「外部からのロード無、カウントアップ」で使用しています。
Counterのセッティングが以下に。8ビットです。8ビット範囲を超えたらラップ・アラウンドして0に戻ります。
Verilogで書いてみた
今回は順序回路、RST付きなので、以下のようにしてみました。お作法的にはどうなんだろ~。8ビット・バイナリ・アップカウンタということで。
/** @file 8bit binary counter */ `ifndef COUNTER8_V_ `define COUNTER8_V_ /** The COUNTER8 module @param[in] CLK clock input @param[in] RST reset input @param[out] OUT [7:0] counter output */ module counter8( CLK, RST, OUT ); input CLK, RST; output [7:0] OUT; reg [7:0] OUT; always @( posedge CLK or posedge RST) begin if ( RST==1'b1 ) OUT <= 8'h00; else OUT <= OUT + 8'h01; end endmodule `endif // COUNTER8_V_
上記の8ビット・カウンタをエクササイズするためのテストベンチが以下に。これまた成り行き。これまた、お作法的にはどんなもんだろ~。
/** @file testBench.v, to test counter8.v (8 bit binary counter) */ `ifndef TESTBENCH_V_ `define TESTBENCH_V_ `timescale 1 us / 100 ns /** The counter8 testbench */ module counter8_tb; reg CLK, RST; wire [7:0] OUT; parameter STEP = 10; counter8 dut( CLK, RST, OUT ); initial begin $dumpfile("counter8.vcd"); $dumpvars(-1, dut); $monitor("%d OUT=%d", $stime, OUT); end // testbench actions always begin CLK=0; #(STEP/2); CLK=1; #(STEP/2); end initial begin #0 RST = 1'b1; #STEP RST = 1'b0; #(STEP*260) $finish; end endmodule `endif // TESTBENCH_V_じ
実行してみた
お作法はともあれ、実行してみれば動作はOK、こんな感じであります。
$ iverilog -o tb.out testBench.v counter8.v $ vvp tb.out VCD info: dumpfile counter8.vcd opened for output. 0 OUT= 0 15 OUT= 1 25 OUT= 2 35 OUT= 3 45 OUT= 4 55 OUT= 5 65 OUT= 6 75 OUT= 7 85 OUT= 8 95 OUT= 9 ~途中略~ 2555 OUT=255 2565 OUT= 0 2575 OUT= 1 2585 OUT= 2 2595 OUT= 3 2605 OUT= 4
上記の$monitor出力で動いているのは明らかですが、念のためVCDビューワーで波形として観察してみます。
$ gtkwave counter8.vcd GTKWave Analyzer v3.3.100 (w)1999-2019 BSI [0] start time. [2610000] end time.
カウンタしているようです。当たりまえか。