Детекторы фронта и формирование импульсов
← Все статьи

Детекторы фронта и формирование импульсов

5 мин

Уровневый сигнал и импульс

Кнопка, удерживаемая полсекунды, даёт уровневый сигнал, остающийся высоким десятки тактов подряд. Многим схемам — например, счётчику, который должен увеличиваться один раз за нажатие, а не один раз за каждый такт, пока кнопка зажата, — нужно превратить этот уровень в импульс: сигнал, который становится высоким ровно на один такт в момент изменения, а затем опускается независимо от того, сколько ещё вход остаётся высоким.

Строим детектор из триггера и вентиля AND

Классический детектор фронта задерживает сигнал на один такт через D-триггер, а затем берёт AND от текущего сигнала и инвертированной задержанной копии:

  • Импульс = A · ¬A_prev, где A_prev — значение A, зафиксированное на один такт назад.
  • В момент, когда A переходит из 0 в 1, A_prev ещё остаётся 0 ровно один такт, поэтому AND ненадолго выдаёт 1 — ровно один импульс на каждый нарастающий фронт, сколько бы потом A ни оставался высоким.
AИмпульс1 тактвремя →

EDGE_DET и FALL_DET в Boolflow

В Boolflow эта схема есть в готовом виде — блоки EDGE_DET (нарастающий фронт) и FALL_DET (спадающий фронт). Пропустите удерживаемый переключатель INPUT через один из них перед тактовым входом счётчика, и счётчик будет увеличиваться ровно один раз за переключение, а не мчаться вперёд на каждом шаге симуляции, пока вход держится высоким.

Смежная задача: деление частоты

Другая, но родственная задача — получить более медленный, регулярный тактовый сигнал из быстрого, а не одиночный импульс из уровня. Блок CLK_DIV в Boolflow делит частоту сигнала CLOCK пополам при каждом соединении в цепочку — то же самое переключающееся поведение, из-за которого двоичные счётчики вообще умеют считать.

Собрать детектор фронта →