Третье состояние помимо 0 и 1
Выход обычного вентиля всегда активно задаёт либо 0, либо 1. Буфер с тремя состояниями добавляет третью возможность: когда его вход Enable низкий, выход полностью отключается — высокий импеданс (Hi-Z), как будто провод просто выдернут, а не подключён к какому-то напряжению. В Boolflow это напрямую моделирует элемент TRIBUF: один вход данных, один вход разрешения, один выход, который либо повторяет данные, либо «плавает».
Зачем вообще делить один провод
Шина — это набор проводов, на которые в разное время должны писать несколько устройств: шина памяти с несколькими микросхемами или регистровый файл с несколькими портами чтения на один выход. Вместо того чтобы пропускать все источники через мультиплексор, можно подключить несколько выходов TRIBUF прямо к одному проводу и разрешать в каждый момент ровно одному из них: какой буфер разрешён, тот и пишет на шину, а все остальные остаются отключены.
Конфликт и «плавающая» шина
Неправильная логика разрешения приводит к двум разным поломкам. Если разрешить сразу два несогласных драйвера, оба активно пытаются задать один и тот же провод в противоположные напряжения — это конфликт (contention), который в реальном железе впустую тратит энергию и может повредить драйверы. Если не разрешить ни одного, шина «плавает»: тот, кто её читает, видит неопределённое, чувствительное к шуму значение вместо чистого 0 или 1.
Как Boolflow обрабатывает общий провод
Чтобы разделить провод в Boolflow, подключите несколько выходов TRIBUF к одному и тому же входу. Симулятор разрешает это так, как ведёт себя настоящая шина: выключенный драйвер отпускает провод, а включённый задаёт своё значение. Если два включённых драйвера не согласны, провод читается как неизвестное значение, а не как догадка. Инструмент Check сообщает именно об этих ситуациях — драйверы, которые сейчас спорят, шина, которую никто не питает, и обычные выходы вентилей, соединённые вместе: это никогда не допустимо, потому что отпустить провод может только tri-state выход.
Попробуйте сами
Соберите общую шину из двух элементов TRIBUF в редакторе схем и переключайте их линии Enable вручную: пока включён один, шина повторяет его, пока не включён ни один — показывает «?», а когда включены оба с разными данными, страница Check помечает конфликт.