4ビットジョンソンカウンタ:Verilog設計・テストベンチ・シミュレーション
ジョンソンカウンタ(ツイステッドリングカウンタ)とは
ジョンソンカウンタは、シフトレジスタの最終出力を反転させて先頭にフィードバックする構造です。Nビットで2Nステートを持つため、リングカウンタ(Nステート)の2倍のカウント長を実現できます。出力パターンは「1つの1が左へ移動 → 全1 → 1つの0が左へ移動 → 全0」を繰り返します。
設計
リングカウンタとほぼ同一ですが、フィードバック時に~out[0](LSBの反転)をMSBに入力する点が異なります。
module johnson_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;
johnson_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);
$finish;
end
endmodule
シミュレーション結果
ncsim> run T=0 out=xxxx T=10 out=0001 // 初期値 T=50 out=0000 // 1が左へシフトアウト、反転0がMSBへ T=70 out=1000 // 反転1がMSBへ T=90 out=1100 T=110 out=1110 T=130 out=1111 // 全1に到達 T=150 out=0111 // 今度は0が左へシフトイン T=170 out=0011 T=190 out=0001 // 8クロックで初期値に戻る(2×4=8ステート) T=210 out=0000 T=230 out=1000 T=250 out=1100 T=270 out=1110 T=290 out=1111 T=310 out=0111 Simulation complete via $finish(1) at time 330 NS + 0
ステート遷移図(4ビットの場合:8ステート)
0001 → 0000 → 1000 → 1100 → 1110 → 1111 → 0111 → 0011 → (0001に戻る) ↑ │ └───────────────────────────────────────────────────────────────────┘
リングカウンタ vs ジョンソンカウンタ
| 項目 | リングカウンタ | ジョンソンカウンタ |
|---|---|---|
| ステート数 | N | 2N |
| フィードバック | out[0] → out[N-1] | ~out[0] → out[N-1] |
| 使用FF数 | N | N |
| デコード容易性 | 極めて容易(ワンホット) | 容易(ユニークパターン) |
| 自己起動 | 全0/全1でスタック | 全0/全1でスタック |
用途
- クロック分周(2N分周)
- ステートマシンのステートエンコーディング(ワンホットに近い利点)
- 位相ずらしクロック生成
- テストパターン生成
注意点
リングカウンタ同様、リセットなしでは全0または全1でスタックする「自己起動不備」があります。必ずリセット回路を設け、初期値を1(または任意の非ゼロ・非全1パターン)に強制してください。
Verilog
- Verilogマスター:デジタル回路設計のための完全チュートリアル
- Verilog連結マスター:実践ガイド
- Verilog代入文の理解:種類、構文、ベストプラクティス
- Verilogブロッキング代入とノンブロッキング代入:違いを徹底解説
- Verilog関数のマスター:効率的なRTL設計のために
- Verilogタスクの理解:関数との違い、構文、使用法
- Verilogクロックジェネレータ:設計と実装ガイド
- Verilog数学関数のマスター:効率的なハードウェア設計のために
- Verilog $timeformatのマスター:精度と表示制御
- Verilog Mod-Nカウンタ:パラメータ化モジュールとテストベンチ
- Verilogグレイカウンタ:4ビットグレイコード生成モジュール