카르노맵과 해저드

한 줄 요약 — 논리식을 줄이면 게이트가 줄지만, 줄이다가 없앤 항이 글리치를 만듭니다. 측정 회로에서는 그 글리치가 아날로그로 결합합니다.


왜 간소화하는가

같은 진리표를 만드는 식은 여러 개입니다. 어느 것을 쓰든 정적으로는 같지만 셋이 달라집니다.

줄이면
게이트 수줄어듦 → 면적·전력·비용
전파 지연단수가 줄면 빨라짐
글리치오히려 늘어날 수 있음 ← 이 문서의 핵심

카르노맵 — 인접한 것끼리 묶는다

진리표를 그레이 코드 순서로 늘어놓으면, 이웃한 칸은 변수 하나만 다릅니다. 그 둘을 묶으면 그 변수가 사라집니다.

ABCˉ+ABC=AB(Cˉ+C)=ABAB\bar{C} + ABC = AB(\bar{C}+C) = AB
기호
A이득gain
B대역폭 또는 자속밀도bandwidth or flux density
C정전용량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)은 편한 대로묶음을 키우는 데만 씀

위 맵에서: DD (세로 두 열 전체) + ACAC (오른쪽 아래) →

F=D+ACF = D + AC
기호
A이득gain
C정전용량capacitanceF
D듀티비duty cycle
F잡음 지수noise figure

게이트 둘로 줄었습니다.


★ 정적 해저드 — 줄이다가 생기는 글리치

문제: 입력이 하나 바뀔 때 출력이 안 바뀌어야 하는데 잠깐 반대로 튀는 현상입니다.

F=ACˉ+BCF = A\bar{C} + BC
기호
A이득gain
B대역폭 또는 자속밀도bandwidth or flux density
C정전용량capacitanceF
F잡음 지수noise figure

A=B=1A = B = 1 로 두고 CC 를 0 → 1 로 바꾸면 출력은 계속 1 이어야 합니다. 그런데

시각ACˉA\bar CBCBCFF
CC=0101
전환 중 (Cˉ\bar C 가 아직 안 내려감… 이 아니라 먼저 내려감)000 ✗
CC=1011

인버터 지연 때문입니다. Cˉ\bar C 가 CC 보다 한 게이트 늦게 바뀌므로, 그 사이에 두 항이 동시에 0 이 되는 순간이 생깁니다.

카르노맵으로 보면 원인이 명확합니다. 두 묶음이 인접한데 겹치지 않으면 그 경계에서 해저드가 납니다.

      C
    0   1
AB ┌───┬───┐
11 │ 1 │ 1 │  ← 두 묶음의 경계. 겹치지 않으면 여기서 글리치
   └───┴───┘

해결: 겹치는 묶음(중복 항)을 일부러 추가합니다.

F=ACˉ+BC+AB⏟중복항F = A\bar{C} + BC + \underbrace{AB}_{\text{중복항}}
기호
A이득gain
B대역폭 또는 자속밀도bandwidth or flux density
C정전용량capacitanceF
F잡음 지수noise figure

ABAB 는 논리적으로 없어도 되는 항인데, CC 가 바뀌는 동안 계속 1 을 유지해 줍니다.

핵심: 최소화와 글리치 없음은 서로 반대 방향입니다. 게이트를 하나 더 써서 글리치를 없애는 것이고, 그 결정은 그 신호가 무엇에 쓰이는가로 합니다.


글리치가 언제 문제인가

쓰임글리치
동기 회로의 데이터 입력문제 없음 — 클럭 에지에서만 읽으므로
조합 논리의 중간 신호문제 없음
클럭·인에이블치명적 — 한 클럭이 두 번 세어집니다
비동기 리셋치명적
아날로그 스위치 제어치명적 — 전하 주입전하 주입 charge injection아날로그 스위치를 끌 때 게이트의 전하가 신호 쪽으로 새어 나와 전압을 튀게 하는 현상입니다.자세히 보기 →이 신호에 들어감
ADC 변환 시작 신호치명적

⚠️ 측정 회로에서 특히 조심할 곳은 아날로그 스위치 제어선입니다. 글리치 하나가 스위치를 짧게 열었다 닫으면서 샘플링 커패시터에 전하를 주입합니다 (9-06). 신호에 직접 오차로 들어갑니다.


계산 예제 — 4-to-1 멀티플렉서 제어

측정 시스템에서 4채널을 선택하는 신호를 만듭니다. S1S0S_1 S_0 로 채널을 고르고, ENEN 이 0 이면 전부 끕니다.

채널 0 선택 신호:

