← 블로그로 돌아가기디지털 디코더

BCD-7세그먼트 디코더: 숫자에서 표시까지

진리표, K-맵 최소화, 고전적인 74LS47 드라이버 칩을 사용해 4비트 BCD 숫자를 디지털 표시기의 7개 세그먼트에 매핑합니다.

DennyDenny
약 9분 소요
Chalkboard feature illustration for “BCD-7세그먼트 디코더: 숫자에서 표시까지”

요약: BCD-7세그먼트 디코더는 4비트 이진화 십진수(09)를 받아 디지털 표시기의 ag 세그먼트 중 올바른 조합을 켭니다. 이 매핑은 10행 진리표로 정의합니다. 각 세그먼트의 부울식은 표에서 유도하고 K-맵으로 최소화한 뒤, 74LS47(공통 애노드) 또는 74LS48(공통 캐소드) 같은 칩으로 구현합니다.

7세그먼트 표시는 디지털 전자공학에서 가장 알아보기 쉬운 출력 장치입니다. 시계, 전자레인지, 계산기, 스코어보드, 오래된 주유기까지 모두 이를 사용합니다. 화면의 숫자 뒤에는 4비트 수를 어떤 LED를 켤지를 나타내는 7비트 패턴으로 바꾸는 작은 조합 회로가 있습니다. 이것이 BCD-7세그먼트 디코더이며, 부울 대수와 카르노 맵의 가장 명료한 실용 응용 가운데 하나입니다.

이 글에서는 BCD를 정의하고 세그먼트 명명 규칙을 정한 뒤 진리표를 만들고, 각 세그먼트의 부울 방정식을 유도합니다. 또한 공통 애노드와 공통 캐소드 배선을 대조하고 전체 기능을 구현하는 74LS47/74LS48 칩을 소개합니다. 마지막에 언급한 시뮬레이터 템플릿을 사용하면 직접 배선해 볼 수 있습니다.

BCD란?

BCD(Binary-Coded Decimal, 이진화 십진수)는 십진 숫자 09 각각을 4비트로 나타내는 인코딩입니다. 일반 이진수와 달리 BCD는 10101111(십진수 10~15) 코드를 낭비합니다. 이 코드는 사용하지 않습니다.

십진 숫자BCD(4비트)A B C D
000000 0 0 0
100010 0 0 1
200100 0 1 0
300110 0 1 1
401000 1 0 0
501010 1 0 1
601100 1 1 0
701110 1 1 1
810001 0 0 0
910011 0 0 1
10–151010–1111미사용(don’t-care)

이 글에서 사용하는 규칙은 A가 최상위 비트이고 D가 최하위 비트라는 것입니다. 일부 교재는 반대 순서를 쓰지만 변수 이름을 바꾸면 방정식은 같습니다.

일반 이진수 대신 BCD를 쓰는 이유는 무엇일까요? 십진 숫자가 숫자 중심 표시 장치에 직접 매핑되고, 고정 스케일의 십진량은 이진 분수 변환 없이 저장된 십진 숫자를 보존할 수 있기 때문입니다. 산술은 수학적 결과가 선택한 자릿수와 스케일에 들어맞을 때에만 정확합니다. 나눗셈과 다른 비종료 결과에는 여전히 반올림 규칙이 필요합니다.

저장 공간을 비교하려면 분모를 명확히 해야 합니다. BCD는 십진 숫자 하나당 4비트를 쓰는 반면, 열 기호의 정보량은 log⁡210≈3.322\log_2 10\approx3.322비트입니다. 각 BCD 니블의 이론적 코드 공간 중 약 16.9%는 사용되지 않습니다. 동등하게 말하면 4비트는 log⁡210\log_2 10보다 약 20.4% 많습니다. 특정 범위로 제한된 정수에서는 하나의 비율을 무조건 적용하지 말고 실제 이진수 폭과 BCD 폭을 비교하세요.

사용하지 않는 여섯 코드 1010~1111은 세그먼트 방정식을 최소화할 때 don’t-care 항이 될 수 있지만, 시스템이 표시 출력이 중요하지 않음을 보장할 때만 가능합니다. 리셋, 버스 전이, 고장 중 유효하지 않은 코드가 나타날 수 있다면 의도적인 공백 또는 오류 패턴을 지정하세요. don’t-care는 설계를 허용하는 조건이지, 하드웨어가 그 입력을 절대 내놓지 않는다는 주장이 아닙니다.

일곱 세그먼트

