15.6有限状态机自顶向下的模块化设计方法是EDA技术的特点之一。从整个系统的功能出发,将系统分割成若干功能模块。数字系统控制器受控部分各种功能的电路,如计数器,加法器等。数字系统的核心。21.状态机的基本概念:状态机是描述一系列状态转换的电路。状态机主要用来实现一个数字系统设计中的控制部分。运行模式类似于CPU,但和CPU相比,具有结构简单、易读易懂等特点。状态机(statemachine)是一个广义的时序电路。触发器、计数器等都是它的一种特殊功能类型。实际时序电路中的状态数都是有限的,因此又叫做有限状态机(FSM,finitestatemachine)。用状态机设计时序电路类似于数字电路中用状态转移图设计时序电路的方法。但它不必知道每个触发器的激励方程和电路具体实现的细节,而只需在逻辑上加以描述。32.状态机的结构:3.状态机的操作:状态机的内部状态转换产生输出信号序列状态机包括组合逻辑和时序逻辑两个部分,下图中的状态译码器和输出译码器为组合部分,状态寄存器为时序部分。状态译码器输出译码器状态寄存器输入状态输出44.状态机的优点:有限状态机克服了纯硬件数字系统顺序方式控制不灵活的缺点。状态机的结构模式相对简单。状态机容易构成性能良好的同步时序逻辑模块。状态机的VHDL表述丰富多样。在高速运算和控制方面,状态机更有其巨大的优势。就可靠性而言,状态机的优势也是十分明显的。55.6.1状态机的分类在实际应用中,有限状态机主要有两种类型:moore型有限状态机:其输出信号仅与当前状态有关,即moore型有限状态机的输出是当前状态的函数。状态译码器输出译码器状态寄存器resetclock输入次态现态输出moore型有限状态机的结构框图6mealy型有限状态机:其输出信号不仅与当前状态有关,还与输入有关,即mealy型有限状态机的输出是当前状态和输入的函数。状态译码器输出译码器状态寄存器resetclock输入次态现态输出mealy型有限状态机的结构框图7Moore状态机的状态转移图Mealy状态机的状态转移图8状态译码器输出译码器状态寄存器resetclock由于VHDL描述的灵活性,状态机可以具有多种不同的描述方式。单进程:将有限状态机的次态逻辑(状态译码器)、状态寄存器和输出逻辑(输出译码器)在VHDL源代码的结构体中用一个进程来进行描述。双进程:将有限状态机的次态逻辑、状态寄存器和输出逻辑在VHDL源代码的结构体中用两个进程来进行描述。三进程:将有限状态机的次态逻辑、状态寄存器和输出逻辑在VHDL源代码的结构体中各用一个进程来进行描述。95.6.2状态机的设计实现状态机有状态图、状态表、流程图三种表示方法,状态图是其中的一种。在设计的过程中,采用图形方式表示状态机的状态转移和输出,这个图形称之为状态转移图,简称状态图。000001010011100101110111计数器的状态转移图:状态机的状态图:状态A状态B状态C状态D状态E输入/输出输入/输出输入/输出输入/输出输入/输出输入/输出状态A状态B状态C状态DSYYS1.状态图102.状态机的设计步骤步骤1分析设计要求,列出状态机所有状态步骤2设计状态机的状态转移图步骤3用硬件描述语言描述状态机11回顾用户自定义数据类型定义语句TYPE语句用法如下:TYPE数据类型名IS数据类型定义OF基本数据类型;或TYPE数据类型名IS数据类型定义;以下列出了两种不同的定义方式:TYPEst1ISARRAY(0TO15)OFSTD_LOGIC;TYPEweekIS(sun,mon,tue,wed,thu,fri,sat);12TYPEm_stateIS(st0,st1,st2,st3,st4);SIGNALpresent_state,next_state:m_state;m_state是一种枚举数据类型,它包括的元素是st0,st1,st2,st3,st4,这是用文字符号表示的二进制数。状态机的每一个状态在实际电路中是以一组触发器的当前二进制数位的组合来表示的。但是设计者在状态机的设计中,为了更利于阅读、编译,往往将表征每一状态的二进制数组用文字符号来代表,即所谓的状态符号化。在综合过程中,枚举数据类型的编码顺序是默认的,如上例的各元素编码值分别为st0=“000”,st1=“001”,st2=“010”,st3=“011”,st4=“100”。利用用户自定义数据类型定义语句定义状态机的状态:13例:用VHDL语言实现如图所示的moore状态机----单进程的方法14libraryieee;useieee.std_logic_1164.all;entitymooreisport(reset,clock,din:instd_logic;dout:outstd_logic_vector(2downto0));end;architecturebehavofmooreistypestate_typeis(s0,s1,s2,s3);signalstate:state_type;begin15process(reset,clock)beginifreset='1'thenstate=s0;dout=001;elsifrising_edge(clock)thencasestateiswhens0=dout=001;ifdin='1'thenstate=s1;endif;whens1=dout=011;ifdin='1'thenstate=s2;endif;whens2=dout=101;ifdin='1'thenstate=s3;endif;whens3=dout=111;ifdin='1'thenstate=s0;elsestate=s1;endif;endcase;endif;endprocess;end;在if语句外面1617例:用VHDL语言实现如图所示的moore状态机----双进程的方法process(reset,clock)beginifreset='1'thenstate=s0;elsifrising_edge(clock)thencasestateiswhens0=ifdin='1'thenstate=s1;endif;whens1=ifdin='1'thenstate=s2;endif;whens2=ifdin='1'thenstate=s3;endif;whens3=ifdin='1'thenstate=s0;elsestate=s1;endif;endcase;endif;endprocess;方法1:确定状态转移18process(state)begincasestateiswhens0=dout=001;whens1=dout=011;whens2=dout=101;whens3=dout=111;endcase;endprocess;end;决定输出值19architecturebehavofmooreistypestate_typeis(s0,s1,s2,s3);signalpresentstate:state_type;signalnextstate:state_type;beginprocess(reset,clock)beginifreset='1'thenpresentstate=s0;elsifrising_edge(clock)thenpresentstate=nextstate;endif;endprocess;方法2:状态译码器输出译码器状态寄存器resetclock输入次态现态输出状态寄存20process(presentstate,din)begincasepresentstateiswhens0=ifdin='1'thennextstate=s1;elsenextstate=s0;endif;dout=001;whens1=ifdin='1'thennextstate=s2;elsenextstate=s1;endif;dout=011;whens2=ifdin='1'thennextstate=s3;elsenextstate=s2;endif;dout=101;whens3=ifdin='1'thennextstate=s0;elsenextstate=s1;endif;dout=111;endcase;endprocess;end;在if语句外面状态译码和输出译码2122三个进程分别用来描述状态机的次态逻辑、状态寄存器和输出逻辑。状态译码器输出译码器状态寄存器resetclock输入次态现态输出例:用VHDL语言实现如图所示的moore状态机----三进程的方法23architecturebehavofmooreistypestate_typeis(s0,s1,s2,s3);signalpresentstate:state_type;signalnextstate:state_type;beginprocess(reset,clock)beginifreset='1'thenpresentstate=s0;elsifrising_edge(clock)thenpresentstate=nextstate;endif;endprocess;进程1:状态寄存24process(presentstate,din)begincasepresentstateiswhens0=ifdin='1'thennextstate=s1;elsenextstate=s0;endif;whens1=ifdin='1'thennextstate=s2;elsenextstate=s1;endif;whens2=ifdin='1'thennextstate=s3;elsenextstate=s2;endif;whens3=ifdin='1'thennextstate=s0;elsenextstate=s1;endif;endcase;endprocess;进程2:状态译码25process(presentstate)begincasepresentstateiswhens0=dout=001;whens1=dout=011;whens2=dout=101;whens3=dout=111;endcase;endprocess;end;进程3:输出逻辑26例:用VHDL语言实现如图所示的mealy状态机----单进程的方法27libraryieee;useieee.std_logic_1164.all;entitymealy0isport(reset,clock,din:instd_logic;dout:outstd_logic_vector(2downto0));end;architecturebehavofmealy0istypestate_typeis(s0,s1,s2,s3);signalstate:state_type;begin28process(reset,clock)beginifreset='1'thenstate=s0;elsifrising_edge(clock)thencasestateiswhens0=ifdin='1'thenstate=s1;dout=001;elsestate=s0;dout=000;endif;whens1=ifdin='1'thenstate=s2;dout=011;elsestate=s1;dout=010;endif;whens2=ifdin='1'thenstate=s3;dout=101;elsestate=s2;dout=100;endif;whens3=ifdin='1'thenstate=s0;dout=111;elsestate=s1;dout=110;endif;endcase;