跳转至

配置语法

配置文件构成

首选看一个示例,examples/example_logic_1.txt

A2 = A0 & A3
Back = A0 & A3
C9 = clock_5MHz
Downsacle = (A0 & A3) / 100
C26 = Downscale | (C3 / 5)
Extern = clock_5MHz
C10 = 0
S0 = A2
S1 = D0
S2 = C4 | C7

不难发现,配置文件由语句sentence)构成,语句的基本单位是记号token),记号由字母、数字和下划线构成。所有的空格将被忽略。

配置中记号可以分为3类,标识符identifier),字面值literal)和运算符operator)。在示例中,A2C9clock_5MHzD0S0 等都是标识符10050字面值=&|()/运算符

每一个语句都是赋值语句,即包含一个赋值运算符 = 和被其分开的左式右式左式包含且仅包含一个标识符右式则是形式更自由的拓展的逻辑表达式。根据左式的不同,可以将语句分为输入输出语句定义变量语句定标器语句,其左式分别是输入输出端口标识符变量标识符定标器标识符语句之间由换行符分隔,即没有行末标记同时每行最多有一个语句,允许有空行。

标识符

标识符分为以下几类

  • 输入输出端口
  • 时钟
  • 定标器
  • 变量

输入输出端口

输入输出端口又可以分为3类

  • 前面板网口48路输入输出
  • 背板输入输出
  • 子板 lemo 口输入输出

硬件的前面板一共有 12 个用于逻辑输入输出的网口,每个网口有 4 路,总计 48 路。这 12 个网口又分为3组(A、B、C),每组 4 个网口 16 路。这 48 路从上到下分别命名为 A0-A15,B0-B15,C0-C15。

硬件的背板目前只有 2 路输入输出,分别是 Back 和 Extern。其中 Back 用于输入输出触发信号,Extern 用于输出时钟信号。

硬件的每个子板有 8 个 lemo 口输入输出,最多可以有 3 个子板,这些端口命名为 A16-A31,B15-B31,C16-C31,以表示与前面板网口的并行关系。

时钟

时钟标识符都有相同的前缀clock_和后缀Hz,前缀和后缀之外部分表示该时钟信号的频率。频率可以是单纯的数值,比如100,表示时钟信号的频率是 100Hz ;也可以是带有字母后缀 k 或者 M,比如 5k5M,分别表示时钟信号的频率是5000Hz 和 5,000,000 Hz。

定标器

定标器用于计数选定信号的频率,最多有 32 个定标器,所以将定标器标识符命名为 S0-S31。

变量

变量标识符用于自定义中间变量,中间变量必须先定义再使用(先出现在左边,再出现在右边)。

字面值

字面值由数字组成,表示一个数。有两种使用情形

  1. 紧跟在运算符/后面,其含义是对/前面的表达式分除字面值表示的倍数
  2. 0 或 1,表示逻辑假或真,可以跟在 & 或者 | 后面

运算符

运算符分成3类

  • 逻辑运算符 &|()
  • 分除运算符 /
  • 赋值运算符 =

逻辑运算符顾名思义,表示信号之间的运算操作,&为与操作,|为或操作,操作顺序都是从左往右,且 &| 优先级相同。() 配对出现,用于提高内部表达式的优先级。

分除运算符即除号 /,除号左边是被分除的信号,右边是分除的倍数,为字面值。分除即降低一个信号的频率,比如分除100倍,则左边信号触发 100 次后,分除结果信号才产生一次触发;如果分除前是1kHz,则分除 100 倍后为10Hz。

赋值运算符即等于号 =,每一个语句都包含且仅包含一个=,但根据左式可以分为3种情况

  • 左式输入输出端口标识符,表示该端口输出右式输入信号的运算结果
  • 左式分除标识符,表示给中间变量赋值
  • 左式定标器标识符,表示该定标器监测右式输入信号运算结果

输入输出语句

输入输出语句左式输入输出端口标识符,表示该端口是输出端口,输出的信号是右式的运算结果。右式可能为

  • 逻辑表达式,e.g. 示例第 1、2、5 、7 行
  • 时钟表达式,仅有单个的时钟标识符,表示该端口输出一个时钟信号;e.g. 示例第 3、6 行

定义变量语句

定义变量语句左式变量名右式是任意的逻辑表达式。自定义的变量用于方便阅读和记忆。e.g. 示例第 4 行

定标器语句

定标器语句左式定标器标识符右式是逻辑表达式;e.g. 示例第 8-10 行。

上下文语法检查

配置文件中不同的语句需要满足以下上下文语法检查的条件

  • 一个端口不能同时作为输入和输出,但是一个输出端口可以出现在定标器语句右式作为监测对象
  • 变量必须先定义再使用
  • 不允许分除嵌套,比如说 (A0 / 5) / 20,因为这种情形完全可以用 A0 / 100 替代

简单示例

前面板组合逻辑

我们首先从最简单的例子开始,一个与门

A2 = A0 & A3

语句表示前面板第1个端口和第4个端口的输入做符合,符合结果在第3个端口输出。前面的硬件介绍提到过,对于 pixie16 插件,网口的第1路和第4路用于输出,第2路和第3路用于输入;因此,MZTIO 的网口如果是使用网线和 pixie16 的网口连接的,那么 MZTIO 的该网口的第1路和第4路就只能作为输入,而第2路和第3路只能作为输出。因此不难理解这个语句为什么初看那么怪异。

子板组合逻辑

如果要从子板输出输出,可以利用子板输入输出标识符

C26 = C17 | C18

语句表示第三块的子板第1个 lemo 口和第2个 lemo 的输入做符合,符合结果在第6个 lemo 口输出。如果对硬件不熟悉,可以查看前面硬件介绍,如此即可理解硬件中子板只有8个 lemo 口,而对于最下面的对应前面板 C 组端口的子板,lemo 口从上往下对应网口 C1、C2、C5、C6、C9、C10、C13、C14

背板组合逻辑

如果要从背板输出单路的信号,只需设置左式Back

Back = A0 & A3

语句和前面板组合逻辑小节中的只有左式不同,表示前面板第1个端口和第4个端口的输入做符合,符合结果在背板输出。

时钟输出

前面板端口和背板都可以输出时钟信号,但是前面板任意一个端口都可以输出时钟信号,而背板只有一路可以输出

C25 = clock_5MHz

语句表示在第三块子板的第5个 lemo 口输出 5MHz 的时钟信号。

Extern = clock_5MHz

该语句表示在背板输出 5MHz 的时钟信号作为 pixie16 的外部时钟。

分除

所谓分除,就是降低信号的频率,比如分除100倍,就是原信号每来100个才输出1个,如果原信号是1kHz,分除后就只有10Hz。

A2 = ((A0 & A3) / 100) | (A4 & A7)

分除可以直接和其他语句结合使用。

定标器计数

定标器的监测对象为右式的运算结果,右式可以是输出端口,也可以是输入端口的组合,甚至是自定义变量

1
2
3
S0 = A3
S1 = A0 & A3
S2 = D0

这里展示了3个定标器对不同的对象进行监测

  • 第1个语句表示监测前面板第4个端口的输入(输出)频率
  • 第2个语句表示监测前面板第1个端口和第4个端口的输入信号的符合结果的频率
  • 第3个语句表示监测自定义变量 D0 的频率(这里仅作为示例,实际中使用应该先定义 D0 这个变量)