Операторы отслеживания фронта сигнала
Помимо операторов и индикаторов из статей Операторы темпоральной логики и Индикаторы изменений, на переходах
могут быть заданы операторы отслеживания фронта сигнала.
Операторы отслеживания фронта сигнала — это функции rising, falling и crossing, которые возвращают логическое значение true в момент изменения сигнала определенным образом. Это позволяет конечному автомату точно определить момент переключения: не по текущему значению сигнала, а по его изменению во времени.
Что такое изменение сигнала и фронт
В цифровых системах сигналы часто представлены логическими значениями — логический 0 (false) и логическая 1 (true). Изменение в таком случае — это переход между этими двумя состояниями.
В непрерывных системах (например, с аналоговыми сигналами) значения могут быть любыми числовыми, и важным считается момент, когда сигнал пересекает определенный порог — особенно значение ноль.
Изменения сигнала называют фронтами. Различают два основных типа:
-
Нарастающий фронт — переход сигнала через
0от меньшего значения к большему (например, от-1к0.5); -
Спадающий фронт — переход сигнала через
0от большего значения к меньшему (например, от1к-0.2).
Логика срабатывания операторов
Каждый из операторов (rising, falling, crossing) — это выражение, которое возвращает значение true только в момент изменения сигнала определенным образом. В остальное время — false.
Рассмотрим условия срабатывания каждого оператора.
Оператор rising(x)
Оператор rising(x) возвращает true в момент, когда сигнал x пересекает ноль снизу вверх (возрастание).
Это происходит в двух случаях:
-
Предыдущее значение
xбыло отрицательным, а текущее стало нулевым или положительным; -
Предыдущее значение
xбыло нулевым, а текущее стало положительным.
Так, rising(x) — это детектор перехода в положительном направлении.
Например, пусть переменная x изменяется от -0.2 → 0.1. Оператор rising(x) в этом случае вернет true, так как произошло пересечение нуля снизу вверх. Если же x изменяется от 0.1 к -0.1, то оператор не сработает.
Аналогично, rising(x - 0.5) отслеживает момент, когда x пересекает значение 0.5 снизу вверх. Например:
![]()
-
xбыло0.4, стало0.6→rising(x - 0.5)вернетtrue; -
xбыло0.6, стало0.4→rising(x - 0.5)вернетfalse.
Оператор falling(x)
Оператор falling(x) возвращает true в момент, когда сигнал x пересекает ноль сверху вниз. Срабатывает при:
-
Предыдущем положительном значении
x, если текущее — нулевое или отрицательное; -
Предыдущем нулевом значении
x, если текущее стало отрицательным.
Так, falling(x) реагирует на переход в отрицательном направлении.
+ Пример:
-
xбыло0.2, стало-0.1→falling(x)вернетtrue; -
xбыло-0.1, стало0.2→ не сработает.
Для falling(x - 0.5) аналогично: оператор сработает, когда x пересекает 0.5 сверху вниз. Например:
![]()
-
xизменяется от0.6к0.4→ срабатывает; -
xизменяется от0.4к0.6→ не срабатывает.
Оператор crossing(x)
Оператор crossing(x) — это универсальный оператор, возвращающий true при любом пересечении сигнала через ноль (или другой заданный порог), вне зависимости от направления. Он срабатывает при одном из следующих условий:
-
Предыдущее значение было положительным, а текущее — нулевым или отрицательным;
-
Предыдущее значение было нулевым, а текущее — отличным от нуля;
-
Предыдущее значение было отрицательным, а текущее — нулевым или положительным.
Так, оператор crossing(x) фиксирует любой переход через ноль — и вверх (возрастание), и вниз (убывание). Например:
![]()
-
xизменяется от0.6к0.4→crossing(x - 0.5)вернетtrue; -
xизменяется от0.4к0.6→ такжеtrue; -
xостается ниже0.5или выше0.5, не пересекает порог →false.
|
Отдельное внимание стоит уделить тому, как обрабатывается равенство нулю. В отличие от простого условия Например:
|