← ブログに戻る組合せ論理

マルチプレクサ(MUX)を解き明かす:データトラフィックの制御役

マルチプレクサは n 本の選択線により、$2^n$ 個の入力のうち 1 つを単一出力へ送ります。2入力1出力および4入力1出力の MUX を構成し、汎用関数生成器として使う方法を学びます。

DennyDenny
読了まで約15分
Chalkboard feature illustration for “マルチプレクサ(MUX)を解き明かす:データトラフィックの制御役”

要約: マルチプレクサは nn ビットの選択コードで、2n2^n 個のデータ入力のうち1つを選びます。4入力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 の範囲を超えます。本ガイドでは、ブール論理の基礎、ゲートレベルでの構成、カスケード接続、関数生成の性質を扱います。

マルチプレクサとは?

マルチプレクサは、複数のデータ入力から1つを選び、単一の出力線へ転送する組み合わせ回路です。選択は、目的の入力に対応する2進アドレスを符号化した別組の選択線によって制御されます。

すべての入力が接続された、入力数が2のべき乗の MUX では、次が成り立ちます。

nn 本の選択線で、2n2^n 個のデータ入力から選択できます。

選択線が1本なら2入力、2本なら4入力、3本なら8入力を指定できます。2のべき乗でない入力数のインターフェースでは、未使用のコードを残したり、既定の経路を定義したりできます。実用的なデバイスの多くには、イネーブルまたはストローブもあります。

真理値表付き4入力1出力マルチプレクサ

4入力1出力マルチプレクサ:2本の選択線が4つの入力から選び、選択された入力が出力に現れます。

2入力1出力 MUX:最も単純なデータセレクタ

