이번 문서의 목표: 이 파일을 다 읽으면 무관항(don’t care)이 있는 함수를 카르노맵으로 간소화하고, 5변수 카르노맵을 두 장의 표로 그려 겹치는 자리까지 정확히 묶을 수 있으며, 여러 출력을 동시에 최소화할 때 항을 공유하는 요령과 0을 묶어 POS를 구하는 전 과정을 손으로 완성할 수 있다.
왜 11편만으로는 부족한가
11편에서는 2·3·4변수 함수의 진리표가 정확히 하나의 값(0 또는 1)으로 빠짐없이 채워져 있다고 가정하고 카르노맵 묶음 절차를 배웠다. 그런데 실제 시험 문제와 실제 회로 설계에는 세 가지 상황이 더 있다.
첫째, 입력 조합 중 일부는 애초에 나타날 일이 없거나, 나타나도 출력이 무엇이든 상관없는 경우가 있다(예: BCD 코드는 09만 쓰므로 1015는 나타나지 않는다). 둘째, 변수가 5개로 늘어나면 11편의 격자 하나로는 모든 조합을 담을 수 없다. 셋째, 회로 하나가 출력을 여러 개 내야 하는 경우, 출력마다 따로따로 최소화하면 게이트를 낭비하게 된다.
쉽게 말하면: 이 편은 “진리표가 완벽하게 채워진 4변수 이하 함수”라는 11편의 편안한 조건을 하나씩 깨뜨리면서, 그래도 카르노맵으로 최소식을 구하는 방법을 익히는 편이다.
무관항(don’t care): 채워지지 않은 칸을 자유롭게 쓴다
쉽게 말하면: 무관항은 “이 입력은 절대 안 들어오거나, 들어와도 결과가 상관없으니, 간소화에 유리한 쪽으로 마음대로 0 또는 1을 골라도 되는 칸”이다.
무관항(don’t care condition)은 진리표에서 값이 확정되지 않은 입력 조합을 말한다. 표에는 보통 d 또는 X로 표시한다. 18~21편에서 SR 플립플롭의 금지 입력, JK 여기표, 카운터의 미사용 상태를 다룰 때 이미 이 개념을 여러 번 활용했는데, 이번 편에서는 그 근거가 되는 카르노맵 처리 방법을 정식으로 정리한다.
무관항이 생기는 대표적인 상황은 두 가지다.
- 입력 자체가 나타나지 않는 경우: 07편에서 배운 BCD 코드는 4비트로 0
9만 표현하므로, 4비트 조합 중 10101111(10~15)은 정상적인 BCD 입력으로 절대 나타나지 않는다. - 출력이 나타나도 결과가 중요하지 않은 경우: 특정 조건에서는 그 출력값을 다음 단계에서 아예 쓰지 않아, 0이 나오든 1이 나오든 시스템 전체에 영향이 없는 경우다.
예제: BCD 홀수 판별 회로
4비트 BCD 입력 (A가 최상위 비트)가 홀수인지 판별하는 함수 를 만든다고 하자. BCD 숫자가 홀수라는 것은 마지막 비트 가 1이라는 뜻이므로, 실제로 나타나는 홀수는 1, 3, 5, 7, 9다.
- : 반드시 출력이 1이어야 하는 최소항
- : BCD로는 나타나지 않아 무관항으로 두는 최소항(10~15)
4변수 카르노맵에 옮기면 다음과 같다(행은 , 열은 , 둘 다 그레이 코드 순서).
| \ | 00 | 01 | 11 | 10 |
|---|---|---|---|---|
| 00 | 0 | 1 | 1 | 0 |
| 01 | 0 | 1 | 1 | 0 |
| 11 | d | d | d | d |
| 10 | 0 | 1 | d | d |
1단계: 확정된 1이 있는 칸을 확인한다
열 전체()와 열 전체()에 1 또는 d가 채워져 있다.
2단계: 두 열을 하나의 8칸 묶음으로 묶는다
열과 열은 그레이 코드상 이웃한 열이며, 두 열 모두 로 고정되어 있다(01은 , 11은 ). 이 두 열을 네 행 전부와 함께 묶으면 8칸 묶음이 된다. 는 칸마다 값이 섞여 소거되고, 만 모든 칸에서 1로 고정된다.
3단계: 남은 확정된 1을 확인한다
()은 이미 2단계 묶음에 포함되어 있다. 확정된 1 중 아직 커버되지 않은 칸이 없는지 확인하면, 모든 1이 이미 8칸 묶음 안에 있다.
4단계: 최소식을 정리한다
결과 해석: 놀랍게도 최소식은 , 리터럴 하나뿐이다. 이는 “BCD 숫자가 홀수인가”라는 질문이 결국 “마지막 비트가 1인가”와 완전히 같은 질문이기 때문이며, 무관항 6개(10~15)를 전부 1로 채워도 되는 자유를 얻었기 때문에 이렇게까지 줄어들 수 있었다. 만약 무관항을 활용하지 못하고 만으로 간소화했다면 하나로 줄지 않고 더 긴 식이 나왔을 것이다(직접 확인해보면, 무관항 없이는 열과 열 중 행이 확정된 값이 없어 8칸 전체 묶음을 만들 수 없다).
시험 함정: 무관항은 “항상 1로 채워야 유리하다”는 말이 아니다. 간소화에 도움이 될 때만 1로, 도움이 안 되면 0으로 두어도 무방하다는 뜻이다. 위 예제에서도 우연히 전부 1로 채우는 것이 최선이었을 뿐, 다른 함수에서는 무관항 중 일부만 1로, 나머지는 0으로 두는 것이 최소식으로 이어질 수 있다.
5변수 카르노맵: 표 두 장을 겹쳐서 읽는다
쉽게 말하면: 5변수 카르노맵은 4변수 카르노맵 두 장을 준비해서, 다섯 번째 변수가 0인 경우와 1인 경우로 나눈 뒤, 두 표에서 같은 자리에 있는 칸끼리도 서로 이웃하는 것으로 취급하는 방법이다.
11편에서 배운 격자는 4변수까지만 담을 수 있다. 변수가 5개()로 늘어나면, 일 때의 표와 일 때의 표를 각각 그린 뒤 나란히(또는 포개서) 놓는다. 두 표 모두 행은 , 열은 를 그레이 코드 순서로 놓는다는 점은 4변수 카르노맵과 완전히 같다.
핵심은 인접성 규칙이 하나 더 늘어난다는 것이다.
- 각 표 안에서는 11편에서 배운 규칙(가로·세로 그레이 코드 인접, 원통 구조)이 그대로 적용된다.
- 추가로, 표와 표에서 정확히 같은 위치(같은 , 같은 )에 있는 두 칸도 서로 이웃한 것으로 취급한다. 두 칸은 값이 완전히 같고 만 0과 1로 다르기 때문에, 정확히 1비트 차이라는 카르노맵 인접 조건을 만족한다.
이 두 번째 규칙을 “두 표를 포개면 겹치는 자리끼리 이웃”이라고 기억하면 쉽다. 종이 두 장을 겹쳐 들었을 때 완전히 겹치는 칸이 바로 그 규칙이 말하는 이웃이다.
예제 1: 두 표를 모두 쓰는 8칸 묶음
다음 함수를 5변수 카르노맵으로 간소화해보자.
먼저 각 최소항을 이진수로 풀어 값만 확인한다. 순서로 이므로, , , , 은 모두 이고, , , , 도 모두 이다. 즉 이 여덟 최소항은 값과 관계없이 인 모든 경우를 나열한 것이다.
표 (행 , 열 , 인 칸만 해당 열에 값이 들어감. 이 )
| \ | 00 | 01 | 11 | 10 |
|---|---|---|---|---|
| 00 | 1() | 0 | 0 | 1() |
| 01 | 0 | 0 | 0 | 0 |
| 11 | 0 | 0 | 0 | 0 |
| 10 | 1() | 0 | 0 | 1() |
표 (가 )
| \ | 00 | 01 | 11 | 10 |
|---|---|---|---|---|
| 00 | 1() | 1() | 0 | 0 |
| 01 | 0 | 0 | 0 | 0 |
| 11 | 0 | 0 | 0 | 0 |
| 10 | 1() | 1() | 0 | 0 |
1단계: 각 표 안에서 행의 인접성을 확인한다
두 표 모두 행과 행에 1이 몰려 있다. 의 그레이 코드 순서는 00, 01, 11, 10이므로, 과 은 표의 맨 위와 맨 아래에 떨어져 있지만, 11편에서 배운 원통 구조에 의해 맨 위 행과 맨 아래 행은 서로 인접하다.
2단계: 표 안에서 열의 인접성도 확인한다
표에서는 과 열(둘 다 … 정확히는 이 , 이 )에 1이 있는데, 이 두 열도 그레이 코드 순서상 맨 왼쪽·맨 오른쪽이라 원통 구조로 인접하다. 표에서는 과 열(보통 순서로 이웃)에 1이 있다.
3단계: 두 표를 포개어 겹치는 자리를 확인한다
표의 행 열(4칸: )과, 표의 행 열(4칸: )을 각각 4칸 묶음으로 만들 수 있다는 것은 3변수까지 확인한 것이고, 이제 이 두 4칸 묶음을 서로 포개면 정확히 같은 행 조합()을 공유하지만 열은 다르다( vs ). 그런데 애초에 이 여덟 최소항 전체가 ""이라는 조건 하나로 묶인다는 점(1단계 앞부분에서 확인)을 기준으로 다시 보면, 네 열 중 인 두 열()과 네 행 중 인 두 행()을 두 표(E=0, E=1) 모두에서 함께 묶으면 정확히 이 여덟 최소항 전부를 담는 8칸 묶음이 만들어진다.
4단계: 고정된 변수만 남긴다
이 8칸 묶음에서 는 0과 1이 섞여 소거되고, 도 두 열()에서 0과 1이 섞여 소거되며, 도 두 표에 걸쳐 있으므로 소거된다. 오직 과 만 모든 칸에서 고정되어 있다.
결과 해석: 5변수 함수였지만 최소식은 리터럴 단 2개다. 이 묶음은 한 표 안의 원통 구조(행 인접) 와 두 표 사이의 포개기(E 인접) 를 동시에 활용한 8칸 묶음이며, 5변수 카르노맵의 핵심 기술을 그대로 보여준다.
예제 2: 한 표 안에서만 묶이는 경우
모든 묶음이 두 표에 걸치는 것은 아니다. 다음처럼 최소항이 한쪽 표에만 있으면 그 표 안에서만 묶는다.
(), ()이며, 둘 다 이므로 표에는 아무 값도 없다. 두 최소항은 자리만 다르고 나머지()는 완전히 같으므로 2칸 묶음이 된다.
시험 함정: 5변수 카르노맵을 보자마자 “무조건 두 표를 합쳐서 묶어야 한다”고 생각하면 안 된다. 최소항이 한쪽 표에만 몰려 있으면 그 표 안에서만 묶는 것이 맞고, 억지로 다른 표의 칸을 무리하게 끌어들이면 오히려 틀린 항이 나온다. 두 표 사이의 인접성은 “같은 위치에 실제로 값이 있을 때만” 활용하는 추가 옵션이라고 생각해야 한다.
필수 프라임 임플리컨트: 반드시 골라야 하는 묶음
쉽게 말하면: 어떤 최소항을 커버하는 방법이 딱 하나의 묶음뿐이라면, 그 묶음은 무조건 최종 답에 들어가야 한다.
11편까지는 “가장 큰 묶음부터 찾는다”는 요령만 강조했지만, 실제로는 어떤 최소항을 커버하는 유효한 묶음이 여러 개일 때, 어느 것을 최종 답으로 골라야 하는가라는 문제가 남는다. 이때 기준이 되는 것이 필수 프라임 임플리컨트(essential prime implicant)다.
프라임 임플리컨트(prime implicant)란 더 이상 다른 칸과 합쳐 확장할 수 없는, 가장 큰 형태의 묶음을 말한다(13편에서 퀴인-맥클러스키로 이 개념을 표로 다시 정리한다). 이 중에서도 어떤 최소항 하나를 커버할 수 있는 유일한 묶음이 있다면, 그 묶음은 골라도 되고 안 골라도 되는 것이 아니라 반드시 골라야 최종 함수가 원래 진리표와 일치한다. 이런 묶음을 필수 프라임 임플리컨트라고 부른다.
판정 절차
1단계: 각 확정된 1(또는 don’t care가 아닌 1)마다 그 칸을 포함하는 가능한 가장 큰 묶음을 모두 나열한다
2단계: 어떤 칸이 딱 하나의 묶음에만 속하는지 확인한다
그 칸을 포함하는 다른 대안적인 큰 묶음이 없다면, 그 묶음은 그 칸에 대해 유일한 선택지다.
3단계: 유일한 선택지인 묶음을 모두 필수 프라임 임플리컨트로 확정한다
4단계: 필수 프라임 임플리컨트가 커버하는 최소항을 모두 지운다
5단계: 아직 커버되지 않은 최소항이 남아 있으면, 그것을 커버하는 묶음 중 최소 개수만 추가로 고른다
앞서 BCD 홀수 판별 예제에서는 8칸 묶음 하나가 모든 1을 커버했으므로 이 묶음 자체가 유일한 필수 프라임 임플리컨트였다. 반면 여러 개의 서로 다른 묶음이 최소항을 나눠 커버해야 하는 경우에는, 어떤 묶음이 필수이고 어떤 묶음이 없어도 되는지(다른 묶음에 완전히 포함되는 중복 묶음인지)를 하나씩 따져야 한다. 변수가 많아 눈으로 이 판정을 하기 어려울 때는 13편에서 배울 프라임 임플리컨트 차트를 표로 만들어 기계적으로 판정하는 방법이 훨씬 안전하다.
다중 출력 함수의 카르노맵: 게이트를 함께 아낀다
쉽게 말하면: 출력이 여러 개인 회로에서는 각 출력을 따로 최소화하기보다, 여러 출력이 공통으로 쓸 수 있는 AND 항을 찾아 게이트 하나를 나눠 쓰는 것이 전체 게이트 수를 더 많이 줄인다.
실제 회로는 출력이 하나뿐인 경우보다 여러 출력을 동시에 만들어야 하는 경우가 많다(예: 15편의 전가산기는 합 와 자리올림 두 출력을 함께 낸다). 각 출력을 따로 카르노맵으로 최소화하면 각자에게는 최소식이 나오지만, 두 출력이 우연히 같은 곱항을 필요로 한다면 그 AND 게이트를 한 번만 만들어 두 출력에 공유해서 연결하는 것이 전체 게이트 수를 더 아낄 수 있다.
예제: 두 출력에서 공통 항 찾기
다음 두 함수를 함께 구현한다고 하자.
의 카르노맵과 간소화
| \ | 00 | 01 | 11 | 10 |
|---|---|---|---|---|
| 0 | 0 | 1() | 1() | 0 |
| 1 | 0 | 1() | 0 | 0 |
과 을 묶으면(, 고정) 가 나오고, 과 를 묶으면(, 고정) 가 나온다. 은 로만, 는 로만 커버되므로 두 묶음 모두 필수다.
의 카르노맵과 간소화
| \ | 00 | 01 | 11 | 10 |
|---|---|---|---|---|
| 0 | 0 | 1() | 0 | 0 |
| 1 | 1() | 1() | 0 | 0 |
과 를 묶으면(, 고정) 가 나오고, 와 를 묶으면(, ) 이 나온다. 는 으로만, 은 로만 커버되므로 두 묶음 모두 필수다.
결과 해석: 과 를 각각 독립적으로 보면 서로 다른 함수이지만, 두 최소식 모두 라는 같은 항을 포함한다. 실제 회로를 만들 때는 를 계산하는 AND 게이트를 딱 한 번만 만들어 두고, 그 출력을 의 OR 게이트와 의 OR 게이트에 동시에 연결하면 된다.
| 방식 | 필요한 AND 게이트 | 비고 |
|---|---|---|
| 각자 독립적으로 구현 | , (용), , (용) = 4개 | 를 두 번 만듦(낭비) |
| 항을 공유해서 구현 | , , = 3개 | 게이트 하나를 가 함께 사용 |
시험 함정: 다중 출력 문제에서 “각 출력의 최소식을 그냥 나열하면 끝”이라고 생각하면 안 된다. 각 출력만 놓고 보면 최소식이라도, 두 출력의 카르노맵을 나란히 놓고 공통 항이 있는지 반드시 확인해야 진짜 최소 게이트 수에 도달할 수 있다. 이 확인 과정을 건너뛰면 정답은 맞아도 “게이트 수를 최소화하라”는 문제의 취지를 놓치게 된다.
POS 간소화 전 과정: 0을 묶어서 곱의 합을 얻는다
쉽게 말하면: SOP를 구할 때는 1이 있는 칸을 묶었다면, POS를 구할 때는 반대로 0이 있는 칸을 묶은 뒤 드모르간 법칙으로 뒤집으면 된다.
10편에서 표준 POS(곱의 합, Product of Sums)를 배웠다. 카르노맵으로 최소 POS를 구하는 절차는 SOP와 접근 방향만 반대다. 함수 값이 0인 칸(즉 이 1인 칸)을 묶어서 의 최소 SOP를 먼저 구한 뒤, 드모르간 법칙으로 전체를 뒤집어 POS로 바꾼다.
예제: F(A,B,C) = sum m(0,1,2,3,4)
이 함수는 인 최소항이 세 개뿐이다.
| \ | 00 | 01 | 11 | 10 |
|---|---|---|---|---|
| 0 | 1 | 1 | 1 | 1 |
| 1 | 1 | 0() | 0() | 0() |
1단계: F=0인 칸을 확인한다
, , 세 칸이 0이다.
2단계: 0인 칸끼리 묶는다
와 은 로 이웃하며( 고정) 묶으면 가 나온다. 과 은 으로 이웃하며( 고정) 묶으면 가 나온다. 는 로만, 은 로만 커버되므로 둘 다 필수다.
3단계: F’의 최소 SOP를 완성한다
4단계: 드모르간 법칙으로 F를 구한다
이므로 전체에 보수를 취한다. 09편에서 배운 드모르간 법칙을 두 번 적용한다.
5단계: 각 인수에 드모르간 법칙을 한 번 더 적용한다
, 이므로 다음과 같이 정리된다.
결과 해석: 가 최소 POS다. 실제로 대입해서 검산하면, 예를 들어 에서는 , 이므로 곱은 1이 되어 원래 과 일치하고, 에서는 , 이므로 곱은 0이 되어 원래 과 일치한다.
시험 함정: “POS를 구하라”는 문제에서 습관대로 1이 있는 칸을 묶어 SOP를 구해 놓고 답으로 제출하는 실수가 매우 흔하다. POS는 반드시 0이 있는 칸을 묶어 을 얻은 뒤 드모르간 법칙으로 뒤집는 절차를 거쳐야 한다. 두 절차의 결과물(SOP의 각 항 vs POS의 각 인수)은 서로 완전히 다른 형태이므로, 묶기 전에 반드시 “지금 SOP를 구하는지 POS를 구하는지”를 확인해야 한다.
자주 출제되는 함정 총정리
- 무관항을 무조건 1로 채우는 착각: 간소화에 도움이 될 때만 1로 채우고, 도움이 안 되면 0으로 두어도 무방하다.
- 5변수 카르노맵에서 두 표 사이의 인접성(포개서 겹치는 자리)을 놓치는 실수: 최상위 변수(이 편의 예제에서는 )로 나눈 두 표에서 같은 위치의 칸도 이웃이라는 점을 빠뜨리면 더 큰 묶음을 놓친다.
- 필요하지도 않은데 억지로 두 표를 함께 묶으려는 실수: 최소항이 한쪽 표에만 몰려 있으면 그 표 안에서만 묶는 것이 맞다.
- 다중 출력 문제에서 공유 가능한 항을 확인하지 않는 실수: 각 출력을 독립적으로만 최소화하면 최소식은 맞아도 전체 게이트 수는 최소가 아닐 수 있다.
- POS 문제에서 1을 묶어 SOP를 구해버리는 실수: POS는 0을 묶어 의 SOP를 구한 뒤 드모르간 법칙으로 뒤집어야 한다.
- 필수 프라임 임플리컨트 판정 없이 아무 묶음이나 골라 최소식이 아닌 결과를 내는 실수: 어떤 최소항을 커버하는 유일한 묶음인지 반드시 확인하고, 그렇지 않은 묶음(다른 묶음에 완전히 포함되는 묶음)은 제외해야 한다.
핵심 정리
- 무관항(don’t care)은 입력이 나타나지 않거나 출력이 중요하지 않은 칸이며, 간소화에 유리한 쪽으로만 자유롭게 1 또는 0을 선택해 활용한다.
- 5변수 카르노맵은 다섯 번째 변수 값(0/1)으로 나눈 두 장의 4변수 표로 그리며, 각 표 안의 인접성(원통 구조)에 더해 두 표에서 같은 위치에 있는 칸끼리도 서로 이웃으로 취급한다.
- 필수 프라임 임플리컨트는 어떤 최소항을 커버하는 유일한 묶음이며, 최종 최소식에 반드시 포함되어야 한다.
- 여러 출력을 동시에 구현할 때는 각 출력의 카르노맵에서 공통으로 쓸 수 있는 항을 찾아 AND 게이트를 공유하면 전체 게이트 수를 더 줄일 수 있다.
- 최소 POS는 함수 값이 0인 칸을 묶어 의 최소 SOP를 구한 뒤, 드모르간 법칙으로 전체를 뒤집어서 얻는다.