← 블로그로 돌아가기조합 논리

디코더와 인코더: 7세그먼트 디스플레이 구동하기

디코더는 이진값을 원핫 또는 세그먼트 출력으로 바꾸고 인코더는 반대로 변환합니다. BCD-7세그먼트 드라이버와 우선순위 인코더를 만들어 보세요.

DennyDenny
약 9분 소요
Chalkboard feature illustration for “디코더와 인코더: 7세그먼트 디스플레이 구동하기”

요약: 인에이블된 액티브 하이 이진 디코더는 nn비트 코드를 2n2^n개 출력 중 하나의 인가로 매핑하며, 액티브 로우형은 이 규약을 반전합니다. 일반 인코더는 원핫 입력을 가정하지만 우선순위 인코더는 다중 활성 입력의 승자를 정합니다. BCD-7세그먼트 블록은 여러 세그먼트가 함께 활성화될 수 있으므로 원핫 디코더가 아니라 코드 변환기입니다.

디코더와 인코더는 압축된 이진 인덱스와 더 넓은 신호 집합 사이를 변환합니다. 주소 선택, 명령 제어, 이벤트 인코딩, 디스플레이 논리 등 많은 인터페이스에 쓰입니다. 이름은 논리 방향을 말하지만, 완전한 인터페이스에는 극성, 인에이블 동작, 무효 또는 동시 입력 정책도 필요합니다.

이 글에서는 부울식으로 동작하는 BCD-7세그먼트 디스플레이 드라이버를 만들고, 공통 애노드와 공통 캐소드 디스플레이의 차이, 우선순위 인코더와 인터럽트 처리 역할을 이해하며, digisim.io에서 이 회로들을 구성합니다.

디코더란?

이진 디코더는 nn비트 입력을 최대 2n2^n개 중 선택된 출력 하나로 매핑하는 조합 회로입니다. 아래 액티브 하이 예에서는 선택 출력이 HIGH이고 나머지는 LOW입니다. 실제 디코더 IC에는 인에이블이 있고 선택선이 LOW인 액티브 로우 출력도 흔합니다.

2-4 디코더 수업

2-4 디코더에서 2비트 입력은 4개 출력 중 어느 하나가 HIGH인지 선택합니다. 입력 10(이진 2)은 출력 Y2Y_2를 활성화합니다.

2-4 디코더: 진리표와 부울식

A1A_1A0A_0Y0Y_0Y1Y_1Y2Y_2Y3Y_3
001000
010100
100010
110001

각 출력은 입력 변수(보수형 또는 원형)의 고유한 AND 조합입니다.

Y0=A1‾⋅A0‾Y_0 = \overline{A_1} \cdot \overline{A_0} Y1=A1‾⋅A0Y_1 = \overline{A_1} \cdot A_0 Y2=A1⋅A0‾Y_2 = A_1 \cdot \overline{A_0} Y3=A1⋅A0Y_3 = A_1 \cdot A_0

정준 곱의 합 도식은 반전 두 개와 2입력 AND 항 네 개를 씁니다. 합성된 ASIC이나 FPGA는 같은 함수를 다른 셀이나 LUT로 매핑할 수 있습니다.

더 큰 디코더로 확장

3-8 디코더는 여덟 최소항으로 같은 부울 패턴을 따릅니다. 일반적으로 직접 곱의 합 형식은 출력마다 최소항 하나를 가집니다. 이는 교육용 구성이지 보편적 물리 게이트 수 요구 사항이 아니며, 큰 디코더는 흔히 계층형입니다.

7세그먼트 디스플레이

7세그먼트 디스플레이는 8자 모양으로 배치한 LED 세그먼트 일곱 개로 십진 숫자를 표시합니다. 각 세그먼트는 a부터 g까지 레이블을 붙입니다.

 ━━━━━ (a)
│     │
(f)   (b)
│     │
 ━━━━━ (g)
│     │
(e)   (c)
│     │
 ━━━━━ (d)

0부터 9까지 표시하려면 적절한 세그먼트 조합만 켭니다. 예를 들어 숫자 ‘7’은 a, b, c를 켜고 d, e, f, g는 끕니다.

