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

멀티플렉서(MUX) 완전 해부: 데이터 교통 관제기

멀티플렉서는 n개의 선택선으로 $2^n$개 입력 중 하나를 단일 출력으로 전달합니다. 2-to-1과 4-to-1 MUX를 만들고 범용 함수 생성기로 활용해 봅니다.

DennyDenny
약 11분 소요
Chalkboard feature illustration for “멀티플렉서(MUX) 완전 해부: 데이터 교통 관제기”

요약: 멀티플렉서는 nn비트 선택 코드로 2n2^n개의 데이터 입력 중 하나를 선택합니다. 4-to-1 MUX의 식은 Y=S1‾S0‾D0+S1‾S0D1+S1S0‾D2+S1S0D3Y=\overline{S_1}\overline{S_0}D_0+\overline{S_1}S_0D_1+S_1\overline{S_0}D_2+S_1S_0D_3입니다. 데이터 입력에 상수를 연결하면 MUX로 진리표를 구현할 수 있으며, 실제 FPGA LUT는 저장된 구성 정보와 아키텍처별 선택 회로를 결합합니다.

멀티플렉서는 프로세서에서 피연산자의 출처를 선택하고, 인터커넥트에서 응답을 선택하며, 프로그래머블 논리에서 구성된 신호를 선택합니다. 아날로그 스위치와 비디오 스위치도 비슷한 라우팅 문제를 해결하지만 1비트 디지털 MUX의 범위를 넘어서는 전기적 동작을 갖습니다. 이 글에서는 부울 논리의 기초, 게이트 수준 구성, 계층 연결, 함수 생성 특성을 다룹니다.

멀티플렉서란?

**멀티플렉서(multiplexer)**는 여러 데이터 입력 중 하나를 선택해 단일 출력선으로 전달하는 조합 회로입니다. 별도의 선택선(select line) 집합이 원하는 입력에 해당하는 이진 주소를 인코딩하여 무엇을 전달할지 제어합니다.

입력 수가 2의 거듭제곱이고 모든 코드가 채워진 MUX에서는 다음 관계가 성립합니다.

nn개의 선택선으로 2n2^n개의 데이터 입력 중 하나를 고를 수 있습니다.

선택선 하나는 입력 두 개, 두 개는 네 개, 세 개는 여덟 개를 주소로 지정합니다. 입력 수가 2의 거듭제곱이 아닌 인터페이스는 일부 코드를 사용하지 않거나 기본 경로를 정의할 수 있으며, 실용적인 장치에는 enable 또는 strobe가 포함되는 경우도 많습니다.

진리표가 포함된 4-to-1 멀티플렉서

4-to-1 멀티플렉서에서는 선택선 두 개가 입력 네 개 중 하나를 고릅니다. 선택된 입력이 출력에 나타납니다.

2-to-1 MUX: 가장 단순한 데이터 선택기

2-to-1 MUX는 가장 기본적인 구성 요소입니다. 데이터 입력 두 개(D0D_0, D1D_1), 선택선 하나(SS), 출력 하나(YY)를 갖습니다.

선택선(SS)출력(YY)
0Y=D0Y = D_0
1Y=D1Y = D_1

부울 표현식은 간단합니다. S=0S=0일 때 D0D_0가 통과하고 S=1S=1일 때 D1D_1이 통과해야 합니다.

Y=S‾⋅D0+S⋅D1Y = \overline{S} \cdot D_0 + S \cdot D_1

기본 게이트로 구성하는 대표적인 방식은 다음과 같습니다.

  • NOT 게이트 하나로 S‾\overline{S}를 생성합니다.
  • AND 게이트 두 개를 사용합니다. 하나는 S‾⋅D0\overline{S} \cdot D_0를, 다른 하나는 S⋅D1S \cdot D_1을 계산합니다.
  • OR 게이트 하나로 두 AND 출력을 결합해 최종 결과를 만듭니다.

2-to-1 멀티플렉서 학습 회로

AND, OR, NOT 게이트로 만든 2-to-1 MUX입니다. S=0이면 D0D_0가 통과하고 S=1이면 D1D_1이 통과합니다.

