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

4-Bit-Zähler: Effizientes Binäres Zählen von 0 bis 15

Der 4-Bit-Zähler inkrementiert von 4'b0000 bis 4'h1111 und rollt dann zurück zu 4'b0000. Er zählt solange weiter, wie ihm ein laufender Takt und ein high-gehaltener Reset zur Verfügung gestellt werden.

Der Überlauf tritt auf, wenn das höchstwertige Bit (MSB) der finalen Addition verworfen wird. Wenn der Zähler den Maximalwert 4'b1111 erreicht und eine weitere Zählanforderung erhält, versucht er, 5'b10000 zu erreichen. Da er jedoch nur 4 Bits unterstützt, wird das MSB verworfen, was zu 0 führt.

0000 0001 0010 ... 1110 1111 rollt über 0000 0001 ...

Das Design enthält zwei Eingänge: einen für den Takt und einen für einen Active-Low-Reset. Ein Active-Low-Reset setzt das Design zurück, wenn der Reset-Pin den Wert 0 hat. Es gibt einen 4-Bit-Ausgang namens out, der die Zählerwerte liefert.

Elektronisches Zähler-Design

module counter (
  input clk,           // Takteingang zum Hochzählen
  input rstn,          // Active-Low-Reset zum Zurücksetzen auf 0
  output reg[3:0] out  // 4-Bit-Ausgang für Zählerwerte
);
  // Dieser always-Block wird an der steigenden Flanke von clk (0->1) getriggert
  // Prüft, ob Reset 0 ist -> out auf 0 setzen
  // Wenn Reset 1 ist -> Zähler inkrementieren
  always @ (posedge clk) begin
    if (!rstn) out <= 0;
    else out <= out + 1;
  end
endmodule

Das module counter hat Takt und Active-Low-Reset (gekennzeichnet durch n) als Eingänge und den Zählerwert als 4-Bit-Ausgang. Der always-Block wird immer ausgeführt, wann immer der Takt von 0 auf 1 wechselt (steigende/positive Flanke). Der Ausgang wird nur inkrementiert, wenn Reset high (1) gehalten wird, realisiert durch den if-else-Block. Wird Reset an der positiven Taktflanke als low erkannt, wird der Ausgang auf den Standardwert 4'b0000 zurückgesetzt.

Testbench

Wir können das Design in unser Testbench-Modul instanziieren, um zu verifizieren, dass der Zähler wie erwartet zählt.

Das Testbench-Modul heißt tb_counter und benötigt keine Ports, da es das Top-Modul in der Simulation ist. Wir benötigen jedoch interne Variablen, um Takt und Reset zu erzeugen, zu speichern und zu treiben. Dafür deklarieren wir zwei reg-Variablen für Takt und Reset. Außerdem brauchen wir ein wire-Netz für die Verbindung mit dem Design-Ausgang, da es sonst auf ein 1-Bit-Skalar-Netz defaulten würde.

Der Takt wird über einen always-Block erzeugt, der eine Periode von 10 Zeit-Einheiten liefert. Der initial-Block setzt Initialwerte für unsere internen Variablen und treibt den Reset-Wert zum Design. Das Design wird im Testbench instanziiert und mit unseren internen Variablen verbunden, sodass es die Werte erhält, wenn wir sie vom Testbench treiben. Da wir keine $display-Statements im Testbench haben, sehen wir keine Meldungen auf der Konsole.

module tb_counter;
  reg clk;           // Interne TB-Variable für Takt
  reg rstn;          // Interne TB-Variable für Active-Low-Reset
  wire [3:0] out;    // Wire für Design-Ausgang
  
  // Counter-Design instanziieren und mit TB-Variablen verbinden
  counter c0 (
    .clk(clk),
    .rstn(rstn),
    .out(out)
  );
  
  // Takt erzeugen: Wert alle 5ns umschalten -> Periode 10ns -> Frequenz 100 MHz
  always #5 clk = ~clk;
  
  // Stimulus für Testbench
  initial begin
    // 1. TB-Variablen zu Simulationsbeginn auf 0 initialisieren
    clk <= 0; rstn <= 0;
    
    // 2. Restlichen Stimulus treiben, Reset wird dazwischen aktiviert
    #20 rstn <= 1;
    #80 rstn <= 0;
    #50 rstn <= 1;
    
    // 3. Stimulus nach 200ns beenden
    #20 $finish;
  end
endmodule

Simulations-Log:

ncsim> run
[0ns] clk=0 rstn=0 out=0xx
[5ns] clk=1 rstn=0 out=0x0
[10ns] clk=0 rstn=0 out=0x0
[15ns] clk=1 rstn=0 out=0x0
[20ns] clk=0 rstn=1 out=0x0
[25ns] clk=1 rstn=1 out=0x1
[30ns] clk=0 rstn=1 out=0x1
[35ns] clk=1 rstn=1 out=0x2
[40ns] clk=0 rstn=1 out=0x2
[45ns] clk=1 rstn=1 out=0x3
[50ns] clk=0 rstn=1 out=0x3
[55ns] clk=1 rstn=1 out=0x4
[60ns] clk=0 rstn=1 out=0x4
[65ns] clk=1 rstn=1 out=0x5
[70ns] clk=0 rstn=1 out=0x5
[75ns] clk=1 rstn=1 out=0x6
[80ns] clk=0 rstn=1 out=0x6
[85ns] clk=1 rstn=1 out=0x7
[90ns] clk=0 rstn=1 out=0x7
[95ns] clk=1 rstn=1 out=0x8
[100ns] clk=0 rstn=0 out=0x8
[105ns] clk=1 rstn=0 out=0x0
[110ns] clk=0 rstn=0 out=0x0
[115ns] clk=1 rstn=0 out=0x0
[120ns] clk=0 rstn=0 out=0x0
[125ns] clk=1 rstn=0 out=0x0
[130ns] clk=0 rstn=0 out=0x0
[135ns] clk=1 rstn=0 out=0x0
[140ns] clk=0 rstn=0 out=0x0
[145ns] clk=1 rstn=0 out=0x0
[150ns] clk=0 rstn=1 out=0x0
[155ns] clk=1 rstn=1 out=0x1
[160ns] clk=0 rstn=1 out=0x1
[165ns] clk=1 rstn=1 out=0x2
Simulation complete via $finish(1) at time 170 NS + 0

Beachten Sie, dass der Zähler auf 0 zurückgesetzt wird, wenn der Active-Low-Reset 0 wird, und wenn der Reset bei ca. 150ns deaktiviert wird, beginnt der Zähler ab der nächsten positiven Taktflanke wieder zu zählen.

Hardware-Schaltplan

Verilog

  1. IT-Strategie für Sommererfolg aufladen, zurücksetzen und neu konfigurieren
  2. 3-Bit-Binärzähler mit 555-Timer und 4027 Flip-Flops
  3. Synchrone Binärzähler: Design, Up/Down-Betrieb und Encoder-Anwendungen
  4. Counter-Modulus: Optimierte Algorithmen für moderne Systeme
  5. Ringzähler und Johnson-Zähler: Design, Betrieb und praktische Anwendungen
  6. IT/OT-Konvergenz: Kultureller Neustart für nachhaltige digitale Transformation
  7. Python Counter in collections: Effizientes Zählen, Aktualisieren und arithmetische Operationen
  8. Verilog Mod-N Counter Design: Parameterisiertes Modul & Testbench
  9. Verilog Gray Counter Modul – 4-Bit Gray-Code Generator
  10. PID-Reset-Windup verhindern: Strategien für zuverlässige Prozessregelung