工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Verilog

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 ジョンソンカウンタ

項目リングカウンタジョンソンカウンタ
ステート数N2N
フィードバックout[0] → out[N-1]~out[0] → out[N-1]
使用FF数NN
デコード容易性極めて容易(ワンホット)容易(ユニークパターン)
自己起動全0/全1でスタック全0/全1でスタック

用途

注意点

リングカウンタ同様、リセットなしでは全0または全1でスタックする「自己起動不備」があります。必ずリセット回路を設け、初期値を1(または任意の非ゼロ・非全1パターン)に強制してください。

Verilog

  1. Verilogマスター:デジタル回路設計のための完全チュートリアル
  2. Verilog連結マスター:実践ガイド
  3. Verilog代入文の理解:種類、構文、ベストプラクティス
  4. Verilogブロッキング代入とノンブロッキング代入:違いを徹底解説
  5. Verilog関数のマスター:効率的なRTL設計のために
  6. Verilogタスクの理解:関数との違い、構文、使用法
  7. Verilogクロックジェネレータ:設計と実装ガイド
  8. Verilog数学関数のマスター:効率的なハードウェア設計のために
  9. Verilog $timeformatのマスター:精度と表示制御
  10. Verilog Mod-Nカウンタ:パラメータ化モジュールとテストベンチ
  11. Verilogグレイカウンタ:4ビットグレイコード生成モジュール