帰らざるMOS回路(25)今時ゲートレベルでもあるまいに。カウンタをVerilogしてみる

Joseph Halfmoon

前回はLogisimのライブラリから符号無整数の比較器「組み合わせ回路」をVerilogしてみました。今回はバイナリカウンタ「順序回路」をVerilogしてみます。端から部品を練習すれば、そのうち色々できるだろ~という勝手な思い込みです。記述のお作法もいろいろあるのだけれど、今のところ成り行き。徐々に修正する予定。

※使用させていただいとります「フリー」ツールのホームページへのリンクは以下です。

Logisim 画面上で論理回路の動作を観察できるツール。左記からダウンロードして実行可能ではあるものの、既に “suspended indefinitely” 状態。

Icarus Verilog 「商用でない」Verilogの定番。

GTKWave Verilog処理系などが出力する VCDフォーマットのファイルをタイミングチャートとしてみるためのビューワー

Logisim上のカウンタ

Logisimのライブラリから持ってきたカウンタの最小構成が以下です。とりあえずクロックCLK(ポジティブエッジでクロックアップ)と、リセット信号RST(ハイでカウンタクリア)だけで制御しています。ライブラリ・モジュール的には「カウンタに外部から値をロードするための端子あり」「カウントダウンもあり」なのですが「外部からのロード無、カウントアップ」で使用しています。

Counter

Counterのセッティングが以下に。8ビットです。8ビット範囲を超えたらラップ・アラウンドして0に戻ります。

CounterSetting

 

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.

GTKwaveの画面が以下に。gtkwave

カウンタしているようです。当たりまえか。

帰らざるMOS回路(24)今時ゲートレベルでもあるまいに。ライブラリをVerilogしてみる へ戻る

帰らざるMOS回路(26) ROMファイルをVerilogHDLとLogisimで共用する へ進む