입력 신호 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 상승 에지에서만 반응한다.