공통 캐소드와 공통 애노드

7세그먼트 디스플레이에는 두 물리 구성 방식이 있으며 드라이버 회로에서 이 차이는 중요합니다.

  • 공통 캐소드: 모든 세그먼트 LED가 공통 접지(캐소드)를 공유합니다. 애노드를 HIGH로 구동하면 세그먼트가 켜집니다. 디코더 출력은 액티브 하이이며 논리 1이 세그먼트를 켭니다.
  • 공통 애노드: 모든 세그먼트 LED가 공통 양전원(애노드)을 공유합니다. 캐소드를 LOW로 끌어내리면 세그먼트가 켜집니다. 디코더 출력은 액티브 로우여야 하며 논리 0이 세그먼트를 켭니다.

DigiSim의 논리 7세그먼트 구성 요소는 액티브 하이 세그먼트 명령을 씁니다. 물리 디스플레이에서는 출력 극성도 인터페이스 일부일 뿐입니다. 전류 제한을 제공하고 드라이버의 소스/싱크 가능 전류를 확인하며 세그먼트별 및 패키지 전력 한계를 지키세요.

핵심 통찰: 이것은 단순 디코더가 아니다

7세그먼트 디코더는 표준 이진 디코더와 근본적으로 다릅니다. 4-16 디코더는 한 번에 정확히 하나만 활성화합니다. 7세그먼트 디코더는 여러 세그먼트를 동시에 활성화합니다(숫자 ‘8’은 7개 모두를 켭니다). 이는 같은 4비트 BCD 입력에서 나온, 독립 출력 함수 7개를 가진 조합 논리 회로입니다.

BCD-7세그먼트: 진리표

BCD(Binary Coded Decimal)는 4비트로 0부터 9까지를 나타냅니다. 디코더는 각 숫자를 적절한 세그먼트 패턴으로 매핑합니다.

숫자DDCCBBAAabcdefg
000001111110
100010110000
200101101101
300111111001
401000110011
501011011011
601101011111
701111110000
810001111111
910011111011

BCD 값 10~15는 십진 숫자 코드 밖입니다. 표시 패턴은 설계별이므로 시스템 계약에 따라 공백, 오류 글리프, 16진 A–F, 돈트케어 동작을 정의하세요.

세그먼트 출력의 부울식 유도

세그먼트 일곱 개 각각은 네 BCD 입력 DD, CC, BB, AA의 자체 부울 함수를 가집니다. 각 세그먼트를 켜는 숫자를 보고 곱의 합을 쓰거나 카르노 맵으로 최소화하여 식을 유도합니다.

세그먼트 a(위 가로)

세그먼트 a는 0, 2, 3, 5, 6, 7, 8, 9에서 ON이고 1, 4에서 OFF입니다. a=1a=1인 최소항을 나열하면 다음과 같습니다.

a=D‾ C‾ B‾ A‾+D‾ C‾ B A‾+D‾ C‾ B A+D‾ C B‾ A+D‾ C B A‾+D‾ C B A+D C‾ B‾ A‾+D C‾ B‾ Aa = \overline{D}\,\overline{C}\,\overline{B}\,\overline{A} + \overline{D}\,\overline{C}\,B\,\overline{A} + \overline{D}\,\overline{C}\,B\,A + \overline{D}\,C\,\overline{B}\,A + \overline{D}\,C\,B\,\overline{A} + \overline{D}\,C\,B\,A + D\,\overline{C}\,\overline{B}\,\overline{A} + D\,\overline{C}\,\overline{B}\,A

카르노 맵에서 BCD 입력 10~15를 돈트케어로 처리해 최소화하면 다음과 같습니다.

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

동등하게 a=D+B+A⊕C‾a = D + B + \overline{A \oplus C}, 즉 AA와 CC의 XNOR입니다.

세그먼트 g(가운데 가로)

세그먼트 g는 2, 3, 4, 5, 6, 8, 9에서 ON이고 0, 1, 7에서 OFF입니다. 최소화 식은 다음과 같습니다.

