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

Verilog Pattern Detector: Erweiterte Sequenzerkennung für FPGA

Vorheriges Beispiel: Einfacher Sequence Detector. Hier: Pattern Detector für längeres Muster 110101.

Design: 110101 Detector

module det_110101 (input clk, rstn, in, output out);
    parameter IDLE=0, S1=1, S11=2, S110=3, S1101=4, S11010=5, S110101=6;
    reg [2:0] cur_state, next_state; // Bug: 3 Bit reicht nur bis 7, aber 6 States OK
    assign out = (cur_state == S110101) ? 1 : 0;
    always @ (posedge clk) begin
        if (!rstn) cur_state <= IDLE;
        else cur_state <= next_state;
    end
    always @ (cur_state or in) begin
        case (cur_state)
            IDLE:     if (in) next_state=S1; else next_state=IDLE;
            S1:       if (in) next_state=S11; else next_state=IDLE;
            S11:      if (!in) next_state=S110; else next_state=S11; // Self-loop bei '1'
            S110:     if (in) next_state=S1101; else next_state=IDLE;
            S1101:    if (!in) next_state=S11010; else next_state=IDLE;
            S11010:   if (in) next_state=S110101; else next_state=IDLE;
            S110101:  if (in) next_state=S1; else next_state=IDLE; // Bug 2
        endcase
    end
endmodule

Testbench

Gezieltes Pattern: 1-1-0-1-0-1 (detected bei T=230), dann 1-1-0-1-0 (partial), dann 1-0-1 (detected again bei T=350).

Simulationslog zeigt Detections bei T=230 und T=350.

Bugs im Design

  1. State Encoding: reg [2:0] für 7 States (0-6) ist OK, aber S110101=6 passt. Besser: reg [2:0] oder reg [$clog2(7)-1:0] für Skalierbarkeit.
  2. Overlapping Handling in S110101: Bei in=1 → S1 (korrekt für Overlap: neues Pattern startet mit '1'). Bei in=0 → IDLE. Aber: Nach Detection von 110101 könnte nächster Bit '1' Start von neuem Pattern sein UND gleichzeitig Teil von Overlap? Design geht zu S1 – das ist eigentlich richtig für Overlap-Erkennung. Der Kommentar „Bug 2“ im Originalcode ist irreführend – der Transition S110101 --1--> S1 ist korrekt für Overlapping.
  3. Missing Overlap in S11: Bei S11 und Input 1 bleibt man in S11 (Self-Loop). Das ist korrekt für Pattern 110101 (zwei führende 1en).

Insgesamt solides Design für Non-Overlapping und Overlapping Detection.

Verilog

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