4-to-1 MUX: 부울 표현식과 게이트 수준 설계

4-to-1 MUX에는 데이터 입력 네 개(D0D_0부터 D3D_3까지)와 선택선 두 개(S1S_1, S0S_0)가 있습니다. 선택선이 2비트 이진 주소를 이루어 어느 입력이 출력에 도달할지 결정합니다.

S1S_1S0S_0출력(YY)
00D0D_0
01D1D_1
10D2D_2
11D3D_3

표의 각 행은 선택선이 데이터 입력 하나만 정확히 “활성화”하는 하나의 곱 항에 해당합니다. 4-to-1 MUX의 완전한 부울 표현식은 다음과 같습니다.

Y=S1‾ S0‾ D0+S1‾ S0 D1+S1 S0‾ D2+S1 S0 D3Y = \overline{S_1}\,\overline{S_0}\,D_0 + \overline{S_1}\,S_0\,D_1 + S_1\,\overline{S_0}\,D_2 + S_1\,S_0\,D_3

이 식은 필요한 하드웨어를 정확히 알려 줍니다.

  • NOT 게이트 2개로 S1‾\overline{S_1}과 S0‾\overline{S_0}를 생성합니다.
  • 3입력 AND 게이트 4개가 각각 데이터 입력 하나를 알맞은 선택 조합으로 게이팅합니다.
  • 4입력 OR 게이트 1개로 네 AND 출력을 모두 결합합니다.

불 식을 직접 회로로 옮기면 반전 두 개, 곱 항 네 개, OR 축약 하나가 필요합니다. 이를 “게이트 일곱 개”라고 부르는 것은 임의의 3입력·4입력 게이트를 각각 하나로 센다는 가정에 따른 것입니다. 실제 물리 셀 라이브러리나 FPGA에서는 이 함수를 다르게 매핑할 수 있습니다.

확장 패턴을 보여 주는 4-to-1 멀티플렉서 학습 회로

함수표와 확장 패턴을 함께 보여 주는 4-to-1 MUX입니다. nn개의 선택선이 2n2^n개 입력 중 하나를 고릅니다.

digisim.io에서 4-to-1 MUX 만들기

다음 단계에 따라 개별 게이트로 4-to-1 MUX를 구성합니다.

  1. 선택선을 배치합니다. INPUT_SWITCH 부품 두 개를 캔버스로 끌어오고 S1S_1과 S0S_0라는 레이블을 붙입니다.
  2. 보수를 생성합니다. NOT 게이트 두 개를 놓습니다. 하나에는 S1S_1을, 다른 하나에는 S0S_0을 연결하여 S1‾\overline{S_1}과 S0‾\overline{S_0}를 만듭니다.
  3. 데이터 입력을 배치합니다. INPUT_SWITCH 부품 네 개를 추가하고 D0D_0, D1D_1, D2D_2, D3D_3라는 레이블을 붙입니다.
  4. AND 배열을 만듭니다. 3입력 AND 게이트 네 개를 배치합니다.
    • AND-0의 입력은 S1‾\overline{S_1}, S0‾\overline{S_0}, D0D_0입니다.
    • AND-1의 입력은 S1‾\overline{S_1}, S0S_0, D1D_1입니다.
    • AND-2의 입력은 S1S_1, S0‾\overline{S_0}, D2D_2입니다.
    • AND-3의 입력은 S1S_1, S0S_0, D3D_3입니다.
  5. 결과를 결합합니다. OR 게이트 하나를 놓고 AND 출력 네 개를 모두 연결합니다. OR 출력이 최종 출력 YY입니다.
  6. 시각화 부품을 추가합니다. YY를 OUTPUT_LIGHT에 연결합니다.

선택 스위치를 바꾸어 서로 다른 데이터 입력을 출력으로 전달해 보세요. 선택 상태가 유효하고 안정적이면 선택된 곱 항 하나만 활성화되며, 그 항의 데이터 값이 Y를 결정합니다.

MUX 계층 연결: 4-to-1 장치로 8-to-1 만들기

