Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

基础

摩尔型状态机/自动机:输出只取决于

例子1(电梯)

image-20260120223913819

输入分2种:

  • E1, E2:指的是电梯上的按钮
  • End1, End2:指的是限位器之类的

输出则是:

  • U=1:往上运行
  • D=1:往下运行
  • D=U=0:静止

最普通的想法可能就是建模2个状态,在一楼和在二楼。但在这种模型中,一般2个状态中间的转变是瞬间的。所以为了更贴合现实,我们最好设置4个状态:

  • 在1楼,在2楼
  • 上升,下降

image-20260120224251557

当我们按了E2按钮后,电梯就会上升。当它触碰到了2楼的限位器,就会停止上升,停留在2楼。

而输出确实只是取决于当前的状态,输入最多算是切换了状态,但是没有直接影响输出。(输入改变了状态,状态决定了输出)

One-Hot Kodierung

想要构造对应的电路图,最简单直接的方法就是用位置来表示状态:

image-20260120224414139

有多少个状态就设置多少个FF (Flip-Flop)。

Binär Kodierung

而二进制编码则讲究用更少的 FF 来表示状态。如果有 $N$ 个状态,只需要 $q=\lceil \log_2 N\rceil$ 个状态位(state bits)。比如说这个例子里就是2:

image-20260203154958181

所以有:

image-20260203160232074

Mikroprogrammierte Steuerwerke(微程序控制器)

Mikroprogrammierte Steuerwerke的核心想法是用存储器查表实现状态机,代替那些电路结构的推理以及实现。

  • 用一个存储器实现状态转移函数(Zustandsübergangsfunktion durch einen Speicher)
  • 地址(Adresse)由两部分拼出来:
    • 当前状态 $Z$(q bit)
    • 输入信号/状态变量 $X$(m bit)
  • 存储器输出一条微指令(Mikroinstruktion),里面包含:
    • 下一状态 $Z’$(q bit)
    • 输出信号 $Y$(n bit)

把它想成一个“查表函数”:

其中 $Z | X$ 表示把状态位和输入位拼接成地址。

image-20260203231517558

  • 状态寄存器(FFs)保存当前状态 $Z$,每个时钟沿更新一次

  • 当前状态 $Z$ + 输入 $X$ → 作为 ROM 地址

  • ROM 输出一条“控制字/微指令”,分两部分:

    • $Z’$:回写到状态寄存器,成为下一个周期的状态

    • $Y$:直接作为输出控制信号(例如电机上/下)

例子2(扶梯)

image-20260120225856531

我们现在想建模这个扶梯,可以通过传感器控制往上或者往下。只不过在往上(下)的过程中:

  • 如果往上(下)的传感器触发了,就会增加往上(下)的时间
  • 往下(上)的传感器无法触发

状态机

image-20260120230109540

图中状态里的tuple是(Stopp, Unten, Oben),停止/往上/往下。而Übergang上的tuple表示的是(s1传感器,s2传感器)。

注意,因为是自动扶梯,所以不存在停留在几楼的问题,状态只有停止,往上和往下。所以把这个图画成三角形的样子会更直观一点:

image-20260120232253749

微程序控制(Microprogrammed Control)

image-20260120232815496

A. Bedingung (条件选择码)

看电路图右下角的 MUX(多路选择器)。它决定了当前检查哪个传感器。

  • $s1$ 接在第 0 个位置 $\to$ 代码 000
  • $s2$ 接在第 1 个位置 $\to$ 代码 001
  • $1$ (常数/True) 接在第 2 个位置 $\to$ 代码 010 (意思是“无条件跳转”)

B. Steuersignale (控制信号)

这就是我们上一问里写的 Tuple (Stopp, Unten, Oben)

  • 停止 $\to$ 1 0 0
  • 向下 $\to$ 0 1 0
  • 向上 $\to$ 0 0 1

C. 逻辑流 (Jump vs. Next)

电路图左边的逻辑是:

  • 如果条件满足 (True):跳转到 Folgeadresse (下一列填的地址)。
  • 如果条件不满足 (False):执行 Address + 1 (也就是单纯的下一行)。


我们把表格分成三块,分别对应状态机的三个圆圈。

第一块:初始/停止状态 (对应 Z0)

目标: 电机停。如果 $S1$ 亮去上,如果 $S2$ 亮去下,否则原地待命。

  • 地址 0000: if (S1) goto oben
    • Steuer: 1 0 0 (保持停止)。
    • Bedingung: 检查 $S1$ $\to$ 填 0 0 0
    • Folgeadresse: 填 0 0 1 1 (这是下面定义的 oben 入口地址)。
    • 逻辑:S1 没触发就去下一行 0001。
  • 地址 0001: if (S2) goto unten
    • Steuer: 1 0 0 (保持停止)。
    • Bedingung: 检查 $S2$ $\to$ 填 0 0 1
    • Folgeadresse: 填 0 1 1 0 (这是下面定义的 unten 入口地址)。
  • 地址 0010: goto init (回开头)
    • Steuer: 1 0 0
    • Bedingung: 总是跳 (常数1) $\to$ 填 0 1 0
    • Folgeadresse: 回到第一行 $\to$ 填 0 0 0 0

第二块:向上状态 (对应 Z1, 标签 oben)

目标: 电机上行。只要 $S1$ 在就死循环;$S1$ 没了看 $S2$;$S2$ 也没了就停。

  • 地址0011: while (S1) (死循环维持)
    • Steuer: 0 0 1 (开始输出 Oben=1)。
    • Bedingung: 检查 $S1$ $\to$ 填 0 0 0
    • Folgeadresse: 0 0 1 1 (跳回自己)。
    • 逻辑:只要 S1 是 1,就不断跳回 0011,一直维持输出 Oben。一旦 S1 变成 0,条件不满足,自动掉落到下一行 0100。
  • 地址0100: if (S2) goto unten (反转逻辑)
    • Steuer: 0 0 1 (依然保持 Oben,因为还在这个逻辑块里)。
    • Bedingung: 检查 $S2$ $\to$ 填 0 0 1
    • Folgeadresse: 0 1 1 0 (去 Unten)。
  • 地址0101: goto init (没人了,去停)
    • Steuer: 0 0 1
    • Bedingung: 无条件 $\to$ 0 1 0
    • Folgeadresse: 0 0 0 0 (回 Init)。

第三块:向下状态 (对应 Z2, 标签 unten)

  • 地址 0110: while (S2)
    • Steuer: 0 1 0 (输出 Unten=1)。
    • Bedingung: 检查 $S2$ $\to$ 0 0 1
    • Folgeadresse: 0 1 1 0 (跳回自己)。
  • 地址 0111: if (S1) goto oben
    • Steuer: 0 1 0
    • Bedingung: 检查 $S1$ $\to$ 0 0 0
    • Folgeadresse: 0 0 1 1 (去 Oben)。
  • 地址 1000: goto init
    • Steuer: 0 1 0
    • Bedingung: 无条件 $\to$ 0 1 0
    • Folgeadresse: 0 0 0 0