Verilog Mod-Nカウンタ:パラメータ化モジュールとテストベンチ
Mod-Nカウンタとは
Mod-Nカウンタ(モジュロNカウンタ)は、0からN-1までカウントし、N-1の次に0へ戻るカウンタです。任意のカウント長Nをパラメータで指定できるため、任意の分周比やステートマシンの周期制御に最適です。
設計
2つのパラメータN(カウント最大値+1)とWIDTH(ビット幅)を持ち、out == N-1で次回0にクリアします。
module modN_ctr #(
parameter N = 10, // モジュロ値(カウント数)
parameter WIDTH = 4 // 出力ビット幅(N-1を表現できる最小幅)
)(
input clk,
input rstn,
output reg [WIDTH-1:0] out
);
always @(posedge clk) begin
if (!rstn)
out <= 0;
else begin
if (out == N-1)
out <= 0; // N-1の次は0へロールオーバー
else
out <= out + 1; // インクリメント
end
end
endmodule
パラメータ設定の指針
WIDTH >= $clog2(N)である必要があります(例:N=10ならWIDTH≥4)- 合成ツールによっては
$clog2関数で自動計算可能
テストベンチ
N=10(0〜9カウント)、WIDTH=4で検証します。
module tb;
parameter N = 10;
parameter WIDTH = 4;
reg clk;
reg rstn;
wire [WIDTH-1:0] out;
modN_ctr u0 (
.clk(clk),
.rstn(rstn),
.out(out)
);
always #10 clk = ~clk; // 20ns周期
initial begin
{clk, rstn} <= 0;
$monitor("T=%0t rstn=%0b out=0x%0h", $time, rstn, out);
repeat(2) @(posedge clk);
rstn <= 1;
repeat(20) @(posedge clk); // 2周期分観測
$finish;
end
endmodule
シミュレーション結果
ncsim> run T=0 rstn=0 out=0xx T=10 rstn=0 out=0x0 T=30 rstn=1 out=0x0 T=50 rstn=1 out=0x1 T=70 rstn=1 out=0x2 T=90 rstn=1 out=0x3 T=110 rstn=1 out=0x4 T=130 rstn=1 out=0x5 T=150 rstn=1 out=0x6 T=170 rstn=1 out=0x7 T=190 rstn=1 out=0x8 T=210 rstn=1 out=0x9 // N-1 = 9 に到達 T=230 rstn=1 out=0x0 // 次クロックで0へロールオーバー T=250 rstn=1 out=0x1 // 2周期目開始 ... Simulation complete via $finish(1) at time 430 NS + 0
波形の見所
- 0x0 → 0x1 → ... → 0x9 → 0x0 → 0x1 ... と10進カウント動作
- リセット時は即座に0x0
- 16進数表示では0x9の次が0x0になるため、10進カウントとして正しく動作
拡張アイデア
- イネーブル入力追加:
input enでカウント一時停止 - ロード機能:
input load, [WIDTH-1:0] dataで任意値から開始 - ダウンカウント:
parameter DIR = 1でアップ/ダウン切替 - ターミナルカウント出力:
output tcでout == N-1を外部通知
実用例
クロック分周(例:50MHz → 5MHzならN=10)、ボーレートジェネレータ、PWM周期制御、ステートマシンの周期カウンタ、タイマー割り込み周期設定など、任意周期が必要な場面で広く使われます。
Verilog
- Verilogマスター:デジタル回路設計のための完全チュートリアル
- Verilog連結マスター:実践ガイド
- Verilog代入文の理解:種類、構文、ベストプラクティス
- Verilogブロッキング代入とノンブロッキング代入:違いを徹底解説
- Verilog関数のマスター:効率的なRTL設計のために
- Verilogタスクの理解:関数との違い、構文、使用法
- Verilogクロックジェネレータ:設計と実装ガイド
- Verilog数学関数のマスター:効率的なハードウェア設計のために
- Verilog $timeformatのマスター:精度と表示制御
- Verilog Tフリップフロップ:RTL実装とテストベンチ完全解説
- Verilogグレイカウンタ:4ビットグレイコード生成モジュール