Verilog_RTL 설계/Basys_3

[Sequential_Circuit] edge_detector

juniha 2025. 7. 13. 15:53

목적

  • 입력 신호 cp의 상승 에지(0→1) 또는 하강 에지(1→0)가 발생하는 순간을 클럭(clk)에 동기화하여 감지하고,
    해당 순간에만 1클럭 동안 '1'을 출력하는 펄스 신호(p_edge, n_edge)를 생성
  • 입력 신호(cp)의 상승/하강 에지를 감지하여 클럭 동안 p_edge 또는 n_edge 출력이 1이 되도록 함.
  • 클럭(clk)에 동기화된 순차 회로임

사용 목적

  • 버튼 입력 처리
  • FSM 입력 트리거
  • 스톱워치/타이머 시작_정지 제어
  • 카운터 트리거
  • 동기화 회로
  • PWM 신호 측정

사용 코드

module edge_detector_p(
    input clk, reset_p,       // clk: 시스템 클럭, reset_p: 비동기 초기화 신호 (양의 에지에서 리셋)
    input cp,                 // cp: 에지를 감지할 입력 신호
    output p_edge, n_edge     // p_edge: 상승 에지 검출 출력, n_edge: 하강 에지 검출 출력
);
    
    // 현재 및 이전 클럭에서의 cp 값을 저장하는 플립플롭
    reg ff_cur, ff_old;

    // 클럭 상승 에지 또는 reset_p가 1일 때 동작
    always @(posedge clk or posedge reset_p) begin
        if (reset_p) begin
            // 리셋이 들어오면 두 레지스터를 0으로 초기화
            ff_cur <= 0;
            ff_old <= 0;
        end else begin
            // 이전 상태 저장: ff_old ← 이전 cp
            ff_old <= ff_cur;
            // 현재 상태 저장: ff_cur ← 현재 cp
            ff_cur <= cp;
        end
    end

    // cp의 상승 에지 감지: 이전 상태가 0이고 현재 상태가 1일 때
    assign p_edge = (ff_cur == 1 && ff_old == 0) ? 1 : 0;

    // cp의 하강 에지 감지: 이전 상태가 1이고 현재 상태가 0일 때
    assign n_edge = (ff_cur == 0 && ff_old == 1) ? 1 : 0;

endmodule

 

Schematic

Simulation

결과

 

 

  • cp 신호가 변할 때마다 (0→1 또는 1→0) 클럭 상승 에지 기준으로 그 순간을 감지하는 것을 확인 할 수 있다.
  • p_edge: 상승 에지에서 1클럭 동안 1 출력
  • n_edge: 하강 에지에서 1클럭 동안 1 출력
  • 나머지 시점에는 둘 다 0 유지
  • FF_cur : 지금 입력(cp), ff_old : 직전 클럭의 입력(cp) 상승 에지(0→1)와 하강 에지(1→0)를 감지
  • cp 상승 시 p_edge가 0처럼 보이는 것을 확인 할 수 있다.
    이유 : ff_cur, ff_old가 clk 상승 시점에 업데이트되고, p_edge는 그 후 계산되므로  cp는 즉시 바뀌지만, p_edge / n_edge는 다음 clk  에지에서야 감지되기 때문이다.
  • 따라서 cp는 언제든지 즉시 바뀔 수 있지만, 에지 검출 결과인 p_edge/n_edge는 반드시 다음 clk 상승 에지에서만 반응한다.