Память из вентилей: SR-защёлка
← Все статьи

Память из вентилей: SR-защёлка

6 мин

Петля — это память

У вентиля нет памяти: его выход — функция входов в данный момент. Память появляется, как только выход заводят обратно на вход. Возьмите два вентиля NOR и свяжите их крест-накрест: Q = NOR(R, ~Q), ~Q = NOR(S, Q). Каждый выход теперь зависит от другого, а через него — от собственного прошлого.

NORNORRSQ~QS=1 установка · R=1 сброс · S=R=0 хранение

Установка, хранение, сброс

Вентиль 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 только по нарастающему фронту.

Открыть защёлку на NOR в редакторе →