2入力1出力 MUX は基本的な構成要素です。2つのデータ入力(D0D_0、D1D_1)、1本の選択線(SS)、1つの出力(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

基本ゲートによる標準的な実装では、次を使います。

  • S‾\overline{S} を生成する NOT ゲート1個
  • AND ゲート2個:一方は S‾⋅D0\overline{S} \cdot D_0 を計算し、もう一方は S⋅D1S \cdot D_1 を計算
  • 2つの AND 出力を最終結果にまとめる OR ゲート1個

2入力1出力マルチプレクサのレッスン

AND、OR、NOT ゲートで構成した2入力1出力 MUX。S=0 のときは D0D_0 が通り、S=1 のときは D1D_1 が通ります。

4入力1出力 MUX:ブール式とゲートレベル設計

4入力1出力 MUX は4つのデータ入力(D0D_0 から D3D_3)と2本の選択線(S1S_1、S0S_0)を持ちます。選択線は2ビットの2進アドレスを形成し、どの入力が出力に届くかを決めます。

S1S_1S0S_0出力(YY)
00D0D_0
01D1D_1
10D2D_2
11D3D_3

この表の各行は、選択線がちょうど1つのデータ入力を「有効化」する積項に対応します。4入力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

この式は、必要なハードウェアを正確に示しています。

  • S1‾\overline{S_1} と S0‾\overline{S_0} を生成する NOT ゲート2個
  • 各データ入力を適切な選択の組み合わせでゲートする 3入力 AND ゲート4個
  • 4つの AND 出力をまとめる 4入力 OR ゲート1個

直接的なブール回路図には、2つの反転、4つの積項、そして OR による縮約があります。「7ゲート」という数え方は、任意の3入力・4入力ゲートをそれぞれ1個として数える場合のものです。物理的なセルライブラリや FPGA では、この関数は異なる形にマッピングされる場合があります。

スケーリングパターン付き4入力1出力マルチプレクサのレッスン

関数表とスケーリングパターンを備えた4入力1出力 MUX。nn 本の選択線で 2n2^n 個の入力から選びます。

digisim.io で4入力1出力 MUX を構成する

以下の手順で、個別のゲートから4入力1出力 MUX を構成します。

  1. 選択線を配置します。 キャンバス上へ INPUT_SWITCH コンポーネントを2つドラッグし、S1S_1 と S0S_0 のラベルを付けます。
  2. 補数を生成します。 NOT ゲートを2つ置きます。S1S_1 を一方へ、S0S_0 をもう一方へ接続し、S1‾\overline{S_1} と S0‾\overline{S_0} を生成します。
  3. データ入力を配置します。 INPUT_SWITCH コンポーネントを4つ追加し、D0D_0、D1D_1、D2D_2、D3D_3 のラベルを付けます。
  4. AND 配列を作成します。 3入力の AND ゲートを4つ配置します。
    • 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 ゲートを1つ置き、4つの AND 出力すべてを接続します。OR の出力が最終出力 YY です。
  6. 表示を追加します。 YY を OUTPUT_LIGHT へ接続します。

選択スイッチを切り替えると、異なるデータ入力を出力へルーティングできます。安定した有効な選択状態では、選択された積項だけが有効になり、そのデータ値が Y を決めます。

MUX のカスケード接続:4入力1出力ユニットから8入力1出力を作る

マルチプレクサの最も強力な性質の1つは、より多くの入力を扱うためにカスケード接続できることです。8入力1出力 MUX をゼロから設計する必要はなく、小さなユニットから構成できます。

8入力1出力 MUX には3本の選択線(S2S_2、S1S_1、S0S_0)と8つのデータ入力(D0D_0 から D7D_7)が必要です。2つの4入力1出力 MUX と1つの2入力1出力 MUX から構成する手順は次のとおりです。

  1. 第1段(4入力1出力 MUX を2つ):
    • MUX-A は D0D_0-D3D_3 を扱い、S1S_1 と S0S_0 を選択線として使います。
    • MUX-B は D4D_4-D7D_7 を扱い、S1S_1 と S0S_0 を選択線として使います。
  2. 第2段(2入力1出力 MUX を1つ):
    • 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 は、選択されたグループ内の4つの入力のどれが出力に届くかを決定します。

この階層的な手法は、任意の規模へ拡張できます。16入力1出力 MUX は、2つの8入力1出力 MUX と1つの2入力1出力 MUX から作ることも、4つの4入力1出力 MUX を第2レベルの4入力1出力 MUX へ接続して作ることもできます。

8入力1出力マルチプレクサのレッスン

3本の選択線を持つ8入力1出力 MUX。2つの4入力1出力 MUX と1つの2入力1出力 MUX から構成できます。

汎用関数生成器としての MUX

2n2^n-to-1 MUX は、変数を選択線へ接続し、真理値表に基づいてデータ入力を定数へ配線することで、n変数の任意のブール関数を実装できます。MUX 自体が論理回路であるため、これは論理を「無料で」得るものではなく、構造的な実装です。

たとえば、3変数関数 F(A,B,C)F(A, B, C) を考えます。8入力1出力 MUX を使う場合、次のようにします。

  1. AA、BB、CC を選択線 S2S_2、S1S_1、S0S_0 へ接続します。
  2. 真理値表の各行では、選択の組み合わせが1つのデータ入力を指定します。その行で F=1F=1 ならそのデータ入力を1へ、F=0F=0 なら0へ配線します。

これで MUX 出力は真理値表を再現します。FPGA のルックアップテーブルは、記憶された構成ビットと選択回路を用い、LUT の入力数に収まる任意の関数という同じ外部から見える能力を提供します。内部構造と専用のカスケード資源はデバイスファミリに固有です。

入力変数の1つを選択線ではなくデータ線に与えることで、より小さな MUX も使えます。たとえば3変数関数は、AA と BB を選択線に接続し、各データ入力を必要に応じて 0、1、CC、または C‾\overline{C} へ配線すれば、4入力1出力 MUX(選択線は2本だけ)で実装できます。

演習例:多数決関数の実装

3入力多数決関数は、入力のうち2つ以上が1のときに1を出力します。その真理値表は次のとおりです。

AABBCCFF
0000
0010
0100
0111
1000
1011
1101
1111

8入力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入力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 と配線します。

これにより、より小さな MUX を使って同じ関数を実装でき、CC は2つのデータ入力へ直接接続されます。

伝搬遅延とタイミングに関する考慮事項

すべての物理的な組み合わせ回路と同様に、MUX には伝搬遅延があります。直接的な積和回路図では、選択信号の遷移はインバータ、積項、OR による縮約を通る場合があります。

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

これは回路トポロジーに基づく見積もりにすぎません。実際の遅延には、セルの選択、入力スルー、負荷、配線、電圧、温度、および選択される経路がデータ入力から始まるか選択入力から始まるかが含まれます。カスケードされた選択は論理段数を増やしますが、物理的に幅広い1レベルの式も、ファンインと配線のために遅くなり得ます。あるトポロジーが別のものより2倍高速だと仮定せず、対象デバイスのタイミング解析を用いてください。

選択信号の遷移時、古いデータ入力と新しいデータ入力が異なり、内部経路の安定化に差があると、一時的な出力パルスが生じることもあります。結果が同期境界を越えるときはレジスタに保持し、必要な間隔は選択信号を安定させ、条件付けされていない MUX 出力をクロックや非同期の書き込みストローブとして使わないでください。機能シミュレーションは選択論理を検証しますが、物理的なハザードや遅延をモデル化しない場合があります。

NN入力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 番目の最小項です。各最小項はすべての選択変数の積であり、ii の2進表現に応じて、各変数は真の形または補数の形で現れます。たとえば8入力1出力 MUX では、i=5i=5(2進数の101)の最小項は S2⋅S1‾⋅S0S_2 \cdot \overline{S_1} \cdot S_0 です。

この定式化は、MUX が文字どおり最小項和の標準形をハードウェアで実装したものであることを明確にします。すべてのブール関数には一意の最小項和式があり、MUX はデータ入力を適切な定数値に配線することで直接実装できます。

イネーブル入力

市販の MUX IC の多くは、しばしばアクティブローのイネーブルまたはストローブ端子を備えています。無効時の振る舞いは部品ごとに異なり、出力は強制的にロー、強制的にハイ、あるいは別種のデバイスでは高インピーダンスになることがあります。無効時に Y をローへ強制する、抽象的なアクティブハイのイネーブル 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)

