카르노맵과 해저드
한 줄 요약 — 논리식을 줄이면 게이트가 줄지만, 줄이다가 없앤 항이 글리치를 만듭니다. 측정 회로에서는 그 글리치가 아날로그로 결합합니다.
왜 간소화하는가
같은 진리표를 만드는 식은 여러 개입니다. 어느 것을 쓰든 정적으로는 같지만 셋이 달라집니다.
| 줄이면 | |
|---|---|
| 게이트 수 | 줄어듦 → 면적·전력·비용 |
| 전파 지연 | 단수가 줄면 빨라짐 |
| 글리치 | 오히려 늘어날 수 있음 ← 이 문서의 핵심 |
카르노맵 — 인접한 것끼리 묶는다
진리표를 그레이 코드 순서로 늘어놓으면, 이웃한 칸은 변수 하나만 다릅니다. 그 둘을 묶으면 그 변수가 사라집니다.
A이득gainB대역폭 또는 자속밀도bandwidth or flux densityC정전용량capacitanceF칸 배치가 그레이 코드인 이유가 이것입니다 — 이웃이 곧 “하나만 다름”이 되게 만들어 눈으로 묶을 수 있게 한 것입니다.
CD
00 01 11 10
AB ┌───┬───┬───┬───┐
00 │ 0 │ 1 │ 1 │ 0 │
01 │ 0 │ 1 │ 1 │ 0 │
11 │ 0 │ 1 │ 1 │ 1 │
10 │ 0 │ 0 │ 1 │ 1 │
└───┴───┴───┴───┘묶는 규칙
| 규칙 | 왜 |
|---|---|
| 2의 거듭제곱 크기로만 (1·2·4·8) | 그래야 변수가 딱 떨어짐 |
| 최대한 크게 | 클수록 변수가 많이 사라짐 |
| 겹쳐도 됨 | 같은 1 을 여러 묶음이 써도 결과는 같음 |
| 가장자리끼리 이어짐 | 맵이 도넛 모양 — 왼쪽 끝과 오른쪽 끝이 이웃 |
| 무관항(X)은 편한 대로 | 묶음을 키우는 데만 씀 |
위 맵에서: (세로 두 열 전체) + (오른쪽 아래) →
A이득gainC정전용량capacitanceFD듀티비duty cycleF잡음 지수noise figure게이트 둘로 줄었습니다.
★ 정적 해저드 — 줄이다가 생기는 글리치
문제: 입력이 하나 바뀔 때 출력이 안 바뀌어야 하는데 잠깐 반대로 튀는 현상입니다.
A이득gainB대역폭 또는 자속밀도bandwidth or flux densityC정전용량capacitanceFF잡음 지수noise figure로 두고 를 0 → 1 로 바꾸면 출력은 계속 1 이어야 합니다. 그런데
| 시각 | |||
|---|---|---|---|
| =0 | 1 | 0 | 1 |
| 전환 중 ( 가 아직 안 내려감… 이 아니라 먼저 내려감) | 0 | 0 | 0 ✗ |
| =1 | 0 | 1 | 1 |
인버터 지연 때문입니다. 가 보다 한 게이트 늦게 바뀌므로, 그 사이에 두 항이 동시에 0 이 되는 순간이 생깁니다.
카르노맵으로 보면 원인이 명확합니다. 두 묶음이 인접한데 겹치지 않으면 그 경계에서 해저드가 납니다.
C
0 1
AB ┌───┬───┐
11 │ 1 │ 1 │ ← 두 묶음의 경계. 겹치지 않으면 여기서 글리치
└───┴───┘해결: 겹치는 묶음(중복 항)을 일부러 추가합니다.
A이득gainB대역폭 또는 자속밀도bandwidth or flux densityC정전용량capacitanceFF잡음 지수noise figure는 논리적으로 없어도 되는 항인데, 가 바뀌는 동안 계속 1 을 유지해 줍니다.
핵심: 최소화와 글리치 없음은 서로 반대 방향입니다. 게이트를 하나 더 써서 글리치를 없애는 것이고, 그 결정은 그 신호가 무엇에 쓰이는가로 합니다.
글리치가 언제 문제인가
| 쓰임 | 글리치 |
|---|---|
| 동기 회로의 데이터 입력 | 문제 없음 — 클럭 에지에서만 읽으므로 |
| 조합 논리의 중간 신호 | 문제 없음 |
| 클럭·인에이블 | 치명적 — 한 클럭이 두 번 세어집니다 |
| 비동기 리셋 | 치명적 |
| 아날로그 스위치 제어 | 치명적 — 전하 주입전하 주입 charge injection아날로그 스위치를 끌 때 게이트의 전하가 신호 쪽으로 새어 나와 전압을 튀게 하는 현상입니다.자세히 보기 →이 신호에 들어감 |
| ADC 변환 시작 신호 | 치명적 |
⚠️ 측정 회로에서 특히 조심할 곳은 아날로그 스위치 제어선입니다. 글리치 하나가 스위치를 짧게 열었다 닫으면서 샘플링 커패시터에 전하를 주입합니다 (9-06). 신호에 직접 오차로 들어갑니다.
계산 예제 — 4-to-1 멀티플렉서 제어
측정 시스템에서 4채널을 선택하는 신호를 만듭니다. 로 채널을 고르고, 이 0 이면 전부 끕니다.
채널 0 선택 신호:
C정전용량capacitanceFE에너지energyJN개수countS_00번 슬루레이트 또는 감도slew rate or sensitivity 0S_11번 슬루레이트 또는 감도slew rate or sensitivity 1문제: 가 01 → 10 으로 바뀔 때(채널 1 → 채널 2), 두 비트가 동시에 바뀌지 않으면 잠깐 00 이나 11 을 지납니다.
| 경로 | 잠깐 지나는 값 | 결과 |
|---|---|---|
| 01 → 00 → 10 | 00 | 채널 0 이 잠깐 켜짐 ✗ |
| 01 → 11 → 10 | 11 | 채널 3 이 잠깐 켜짐 ✗ |
두 채널이 순간적으로 단락되어 신호가 섞입니다.
대책 셋:
| 방법 | 어떻게 | 대가 |
|---|---|---|
| 그레이 코드로 순서 바꾸기 | 00→01→11→10 순으로 스캔 | 순서가 부자연스러움 |
| 브레이크-비포-메이크 | 을 먼저 끄고 주소 바꾸고 다시 켜기 | 스캔 시간↑ |
| 레지스터로 동기화 | 주소를 플립플롭으로 받아 동시에 바꿈 | 플립플롭 2개 |
측정 회로에서는 두 번째가 표준입니다. 채널을 바꾸는 동안 스위치를 아예 다 꺼 두면 섞일 일이 없습니다. 대신 세틀링정착 시간 settling time출력이 목표값의 허용 오차 안으로 들어와 머무를 때까지 걸리는 시간으로, 다채널 측정의 속도 상한을 정합니다.자세히 보기 → 시간에 그만큼 더합니다.
시뮬레이션으로 확인
# examples/09-digital/glitch-mux-enable.yaml
meta:
name: 멀티플렉서 인에이블 글리치
lesson: docs/09-digital/07-karnaugh.md
note: 주소가 바뀌는 동안 EN 을 끄면 스위치가 겹쳐 켜지지 않는다
components:
- {ref: VEN, type: vpulse, params: {v1: 0, v2: 5, td: 0, tr: 10n, tf: 10n, pw: 4u, per: 10u}}
- {ref: SW1, type: sw, model: SW_IDEAL, label: 채널 스위치}
- {ref: VSIG, type: vdc, value: 1, label: 채널 신호}
- {ref: RON, type: r, value: 100, label: 도통 저항}
- {ref: CH, type: c, value: 100p, label: 홀드}
nets:
SIG: [VSIG.p, SW1.1]
MID: [SW1.2, RON.1]
OUT: [RON.2, CH.1]
EN: [VEN.p, SW1.cp]
GND: [VSIG.n, CH.2, VEN.n, SW1.cn]
analyses:
- {type: tran, tstep: 10n, tstop: 30u}VEN 의 tr·tf 를 1 µs 로 늘리면 스위치가 천천히 열리면서 문턱 근처
에서 도통 저항이 크게 변하는 구간이 보입니다. 그동안의 전하 주입이
OUT 에 계단으로 남습니다.
⚖️ 트레이드오프 — 얼마나 줄일 것인가
| 선택 | ✅ | ⚠️ |
|---|---|---|
| 최소 게이트 | 면적·전력·지연↓ | 정적 해저드 |
| 중복항 추가 | 글리치 없음 | 게이트 1~2개 더 |
| 전부 동기화 | 글리치가 아예 무의미 | 플립플롭, 클럭 1주기 지연 |
| 그레이 코드 | 한 번에 한 비트만 바뀜 | 순서가 자연스럽지 않음 |
| 그냥 MCU 로 | 유연 | 타이밍 보장 어려움, 소프트 지연 |
동기 설계가 정답인 경우가 대부분입니다. 글리치를 하나씩 잡는 것보다 클럭 에지에서만 읽게 만드는 것이 훨씬 확실합니다 → 08 FSM
🔌 실제 쓰임새
- 멀티플렉서 주소 디코딩 — 위 예제
- 클럭 게이팅 — 인에이블을 클럭과 AND 하면 글리치가 곧 가짜 클럭 (9-02)
- ADC 변환 시작 — 글리치 하나가 변환을 두 번 시작시킵니다
- CPLD/FPGA 로 구현할 때 — 합성기가 자동으로 줄이므로 글리치 없음을 요구하려면 명시해야 합니다
⚠️ 이상과 실제의 차이
| 이상 | 실제 |
|---|---|
| 게이트 지연이 같음 | 경로마다 다르고, 온도·전압으로 변합니다 |
| 글리치는 짧아서 무해 | 아날로그 스위치는 ns 글리치도 전하를 주입합니다 |
| 최소화가 항상 좋음 | 클럭·인에이블에는 중복항이 낫습니다 |
| 합성기가 알아서 함 | 합성기는 면적을 줄입니다. 글리치는 안 봅니다 |
연습문제
문제 1. 를 간소화할 수 있습니까?
exercises/09-07-xor-simplify.yaml풀이
없습니다. 이것은 XOR 이고, 카르노맵에서 1 들이 대각선으로 놓여 인접하지 않습니다.
B
0 1
A ┌───┬───┐
0 │ 0 │ 1 │
1 │ 1 │ 0 │
└───┴───┘묶을 수 있는 인접 쌍이 없으므로 두 항 그대로입니다.
XOR 이 게이트로 비싼 이유가 이것입니다 — AND/OR 로는 못 줄이고, CMOS 로 만들면 트랜지스터가 12개(NAND 는 4개)입니다. 패리티나 비교기에 XOR 이 많이 들어가면 면적이 금방 커집니다.
문제 2. 에 해저드가 있습니까? 있으면 어디입니까?
풀이
있습니다. 일 때 가 바뀌는 순간입니다.
| 1 | 1 | 0 | 1 |
| 전환 중 | 0 | 0 | 0 ✗ |
| 0 | 0 | 1 | 1 |
가 1→0 으로 갈 때 는 바로 0 이 되는데 는 인버터를 거치느라 늦게 1 이 되므로, 그 사이에 둘 다 0 인 순간이 생깁니다.
해결: 중복항 를 추가합니다.
A이득gainB대역폭 또는 자속밀도bandwidth or flux densityC정전용량capacitanceFF잡음 지수noise figure인 동안 가 계속 1 을 붙잡아 줍니다. 논리적으로는 없어도 되는 항이지만 시간적으로는 필요합니다.
문제 3. 8채널 MUX 의 주소를 MCU GPIO 로 직접 만듭니다. 무엇을 조심해야 합니까?
exercises/09-07-mux-address.yaml풀이
GPIO 는 비트마다 따로 바뀝니다. GPIOA->ODR = 0b011 처럼 한 번에
써도 실제 핀은 몇 ns 어긋나 바뀌고, 배선 길이까지 다르면 더 벌어집니다.
주소를 011 → 100 으로 바꾸면 세 비트가 다 바뀌므로 중간에 001·010·101·110·111 중 무엇이든 지날 수 있습니다 — 아무 채널이나 잠깐 켜집니다.
대책 (순서대로 권장):
- EN 을 먼저 끄고 주소를 바꾸고 다시 켠다 — 가장 확실, 소프트웨어만
- 주소 순서를 그레이 코드로 (000→001→011→010→110→111→101→100)
- 외부 레지스터(74HC574)로 받아 하나의 클럭으로 동시에 바꿈
1번이 표준입니다. 어차피 채널을 바꾼 뒤 세틀링 을 기다려야 하므로, 그 앞에 EN 오프 구간을 두는 것이 비용이 거의 0 입니다.
이전 ← 06 아날로그 스위치와 멀티플렉서 | 다음 → 08 상태기계 설계