멀티플렉서의 가장 강력한 특성 중 하나는 더 많은 입력을 처리하도록 **계층적으로 연결(cascade)**할 수 있다는 점입니다. 8-to-1 MUX를 처음부터 설계할 필요 없이 작은 장치들로 만들 수 있습니다.

8-to-1 MUX에는 선택선 세 개(S2S_2, S1S_1, S0S_0)와 데이터 입력 여덟 개(D0D_0부터 D7D_7까지)가 필요합니다. 4-to-1 MUX 두 개와 2-to-1 MUX 하나를 다음과 같이 연결합니다.

  1. 첫 번째 단계(4-to-1 MUX 두 개):
    • MUX-A는 D0D_0-D3D_3을 처리하며 S1S_1과 S0S_0을 선택선으로 사용합니다.
    • MUX-B는 D4D_4-D7D_7을 처리하며 S1S_1과 S0S_0을 선택선으로 사용합니다.
  2. 두 번째 단계(2-to-1 MUX 하나):
    • MUX-A의 출력을 마지막 MUX의 D0D_0에 연결합니다.
    • MUX-B의 출력을 마지막 MUX의 D1D_1에 연결합니다.
    • S2S_2를 마지막 MUX의 선택선으로 사용합니다.

S2=0S_2 = 0이면 마지막 MUX는 MUX-A의 결과, 즉 D0D_0-D3D_3 입력군의 결과를 전달합니다. S2=1S_2 = 1이면 MUX-B의 결과, 즉 D4D_4-D7D_7 입력군의 결과를 전달합니다. 하위 선택선 S1S_1과 S0S_0은 선택된 그룹 안의 네 입력 중 어느 것이 출력에 도달할지 결정합니다.

이 계층적 방식은 어떤 크기로도 확장할 수 있습니다. 입력 16개짜리 멀티플렉서는 입력 8개짜리 장치 두 개와 입력 2개짜리 장치 하나로 만들 수도 있고, 입력 4개짜리 장치 네 개의 출력을 두 번째 단계의 입력 4개짜리 장치로 보내 구성할 수도 있습니다.

8-to-1 멀티플렉서 학습 회로

선택선 세 개를 갖는 8-to-1 MUX입니다. 4-to-1 MUX 두 개와 2-to-1 MUX 하나로 만들 수 있습니다.

범용 함수 생성기로서의 MUX

2n2^n-to-1 MUX는 변수들을 선택선에 연결하고 진리표에 따라 데이터 입력에 상수를 배선함으로써 n개 변수로 이루어진 모든 불 함수를 구현할 수 있습니다. MUX 자체가 논리 회로이므로, 이는 구조적인 구현이지 논리를 “공짜로” 얻는 방법은 아닙니다.

예를 들어 3변수 함수 F(A,B,C)F(A, B, C)를 생각해 봅시다. 8-to-1 MUX를 사용한다면 다음과 같이 연결합니다.

  1. AA, BB, CC를 선택선 S2S_2, S1S_1, S0S_0에 연결합니다.
  2. 진리표의 각 행에서 선택 조합은 데이터 입력 하나를 주소로 지정합니다. 그 행에서 F=1F=1이면 해당 데이터 입력을 1에, F=0F=0이면 0에 연결합니다.

그러면 MUX 출력이 진리표를 그대로 재현합니다. FPGA lookup table은 저장된 구성 비트와 선택 회로를 사용해 외부에서 보기에 같은 능력, 즉 LUT의 입력 수 안에 들어가는 모든 함수를 제공합니다. 내부 구조와 전용 계층 연결 자원은 장치 제품군마다 다릅니다.

입력 변수 하나를 선택선 대신 데이터 선에 적용하면 더 작은 MUX를 사용할 수도 있습니다. 예를 들어 3변수 함수에서 AA와 BB를 선택선에 연결하고 각 데이터 입력을 필요에 따라 0, 1, CC, C‾\overline{C}에 배선하면 선택선이 두 개뿐인 4-to-1 MUX로 구현할 수 있습니다.

예제: 다수결 함수 구현하기