イネーブルはカスケード接続や制御の適格化を簡単にできますが、すべての MUX 階層で必須ではありません。プッシュプルの MUX 出力をトライステートのバスドライバと混同してはなりません。

digisim.io でカスケード MUX を構成するときは、最終 OR 出力とイネーブルスイッチの間に AND ゲートを追加すれば、イネーブル機能をシミュレートできます。

実世界のたとえ:テレビの入力切替器

ゲーム機、ケーブルテレビ用セットトップボックス、Blu-ray プレーヤー、ストリーミングスティックという4つの映像ソースと、1台のテレビを想像してください。MUX は入力切替器のようなもので、リモコンのボタン(選択線)が、どのソースを画面(出力)に表示するかを決めます。映像データは4つのソースすべてから連続して流れますが、MUX は選択されたものだけをディスプレイへ通します。

テレビのチャンネルセレクタを使った MUX の実世界のたとえ

MUX としてのテレビ入力切替器:選択線がテレビに表示する入力ソースを選びます。

デマルチプレクサ(DEMUX)

MUX の反対はデマルチプレクサ(DEMUX)です。MUX が多数の入力から1つを選んで単一出力へ送るのに対し、DEMUX は1つの入力を取り、選択線に基づいて多数の出力のうち1つへ送ります。

