Verilog Sequence Detector: Zuverlässiges FSM für Mustererkennung bauen
Klassisches FSM-Beispiel: Sequence Detector erkennt festes Muster in einem Strom binärer Bits am Input.
Design: 1011 Detector
module det_1011 (input clk, rstn, in, output out);
parameter IDLE=0, S1=1, S10=2, S101=3, S1011=4;
reg [2:0] cur_state, next_state;
assign out = (cur_state == S1011) ? 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=IDLE; else next_state=S10;
S10: if (in) next_state=S101; else next_state=IDLE;
S101: if (in) next_state=S1011; else next_state=IDLE;
S1011: next_state=IDLE;
endcase
end
endmodule
Testbench
Gezieltes Pattern: 1-0-1-1 (detected), dann 0-0-1-1-0-1-1 (detected again). Plus Random-Stimulus.
Simulationslog zeigt Detection bei T=190 und T=330.
Bug im Design
Können Sie ihn finden?
Hinweis: Im State S1011 geht es immer zu IDLE, aber bei Overlapping-Sequenzen (z. B. 1011011 – das zweite 1011 beginnt mit dem letzten 1 des ersten) verpasst der Detektor die Überlappung. Korrekt wäre: In S1011 bei in=1 → S1, bei in=0 → IDLE (oder passender Next-State für Overlap).
Verilog
- Verilog meistern: Komplettes Tutorial für digitales Schaltungsdesign
- Verilog Concatenation meistern: Praktischer Leitfaden
- Verilog Sequence Detector: Zuverlässiges FSM für Mustererkennung bauen
- Verilog Pattern Detector: Erweiterte Sequenzerkennung für FPGA
- Verilog Assignments verstehen: Typen, Syntax und Best Practices
- Verilog Blocking vs. Non-Blocking: Wichtige Unterschiede erklärt
- Verilog Functions meistern für effizientes RTL-Design
- Verilog Tasks verstehen: Functions vs. Tasks, Syntax und Verwendung
- Verilog Clock Generator: Design & Implementierungsleitfaden
- Verilog Math Functions meistern für effizientes Hardware-Design