3입력 다수결 함수는 입력 중 둘 이상이 1일 때 1을 출력합니다. 진리표는 다음과 같습니다.

AABBCCFF
0000
0010
0100
0111
1000
1011
1101
1111

8-to-1 MUX 사용: AA, BB, CC를 S2S_2, S1S_1, S0S_0에 연결합니다. 데이터 입력 D0D_0부터 D7D_7까지를 F 열과 일치하도록 D0=0D_0=0, D1=0D_1=0, D2=0D_2=0, D3=1D_3=1, D4=0D_4=0, D5=1D_5=1, D6=1D_6=1, D7=1D_7=1로 배선합니다. MUX와 상수 소스 외에 데이터 함수를 위한 외부 게이트는 필요하지 않습니다.

4-to-1 MUX 사용(축약형): AA와 BB를 S1S_1과 S0S_0에 연결합니다. 진리표의 행을 ABAB별로 묶습니다.

  • AB=00AB=00: C=0C=0과 C=1C=1에서 모두 F=0F=0입니다. D0=0D_0 = 0으로 배선합니다.
  • AB=01AB=01: C=0C=0일 때 F=0F=0, C=1C=1일 때 F=1F=1입니다. D1=CD_1 = C로 배선합니다.
  • AB=10AB=10: C=0C=0일 때 F=0F=0, C=1C=1일 때 F=1F=1입니다. D2=CD_2 = C로 배선합니다.
  • AB=11AB=11: C=0C=0과 C=1C=1에서 모두 F=1F=1입니다. D3=1D_3 = 1로 배선합니다.

이 방식은 CC를 두 데이터 입력에 직접 연결해 더 작은 MUX로 동일한 함수를 구현합니다.

전파 지연과 타이밍 고려 사항

모든 물리적 조합 회로와 마찬가지로 MUX에도 전파 지연이 있습니다. sum-of-products를 직접 그린 회로에서 선택 신호의 전이는 인버터, 곱 항, OR 축약을 차례로 통과할 수 있습니다.

tlogical path≈tinvert+tproduct+treductiont_{\text{logical path}}\approx t_{\text{invert}}+t_{\text{product}}+t_{\text{reduction}}

이는 토폴로지만을 바탕으로 한 추정치입니다. 실제 지연에는 셀 선택, 입력 slew, 부하, 라우팅, 전압, 온도, 그리고 선택된 경로가 데이터 입력과 선택 입력 중 어디에서 시작하는지가 영향을 줍니다. MUX를 계층 연결하면 논리 단계가 늘어나지만, 한 단계로 구성한 넓은 식도 fan-in과 배선 때문에 느릴 수 있습니다. 한 토폴로지가 다른 토폴로지보다 두 배 빠르다고 단정하지 말고 대상 장치의 타이밍 분석을 사용해야 합니다.

기존 데이터 입력과 새 데이터 입력의 값이 다르고 내부 경로가 서로 다른 시점에 안정되면 선택 신호가 바뀌는 동안 출력에 일시적인 펄스가 생길 수도 있습니다. 결과가 동기식 경계를 넘는다면 레지스터에 저장하고, 필요한 구간 동안 선택 신호를 안정적으로 유지하며, 자격 조건을 거치지 않은 MUX 출력을 clock이나 비동기 write strobe로 사용하지 마세요. 기능 시뮬레이션은 선택 논리를 검증하지만 물리적 hazard나 지연을 모델링하지 않을 수 있습니다.

NN-to-1 MUX의 일반 부울 표현식

MUX의 부울 표현식을 모든 크기로 일반화할 수 있습니다. 선택선이 Sn−1,Sn−2,…,S0S_{n-1}, S_{n-2}, \ldots, S_0이고 데이터 입력이 D0,D1,…,D2n−1D_0, D_1, \ldots, D_{2^n - 1}인 2n2^n-to-1 MUX는 다음과 같이 표현됩니다.

Y=∑i=02n−1(Di⋅mi)Y = \sum_{i=0}^{2^n - 1} \left( D_i \cdot m_i \right)