g=D+(B⊕C)+(B⋅A‾)g = D + (B \oplus C) + (B \cdot \overline{A})

전개하면 g=D+(B⋅C‾)+(B‾⋅C)+(B⋅A‾)g = D + (B \cdot \overline{C}) + (\overline{B} \cdot C) + (B \cdot \overline{A})입니다.

세그먼트 d(아래 가로)

세그먼트 d는 0, 2, 3, 5, 6, 8, 9에서 ON이고 1, 4, 7에서 OFF입니다. 최소화 식은 다음과 같습니다.

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

나머지 네 세그먼트(b, c, e, f)도 같은 과정을 따릅니다. 최소항을 나열하고, 무효 입력 정책을 정하고, 카르노 맵에 표시한 뒤 최소화 식을 추출합니다. 상용 74x47/48 계열 드라이버는 지정된 BCD-세그먼트 동작을 구현하지만 내부 네트워크가 이 특정 식과 같을 필요는 없습니다.

무효 BCD 입력 처리

BCD는 09만 쓰지만 4비트 입력은 1015도 나타낼 수 있습니다. 이 무효 입력에 디스플레이가 무엇을 보여야 할까요? 흔한 방법은 세 가지입니다.

  1. 디스플레이를 비웁니다. 모든 세그먼트를 끕니다. 정의된 결과를 주지만 다른 진단이 없다면 상위 오류를 숨길 수 있습니다.
  2. 돈트케어 처리합니다. 10~15를 최적화 자유도로 취급합니다. 논리는 단순해질 수 있지만 결과 패턴은 지정되지 않으며 그 입력이 디스플레이에서 중요하지 않을 때만 허용됩니다.
  3. 16진 숫자를 표시합니다. 16진 디스플레이에서는 1015를 AF에 매핑하므로 추가 세그먼트 패턴이 필요합니다.

위 식은 돈트케어 방식을 씁니다. 전용 BCD-7세그먼트 안내서는 일곱 함수 모두를 유도하고 이 가정이 안전한 때를 설명합니다.

digisim.io에서 7세그먼트 드라이버 만들기

동작하는 드라이버를 만들려면 다음을 따릅니다.

  1. BCD 입력 배치: INPUT_SWITCH 네 개를 추가하고 DD, CC, BB, AA로 레이블합니다.
  2. 보수 생성: NOT 게이트 네 개로 D‾\overline{D}, C‾\overline{C}, B‾\overline{B}, A‾\overline{A}를 만듭니다.
  3. 세그먼트 논리 구성: a~g 각 세그먼트에 AND와 OR 게이트로 부울식을 구현합니다. 위 최소화 식으로 a부터 시작합니다.
  4. 디스플레이 연결: SEVEN_SEGMENT_DISPLAY를 배치하고 각 세그먼트 출력을 해당 디스플레이 입력에 배선합니다.
  5. 체계적 시험: 입력 스위치를 BCD 0000~1001 모두로 전환하고 각각 올바른 숫자가 나타나는지 확인합니다.

바로 쓰려면 DIGIT_DISPLAY를 사용하세요. 게이트 수준 연습에서는 보이는 예 하나에서 멈추지 말고 유효 숫자 10개와 무효 코드 6개 모두를 시험합니다.

인코더란?

인코더는 디코더의 역연산을 합니다. 2n2^n개 입력선(최대 하나만 활성이라 가정)을 받아 어느 입력이 활성인지 나타내는 nn비트 이진 코드를 만듭니다.

기능디코더인코더
방향이진 코드에서 원핫원핫에서 이진 코드
입력nn비트2n2^n개 선
출력2n2^n개 선nn비트
예주소에서 메모리 칩 선택키보드 키에서 스캔 코드

단순 4-2 인코더

기본 4-2 인코더는 입력 4개(D3D_3, D2D_2, D1D_1, D0D_0)와 출력 2개(Y1Y_1, Y0Y_0)를 가집니다. 부울식은 다음과 같습니다.

Y1=D2+D3Y_1 = D_2 + D_3 Y0=D1+D3Y_0 = D_1 + D_3

