转自:http://blog.sina.com.cn/s/blog_64ac3ab10100ges2.html
一、有限状态机
引子
让我们先来看几个简单的概念:
状态 - 系统的基本数学特征。
状态机 - 一个离散数学模型。给定一个输入集合,根据对输入的接受次序来决定一个输出集合。
有限状态机 - 输入集合和输出集合都是有限的,并只有有限数目的状态。
有限状态机的定义
课本中的组合电路+时序电路的模型就是一个有限状态机,我们不妨通过它来推测有限状态机应有的组成:
1. 状态有限集S={S0,S1,S2, ...... }。
2. 集合S的特殊元素S0,即为起始状态。
3. 输入字母有限集I={i1,i2, ...... }。
4. 输出字母有限集O={o1,o2, ...... }。
5. S×I映至S的函数f,即转换函数。
6. S映至O的函数g,即为输出函数。
前四个内容很容易理解,而f与g这两个函数由电路的设计决定,一般是时序电路(存储电路)部分决定f,组合电路部分决定g。
具体模型可以用下面图示表示
有限状态机的模型
常用表示方法
而对于计算理论或数学中的定义有限状态机M,有如下的五元组定义:有穷状态转换系统M = <S, A, h, S0, F>。
其中S是M的有穷状态集,初始状态S0∈S,结束状态F⊆S;M总处在某个状态,开始时在S0;A是有穷符号集,h : S×A → S×(A ⋃ { _ }) 是转换函数(部分函数),_表示无输出,若M在状态S接到输入a∈A,假设h(S, a) = <S’, b>,(s'∈S, b∈A),M就转到状态S'并产生输出b。
对比我们总结的模型,发现出现了终止状态(由于我们所学电路功能主要是实现计数、分频、输出序列波等持续性功能,所以没有接触到终止状态),这说明我们的模型基本反映了有限状态机的组成,但只是第二个定义无终止状态(即F为空集)的特例,下面我们的讨论就采用后面的经典定义。
有限状态机示例
有限状态机在现实生活中其实随处可见,伸缩式圆珠笔其实就是一个有限状态机(两种状态互相转换),下面我们用实现一个简单的有限状态机-自动门。
要求如下:有一自动门,它可以被锁上,也可以开锁。当门锁上时,某人可以在它的槽中塞进一枚硬币。这样,门就会自动开锁,转变到开锁的状态;人通过后,门就会自动锁上。
对状态进行分析可得下图
仿真代码:
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY door_contr IS
PORT (
clk,reset,coin,pass: IN std_logic;
door,alarm,thank: OUT std_logic
);
END door_contr;
ARCHITECTURE behavior OF door_contr IS
TYPE states IS (lock,unlock);
SIGNAL next_state: states;
BEGIN
PROCESS (clk)
BEGIN
IF (reset = '1') THEN
next_state <= lock;
alarm <= '0';
thank <= '0';
door <= '0';
ELSIF (clk'EVENT AND clk = '1') THEN
CASE next_state IS
WHEN lock =>
IF (coin = '1') THEN
next_state <= unlock;
thank <= '0';
alarm <= '0';
door <= '1';
ELSIF (pass = '1') THEN
next_state <= lock ;
thank <= '0';
alarm <= '1';
door <= '0';
END IF;
WHEN unlock =>
IF (coin = '1') THEN
next_state <= unlock;
thank <= '1';
alarm<= '0';
door <= '1';
ELSIF (pass = '1') THEN
next_state <= lock;
thank <= '0';
alarm <= '0';
door <= '0';
END IF;
END CASE;
END IF;
END PROCESS;
END behavior;
QuartusⅡ下的仿真结果
当然,上面讲述的还是一个没有停止状态的有限状态机,而且是由电子电路实现的,接下来的例子是在软件方面具有有限状态的有限状态机。
这是一个地址识别的算法。日常我们描述地址(指中文)的语句中地址级别是依次降低的,国家、省(直辖市)、市、区县、街道、门牌号(或者从区县之后是乡、村)。而这些就是我们要构造的有限状态机的全部状态。这些状态构成的状态图是单向图,比如,当前的状态是“省”,如果遇到一个词组(即输入)和市名有关,我们就进入状态相应“市”(即状态转换);走到最低级的地址单位(即终止状态),那么这条地址是有效的,否则无效。比如说,“北京市海淀区清华大学紫荆公寓2#”对于上面的有限状态机来讲有效,而“上海市辽宁省石家庄市”则无效(因为无法从市走回到省,即便可以也会由于石家庄市不属于辽宁省而进入错误状态)。
使用有限状态机识别地址,关键要解决两个问题,即通过一些有效的地址建立状态机,以及给定一个有限状态机后,地址字串的匹配算法,而这两个问题都有现成的算法。有了关于地址的有限状态机后,我们就可又用它分析网页,找出网页中的地址部分,建立本地搜索的数据库。同样,我们也可以在搜索引擎中对用户输入的查询进行分析,挑出其中描述地址的部分,当然,剩下的关键词就是用户要找的内容。
以上就是有限状态机的实际应用,这让我们感到它的功能的确很强大。其实想想看,无论对连续系统还是离散系统,状态概念无所不在,有限状态机提供了一种描述和控制应用逻辑的非常强大的方法,具有规则简单、可读性和可验证性强等特点。
有限状态机的弱点
1、 每一种有限状态机均功能唯一,即设计好之后无法完成其他原理不同的工作;
2、 因为其状态有限,当所要描述的系统的状态太多时,可能确定的有限状态机无能为力;
3、 有一些任务是有限状态机无法完成的,比如它可以判断输入的0、1数列中0或1的个数是否为奇数或偶数,但是无法判断0是否比1多或者相反。
前两个问题表示有限状态机的可扩展性差(或者对比计算机而言是无可编程性),而后者是因为有限状态机状态有限而且不能记下自己需要记录的东西(或者对比图灵机理论是不能写)。
于是我们发现有限状态机不但状态有限,功能也有限(根据计算理论,这是因为它只能接受正则语言,而正则语言是最低级的语言,所以能够解决的问题是有限的)。
事实上,最初的计算“机”(其实更应该说是计算器)都是功能单一的,虽然人们不断地试图在一台机器上集成更多的功能,但是相对于下面要讲到通用计算理论,这些行为还是“盲目”的。