Мультиплексор и дешифратор

Урок разбирает два ключевых блока выбора: мультиплексор (выбрать один из многих входов) и дешифратор (включить одну из многих линий).

Мультиплексор (MUX) — схема, выбирающая один из нескольких входов по управляющему «адресу». Дешифратор — наоборот, по двоичному адресу активирует ровно один выход.

Зачем они нужны

Мультиплексор — это аппаратный оператор выбора, «if на железе»: по сигналу управления он пропускает на выход нужный вход. Из мультиплексоров строят маршрутизацию данных внутри процессора (например, выбор операнда). Дешифратор — обратная операция: по адресу он активирует одну линию из многих. Так выбирается ячейка памяти по адресу или одна команда по коду операции.

Мультиплексор 2 в 1

Простейший MUX имеет два входа данных (d0, d1), один селектор s и один выход y. Логика: если s=0, на выход идёт d0; если s=1 — d1. Формула: y = (NOT s AND d0) OR (s AND d1).

        d0 ──┐
             │  ┌─────┐
   sel ──────┼─→│ MUX │──→ y
             │  └─────┘
        d1 ──┘

  sel=0 -> y=d0
  sel=1 -> y=d1
def mux2(d0, d1, sel):
    return (d0 & (1 - sel)) | (d1 & sel)

print("d0 d1 sel | y")
for d0 in (0,1):
    for d1 in (0,1):
        for sel in (0,1):
            print(f" {d0}  {d1}   {sel}  | {mux2(d0,d1,sel)}")

Вывод:

d0 d1 sel | y
 0  0   0  | 0
 0  0   1  | 0
 0  1   0  | 0
 0  1   1  | 1
 1  0   0  | 1
 1  0   1  | 0
 1  1   0  | 1
 1  1   1  | 1

Дешифратор 2 в 4

Дешифратор берёт n адресных бит и зажигает один из 2^n выходов. Адрес 2 бита -> 4 выхода; активен ровно тот, чей номер равен адресу:

def decoder_2to4(a1, a0):
    addr = a1 * 2 + a0
    outputs = [1 if i == addr else 0 for i in range(4)]
    return outputs

print("a1 a0 | y3 y2 y1 y0")
for a1 in (0,1):
    for a0 in (0,1):
        y = decoder_2to4(a1, a0)
        print(f" {a1}  {a0}  |  {y[3]}  {y[2]}  {y[1]}  {y[0]}")

Вывод:

a1 a0 | y3 y2 y1 y0
 0  0  |  0  0  0  1
 0  1  |  0  0  1  0
 1  0  |  0  1  0  0
 1  1  |  1  0  0  0

Как работает под капотом

Большой мультиплексор (4-в-1, 8-в-1) строится из дерева MUX 2-в-1 или из дешифратора + вентилей AND/OR. В процессоре MUX выбирает: какой регистр читать, какой результат АЛУ взять, откуда брать следующий адрес инструкции. Дешифратор в памяти преобразует адрес в сигнал «выбрать строку ячеек». Это буквально механика того, как «адрес» превращается в «доступ к конкретным данным».

Глубже в тему

Историческое имя «мультиплексор» пришло из техники связи: в телефонии и радио мультиплексированием называли уплотнение нескольких сигналов в один канал, чтобы по одной линии передавать много разговоров. В цифровой схемотехнике идея осталась той же — много источников, один выход и управляющий «адрес», решающий, кого пропустить прямо сейчас. Зеркальная операция, разведение одного входа на много выходов, называется демультиплексором (DEMUX), и по структуре он почти совпадает с дешифратором: дешифратор — это демультиплексор, у которого вход данных постоянно держится в единице. Полезно держать в голове эту симметрию: MUX сжимает много в одно, DEMUX и дешифратор разворачивают одно во многое.

Зачем строить большой мультиплексор из дерева маленьких? Дело в компромиссе между задержкой и площадью. MUX 8-в-1 можно собрать как дерево из семи MUX 2-в-1 в три яруса — тогда сигнал проходит три ступени логики, и задержка растёт логарифмически от числа входов, а не линейно. Это та же идея, что и в сумматорах с ускоренным переносом: там, где наивная цепочка даёт линейную задержку, древовидная структура даёт логарифмическую. Поэтому при выборе из 64 регистров инженер не ставит один гигантский вентиль, а складывает дерево из небольших блоков выбора.

Важная тонкость, которую часто упускают: MUX вычисляет результат обоих входов одновременно и лишь затем выбирает один. Это принципиально отличает его от программного if, который пропускает целую ветку кода. В железе «невыбранная» ветка всё равно отрабатывает на уровне сигналов — просто её результат не доходит до выхода. Отсюда вытекает и риск: если один из входов MUX подаёт неопределённое или «плавающее» значение, оно не вредит, пока селектор не укажет именно на него, но при переключении селектора такое значение может на короткий момент «просочиться». Поэтому в аккуратных схемах все входы мультиплексора держат в определённом состоянии.

Связь с остальной архитектурой здесь прямая. Дешифратор в памяти превращает адрес в сигнал «выбрать строку ячеек» — именно так числовой адрес становится физическим доступом к конкретным битам; это мы увидим в разделе про память. Дешифратор в устройстве управления превращает код операции (opcode) команды в набор управляющих сигналов — «включить сложение», «прочитать регистр», «записать результат». А мультиплексоры расставлены по всему тракту данных процессора: они решают, какой регистр читать, какой результат АЛУ взять и откуда брать следующий адрес инструкции. Фактически вся «маршрутизация» данных внутри CPU — это сеть из MUX, которой дирижирует устройство управления.

Частые ошибки

  • Путать MUX и дешифратор. MUX: много входов -> один выход (выбор данных). Дешифратор: один адрес -> одна активная линия (выбор адреса).
  • Забывать про число селекторов. Для выбора из 2^n входов нужно n линий селектора.
  • Думать, что это «программный if». MUX вычисляет оба варианта одновременно и выбирает результат — он не «пропускает» одну ветку, как процессор пропускает код.

Итог

  • Мультиплексор выбирает один из 2^n входов по n-битному селектору — «if на железе».
  • Дешифратор по n-битному адресу активирует ровно одну из 2^n линий.
  • Оба блока — основа маршрутизации данных в процессоре и адресации в памяти.
Проверьте себя
1. Что делает мультиплексор?
AАктивирует одну линию из многих по адресу
BВыбирает один из нескольких входов данных по сигналу селектора
CСкладывает два числа
DХранит один бит
2. Сколько линий селектора нужно мультиплексору на 8 входов?
A2
B3
C4
D8
3. Чем дешифратор отличается от мультиплексора?
AНичем, это синонимы
BДешифратор по адресу активирует одну из многих линий, MUX выбирает один вход из многих
CДешифратор складывает числа
DДешифратор хранит данные