표준 7세그먼트 표시기에는 8 모양으로 배치한 LED 일곱 개가 있으며, 관례적으로 a~g로 이름 붙입니다.

   ┌─── a ───┐
   │         │
   f         b
   │         │
   ├─── g ───┤
   │         │
   e         c
   │         │
   └─── d ───┘
  • a는 위쪽 가로 막대입니다.
  • b는 오른쪽 위 세로 막대입니다.
  • c는 오른쪽 아래 세로 막대입니다.
  • d는 아래쪽 가로 막대입니다.
  • e는 왼쪽 아래 세로 막대입니다.
  • f는 왼쪽 위 세로 막대입니다.
  • g는 가운데 가로 막대입니다.

각 십진 숫자는 특정 세그먼트 부분집합을 켭니다.

숫자켜지는 세그먼트
0a, b, c, d, e, f
1b, c
2a, b, d, e, g
3a, b, c, d, g
4b, c, f, g
5a, c, d, f, g
6a, c, d, e, f, g
7a, b, c
8a, b, c, d, e, f, g
9a, b, c, d, f, g

DigiSim의 SEVEN_SEGMENT_DISPLAY 구성 요소는 정확히 이 순서로 일곱 입력을 받습니다. DIGIT_DISPLAY는 4비트 BCD 입력을 직접 받고 내부에서 디코딩을 처리하는 더 높은 수준의 추상화입니다.

전체 진리표

BCD 인코딩과 세그먼트 매핑을 합치면 16행(유효 10행 + don’t-care 6행), 세그먼트 열 7개로 된 표가 됩니다.

ABCD숫자abcdefg
000001111110
000110110000
001021101101
001131111001
010040110011
010151011011
011061011111
011171110000
100081111111
100191111011
1010—×××××××
1011—×××××××
1100—×××××××
1101—×××××××
1110—×××××××
1111—×××××××

이 표는 active-high 논리 세그먼트 명령을 가정합니다. 1은 “이 세그먼트를 켜라”는 요청입니다. 공통 캐소드 드라이버는 대개 이 극성을 그대로 쓸 수 있지만, 공통 애노드 드라이버는 보통 active-low 출력을 사용합니다. 물리적 드라이버 단계는 전류 방향, 전압 강하, 출력 구조도 다르므로 구별이 단순한 회로도 인버터만의 문제는 아닙니다.

세그먼트 방정식 유도

위 표의 각 세그먼트 열은 네 입력의 부울 함수 하나입니다. don’t-care 행 6개를 사용하면 K-맵 최소화는 순진한 곱의 합보다 훨씬 짧은 식을 얻습니다. 이 기법은 곱의 합 방법과 K-맵을 통한 축소입니다.

세그먼트 a

세그먼트 a는 숫자 0, 2, 3, 5, 6, 7, 8, 9에서 켜지고 1, 4에서 꺼집니다. don’t-care를 최적으로 취급하면 K-맵 최소화는 다음과 같습니다.

a=A+C+B⋅D+B‾⋅D‾a = A + C + B \cdot D + \overline{B} \cdot \overline{D}

