什么是时序逻辑?
时序逻辑根据时间控制图表的执行。在状态操作和转换中,可以使用两种类型的时间逻辑:基于事件的时间和绝对时间。基于事件的时间逻辑跟踪重复发生的事件,绝对时间时间逻辑根据图表的模拟时间定义时间段。要对这些重复发生的事件或模拟时间进行操作,可以使用称为时间逻辑运算符的内置函数。
时序逻辑运算符使用规则
时序逻辑运算符只能出现在:
状态操作
源自状态的Transition
当完整过渡路径连接两个状态时,源自连接点的Transitions段
每个时态逻辑运算符都有一个相关的状态:动作出现的状态或转换产生的状态。
使用事件表示法在状态操作中表达基于事件的时序逻辑。
可以使用任何显式或隐式事件作为时态运算符的基事件。基本事件是一个时间运算符对其进行操作的重复事件。
对于没有输入事件的图表,可以使用刻度或唤醒事件来表示图表唤醒的隐含事件。
使用关键字sec、msec或usec之一来定义自激活状态以来经过的模拟时间(以秒、毫秒或微秒为单位)。这些关键字仅在状态操作和源自状态的转换中有效。
由于以下原因,请使用绝对时间-时间逻辑而不是隐式勾选事件:
使用绝对时间-时间逻辑的延迟表达式与模型的采样时间无关。但是,刻度事件取决于采样时间。
绝对时间-时间逻辑在具有函数调用输入事件的图表中工作。勾选事件在具有函数调用输入的图表中不起作用。
基于事件的时态逻辑算子
对于基于事件的时态逻辑,请使用此表中描述的运算符。
操作符 | 语法 | 描述 |
---|---|---|
after | after(n, E) E是after运算符的基本事件,n是一个正整数 | 如果基本事件E自激活关联状态以来至少发生了n次,则返回true。否则,运算符返回false。 在没有输入事件的图表中,如果图表自激活相关状态以来已唤醒n次或更多次,则after(n,tick)或after(n,wakeup)返回true。 每当关联状态重新激活时,将E的计数器重置为0。 |
before | before(n, E) E是before运算符的基本事件,n是一个正整数。 | 如果自激活关联状态以来基本事件E发生的次数少于n次,则返回true。否则,运算符返回false。 在没有输入事件的图表中,如果图表自激活相关状态以来唤醒次数少于n次,则before(n,tick)或before。 每当关联状态重新激活时,将E的计数器重置为0。 |
at | at(n, E) E是at运算符的基本事件,n为一个正整数。 | 仅在关联状态激活后第n次出现基本事件E时返回true。否则,运算符返回false。在没有输入事件的图表中,如果图表自激活相关状态以来第n次唤醒,则at(n,tick)或at(n,wakeup)返回true。 每当关联状态重新激活时,将E的计数器重置为0 |
every | every(n, E) E是every运算符的基本事件,n是一个正整数。 | 自激活关联状态以来,基本事件E每第n次出现时返回true。否则,运算符返回false。在没有输入事件的图表中,如果图表自激活相关状态以来已唤醒整数n次,则every(n,tick)或every(n,wakeup)返回true。每当关联状态重新激活时,将E的计数器重置为0。因此,此运算符仅在状态操作中有用,而在转换中不有用 |
temporalCount | temporalCount(E) E是temporalCount运算符的基本事件。 | 递增1,并为激活相关状态后发生的基本事件E的每次出现返回一个正整数值。否则,运算符返回值0。每次重新激活关联状态时,都会将E的计数器重置为0。 |
基于事件的时态逻辑的表示法
可以使用两种符号中的一种来表示基于事件的时间逻辑。
事件符号
使用事件表示法定义仅依赖于基本事件的状态操作或转换条件。
事件表示法遵循以下语法:
tlo(n, E)[C]
tlo是一个布尔时态逻辑运算符(after、before、at或every)
n是运算符的出现次数
E是运算符的基本事件
C是可选的条件表达式
条件表示法
使用条件表示法定义依赖于基本事件和非基本事件的转换条件。
条件表示法遵循以下语法:
E1[tlo(n, E2) && C]
E1是任何非基本事件
tlo是一个布尔时态逻辑运算符(after、before、at或every)
n是运算符的出现次数
E2是操作员的基本事件
C是可选的条件表达式
事件和条件符号示例
符号 | 用法 | 示例 | 描述 |
---|---|---|---|
Event | State action(on after) | on after(5, CLK): temp = WARM; | 在激活状态 5个CLK循环后,温度变量变为WARM。 |
Event | Transition | after(10, CLK)[temp == COLD] | 如果温度变量为COLD,但不早于状态激活后的10个CLK循环,则会发生从关联状态的转换。 |
Conditional | Transition | ON[after(5, CLK) && temp == COLD] | 从关联状态的转换仅在on事件的广播时发生,但不早于状态激活后的5个CLK周期,并且仅当温度变量为COLD时发生。 |
绝对时间-时序逻辑的操作符
对于绝对时间-时序逻辑,请使用此表中描述的运算符。
操作符 | 语法 | 描述 |
---|---|---|
after | after(n, sec) after(n, msec) after(n, usec) n是任何正数或表达式。sec、msec和usec是表示自激活相关状态以来经过的模拟时间的关键字。 | 如果自激活关联状态以来经过了n个指定的秒(sec)、毫秒(msec)或微秒(usec)模拟时间,则返回true。否则,运算符返回false。 每次关联状态重新激活时,将计数器的秒、毫秒和usec重置为0 |
before | before(n, sec) before(n, msec) before(n, usec) | 如果自激活关联状态以来经过的模拟时间少于n个指定的秒(sec)、毫秒(msec)或微秒(usec),则返回true。否则,运算符返回false。关联状态重新激活时,将计数器的秒、毫秒和usec重置为0 |
temporalCount | temporalCount(sec) temporalCount(msec) temporalCount(usec) sec、msec和usec是表示自激活相关状态以来经过的模拟时间的关键字。 | 统计并返回自激活关联状态以来经过的指定秒(秒)、毫秒(毫秒)或微秒(微秒)的模拟时间。 每次关联状态重新激活时,将计数器的秒、毫秒和usec重置为0。 |
elapsed | elapsed(sec) 相当于temporalCount(秒)。返回自激活关联状态以来经过的模拟时间(秒)。 每次重新激活关联的状态时,将计数器的秒重置为0。 | 相当于temporalCount(秒)。返回自激活关联状态以来经过的模拟时间(秒)。 每次重新激活关联的状态时,将计数器的秒重置为0。 |
duration | duration(C) | 返回条件表达式C变为true后的秒数。如果条件表达式变为false,则会重置持续时间运算符。如果在一个状态中使用持续时间运算符,则在输入包含该运算符的状态时会将其重置。如果在转换中使用持续时间运算符,则在输入该转换的源状态时会重置该运算符。 |
绝对时间-时序逻辑的例子
操作符 | 用法 | 示例 | 描述 |
---|---|---|---|
after | State action (on after) | on after(12.3, sec): temp = LOW; | 自状态激活起经过12.3秒的模拟时间后,温度变量变为LOW。 |
after | Transition | after(8, msec) | 自激活状态起经过8毫秒的模拟时间后,发生从相关状态的转换。 |
after | Transition | after(5, usec) | 自激活状态起经过5微秒的模拟时间后,发生相关状态的转换。 |
before | Transition | [temp > 75 && before(12.34, sec)] | 如果可变温度超过75,并且自状态激活以来经过的时间不到12.34秒,则发生从相关状态的转换。 |
temporalCount | State action(exit) | ex: y = temporalCount(sec); | 此操作计数并返回状态激活和停用之间经过的模拟时间秒数。 |