여기서 mim_i는 선택 변수의 ii번째 minterm입니다. 각 minterm은 모든 선택 변수의 곱이며, 각 변수는 ii의 이진 표현에 따라 원래 형태 또는 보수 형태로 나타납니다. 예를 들어 8-to-1 MUX에서 i=5i=5(이진수 101)에 해당하는 minterm은 S2⋅S1‾⋅S0S_2 \cdot \overline{S_1} \cdot S_0입니다.

이 표현은 MUX가 말 그대로 sum-of-minterms 표준형을 하드웨어로 구현한 것임을 분명히 보여 줍니다. 모든 불 함수에는 고유한 sum-of-minterms 표현이 있으며, 데이터 입력을 적절한 상숫값에 연결하면 MUX가 이를 직접 구현할 수 있습니다.

Enable 입력

상용 MUX IC에는 흔히 active-low인 enable 또는 strobe 핀이 포함되는 경우가 많습니다. 비활성화 시 동작은 부품마다 다릅니다. 출력이 low나 high로 강제될 수 있으며, 다른 종류의 장치에서는 high impedance 상태가 될 수도 있습니다. 비활성화되었을 때 Y를 low로 강제하는 추상적인 active-high enable E의 식은 다음과 같습니다.

Y=E⋅(S1‾ S0‾ D0+S1‾ S0 D1+S1 S0‾ D2+S1 S0 D3)Y = E \cdot \left(\overline{S_1}\,\overline{S_0}\,D_0 + \overline{S_1}\,S_0\,D_1 + S_1\,\overline{S_0}\,D_2 + S_1\,S_0\,D_3\right)

Enable은 계층 연결과 제어 신호의 자격 부여를 단순화할 수 있지만 모든 MUX 계층에 필수인 것은 아닙니다. Push-pull MUX 출력을 tri-state 버스 드라이버와 혼동해서는 안 됩니다.

digisim.io에서 계층형 MUX를 만들 때는 마지막 OR 출력과 enable 스위치 사이에 AND 게이트를 추가하여 enable 기능을 흉내 낼 수 있습니다.

현실의 비유: TV 입력 선택기

비디오 소스 네 개(게임 콘솔, 케이블 박스, Blu-ray 플레이어, 스트리밍 스틱)와 TV 한 대가 있다고 생각해 봅시다. MUX는 입력 선택기와 같습니다. 리모컨 버튼(선택선)이 화면(출력)에 어느 소스가 표시될지를 결정합니다. 네 소스 모두에서 비디오 데이터가 계속 흐르지만 MUX는 선택된 하나만 디스플레이로 통과시킵니다.

MUX의 현실 비유인 TV 채널 선택기

MUX로 표현한 TV 채널 선택기입니다. 선택선이 TV에 나타날 입력 소스를 결정합니다.

디멀티플렉서(DEMUX)

MUX의 반대는 **디멀티플렉서(Demultiplexer, DEMUX)**입니다. MUX는 여러 입력 중 하나를 선택해 단일 출력으로 전달하지만, DEMUX는 단일 입력을 받아 선택선에 따라 여러 출력 중 하나로 전달합니다.

1-to-4 DEMUX의 부울 표현식은 다음과 같습니다.

Y0=D⋅S1‾⋅S0‾Y_0 = D \cdot \overline{S_1} \cdot \overline{S_0} Y1=D⋅S1‾⋅S0Y_1 = D \cdot \overline{S_1} \cdot S_0 Y2=D⋅S1⋅S0‾Y_2 = D \cdot S_1 \cdot \overline{S_0} Y3=D⋅S1⋅S0Y_3 = D \cdot S_1 \cdot S_0

DEMUX는 구조상 enable 입력을 가진 decoder와 동일하다는 점에 주목하세요. 데이터 입력 DD가 enable 역할을 하면 선택선의 “주소”가 어느 출력이 신호를 받을지 결정합니다.

1-to-4 디멀티플렉서 학습 회로

1-to-4 DEMUX에서는 선택선 두 개에 따라 입력 하나가 출력 네 개 중 하나로 전달됩니다.

멀티플렉서의 활용