1入力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 は構造的には、イネーブル入力を備えたデコーダと同一であることに注意してください。データ入力 DD がイネーブルとして働く場合、選択線上の「アドレス」がどの出力に信号を送るかを決めます。

1入力4出力デマルチプレクサのレッスン

1入力4出力 DEMUX:1つの入力を、2本の選択線に基づいて4つの出力のうち1つへ送ります。

マルチプレクサの用途

マルチプレクサはデジタルシステム設計のあらゆる層に登場します。MUX が不可欠な理由を理解するために、代表的な用途を詳しく見ていきましょう。

CPU レジスタファイル

個別のフリップフロップで構成した小規模なレジスタバンクでは、各非同期読み出しポートは、レジスタ番号で選択されるワード幅の MUX としてモデル化できます。8レジスタ・8ビットの学習用バンクでは、各読み出しポートに8個の並列な8入力1出力ビット選択回路を使います。物理的な ASIC や FPGA のレジスタファイルでは、代わりにメモリマクロ、デコードされたワード線、ビット線、専用 RAM 資源、または分散論理を用いることがあります。MUX モデルが表すのは外部から見える選択であり、必須のトランジスタトポロジーを示すものではありません。

ALU 入力の選択

ALU のオペランドが常にレジスタから来るとは限りません。命令に埋め込まれた即値定数や、メモリから読み出した値である場合もあります。各 ALU 入力に置いた MUX によって、制御ユニットはレジスタファイル出力、即値、メモリデータレジスタというオペランド源を選択できます。ALU 入力ごとにこの1つの MUX を置くことで、CPU は同じ ALU ハードウェアを用いて、レジスタ間、レジスタ即値、メモリレジスタの命令を実行する柔軟性を得ます。

メモリアドレスのデコードとバス仲裁

複数のターゲットがデータを返せるとき、MUX はデコードされた要求に対応する応答を選択できます。複数のマスタがリソースを要求するときは、アービタが所有権を選び、ルーティング MUX が選択されたマスタのアドレス、データ、制御信号を転送します。MUX は公平性や要求/許可のハンドシェイクを実装するものではなく、仲裁結果に従ってルーティングするだけです。

FPGA ルックアップテーブル

FPGA でよく使われる論理プリミティブに**ルックアップテーブル(LUT)**があります。構成状態には真理値表の値が格納され、論理入力が該当する値を選択します。したがって、概念上の k 入力 LUT は、k 個の入力で選択される 2k2^k エントリの真理値表のように振る舞います。実際の FPGA ファミリは、アーキテクチャ固有の LUT 回路、分割モード、専用カスケードマルチプレクサ、配線を用いるため、「64入力1出力 MUX」は有用な機能モデルであって、普遍的な物理回路図ではありません。

自分で試してみよう

理解を深めるため、digisim.io エディタで次の回路を構成してみましょう。

  1. 2入力1出力 MUX を構成する。 AND ゲート2個、OR ゲート1個、NOT ゲート1個から作ります。4通りの入力組み合わせをすべて検証してください。
  2. 4入力1出力 MUX へ拡張する。 上のブール式を使います。安定した選択の組み合わせを順に切り替えながら、出力を観測してください。
  3. 4入力1出力 MUX を2つと2入力1出力 MUX を1つカスケード接続する。 8入力1出力を構成します。8つの入力すべてを個別に指定できることを確認してください。
  4. MUX を使ってブール関数を実装する。 真理値表から任意の3変数関数を選び、データ入力を固定配線して8入力1出力 MUX に設定します。
  5. DEMUX を構成する。 ルーティングを反転し、1つの信号を4つの出力のうち1つへ送ります。

デコーダとエンコーダ(DEMUX の構造的な近縁)へ進み、MUX が ALU へ入力を送る仕組みをフェッチ・デコード・実行サイクルで確認するか、MUX の主要構成要素である AND ゲートのコンポーネントリファレンスを開いてください。

参考資料

アイデアを実際に動く回路にしましょう。