47 / 63 · 개념
실제 버튼 입력: 동기화·디바운싱·한 번의 이벤트
비동기 입력 동기화와 접점 바운스 제거를 구분하고 연속 샘플 기반 디바운서를 설계합니다.
내용은 무료로 볼 수 있습니다. 수강 신청하면 학습 기록을 저장할 수 있어요.
버튼 한 번이 여러 번의 전환일 수 있습니다
기계식 버튼은 접점이 안정되기 전 여러 번 붙고 떨어질 수 있습니다. 동시에 버튼 신호는 시스템 클록과 무관하게 바뀌는 비동기 입력입니다. 동기화는 클록 도메인으로 받아들이는 문제이고, 디바운싱은 짧은 반복 전환을 하나의 안정된 상태로 판단하는 문제입니다. 2단 플립플롭플립플롭 클록의 지정된 에지에서 입력을 저장하고 다음 에지까지 유지하는 소자입니다. 입력은 setup·hold 조건을 만족해야 합니다. 자세히 보기만 넣어도 바운스가 자동으로 사라지는 것은 아닙니다.
- 비동기 버튼: 접점 바운스와 클록 비동기성이 함께 존재
- 동기화: 단일 비트 레벨을 클록 도메인으로 수신
- 디바운싱: 연속된 안정 샘플만 상태 변화로 승인
- 에지 검출: 승인된 0→1에 한 사이클 이벤트 생성
이 흐름은 충분히 오래 유지되는 단일 비트 버튼 레벨을 전제로 합니다. 짧은 펄스, 여러 비트의 일관된 전달, 비동기 클록 자체의 처리는 별도 설계가 필요합니다.
연속 N개 샘플 규칙
현재 승인 상태를 q, 동기화된 입력을 x, q와 다른 연속 샘플 수를 count라고 합시다. 매 샘플에서 x=q이면 count를 0으로 지웁니다. x≠q이면 count를 늘리고, N번째 연속 샘플에서 q=x로 갱신하고 count를 0으로 되돌립니다.
N=3, 초기 q=0인 예제를 봅니다. 각 열은 동기화된 입력을 관찰하는 샘플 순간입니다. 그래프는 물리 접점 전압이 아닙니다.
| 샘플 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|---|
| x | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 |
| count after | 0 | 1 | 0 | 1 | 2 | 0 | 0 | 1 | 0 |
| q after | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
| rise event | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
파형 데이터 보기
| 신호 | 파형 | 버스 값 |
|---|---|---|
| sample | 234523452 | 0 → 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 |
| x | 0101...01 | |
| q after | 0....1... | |
| rise event | 0....10.. |
지연과 카운터 폭을 명시합니다
샘플 간격을 라 하면 입력 변화의 위상에 따라 승인까지 약 에서 가 걸리고, 앞단 동기화 지연은 별도로 더해집니다. “10 ms 동안 안정됨”을 보수적으로 요구한다면 처음과 마지막 샘플 사이도 고려해 N을 정해야 합니다. 샘플 사이의 짧은 전환은 관찰하지 못하므로, 연속 샘플의 일치만으로 실제 전압이 그동안 한 번도 변하지 않았다고 증명할 수는 없습니다. 스위치 특성과 샘플링 조건을 함께 정해야 합니다.
count가 0부터 N−1까지만 저장한다면 필요한 폭은 입니다. N=1의 특수 경우도 처리합니다. 첫 반대 샘플에서 바로 승인해야 하므로 구현에서 N−1 비교의 순서가 중요합니다.
한 번의 누름을 한 이벤트로
승인된 새 상태를 q_next라고 하면 입니다. 위 표는 승인과 같은 샘플에서 이벤트가 나오는 정책입니다. q와 한 사이클 지연한 q를 별도 레지스터레지스터 여러 비트의 상태를 저장하는 회로입니다. 이 과정의 동기식 레지스터는 클록 에지에서 정해진 입력을 저장합니다. 자세히 보기에서 비교하는 구현은 관찰 위치에 따라 추가 지연이 있으므로, 언제 이벤트를 소비하는지도 명세해야 합니다.
직접 생각해 보기
N=3, 초기 q=0일 때 입력 1,1,0,1,1,1을 넣으면 어느 샘플에서 상태가 바뀌나요? N=8인 카운터가 0~7을 저장할 때 최소 폭은 얼마인가요?
해설 보기
세 번째 샘플의 0이 연속 개수를 초기화하므로 여섯 번째 샘플에서 1을 승인합니다. count 0~7에는 3비트가 필요합니다. 값을 8까지 저장하는 다른 구현이면 4비트가 필요하므로 저장 범위부터 확인해야 합니다.