Skip to content

디지털 코드

디지털 시스템에서 10진수를 2진수로 표현할 때 BCD(Binary Coded Decimal) 코드를 사용한다. BCD는 10진수 한 자리(0~9)를 4비트로 매핑하는 방식이며, 각 비트에 부여된 가중치에 따라 여러 종류가 있다.

가중치 코드

4비트 값 b3 b2 b1 b0의 10진 값은 각 비트에 가중치 w3, w2, w1, w0를 곱한 합으로 결정된다.

값 = b3×w3 + b2×w2 + b1×w1 + b0×w0

8-4-2-1 코드는 가장 기본적인 BCD 코드로, 가중치가 일반 2진수 자릿값과 동일하다. 예를 들어 10진수 70111 → 0×8 + 1×4 + 1×2 + 1×1 = 7이 된다.

순수 2진수 변환과 달리 BCD는 10진수 각 자리를 독립적으로 4비트에 매핑하기 때문에 변환이 직관적이다.

  • 10진수 59 → 순수 2진수: 111011 (나눗셈 필요)
  • 10진수 59 → BCD: 0101 1001 (5→0101, 9→1001)

디지털 시계, 계산기, 디스플레이 구동 회로 등 10진수를 직접 다루는 하드웨어에서 주로 쓰인다.

자기보수 코드

자기보수(Self-Complementing) 코드는 어떤 10진수 N의 코드에서 모든 비트를 반전하면 9-N(9의 보수)이 되는 코드이다. 별도의 뺄셈 회로 없이 비트 반전만으로 9의 보수를 구할 수 있어 연산 회로 설계가 단순해진다.

자기보수 코드의 조건

가중치의 합이 9여야 한다.

w3 + w2 + w1 + w0 = 9

모든 비트가 1일 때 값이 9가 되어야 비트 전체 반전 시 0(모든 비트 0)과 대응되고, 그 사이의 모든 N ↔ 9-N 관계가 성립하기 때문이다.

8 4 -2 -1 코드

가중치 합이 8 + 4 + (-2) + (-1) = 9이므로 자기보수 코드이다. 0~9 매핑은 다음과 같다.

  • 0: 0000 → 0
  • 1: 0111 → 4-2-1 = 1
  • 2: 0110 → 4-2 = 2
  • 3: 0101 → 4-1 = 3
  • 4: 0100 → 4
  • 5: 1011 → 8-2-1 = 5
  • 6: 1010 → 8-2 = 6
  • 7: 1001 → 8-1 = 7
  • 8: 1000 → 8
  • 9: 1111 → 8+4-2-1 = 9

비트 반전으로 자기보수가 성립하는지 확인해보면:

  • 3 = 0101 → 반전 → 1010 = 8-2 = 6 (= 9-3)
  • 2 = 0110 → 반전 → 1001 = 8-1 = 7 (= 9-2)
  • 4 = 0100 → 반전 → 1011 = 8-2-1 = 5 (= 9-4)

모든 쌍(0↔9, 1↔8, 2↔7, 3↔6, 4↔5)이 비트 반전 관계이다.

2-4-2-1 코드

가중치 합이 2 + 4 + 2 + 1 = 9이므로 역시 자기보수 코드이다.

반례: 5-4-2-1 코드

가중치 합이 5 + 4 + 2 + 1 = 12 ≠ 9이므로 자기보수 코드가 아니다.

Excess-3 코드

BCD 값에 3을 더한 비가중치 코드이다. 가중치가 없지만 자기보수 성질을 가진다. 예를 들어 10진수 0은 BCD 0000에 3을 더한 0011, 91001에 3을 더한 1100이 되고, 이 둘은 비트 반전 관계이다.

Gray 코드

Gray 코드는 인접한 두 값 사이에서 정확히 1비트만 변하도록 설계된 비가중치 코드이다. 일반 2진수에서는 0111(7) → 1000(8)처럼 한 번에 4비트가 동시에 바뀌는 경우가 있는데, 실제 회로에서는 각 비트의 전환 시점에 미세한 차이가 있어 순간적으로 엉뚱한 중간값이 나타날 수 있다. Gray 코드는 이 문제를 원천적으로 제거한다.

4비트 Gray 코드

10진수 2진수 Gray
0 0000 0000
1 0001 0001
2 0010 0011
3 0011 0010
4 0100 0110
5 0101 0111
6 0110 0101
7 0111 0100
8 1000 1100
9 1001 1101
10 1010 1111
11 1011 1110
12 1100 1010
13 1101 1011
14 1110 1001
15 1111 1000

인접한 행끼리 비교하면 항상 1비트만 다르다. 마지막 값 1000(15)과 처음 값 0000(0) 사이에서도 1비트만 다르므로, 순환 구조에서도 안전하다.

2진수 → Gray 변환

최상위 비트는 그대로 유지하고, 나머지 비트는 2진수의 인접한 두 비트를 XOR하면 된다.

2진수: b3 b2 b1 b0
Gray: b3 b3⊕b2 b2⊕b1 b1⊕b0

예시: 2진수 1010 → Gray 1 1⊕0=1 0⊕1=1 1⊕0=11111

Gray → 2진수 변환

최상위 비트는 그대로 유지하고, 이후 비트는 직전에 구한 2진수 비트와 현재 Gray 비트를 XOR한다.

Gray: g3 g2 g1 g0
2진수: g3 g3⊕g2 (g3⊕g2)⊕g1 ((g3⊕g2)⊕g1)⊕g0

예시: Gray 11111 1⊕1=0 0⊕1=1 1⊕1=0 → 2진수 1010

활용

  • 회전 인코더: 축의 회전 각도를 감지하는 센서에서 위치를 읽을 때, 일반 2진수를 쓰면 경계에서 여러 비트가 동시에 바뀌며 잘못된 위치가 순간적으로 읽힐 수 있다. Gray 코드는 1비트만 바뀌므로 이런 글리치가 발생하지 않는다.
  • A/D 변환기: 아날로그 신호를 디지털로 변환할 때 경계값 근처에서의 오류를 줄인다.
  • 카르노 맵: 논리 회로 간소화에 쓰이는 카르노 맵의 축 순서가 Gray 코드 순서이다. 인접 셀끼리 1비트만 다르게 배치해야 인접항 묶기가 가능하기 때문이다.
  • 오류 최소화: 전송 중 1비트 오류가 발생해도 인접한 값으로만 틀리므로, 오류의 크기가 최소화된다.