이는 한 번에 정확히 하나의 입력이 활성일 때만 올바릅니다. 여러 입력이 동시에 활성화되면 출력은 모호합니다.

우선순위 인코더

실제 시스템에서는 여러 입력이 동시에 활성일 수 있습니다. 우선순위 인코더는 가장 높은 우선순위의 활성 입력(보통 가장 높은 인덱스)만 인코딩해 모호성을 해결합니다.

D3D_3D2D_2D1D_1D0D_0Y1Y_1Y0Y_0Valid인코딩 입력
0000XX0없음
0001001D0D_0
001X011D1D_1
01XX101D2D_2
1XXX111D3D_3(최고 우선순위)

X는 돈트케어입니다. 높은 우선순위 입력이 활성일 때 낮은 우선순위 입력은 무시됩니다. Valid 출력은 어떤 입력이라도 활성인지 나타내므로, ‘입력 0 활성’과 ‘활성 입력 없음’을 구분해야 하는 하위 논리에 중요합니다.

인터럽트 처리의 우선순위 인코더

우선순위 인코더의 중요한 응용 중 하나는 인터럽트 제어기입니다. 마이크로프로세서 시스템에서 키보드, 네트워크 카드, 타이머, 디스크 드라이브 같은 여러 하드웨어 장치가 인터럽트 요청선을 인가해 동시에 CPU의 주의를 요청할 수 있습니다.

우선순위 인코더는 가장 높은 순위의 적격한 요청을 식별하고 인덱스를 낼 수 있습니다. 완전한 인터럽트 제어기는 추가로 보류 이벤트를 기록하고, 마스크와 우선순위 상태를 적용하며, 프로토콜 정의 인터럽트 식별자나 벡터를 전달하고, 서비스 상태를 추적하며, 선택되지 않은 요청을 보존합니다. 상태 없는 인코더 하나만으로는 낮은 우선순위 요청을 보류할 수 없습니다.

Intel 8259A는 요청, 마스크, 서비스 중, 우선순위 해석, 벡터 생성을 결합한 역사적 제어기 예입니다. 이를 8입력 인코더로만 줄이면 그 상태성 기능을 놓칩니다.

digisim.io에서 3-8 디코더 만들기

완전한 3-8 디코더를 만드는 단계는 다음과 같습니다.

  1. 입력 배치: A2A_2, A1A_1, A0A_0로 레이블한 INPUT_SWITCH 세 개를 추가합니다.
  2. 보수 생성: A2‾\overline{A_2}, A1‾\overline{A_1}, A0‾\overline{A_0}용 NOT 게이트 세 개를 둡니다.
  3. AND 배열 구성: 3입력 AND 게이트 여덟 개를 둡니다. 각 게이트는 원형 및 보수형 입력의 고유 조합을 받습니다.
    • Y0=A2‾⋅A1‾⋅A0‾Y_0 = \overline{A_2} \cdot \overline{A_1} \cdot \overline{A_0}
    • Y1=A2‾⋅A1‾⋅A0Y_1 = \overline{A_2} \cdot \overline{A_1} \cdot A_0
    • Y2=A2‾⋅A1⋅A0‾Y_2 = \overline{A_2} \cdot A_1 \cdot \overline{A_0}
    • …계속하여…
    • Y7=A2⋅A1⋅A0Y_7 = A_2 \cdot A_1 \cdot A_0
  4. 출력 추가: 각 AND 출력을 OUTPUT_LIGHT에 연결합니다. 입력을 전환할 때 어느 때나 정확히 한 등이 켜져야 합니다.
  5. 인에이블선 추가(선택): 각 출력을 인에이블 신호와 AND하여 메모리 주소 디코딩에 쓸 수 있는 인에이블 디코더를 만듭니다.

응용

메모리 주소 디코딩

