Verilogリングカウンタ:パラメータ化設計とテストベンチ例
リングカウンタとは
リングカウンタは、出力ビットを循環シフトさせるカウンタです。初期状態で1ビットのみが'1'(他は'0')で、クロックごとに'1'が左(または右)に1ビットずつ移動し、端まで達したら反対側に戻ります。NビットならNクロックで元の状態に戻るため、N進カウンタとして機能します。
設計(ストレートリングカウンタ)
パラメータWIDTHでビット幅を可変にし、リセット時はout = 1(LSBのみ1)で初期化します。クロックごとにMSBにLSBを、それ以外は右隣のビットをシフトインします。
module ring_ctr #(
parameter WIDTH = 4
)(
input clk,
input rstn,
output reg [WIDTH-1:0] out
);
always @(posedge clk) begin
if (!rstn)
out <= 1; // リセット時: 0001
else begin
out[WIDTH-1] <= out[0]; // MSBにLSBをシフトイン
for (int i = 0; i < WIDTH-1; i = i + 1)
out[i] <= out[i+1]; // 下位ビットに上位ビットをシフトイン
end
end
endmodule
テストベンチ
module tb;
parameter WIDTH = 4;
reg clk;
reg rstn;
wire [WIDTH-1:0] out;
ring_ctr u0 (
.clk(clk),
.rstn(rstn),
.out(out)
);
always #10 clk = ~clk; // 20ns周期
initial begin
{clk, rstn} <= 0;
$monitor("T=%0t out=%b", $time, out);
repeat (2) @(posedge clk); // リセット保持
rstn <= 1; // リセット解除
repeat (15) @(posedge clk); // 15サイクル観測
$finish;
end
endmodule
シミュレーション結果
ncsim> run T=0 out=xxxx T=10 out=0001 // リセット解除後初期値 T=50 out=1000 // 4クロック後: 1がMSBへ T=70 out=0100 // 循環継続 T=90 out=0010 T=110 out=0001 // 4クロックで元に戻る(4進カウンタ) T=130 out=1000 T=150 out=0100 T=170 out=0010 T=190 out=0001 T=210 out=1000 T=230 out=0100 T=250 out=0010 T=270 out=0001 T=290 out=1000 T=310 out=0100 Simulation complete via $finish(1) at time 330 NS + 0
リングカウンタの特徴
- ステート数 = ビット幅:4ビットなら4ステート(ワンホット符号化)
- デコード不要:各ビットが直接ステートを表すため、デコーダなしで制御信号生成可能
- グリッチフリー:1ビットのみ遷移するため出力にグリッチなし
- 自己起動不備:リセットなしでは全0または全1でスタックする可能性あり → リセット必須
応用例
- ステートマシンのワンホットエンコーディング
- 順序制御信号生成(例:マルチプレクサのセレクト信号循環)
- 周期的なタイミングパターン生成
ツイステッドリングカウンタ(ジョンソンカウンタ)との違い
リングカウンタはLSBをMSBに戻しますが、ジョンソンカウンタはLSBの反転をMSBに戻します。これによりステート数が2×ビット幅になります(次記事で詳解)。
Verilog
- Verilog基礎:最初のANDゲートを設計する
- Verilogマスター:デジタル回路設計のための完全チュートリアル
- Verilog連結マスター:実践ガイド
- Verilog代入文の理解:種類、構文、ベストプラクティス
- Verilogブロッキング代入とノンブロッキング代入:違いを徹底解説
- Verilog関数のマスター:効率的なRTL設計のために
- Verilogタスクの理解:関数との違い、構文、使用法
- Verilogクロックジェネレータ:設計と実装ガイド
- Verilog数学関数のマスター:効率的なハードウェア設計のために
- Verilog Mod-Nカウンタ:パラメータ化モジュールとテストベンチ
- Verilogグレイカウンタ:4ビットグレイコード生成モジュール