1、为什么要设计有限状态机为什么要设计有限状态机应用的需要,复杂系统的需要应用的需要,复杂系统的需要如果我们能设计这样一个电路如果我们能设计这样一个电路能记住自己目前所处的状态能记住自己目前所处的状态状态的变化只可能在同一时钟的跳变沿时刻发生,而状态的变化只可能在同一时钟的跳变沿时刻发生,而不可能发生在任意时刻不可能发生在任意时刻在时钟跳变沿时刻,如输入条件满足则进入下一状态,在时钟跳变沿时刻,如输入条件满足则进入下一状态,并记住自己目录所处的状态。否则仍保留原来的状态。并记住自己目录所处的状态。否则仍保留原来的状态。在进入不同的状态时刻,对系统的开关阵列做开启或关在进入不同的状态时刻,对系统的开
2、关阵列做开启或关闭操作。闭操作。1234o 状态机是一种思想方法n 状态机的本质就是对具有逻辑顺序或时序规律事件的一种描述方法。具有逻辑顺序和时序规律的事件都适合用状态机描述。什么是有限状态机什么是有限状态机FSM:Finite State Machine应用市场上的电子产品进入非正常状态应用市场上的电子产品进入非正常状态/(不需要考虑的状态)(不需要考虑的状态)的可能很多,不可能一一去列举的可能很多,不可能一一去列举于是采用以于是采用以“不变应万变不变应万变”的方式,只考虑需要的状态,不需要的方式,只考虑需要的状态,不需要的状态不管。的状态不管。需要考虑的状态一一列举出来(有限性需要考虑的状
3、态一一列举出来(有限性Finite),不需要考虑),不需要考虑的状态都统一当异常处理(的状态都统一当异常处理(default)123有限状态机三要素有限状态机三要素FSM:Finite State Machine状态(当前状态,下一个状态)状态(当前状态,下一个状态)输入信号(事件)输入信号(事件)输出控制信号(相应操作)输出控制信号(相应操作)123用用VHDL设计的状态机有多种形式设计的状态机有多种形式从信号输出方式分:从信号输出方式分:Mealy型状态机和型状态机和Moore型状态机型状态机从结构上分:从结构上分:单进程状态机和多进程状态机单进程状态机和多进程状态机从状态表达方式上分:从
4、状态表达方式上分:符号化状态机、符号化状态机、确定状态编码状态机确定状态编码状态机从编码方式上分:从编码方式上分:顺序编码状态机、顺序编码状态机、一位热码编码状态机一位热码编码状态机 或其他编码方式状态机或其他编码方式状态机o Moore型有限状态机n 是指那些输出信号仅与当前状态有关的有限状态机,即可以把Moore型有限状态机的输出看成是当前状态的函数。n Moore型有限状态机框图:o Mealy型有限状态机n 是指那些输出信号不仅与当前状态有关,而且还与所有的输入信号有关的有限状态机,即可以把Mealy有限状态机的输出看作当前状态和所有输入信号的函数。可见,Mealy有限状态机要比Moo
5、re有限状态机复杂一些。n Mealy有限状态机框图:o Moore型和Mealy型有限状态机的区别:n Moore型有限状态机仅与当前状态有关,而与输入信号无关;n Mealy型有限状态机不但与当前状态有关,而且还与状态机的输入信号有关。o 采用何种有限状态机的判别条件:n Moore型有限状态机可能要比相应的Mealy型有限状态机需要更多的状态。n Moore型有限状态机的输出与当前的输入部分无关,因此当前输入产生的任何效果将会延迟到下一个时钟周期。可见,Moore型状态机的最大优点就是可以将输入部分和输出部分隔离开。n 对于Mealy型有限状态机来说,由于它的输出是输入信号的函数,因此如
6、果输入信号发生改变,那么输出可以在一个时钟周期内发生改变o 单进程状态机n 整个状态机的描述在一个进程中完成o 双进程状态机n 将组合逻辑部分和时序逻辑部分分开描述,放在结构体的说明部分o 三进程状态机n 将组合逻辑部分再分为产生次态的组合逻辑部分和产生输出的组合逻辑部分,与时序逻辑部分一起放在结构体的说明部分利用VHDL语言将时序电路的状态转换关系进行描述。在VHDL中,所有状态均可表达为case_when结构中的一条case语句,而状态的转移可以通过if_then_else语句实现。6.2 6.2 有限状态机的有限状态机的VHDLVHDL程序设计程序设计Process(clk)BeginI
7、f clkevent and clk=1 thenCase state is:When“000”=If 条件1 thenstate=“001”;End if;When End case;End if;End processS0/0S1/1Input=1/output=10/1/output=0S0/0S1/1Input=1/output=10/1/output=0S0/0S1/1Input=1/output=10/1/output=0LIBRARY ieee;USE ieee.std_logic_1164.ALL;ENTITY state_machine IS PORT(clk,reset,A
8、,B:IN std_logic;Y,Z:OUT std_logic);END state_machine;ARCHITECTURE test of state_machine IS TYPE IS(s0,s1,s2,s3);SIGNAL current_state,next_state:;Begin(1)说明部分说明部分用户自定义数据类型定义语句用户自定义数据类型定义语句TYPE语句用法如下:语句用法如下:TYPE 数据类型名数据类型名 IS 数据类型定义数据类型定义 OF 基本数据类型基本数据类型;或或TYPE 数据类型名数据类型名 IS 数据类型定义数据类型定义;以下列出了两种不同的定义方
9、式:以下列出了两种不同的定义方式:TYPE st1 IS ARRAY(0 TO 15)OF STD_LOGIC;数组数组数据数据类型类型TYPE week IS(sun,mon,tue,wed,thu,fri,sat);枚举枚举数据数据类型类型TYPE m_state IS (st0,st1,st2,st3,st4,st5);SIGNAL present_state,next_state :m_state ;布尔数据类型的定义语句是:布尔数据类型的定义语句是:TYPE BOOLEAN IS(FALSE,TRUE);TYPE my_logic IS (1,Z,U,0);SIGNAL s1:my_
10、logic;s1=Z;符号化状态机:符号化状态机:用文字符号表示二进制数。用文字符号表示二进制数。确定化状态机:确定化状态机:直接用数值表示。直接用数值表示。(2 2)时序进程)时序进程(PROCESS REG)(PROCESS REG)时序进程是负责状态机运转和在时钟驱动下负责状态转换的进程。BEGINREG:PROCESS(clk,reset)-时序逻辑进程时序逻辑进程 BEGIN IF reset=1 THEN current_state=s0;ELSIF rising_edge(clock)THEN current_state IF A=0 and B=1 THEN next_stat
11、e=s1;ELSIF A=1 and B=0 THEN next_state=s2;ELSIF A=0 and B=0 THEN next_state IF A=0 and B=0 THEN next_state=s1;ELSIF A=0 and B=1 THEN next_state=s2;ELSIF A=1 and B=0 THEN next_state IF A=0 and B=0 THEN next_state=s2;ELSE next_state IF A=0 and B=1 THEN Y=0,Z=0;ELSIF A=1 and B=0 THEN Y=0,Z=0;ELSIF A=0 and B=0 THEN Y=0,Z=0;END IF;END CASE;END PROCESS;设计步骤分解设计步骤分解分析输入输出端口信号;分析输入输出端口信号;状态转移图;状态转移图;根据状态转移图进行根据状态转移图进行VHDL 语言描述;语言描述;测试代码编写,仿真;测试代码编写,仿真;FPGA实现。实现。12345RESET(asynchronous)REDTIMER1YELLOWGREENTIMER1TIMER2TIMER2Y=1G=1TIMER3TIMER3R=1