Петля — это память
У вентиля нет памяти: его выход — функция входов в данный момент. Память появляется, как только выход заводят обратно на вход. Возьмите два вентиля NOR и свяжите их крест-накрест: Q = NOR(R, ~Q), ~Q = NOR(S, Q). Каждый выход теперь зависит от другого, а через него — от собственного прошлого.
Установка, хранение, сброс
Вентиль NOR выдаёт 0, как только хотя бы один вход равен 1, что бы ни было на другом. Весь механизм защёлки держится на этом факте. Поднимите S: нижний вентиль видит единицу, поэтому ~Q становится 0. Верхний вентиль теперь видит R = 0 и ~Q = 0, и Q становится 1. Опустите S, и ничего не меняется: нижний вентиль видит S = 0 и Q = 1, поэтому ~Q остаётся 0, а это удерживает Q в единице. Защёлка хранит единицу, хотя ни один вход этого не требует.
Сброс — зеркальное отражение: поднимите R, Q падает в 0, это позволяет ~Q подняться в 1 и остаться там после отпускания R.
- S = 0, R = 0: хранение того, что записано.
- S = 1, R = 0: установка, Q = 1 и ~Q = 0.
- S = 0, R = 1: сброс, Q = 0 и ~Q = 1.
- S = 1, R = 1: запрещено, оба выхода равны 0.
Что Boolflow показывает при включении
Boolflow считает с тремя значениями на проводе: 0, 1 и «неизвестно». Защёлка, только что включённая с S = R = 0, действительно в неизвестном состоянии, и редактор показывает Q и ~Q как ?. Первый импульс на S или R всё решает, потому что NOR с единицей на одном входе определён, даже пока другой вход неизвестен. После этого схема помнит: каждый такт начинается со значений проводов, оставленных предыдущим тактом, — именно так петля и удерживает свой бит.
Запрещённый вход
Держите S = R = 1, и оба вентиля видят единицу, поэтому оба выхода равны 0. Это не хранимый бит, ведь Q и ~Q должны быть противоположны. Беда начинается, когда оба входа отпускают одновременно. Каждый вентиль теперь видит два нуля и хочет выдать 1; когда оба выдали, каждый видит единицу и хочет выдать 0; и так без конца. В реальном кремнии один вентиль всегда чуть быстрее и выигрывает гонку, но заранее никто не скажет, какой, — отсюда метастабильность. Boolflow обновляет все вентили раунда одновременно, поэтому ничья никогда не разрешается: оба выхода показываются как ?, а в строке состояния написано, что схема не устанавливается. Правильная установка или сброс после этого её возвращают. В редакторе два отдельных переключателя отпускаются один за другим, и защёлка тогда просто приходит в определённое состояние; чтобы отпустить оба в один момент, соедините один переключатель и с S, и с R.
От защёлки к триггеру
Замените NOR на NAND, и входы станут активными низким уровнем: 0 на S устанавливает, 0 на R сбрасывает. Добавьте перед ней ещё два NAND и инвертор, и получится D-защёлка с разрешением: она следует за D при E = 1 и хранит при E = 0. Соедините две такие с противоположными разрешениями, и выход сможет меняться только в момент нарастания такта: это D-триггер master-slave, собранный из одних вентилей. В Boolflow есть все три как примеры: защёлка на NOR, D-защёлка с разрешением и триггер на вентилях.
Попробуйте сами
Откройте защёлку на NOR, нажмите S и отпустите: Q остаётся единицей. Нажмите R, чтобы сбросить. Затем соедините один переключатель и с S, и с R, включите и выключите его и посмотрите на строку состояния. Наконец, попробуйте триггер: переключайте CLK вверх и вниз, меняя D, и убедитесь, что Q следует за D только по нарастающему фронту.