[컴퓨터 구조] - 조합 논리회로 (Combination Logic Circuit)
조합 논리회로 (Combination Logic Circuit)
조합 논리회로(Combination Logic Circuit)는 입력 신호의 조합에 의해서만 출력이 결정되는 회로로서, 상태나 시간에 의존하지 않는다. 조합 논리회로는 논리 게이트를 사용하여 구현되며, 입력 조합의 다양한 결과를 효율적으로 처리할 수 있는 장점이 있다. 조합 논리회로의 기본적인 설계과정은 다음과 같다.
- 주어진 문제로부터 입력변수와 출력변수의 개수를 결정한다.
- 입력변수와 출력변수를 기호로 표시하여 블록도를 그린다.
- 각각의 출력을 입력변수의 함수(정규형)으로 나타내고 간소화한다.
- 논리회로도를 그린다.
실제 조합 논리회로를 설계할 때는 "게이트 수의 최소화", "입력단자 최소화", "신호 전파시간", "게이트 간의 상호 연결 수 최소화", "각 게이트 동작 특성 한계" 등 다양한 조건들이 고려되어 설계된다.
기본적인 연산회로
조합 논리회로는 기본적인 연산회로(산술회로)와 데이터 전송에 관련된 조합 논리회로로 구분된다. 가산, 감산, 승산 등의 산술 연산을 수행하는 회로들은 다음과 같다.
가산기 (Adder)
가장 기본적인 산술 연산은 2개의 이진수를 더하는 것이다. $0+0=1$, $0+1=1$, $1+0=1$, $1+1=10$ 이렇게 네 가지 기본 연산이 있다. 이처럼 이진수의 덧셈을 수행하는 조합 논리회로를 가산기라고 하며, 이때 2비트의 덧셈을 수행하는 조합 논리회로는 반가산기라고 하고 3비트의 덧셈을 수행하는 회로를 전가산기라고 한다.
반가산기 (Half Adder: HA)
반가산기는 두 개의 이진수 비트를 더하는 기본적인 논리 회로이다. 반가산기는 두 개의 입력을 받아서 합(Sum)과 자리 올림수(Carry)를 출력한다. 반가산기는 1비트 덧셈을 수행하며, 입력이 0과 1일 때의 결과는 다음과 같다.
입력 | 출력 | ||
$X$ | $Y$ | $S$ | $C$ |
$0$ | $0$ | $0$ | $0$ |
$0$ | $1$ | $1$ | $0$ |
$1$ | $0$ | $1$ | $0$ |
$1$ | $1$ | $0$ | $1$ |
위의 진리표로부터 유도해낸 부울함수는 다음과 같다.
\begin{align} S &= \overline{X}Y + X\overline{Y} = X \oplus Y \\[5pt] C &= XY \end{align}
위의 부울 함수식을 보면 알 수 있듯, 반가산기는 XOR 게이트(Sum)와 AND 게이트(Carry)를 이용해 구현되며, 입력 조합에 따라 서로 다른 출력을 갖는다. 반가산기의 회로도는 다음과 같다.
전가산기 (Full Adder: FA)
전가산기는 반가산기의 기능을 확장하여, 세 개의 입력을 받아 두 개의 출력을 생성한다. 이때, 세 개의 입력은 두 개의 이진수 비트($X$, $Y$)와 이전 단계에서 넘어온 자리 올림수($C_{in}$)이다. 전가산기는 다음과 같은 출력을 생성한다.
입력 | 출력 | |||
$X$ | $Y$ | $Z (= C_{in})$ | $S$ | $C_{out}$ |
$0$ | $0$ | $0$ | $0$ | $0$ |
$0$ | $0$ | $1$ | $1$ | $0$ |
$0$ | $1$ | $0$ | $1$ | $0$ |
$0$ | $1$ | $1$ | $0$ | $1$ |
$1$ | $0$ | $0$ | $1$ | $0$ |
$1$ | $0$ | $1$ | $0$ | $1$ |
$1$ | $1$ | $0$ | $0$ | $1$ |
$1$ | $1$ | $1$ | $1$ | $1$ |
위의 진리표로부터 유도해낸 부울함수는 다음과 같다.
\begin{align} S &= \overline{X}\overline{Y}Z + \overline{X}Y\overline{Z} + X\overline{Y}\overline{Z} + XYZ = X \oplus Y \oplus Z \\[5pt] C &= XY + XZ + YZ = XY + Z(X \oplus Y)\end{align}
위의 부울 함수식을 보면 알 수 있듯, 전가산기는 2개의 반가산기와 1개의 OR 게이트를 이용해 구현된다. 전가산기의 회로도는 다음과 같다.
감산기 (Subtractor)
두 개의 이진수 사이의 뺼셈은 보수를 취하는 방법으로 수행한다. 즉, $A-B$는 $B$의 2의 보수를 취한 후, $A$에 더하여 계산한다.
반감산기 (Half Subtractor: HS)
반감산기는 1비트의 2진수에서 다른 1비트의 2진수를 빼서 차를 구하는 조합 논리회로이다. $0 - 0= 0$, $1 - 0 =1$, $1 - 1 =0$, $0-1 = 1$ 이렇게 네 가지 기본 연산이 있다. $0-1$의 경우. 앞자리에서 1을 빌려와야 하는데 빌려 온 수를 빌림수라고 한다. 반감산기는 2개의 입력과 2개의 출력을 가진다.
입력 | 출력 | ||
$X$ | $Y$ | $D$ | $B$ |
$0$ | $0$ | $0$ | $0$ |
$0$ | $1$ | $1$ | $1$ |
$1$ | $0$ | $1$ | $0$ |
$1$ | $1$ | $0$ | $0$ |
위의 진리표로부터 유도해낸 부울함수는 다음과 같다.
\begin{align} D &= \overline{X}Y + X\overline{Y} = X \oplus Y \\ B &= \overline{X}Y \end{align}
위의 부울 함수식을 보면 알 수 있듯, 반감산기는 XOR 게이트(Sum)와 NOT 게이트(보수), AND 게이트(Carry)를 이용해 구현된다. 반감산기의 회로도는 다음과 같다.
전감산기 (Full Subtractor)
전감산기는 반감산기를 기반으로 한 뺄셈 회로로, 이전 단계에서 발생한 빌림을 포함하여 더 복잡한 연산을 수행한다. 빌림수에 대한 입력을 고려하기 위해 3개의 입력과 2개의 출력을 가진다.
입력 | 출력 | |||
$X$ | $Y$ | $Z (= B_{in})$ | $D$ | $B$ |
$0$ | $0$ | $0$ | $0$ | $0$ |
$0$ | $0$ | $1$ | $1$ | $1$ |
$0$ | $1$ | $0$ | $1$ | $1$ |
$0$ | $1$ | $1$ | $0$ | $1$ |
$1$ | $0$ | $0$ | $1$ | $0$ |
$1$ | $0$ | $1$ | $0$ | $0$ |
$1$ | $1$ | $0$ | $0$ | $0$ |
$1$ | $1$ | $1$ | $1$ | $1$ |
위의 진리표로부터 유도해낸 부울함수는 다음과 같다.
\begin{align} D &= \overline{X}\overline{Y}Z + \overline{X}Y\overline{Z} + X\overline{Y}\overline{Z} + XYZ = X \oplus Y \oplus Z \\[5pt] B &= \overline{X}Y + \overline{X}Z + YZ = \overline{X}Y + (\overline{X \oplus Y})Z\end{align}
위의 부울 함수식을 보면 알 수 있듯, 전감산기는 2개의 반감산기와 1개의 OR 게이트를 이용해 구현된다. 전감산기의 회로도는 다음과 같다.
여러 가지 조합 논리회로
코드 변환기 (Code converter)
디지털 시스템에서 서로 다른 시스템끼리 동일한 정보를 교환할 때, 교환할 정보에 대해 서로 다른 코드를 사용한다면 두 시스템 사이에는 코드 변환이 필요하게 된다. 이때, 코드 변환기는 하나의 이진 코드를 다른 이진 코드로 바꾸어주는 조합 논리회로이며 논리게이트로 된 변환회로를 사용하여 변환 과정을 수행한다.
코드 변환기는 데이터 변환, 오류 방지, 연산 최적화 등의 목적으로 사용되며, 논리 게이트를 조합하여 구현할 수 있다. 코드 변환기의 종류들와 변환 방식 등을 정리하면 다음과 같다.
변환기 종류 | 변환 방식 | 주요 논리 연산 |
BCD - 3초과 코드 변환기 | BCD 코드에서 각 숫자에 3을 더하고 4비트로 표현한다. | AND, OR, XOR, NOT |
3초과 → BCD 코드 변환기 | 3초과 코드에서 각 숫자에 3을 빼면 BCD 코드가 된다. | AND, OR, XOR |
2의 보수 변환기 | 모든 비트를 반전시킨 후, 1을 더한다. | NOT + Full Adder |
이진 → 그레이 코드 변환기 | 첫 번째 비트 그대로 유지하고 각 나머지 비트들은 이전 비트와 XOR 연산을 수행한다. | XOR |
그레이 → 이진 코드 변환기 | 첫 번째 비트는 그대로 유지하고 나머지는 순차적으로 XOR 연산 수행한다. | XOR |
패리티 발생기/검사기
패리티(Parity)는 데이터 전송 중 오류를 검출하기 위해 사용하는 방법으로, 패리티 비트(Parity Bit)를 추가하여 전송된 데이터의 1의 개수를 일정한 규칙(짝수 또는 홀수)으로 맞추는 방식이다.
패리티 발생기(Parity Generator)
패리티 발생기는 데이터 비트에 패리티 비트를 추가하여 전송하기 위한 논리 회로이다.
- `짝수 패리티 발생(Even Parity Generator)`: 1의 개수가 짝수가 되도록 패리티 비트를 추가한다. 모든 데이터 비트를 XOR 연산하여 패리티 비트를 생성한다.
- `홀수 패리티 발생(Odd Parity Generator)`: 1의 개수가 홀수가 되도록 패리티 비트를 추가한다. 모든 데이터 비트를 XOR 연산 후, 반전(NOT) 연산을 추가
패리티 검사기(Parity Checker)
패리티 검사기는 전송된 데이터의 패리티를 확인하여 오류를 검출하는 논리 회로이다. 수신된 데이터에서 패리티 비트를 포함한 모든 비트를 XOR 연산하여 결과가 0이면 정상적인 데이터이고, 1이면 오류가 발생한 것이라고 판단한다.
- `짝수 패리티 검사(Even Parity Checker)`: $A \oplus B \oplus C \oplus P= 0$이면 정상, $A \oplus B \oplus C \oplus P = 1$이면 오류
- `홀수 패리티 검사(Odd Parity Checker)`: $A \oplus B \oplus C \oplus P= 1$이면 정상, $A \oplus B \oplus C \oplus P = 0$이면 오류
이때, 패리티 비트는 단순히 오류를 검출하는데 사용될 뿐이며, 오류 수정(Correction)은 불가능하다.
MSI를 이용한 조합 논리회로
조합 논리회로를 효율적으로 설계하기 위해서는 "주어진 함수를 실행할 때 필요한 게이트 수를 최소화하는 것"이 중요하다. 이때, "집적회로(Integrated Circuits)"를 사용하면 편리하게 조합 논리회로를 설계할 수 있다.
이미 제작된 MSI(중규모 집적회로), LSI(대규모 집적회로) 등을 이용하면 다양한 조합 논리회로를 설계할 수 있으며 복잡한 디지털 시스템 설계를 할 때도 편리해진다. MSI 회로의 종류들로는 "인코더", "디코더", "멀티플렉서", "디멀티플렉서" 등이 있다.
인코더와 디코더
인코더 (Encoder)
인코더(Encoder)는 부호화 되지 않은 입력을 받아 부호화된 출력으로 내보내는 부호화기를 말한다. 10진수나 8진수 등을 입력으로 받아서 2진수나 BCD 코드로 변환하는 조합 논리회로이다. 인코더는 $2^n$개의 입력과 $n$개의 출력을 가지며, 이때 출력은 입력값에 대응하는 2진 코드를 생성한다.
인코더는 입력 신호를 더 작은 비트 크기의 이진 코드로 변환하는 데 사용된다. 더 작은 비트 크기로 변환하면 당연히 데이터 전송 속도가 빨라지고, 저장 공간을 절약할 수 있다. 또한 인코더를 통해 다양한 입력 신호를 하나의 코드로 변환하여 시스템의 복잡성을 줄일 수 있다.
디코더 (Decoder)
디코더는 인코더의 반대 역할을 수행하는 회로로, 주어진 이진 코드를 다시 원래의 입력 신호로 변환한다. 즉, $n$비트의 2진 코드를 최대 $2^n$개의 서로 다른 정보로 바꾸어 주는 조합 논리회로이다. 예를 들어, 디코더를 통해 3비트의 이진 코드를 입력받아 8개의 출력 신호로 변환할 수 있다.
디코더는 인코더에 의해 변환된 이진 코드를 원래의 신호로 복원하는데 사용된다. 데이터 전송 후, 수신 측에서 정보를 정확하게 해석할 수 있도록 하며 여러 개의 출력 신호를 생성하여 다양한 장치와 연결을 가능하게 한다. 디코더가 없으면 전송된 데이터의 해석이 불가능하게 된다.
멀티플렉서와 디멀티플렉서
멀티플렉서 (Multiflexer)
멀티플렉서(Multiflexer)란 여러 개의 입력 신호로부터 원하는 하나의 신호를 선택하여, 선택된 입력을 출력하는 회로를 말한다. $2^n$개의 입력선 중에 특정 입력선을 선택하기 위해서는 $n$개의 선택 변수가 있어야 하며, 선택 변수들로 인하여 특정 입력선이 선택되는 것이다. 가장 간단한 형태의 멀티플렉서는 "2개의 입력 중 하나를 선택하여 출력하는 것"이며, 이를 2X1 MUX라고 한다.
멀티플렉서는 여러 신호를 하나의 신호로 통합하여 전송하는 것이 주 목적인데, 이를 통해 데이터 전송의 효율을 높이고 회로의 복잡성을 줄인다.
디멀티플렉서 (Demultiflexer)
디멀티플렉서(De-Multiplexer)는 멀티플렉서의 반대 기능을 수행하는 회로이며, 1개의 입력을 여러 출력 신호로 분배하는 조합 논리회로이다. 가장 간단한 디멀티플렉서 형태는 "1개의 입력을 2개의 출력 라인 중 하나로 출력하는 형태"이며, 이를 2X1 DEMUX라고 한다.
디멀티플렉서는 하나의 신호를 여러 개의 신호로 분배하여 필요한 곳에 보내는 것이 주 목적이며, 이를 통해 데이터의 효율적인 분배가 가능해진다.