산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> verilog

Verilog 패턴 디텍터: '110101' 검출 FSM과 오버래핑 처리

앞선 '1011' 디텍터에 이어 더 긴 패턴 110101 (6비트) 검출기를 구현하고, 오버래핑 패턴 처리까지 다룹니다.

상태 정의 (7개 상태)

상태값매칭된 접두사
IDLE0-
S111
S11211
S1103110
S110141101
S11010511010
S1101016110101 (완전 매칭)

RTL 구현 (오버래핑 버그 포함 버전)

module det_110101 (
    input  wire clk,
    input  wire rstn,
    input  wire in,
    output wire out
);
    parameter IDLE=0, S1=1, S11=2, S110=3, S1101=4, S11010=5, S110101=6;
    reg [2:0] cur_state, next_state;

    assign out = (cur_state == S110101);

    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:     next_state = in ? S1      : IDLE;
            S1:       next_state = in ? S11     : IDLE;
            S11:      next_state = in ? S11     : S110;      // '1' 계속 들어오면 S11 유지
            S110:     next_state = in ? S1101   : IDLE;
            S1101:    next_state = in ? IDLE    : S11010;    // Bug 1: in=1 시 IDLE로?
            S11010:   next_state = in ? S110101 : IDLE;
            S110101:  next_state = in ? S1      : IDLE;      // Bug 2: 오버래핑 처리
            default:  next_state = IDLE;
        endcase
    end
endmodule

테스트벤치 및 시뮬레이션

module tb;
    reg clk, in, rstn; wire out;
    always #10 clk = ~clk;
    det_110101 u0 (.clk(clk), .rstn(rstn), .in(in), .out(out));
    initial begin
        clk=0; rstn=0; in=0; repeat(5) @(posedge clk); rstn=1;
        // 패턴: 1 1 0 1 0 1
        @(posedge clk) in=1; @(posedge clk) in=1; @(posedge clk) in=0;
        @(posedge clk) in=1; @(posedge clk) in=0; @(posedge clk) in=1;
        @(posedge clk) in=1; @(posedge clk) in=1; @(posedge clk) in=0;
        @(posedge clk) in=1; @(posedge clk) in=0; @(posedge clk) in=1;
        #100 $finish;
    end
endmodule

시뮬레이션 로그 분석

T=230  in=1  out=1  ← 첫 패턴 완료
T=350  in=1  out=1  ← 두 번째 패턴 완료

발견된 버그 2가지

  1. S1101 상태에서 in=1 시 IDLE로 전이 (Bug 1): 패턴 '110101'에서 '1101' 다음이 '1'이면 '11011'이 되어 패턴이 깨지지만, 실제로는 '11011'의 접미사 '11'이 패턴 '110101'의 접두사 '11'과 일치하므로 S11로 가야 함 (KMP 알고리즘의 실패 함수 개념).
  2. S110101 상태에서 in=1 시 S1로 전이 (Bug 2): 완전 매칭 후 입력이 '1'이면 마지막 '1'을 다음 패턴 첫 '1'로 재사용해 S1이 아닌 S11로 가야 함 (패턴이 '1'로 시작하므로 '11' 접두사 매칭).

올바른 다음 상태 로직 (KMP 기반)

패턴 '110101'의 접두사-접미사 매칭 테이블(실패 함수) 계산 후 각 상태에서 입력 0/1에 대한 올바른 다음 상태 결정 필요. 이는 다음 글에서 SystemVerilog always_comb와 함수로 깔끔하게 구현해보겠습니다.

교훈

verilog

  1. 버릴로그(Verilog) 입문: 디지털 회로 설계를 위한 하드웨어 기술 언어
  2. Verilog 결합(Concatenation) & 복제(Replication) 연산자 실전 가이드
  3. Verilog 시퀀스 디텍터: FSM으로 패턴 '1011' 검출하기
  4. Verilog 할당문 이해: 유형, 문법, 모범 사례
  5. Verilog 차단 vs 비차단 할당: 핵심 차이점 완벽 이해
  6. Verilog 함수 마스터하기: 효율적인 RTL 설계를 위한 활용법
  7. Verilog 태스크 이해: 함수와의 차이점, 문법, 활용법
  8. Verilog 클럭 생성기: 설계 및 구현 가이드
  9. Verilog 수학 함수 마스터하기: 효율적인 하드웨어 설계를 위한 활용
  10. Verilog $timeformat 마스터하기: 정밀도 및 표시 제어