CH0=EN⋅S1ˉ⋅S0ˉCH_0 = EN \cdot \bar{S_1} \cdot \bar{S_0}
기호
C정전용량capacitanceF
E에너지energyJ
N개수count
S_00번 슬루레이트 또는 감도slew rate or sensitivity 0
S_11번 슬루레이트 또는 감도slew rate or sensitivity 1

문제: S1S0S_1S_0 가 01 → 10 으로 바뀔 때(채널 1 → 채널 2), 두 비트가 동시에 바뀌지 않으면 잠깐 00 이나 11 을 지납니다.

경로잠깐 지나는 값결과
01 → 00 → 1000채널 0 이 잠깐 켜짐 ✗
01 → 11 → 1011채널 3 이 잠깐 켜짐 ✗

두 채널이 순간적으로 단락되어 신호가 섞입니다.

대책 셋:

방법어떻게대가
그레이 코드로 순서 바꾸기00→01→11→10 순으로 스캔순서가 부자연스러움
브레이크-비포-메이크ENEN 을 먼저 끄고 주소 바꾸고 다시 켜기스캔 시간↑
레지스터로 동기화주소를 플립플롭으로 받아 동시에 바꿈플립플롭 2개

측정 회로에서는 두 번째가 표준입니다. 채널을 바꾸는 동안 스위치를 아예 다 꺼 두면 섞일 일이 없습니다. 대신 세틀링정착 시간 settling time출력이 목표값의 허용 오차 안으로 들어와 머무를 때까지 걸리는 시간으로, 다채널 측정의 속도 상한을 정합니다.자세히 보기 → 시간에 그만큼 더합니다.


시뮬레이션으로 확인

멀티플렉서 인에이블 글리치 회로도RON100Ω도통 저항VENVSIG1V채널 신호CH100pF홀드SW1SW_IDEAL채널 스위치SIGMIDOUTENGND
멀티플렉서 인에이블 글리치워크벤치에서 열기 →
# 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. F=AˉB+ABˉF = \bar{A}B + A\bar{B} 를 간소화할 수 있습니까?

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. F=AB+AˉCF = AB + \bar{A}C 에 해저드가 있습니까? 있으면 어디입니까?

연습 9-07-2 — 해저드는 두 길의 지연 차이가 만든다 회로도RD700Ω인버터 한 단의 지연DF1N4148빠른 항 (AB)DS1N4148늦은 항 (ĀC)VAA 가 1 → 0CD10pFRL10kΩOR 의 부하VIĀ (뒤집힌 것)RI1kΩ뒤집는 쪽GNDGNDAABARSLOWOUTGND
연습 9-07-2 — 해저드는 두 길의 지연 차이가 만든다워크벤치에서 열기 →
풀이

있습니다. B=C=1B = C = 1 일 때 AA 가 바뀌는 순간입니다.

AAABABAˉC\bar A CFF
1101
전환 중000 ✗
0011

AA 가 1→0 으로 갈 때 ABAB 는 바로 0 이 되는데 Aˉ\bar A 는 인버터를 거치느라 늦게 1 이 되므로, 그 사이에 둘 다 0 인 순간이 생깁니다.

해결: 중복항 BCBC 를 추가합니다.

F=AB+AˉC+BCF = AB + \bar{A}C + BC
기호
A이득gain
B대역폭 또는 자속밀도bandwidth or flux density
C정전용량capacitanceF
F잡음 지수noise figure

B=C=1B=C=1 인 동안 BCBC 가 계속 1 을 붙잡아 줍니다. 논리적으로는 없어도 되는 항이지만 시간적으로는 필요합니다.

문제 3. 8채널 MUX 의 주소를 MCU GPIO 로 직접 만듭니다. 무엇을 조심해야 합니까?

exercises/09-07-mux-address.yaml
풀이

GPIO 는 비트마다 따로 바뀝니다. GPIOA->ODR = 0b011 처럼 한 번에 써도 실제 핀은 몇 ns 어긋나 바뀌고, 배선 길이까지 다르면 더 벌어집니다.

주소를 011 → 100 으로 바꾸면 세 비트가 다 바뀌므로 중간에 001·010·101·110·111 중 무엇이든 지날 수 있습니다 — 아무 채널이나 잠깐 켜집니다.

대책 (순서대로 권장):

  1. EN 을 먼저 끄고 주소를 바꾸고 다시 켠다 — 가장 확실, 소프트웨어만
  2. 주소 순서를 그레이 코드로 (000→001→011→010→110→111→101→100)
  3. 외부 레지스터(74HC574)로 받아 하나의 클럭으로 동시에 바꿈

1번이 표준입니다. 어차피 채널을 바꾼 뒤 세틀링 을 기다려야 하므로, 그 앞에 EN 오프 구간을 두는 것이 비용이 거의 0 입니다.


이전 ← 06 아날로그 스위치와 멀티플렉서 | 다음 → 08 상태기계 설계