Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Verilog

4-Bit Johnson Counter in Verilog – Design, Testbench & Simulation

Design

Ein Johnson-Counter (auch „Twisted Ring Counter“) verbindet den negierten Ausgang des letzten Flip-Flops mit dem Eingang des ersten. Bei n Stufen erzeugt er eine Folge von 2n Zuständen. Der folgende Code zeigt einen parameterisierten 4-Bit-Johnson-Counter mit aktiv-tiefem Reset.

module johnson_ctr #(parameter WIDTH = 4) (
    input  logic        clk,
    input  logic        rstn,
    output logic [WIDTH-1:0] out
);

always_ff @(posedge clk) begin
    if (!rstn) begin
        out <= 1;                         // Startzustand: 0001
    end else begin
        out[WIDTH-1] <= ~out[0];          // Invertierte Rückkopplung
        for (int i = 0; i < WIDTH-1; i++) begin
            out[i] <= out[i+1];           // Links-Shift
        end
    end
end

endmodule

Testbench

Struktur identisch zum Ring-Counter-Test; lediglich das DUT wird ausgetauscht.

module tb;
    parameter WIDTH = 4;
    logic clk, rstn;
    logic [WIDTH-1:0] out;

    johnson_ctr #(.WIDTH(WIDTH)) u0 (
        .clk  (clk),
        .rstn (rstn),
        .out  (out)
    );

    always #10 clk = ~clk;

    initial begin
        clk  = 0;
        rstn = 0;
        $monitor("T=%0t out=%b", $time, out);
        repeat (2) @(posedge clk);
        rstn = 1;
        repeat (15) @(posedge clk);
        $finish;
    end
endmodule

Simulationsergebnis

Die Ausgabe durchläuft 8 eindeutige Zustände (0001 → 0000 → 1000 → 1100 → 1110 → 1111 → 0111 → 0011 → 0001 …) bevor sie sich wiederholt.

ncsim> run
T=0   out=xxxx
T=10  out=0001
T=50  out=0000
T=70  out=1000
T=90  out=1100
T=110 out=1110
T=130 out=1111
T=150 out=0111
T=170 out=0011
T=190 out=0001
...
Simulation complete via $finish(1) at time 330 NS

Verilog

  1. Verilog meistern: Komplettes Tutorial für digitales Schaltungsdesign
  2. Verilog Concatenation meistern: Praktischer Leitfaden
  3. Verilog Assignments verstehen: Typen, Syntax und Best Practices
  4. Verilog Blocking vs. Non-Blocking: Wichtige Unterschiede erklärt
  5. Verilog Functions meistern für effizientes RTL-Design
  6. Verilog Tasks verstehen: Functions vs. Tasks, Syntax und Verwendung
  7. Verilog Clock Generator: Design & Implementierungsleitfaden
  8. Verilog Math Functions meistern für effizientes Hardware-Design
  9. Verilog $timeformat meistern: Präzision und Anzeigesteuerung
  10. Verilog Mod-N Counter Design: Parameterisiertes Modul & Testbench