Операторы отслеживания фронта сигнала
Страница в процессе разработки. |
Помимо операторов и индикаторов из статей Операторы темпоральной логики и Индикаторы изменений, на переходах могут быть заданы операторы отслеживания фронта сигнала.
Операторы отслеживания фронта сигнала — это функции 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
.
Отдельное внимание стоит уделить тому, как обрабатывается равенство нулю. В отличие от простого условия Например:
|