프로세서 시스템에서 디코더는 어떤 메모리 또는 I/O 대상이 주소에 응답할지 선택합니다. 상위 주소 비트 두 개에 연결한 2-4 디코더는 공간을 같은 크기의 2의 거듭제곱 영역 네 개로 나눌 수 있습니다. 다른 맵에는 추가 주소 비트와 접근 한정자가 필요합니다. 대상이 트라이스테이트 버스를 공유하면 버스 제어 논리는 출력이 최대 하나만 인에이블되게 해야 하며, 많은 현대 온칩 인터커넥트는 내부 트라이스테이트 배선 대신 멀티플렉싱 응답을 씁니다.

키보드 인코딩

스캔 키 매트릭스는 행/열 관측을 만듭니다. 우선순위 인코더는 여러 활성 열선을 하나의 인덱스로 의도적으로 줄일 수 있지만 다른 동시 키는 잃습니다. 다중 키 롤오버가 필요한 설계는 전체 매트릭스 상태를 보존하고 처리합니다. 전기적 고스팅, 접점 디바운스, 스캔 코드 생성, 우선순위는 별개 관심사입니다.

디스플레이 시스템

BCD-7세그먼트 변환은 시계, 계측기, 가전, 점수판에 나타납니다. 멀티플렉스 디스플레이에서는 여러 숫자 위치가 세그먼트 구동을 공유할 수 있습니다. 제어기는 하나의 패턴을 제시하고 맞는 숫자를 인에이블한 뒤 진행합니다. 완전 프레임 및 숫자별 새로 고침률은 깜박임, 카메라, 밝기, 듀티 사이클, 소자 한계에서 정해야 하며 보편적 1kHz 임계값은 없습니다. 드라이버와 숫자 선택 지연이 고스트 세그먼트를 만들 수 있으면 블랭킹을 넣으세요.

CPU의 명령어 디코딩

작은 교육용 CPU에서 4비트 opcode는 인출-디코드-실행 주기 동안 ALU, 레지스터, 메모리 제어에 기여하는 선택선을 만들도록 4-16 디코더에 들어갈 수 있습니다. 실제 명령 디코드는 계층형, 표 구동, 마이크로코드, 분산형일 수 있고 제어 신호는 보통 opcode 정보와 타이밍 상태 및 다른 명령 필드를 결합합니다.

타이밍과 해저드

조합 출력은 동시에 변하지 않습니다. 여러 입력 비트가 변할 때 최소항 디코더는 보수 및 비보수 경로의 지연 차이로 잠시 이전 출력, 출력 없음, 물리 하드웨어에서는 의도하지 않은 출력을 선택할 수 있습니다. 7세그먼트 네트워크도 전이 패턴을 잠시 표시할 수 있습니다.

수신기가 동기적으로 샘플한다면 입력이나 출력을 레지스터로 받으세요. 멀티플렉스 디스플레이는 고스팅이 중요하면 숫자/패턴 전환 중 블랭킹합니다. 칩 선택과 쓰기 인에이블은 정적 진리표만 믿지 말고 해저드를 분석하고 목표 소자 타이밍 요구를 만족하세요.

직접 해 보기

  1. 2-4 디코더를 적절한 반전의 AND 항 네 개로 만듭니다. 인에이블된 각 입력 조합에서 정확히 하나의 출력만 HIGH이고 비활성일 때는 어느 것도 HIGH가 아닌지 검증합니다.
  2. 적어도 a와 g 세그먼트 부울식을 처음부터 구현하고 출력을 SEVEN_SEGMENT_DISPLAY에 연결해 7세그먼트 디스플레이를 배선합니다.
  3. 버튼 4개 중 눌린 것을 2비트 이진 코드로 인코딩하는 4-2 인코더를 만듭니다.
  4. 버튼 두 개가 동시에 눌리면 높은 번호 버튼이 이기도록 인코더에 우선순위 논리를 더합니다.
  5. COUNTER를 7세그먼트 디코더에 연결해 0~9를 자동 계수하는 디스플레이 포함 완전 BCD 카운터를 만듭니다.

디코더에 계수 입력을 공급하려면 카운터와 상태 기계를 계속 읽거나, 모든 디코더 출력의 주 구성 블록인 AND 게이트 구성 요소 참조를 여세요. 멀티플렉서는 역 라우팅 문제를 해결합니다. 멀티플렉서 안내서를 참조하세요.

참고 자료

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