멀티플렉서는 디지털 시스템 설계의 모든 계층에 나타납니다. MUX가 반드시 필요한 이유를 이해할 수 있도록 주요 활용 사례를 살펴보겠습니다.

CPU 레지스터 파일

개별 플립플롭으로 만든 작은 레지스터 뱅크에서는 각 비동기 읽기 포트를 레지스터 인덱스가 선택하는 word-wide MUX로 모델링할 수 있습니다. 레지스터 8개가 각각 8비트인 교육용 뱅크라면 읽기 포트마다 8개의 병렬 8-to-1 비트 선택이 필요합니다. 실제 ASIC과 FPGA의 레지스터 파일은 대신 memory macro, decoded word line, bit line, 전용 RAM 자원 또는 distributed logic을 사용할 수 있습니다. MUX 모델은 외부에서 보이는 선택 동작을 설명할 뿐, 반드시 따라야 하는 하나의 트랜지스터 토폴로지를 뜻하지는 않습니다.

ALU 입력 선택

ALU의 피연산자는 항상 레지스터에서 오지 않습니다. 때로는 명령어 안에 포함된 immediate 상수이거나 메모리에서 읽은 값입니다. 각 ALU 입력의 MUX를 통해 제어 장치는 레지스터 파일 출력, immediate 값, memory data register 중 피연산자의 출처를 선택할 수 있습니다. ALU 입력마다 있는 이 MUX 하나가 동일한 ALU 하드웨어로 register-register, register-immediate, memory-register 명령을 실행할 수 있는 유연성을 CPU에 제공합니다.

메모리 주소 디코딩과 버스 중재

여러 target이 데이터를 반환할 수 있을 때 MUX는 디코딩된 요청에 해당하는 응답을 선택할 수 있습니다. 여러 master가 자원을 요청하면 arbiter가 소유권을 정하고, 라우팅 MUX가 선택된 master의 주소, 데이터, 제어 신호를 전달합니다. MUX는 공정성이나 request/grant handshake를 구현하지 않습니다. 중재 결과에 따라 신호를 전달할 뿐입니다.

FPGA Lookup Table

흔히 쓰이는 FPGA 논리 기본 요소 중 하나는 **lookup table(LUT)**입니다. 구성 상태에는 진리표 값이 저장되고 논리 입력이 적용할 값을 선택합니다. 따라서 개념적으로 k입력 LUT는 k개 입력으로 선택하는 2k2^k개 항목의 진리표처럼 동작합니다. 실제 FPGA 제품군은 아키텍처별 LUT 회로, fracturing mode, 전용 cascade multiplexer, 라우팅을 사용하므로 “64-to-1 MUX”는 모든 장치에 공통인 물리 회로도가 아니라 유용한 기능 모델입니다.

직접 만들어 보기

이해를 굳히기 위해 digisim.io 편집기에서 다음 회로를 만들어 보세요.

  1. 2-to-1 MUX를 만듭니다. AND 게이트 2개, OR 게이트 1개, NOT 게이트 1개를 사용하고 네 가지 입력 조합을 모두 검증합니다.
  2. 4-to-1 MUX로 확장합니다. 위의 부울 표현식을 사용하고 안정적인 선택 조합을 모두 순회하면서 출력을 probe합니다.
  3. 4-to-1 MUX 두 개와 2-to-1 MUX 하나를 계층 연결해 8-to-1 MUX를 만듭니다. 입력 여덟 개를 각각 주소로 지정할 수 있는지 확인합니다.
  4. MUX로 불 함수를 구현합니다. 진리표에서 임의의 3변수 함수를 고르고 데이터 입력을 상수에 연결해 8-to-1 MUX에 프로그래밍합니다.
  5. DEMUX를 만들어 라우팅을 반대로 수행합니다. 신호 하나를 출력 네 개 중 하나로 보냅니다.

DEMUX의 구조적 친척인 decoder와 encoder로 계속 학습하거나, fetch-decode-execute 사이클에서 MUX가 ALU에 입력을 공급하는 방식을 살펴보세요. 모든 MUX의 주요 구성 요소인 AND 게이트 부품 참고 문서도 열어 볼 수 있습니다.

참고 자료

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