(여기서 B‾\overline{B}는 NOT B를 뜻합니다. 일부 책에서는 B′B'로 표기합니다.) B‾⋅D‾\overline{B} \cdot \overline{D} 항은 B와 D가 모두 0인 경우로 0과 2를 효율적으로 덮습니다. B⋅DB \cdot D 항은 둘 다 1인 경우로 3, 5, 7, 9를 덮습니다. AA만으로는 8, 9와 don’t-care 10~15를 덮고, CC만으로는 2, 3, 6, 7을 덮습니다.

이 식은 각 곱 항마다 AND 하나와 OR 축소를 사용합니다. 정확한 셀 또는 트랜지스터 수는 논리 계열, 보수 신호의 가용성, 합성 매핑에 따라 달라집니다.

세그먼트 b

세그먼트 b는 0, 1, 2, 3, 4, 7, 8, 9에서 켜지고 5, 6에서 꺼집니다. K-맵 결과는 다음과 같습니다.

b=B‾+C‾⋅D‾+C⋅Db = \overline{B} + \overline{C} \cdot \overline{D} + C \cdot D

세그먼트 c

세그먼트 c는 0, 1, 3, 4, 5, 6, 7, 8, 9에서 켜지고 2에서만 꺼집니다. K-맵 결과는 다음과 같습니다.

c=B+C‾+Dc = B + \overline{C} + D

이것이 가장 단순합니다. 출력이 0인 행이 하나뿐이고 don’t-care가 맵의 나머지를 채우기 때문에 항이 세 개뿐입니다.

세그먼트 d

세그먼트 d는 0, 2, 3, 5, 6, 8, 9에서 켜지고 1, 4, 7에서 꺼집니다. K-맵 결과는 다음과 같습니다.

d=B‾⋅D‾+C⋅D‾+B⋅C‾⋅D+B‾⋅C+Ad = \overline{B} \cdot \overline{D} + C \cdot \overline{D} + B \cdot \overline{C} \cdot D + \overline{B} \cdot C + A

세그먼트 e

세그먼트 e는 0, 2, 6, 8에서 켜지고 1, 3, 4, 5, 7, 9에서 꺼집니다. K-맵 결과는 다음과 같습니다.

e=B‾⋅D‾+C⋅D‾e = \overline{B} \cdot \overline{D} + C \cdot \overline{D}

두 항은 D‾\overline{D}를 공유합니다. 동등하게 e=D‾(B‾+C)e=\overline{D}(\overline{B}+C)입니다. 이 입력 규칙에서 짝수 숫자는 e에 필요하지만 충분하지는 않습니다. 숫자 4는 D=0D=0이지만 e는 꺼져 있습니다. 인수분해한 형식은 필요한 반전을 제외하면 OR 하나 뒤에 AND 하나를 사용할 수 있습니다.

세그먼트 f

세그먼트 f는 0, 4, 5, 6, 8, 9에서 켜지고 1, 2, 3, 7에서 꺼집니다. K-맵 결과는 다음과 같습니다.

f=A+B⋅C‾+C‾⋅D‾+B⋅D‾f = A + B \cdot \overline{C} + \overline{C} \cdot \overline{D} + B \cdot \overline{D}

세그먼트 g

가운데 막대인 세그먼트 g는 2, 3, 4, 5, 6, 8, 9에서 켜지고 0, 1, 7에서 꺼집니다. K-맵 결과는 다음과 같습니다.

g=A+B⋅C‾+C⋅D‾+B‾⋅Cg = A + B \cdot \overline{C} + C \cdot \overline{D} + \overline{B} \cdot C

이 식들은 명시한 active-high 및 don’t-care 가정 아래에서 얻은 유효한 최소화 한 가지입니다. 동등한 최소 형식은 다르게 보일 수 있고, 상용 디코더의 내부 네트워크가 이 교과서식 곱의 합과 같을 필요도 없습니다.

공통 애노드와 공통 캐소드

7세그먼트 표시기 자체에는 두 물리적 배선 방식이 있습니다. 모든 LED의 어느 쪽을 하나의 공통 핀에 묶는지가 다릅니다.

공통 캐소드

일곱 LED의 캐소드(음극)를 모두 접지에 연결된 공통 핀 하나에 묶습니다. 각 애노드는 따로 구동합니다. 세그먼트를 켜려면 해당 애노드를 high로 구동합니다.

  • 드라이버 출력: active-high — 1이 세그먼트를 켭니다.
  • 진리표 해석: 위 표와 직접 일치합니다.
  • 호환 칩: 74LS48 — 출력은 active-high입니다.

공통 애노드

일곱 LED의 애노드(양극)를 모두 VCCV_CC에 연결된 공통 핀 하나에 묶습니다. 각 캐소드는 따로 구동합니다. 세그먼트를 켜려면 해당 캐소드를 low로 끌어내립니다.

  • 드라이버 출력: active-low — 0이 세그먼트를 켭니다.
  • 진리표 해석: 모든 출력 열을 반전합니다.
  • 호환 칩: 74LS47 — 출력은 active-low(open-collector)입니다.

부울 수준에서는 극성 변경을 출력 반전으로 표현할 수 있습니다. 물리 하드웨어에서는 필요한 전류를 소스 또는 싱크할 수 있는 드라이버를 고르고, 켜지는 각 세그먼트 경로에 전류 제한 소자를 넣어야 합니다. LED 세그먼트를 제한 없는 전압원에 절대 연결하지 마세요.

74LS47과 74LS48

74LS47과 74LS48은 TTL BCD-7세그먼트 디코더/드라이버 기능입니다. 유용한 참조이지만, 이름을 극성만 다른 드롭인 추상화로 취급하지 말고 정확히 주문 가능한 장치를 데이터시트로 골라 배선하세요.

칩출력 극성표시기 유형
74LS47Active-low(open-collector)공통 애노드
74LS48Active-high(with internal pull-ups)공통 캐소드

고전적인 장치 표기에서는 보통 A를 최하위 BCD 입력, D를 최상위 입력으로 표기합니다. 이 글의 방정식은 A를 MSB, D를 LSB로 정했습니다. 74LS47/48의 핀 수준 설계에 식을 복사하기 전에 변수 이름을 바꾸세요.

두 칩에는 유용한 보조 입력도 세 개 있습니다.

  • LT(램프 테스트): BCD 입력과 무관하게 일곱 출력을 모두 켜도록 low로 당깁니다. 모든 LED가 정상인지 검증할 때 씁니다.
  • RBI(리플 블랭킹 입력): BCD 입력 0000과 함께 low로 당기면 0을 표시하지 않고 표시기를 공백으로 만듭니다. 여러 자리 표시기에서 선행 0을 없애 00073을 73으로 만드는 데 씁니다.
  • BI/RBO(블랭킹 입력/리플 블랭킹 출력): 강제 블랭킹과 리플 블랭킹 체인에 쓰는 이중 기능 핀입니다. 동작은 다른 제어 입력에 따라 달라지므로, 보통의 양방향 논리 핀처럼 취급하지 말고 장치 기능표를 따르세요.

이 세 핀을 함께 쓰면 여러 디코더/표시기 쌍을 다자리 숫자 표시기로 캐스케이드 연결해 선행 0을 자동으로 없앨 수 있습니다.

유효하지 않은 BCD 입력(1010~1111)의 동작은 칩마다 정의되어 특유의 숫자가 아닌 세그먼트 패턴을 냅니다. 디버깅 신호로는 유용하지만 이식 가능한 동작은 아닙니다.

실제 응용

BCD-7세그먼트 디코딩은 숫자 표시 장치에 흔히 쓰입니다.

  • 디지털 시계 — 카운터 또는 저장한 시간 숫자가 조합 세그먼트 생성기로 들어가며, 흔히 멀티플렉스 드라이버를 거칩니다. 초와 분에는 모듈로 60 동작이 필요하고, 보통 일의 자리와 십의 자리로 나눕니다.
  • 계산기와 계량기 — 여러 숫자가 멀티플렉싱을 통해 세그먼트 구동을 공유할 수 있습니다. 제어기는 한 번에 숫자 하나와 그 세그먼트 패턴을 선택합니다. 새로고침률, 피크 전류, 듀티 사이클, 밝기, 고스팅을 함께 설계해야 합니다.
  • 다자리 전압계와 주파수 카운터 — 카운터가 BCD 인코딩 레지스터로 들어가고, 레지스터가 디코더로, 디코더가 세그먼트를 켭니다.
  • 스코어보드와 주행 거리계 — 같은 멀티플렉싱 기법을 쓰며, 종종 더 밝은 LED 어레이를 사용합니다.

DigiSim에서 만들기

범용 디코더 기본 구성 요소는 DECODER에서 확인하세요. BCD-7세그먼트라는 특정 경우에는 변환이 내장된 DIGIT_DISPLAY를 놓거나, 디코더를 직접 만들어 일곱 출력을 SEVEN_SEGMENT_DISPLAY에 넣습니다.

입력 스위치 네 개를 A, B, C, D(최상위에서 최하위 순)로 배선합니다. 위 방정식으로 세그먼트 a부터 구현합니다.

  1. AND 게이트 두 개: 하나는 B⋅DB \cdot D, 하나는 B‾⋅D‾\overline{B} \cdot \overline{D}용입니다.
  2. AA, CC, 두 AND 출력을 합치는 4입력 OR 하나입니다.

스위치를 BCD 코드 0~9로 바꾸며 세그먼트 a가 올바른 경우에 켜지는지 검증하세요. 이어서 위 방정식으로 b부터 g까지 세그먼트를 추가합니다.

마지막으로 코드 10~15를 시험합니다. 이를 don’t-care로 썼다면 실제 패턴을 기록하고, 표시기가 보이는 동안 상위 논리가 해당 코드를 막는지 확인하세요. 고장을 알리는 설계라면 don’t-care를 정의된 공백 또는 오류 글리프로 바꾸고 다시 최소화하세요.

조합 논리 학습 흐름의 다음 글인 BCD: Binary-Coded Decimal Fundamentals는 BCD 덧셈, 유효하지 않은 자릿값이나 십진 캐리가 발생할 때 6을 더하는 보정, 패킹 및 언패킹 BCD 저장을 다룹니다. 몇 개의 이진 입력이 여러 표시 패턴 중 하나를 선택하는 원리를 체계적으로 이해하려면 7세그먼트 표시기를 구동하는 디코더와 인코더와 함께 참조하십시오.

참고 자료

아이디어를 실제로 작동하는 회로로 만들어 보세요.