1、EDA技术实用教程,第7章 VHDL有限状态机设计,第7章 有限状态机设计 教学内容:,7.1 VHDL状态机的一般形式 7.2 Moore型有限状态机的设计 7.3 Mealy型有限状态机的设计 7.4 状态机图形编辑设计方法 7.5 状态编码 7.6 安全状态机设计 7.7 硬件数字技术排除毛刺,教学要求:,学习和掌握用VHDL设计不同类型的有限状态机的方法;了解EDA工具和设计中关注的问题:综合器优化、毛刺信号的克服、控制速度、状态编码方式等。,状态机(State Machine),状态机是一类很重要的时序电路,是很多数字电路的核心部件,是大型电子设计的基础。状态机相当于一个控制器,它将
2、一项功能的完成分解为若干步,每一步对应于二进制的一个状态,通过预先设计的顺序在各状态之间进行转换,状态转换的过程就是实现逻辑功能的过程。,状态机图是指用图形的方式来表示一个设计实体的各种工作状态、内部各工作状态转换的条件以及各工作状态对应的输出信号序列。,有限状态机 FSM-Finite State Machine,有限状态机是由寄存器组和组合逻辑构成的硬件时序电路,其状态(即由寄存器组的1和0的组合状态所构成的有限个状态)只可能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态,究竟转向哪一状态还是留在原状态不但取决于各个输入值,还取决于当前所在状态。这里指的是米里(Mealy)型有限状态
3、机,而摩尔(Moore)型有限状态机究竟转向哪一状态只决于当前状态。对应: Mealy(输出不但取决于各个输入值,还取决于当前所在状态)-时序逻辑电路(不仅与输入有关还和当前状态有关) Moore(输出只取决于当前状态)-组合逻辑电路(只与输入有关),比较:,传统的设计方法是首先绘制出控制器的状态图,并由此列出状态表,再合并消除状态表中的等价状态项。在完成状态寄存器的分配之后,根据状态表求出次态及输出方程,最后画出设计原理图。采用这种方法设计复杂状态机将会十分繁杂。 利用VHDL设计状态机,不需要进行繁琐的状态分配、绘制状态表和化简次态方程。设计者不必使用卡诺图进行逻辑化简,不必画电路原理图,
4、也不必搭试硬件电路进行逻辑功能的测试,所有这些工作都可以通过EDA工具自动完成。应用VHDL设计状态机的具体步骤如下:(1)根据系统要求确定状态数量、状态转移的条件和各状态输出信号的赋值,并画出状态转移图(状态机图);(2)按照状态转移图编写状态机的VHDL设计程序;所有的状态均可表达为CASE_WHEN结构中的一条CASE语句,而状态的转移则通过IF_THEN_ELSE语句实现。(3)利用EDA工具对状态机的功能进行仿真验证。,7.1 VHDL状态机的一般形式 7.1.1 为什么要使用状态机,(1)高效的顺序控制模型。(2)容易利用现成的EDA优化工具。(3)性能稳定。(4)设计实现效率高。
5、(5)高速性能。(6)高可靠性能。,7.1.2 一般有限状态机的设计,有限状态机分类: 从信号的输入与输出方式分:Mealy型和Moore型有限状态机 从结构分:单进程状态机和多进程状态机 从状态表达方式分:有符号状态机和确定编码状态机 从编码方式分:顺序编码状态机、一位热码编码状态机或其它编码状态机,有限状态机的结构: 说明部分、主控时序进程、主控组合进程、辅助进程,*说明部分在architecture与begin之间; * 定义枚举型数据类型: 用于描述状态 *状态变量定义为信号:便于信息传输,状态变量数据类型定义为含有既定状态元素的新定义的数据类型,ARCHITECTURE .ISTYP
6、E FSM_ST IS (s0,s1,s2,s3); SIGNAL current_state, next_state: FSM_ST; . begin,1.说明部分,负责状态机运转和在时钟驱动下负责状态转换的进程作为状态机的“驱动泵”。功能1:状态机随外部时钟信号以同步方式工作,当时钟的有效跳变到来时,时序进程将代表次态的信号next_state中的内容送入现态信号current_state中,而next_state中的内容完全由其他进程根据实际情况而定。 功能2:此进程中包括一些清零或置位的控制信号。,图7-1 一般状态机结构框图工作示意图,2. 主控时序进程,主控组合进程的任务是根据外部
7、输入的控制信号(包括来自状态机外部的信号和来自状态机内部其它非主控的组合或时序进程的信号),或(和)当前状态的状态值确定下一状态(next_state)的取向,即next_state的取值内容,以及确定对外输出或对内部其它组合或时序进程输出控制信号的内容。-译码过程,3. 主控组合进程,图7-1 一般状态机结构框图工作示意图,用于配合状态机工作的组合进程或时序进程例如: 完成某种算法的进程; 配合状态机工作的其他时序进程; 稳定输出设置的数据锁存器等。,4. 辅助进程,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY s_machine ISP
8、ORT ( clk, reset : IN STD_LOGIC;state_inputs : IN STD_LOGIC_VECTOR (0 TO 1);comb_outputs : OUT INTEGER RANGE 0 TO 15 ); END s_machine; ARCHITECTURE behv OF s_machine ISTYPE FSM_ST IS (s0, s1, s2, s3);-定义FSM_ST为枚举型数据类型(符号化状态机)SIGNAL current_state, next_state: FSM_ST; BEGINREG: PROCESS (reset,clk)-主控时
9、序进程BEGINIF reset = 1 THEN current_state = s0; -异步复位ELSIF clk=1 AND clkEVENT THEN current_state = next_state; -当检测到时钟上升沿时转换至下一状态END IF;END PROCESS; -由current_state将当前状态值带出此进程,进入进程COM,接下页,【例7-1】 2进程 Moore型,COM:PROCESS (current_state, state_Inputs) -主控组合进程BEGINCASE current_state IS -确定当前状态的状态值WHEN s0 =
10、 comb_outputs comb_outputs comb_outputs comb_outputs = 14;IF state_inputs = “11“ THEN next_state = s3; ELSE next_state = s0; END IF;END case;END PROCESS; -由信号next_state将下一状态值带出此进程,进入进程REGEND behv;,接上页,进程间一般是并行运行的,但由于敏感信号的设置不同以及电路的延迟,在时序上进程间的动作是有先后的。,注意:状态变量的状态判断必须用CASE语句,不能用IF语句,图7-2 例7-1状态机的工作时序图,c
11、lk=2 reset=1 next_state= s0 -REG current_state =s0comb_outputs= 5 -COMstate_inputs = “ 01” next_state= s1 -COM clk=3 next_state= s1 current_state -REG current_state =s1comb_outputs= 8 -COMstate_inputs = “ 10” next_state= s2 -COM clk=4 next_state= s2 current_state -REG current_state =s2comb_outputs=1
12、2 -COMstate_inputs = “10” next_state= s3 -COM,2,4,3,7.1.3 状态机设计初始控制与表述,(1)打开“状态机萃取”开关,(2)状态图观察,7.2 Moore型有限状态机的设计,按状态机的信号输出方式分类:Moore(摩尔)型和Mealy(米里)型Moore型:异步输出状态机当时钟到来时,输出仅为当前状态的函数。moore型最大的优点就是可以将输入部分与输出部分隔离开 。 Mealy型: 同步输出状态机输出当前状态和所有输入信号函数,输出是在输入变化后立即发生。不依赖时钟的同步。,Moore型状态机框图,Mealy状态机的框图,7.2.1 AD
13、C采样控制设计及多进程结构状态机,在一般状态机的设计过程中,为了能获得可综合的,高效的VHDL状态机描述,建议使用枚举类数据类型来定义状态机的状态,并使用多进程方式来描述状态机的内部逻辑。例如可使用两个进程来描述,个进程描述时序逻辑,包括状态寄存器的工作和寄存器状态的输出,另一个进程描述组合逻辑,包括进程间状态值的传递逻辑以及状态转换值的输出。必要时还可以引入第三个进程完成其它的逻辑功能。,进程描述方式:,两进程描述的第三种和单进程描述方式最为常用,因为将组合逻辑和时序逻辑清楚区分,故综合效果较好,AD采样控制器-AD574启动时序,D110,图7-3 ADC0809工作时序,AD采样控制器-
14、ADC0809设计,输入选通端口地址锁存信号,转换启动控制信号,状态转换信号,输出控制信号,图7-5 采样状态机结构框图,进程 : 状态机由两个主控进程构成,其中进程REG为主控时序进程,COM为主控组合进程。辅助进程LATCH,【例7-2】描述的状态机由辅助进程LATCH和两个主控进程构成,其中进程REG为主控时序进程,COM为主控组合进程。 LIBRARY IEEE; LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY ADCINT ISPORT (D : IN STD_LOGIC_VECTOR(7 DOWNTO 0);CLK ,EOC :
15、IN STD_LOGIC;ALE, START, OE, ADDA,LOCK0 : OUT STD_LOGIC;Q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); END ADCINT; ARCHITECTURE behav OF ADCINT IS TYPE states IS (st0, st1, st2, st3,st4) ; -定义各状态子类型SIGNAL current_state, next_state: states :=st0 ;SIGNAL REGL : STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL LOCK : STD_LO
16、GIC; - 转换后数据输出锁存时钟信号BEGINADDA =1;-当ADDA=0,模拟信号进入0809通道0;当ADDA=1,则进入通道1 Q = REGL; LOCK0 = LOCK ;接下页,COM: PROCESS(current_state,EOC) BEGIN -规定各状态转换方式 CASE current_state IS WHEN st0=ALEALE ALE ALE ALE next_state = st0; END CASE ;END PROCESS COM ;REG: PROCESS (CLK) BEGINIF (CLKEVENT AND CLK=1) THEN curr
17、ent_state=next_state;END IF;END PROCESS REG ; - 由信号current_state将当前状态值带出此进程:REG LATCH1: PROCESS (LOCK) -st4进入进程中,在LOCK的上升沿,将转换好的数据锁入BEGINIF LOCK=1 AND LOCKEVENT THEN REGL = D ;END IF;END PROCESS LATCH1 ; END behav;,【例7-3】-将例7-2主控组合进程COM 分为两个组合进程COM1(状态转换)、COM 2(状态译码) COM1: PROCESS(current_state,EOC)
18、 -状态转换 BEGIN CASE current_state IS WHEN st0= next_state next_state IF (EOC=1) THEN next_state next_state next_state next_state ALEALEALEALEALE ALE=0;START=0;LOCK=0; END CASE ;END PROCESS COM2 ;,7.2.2 序列检测器之状态机设计,接下页,序列检测器,7.2.2 序列检测器之状态机设计,接上页,例: 用摩尔型状态机的设计空调控制器,空调控制器有两个输入,分别与温度传感器相连,用于检测室内温度。如果温度适宜
19、(如1825),则两个输入temp_high和temp_low均为低;如果室内温度超过上限(25),则输入temp_high为高;如果室内温度低于下限(18),则输入temp_low为高。设控制器的输出为“heat”和“cool”,当两者之一为高时,空调器就制热或制冷。,空调控制器状态转换图,控制器的VHDL描述,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY air_cont ISPORT( clk: IN STD_LOGIC;temp_high: IN STD_LOGIC;temp_low: IN STD_LOGIC;heat: OUT
20、STD_LOGIC;cool: OUT STD_LOGIC); END air_cont; ARCHITECTURE arc1 OF air_cont ISTYPE state_type IS(just_right, too_cold, too_hot); -状态类型,枚举三种状态SIGNAL stvar: state_type; -状态变量 BEGIN,PROCESSBEGIN WAIT ON clk UNTIL RISING_EDGE(clk); -等待clk上升沿IF temp_low=1 THEN stvarheatheatheat=0;cool=1; -太热,制冷END CASE;E
21、ND PROCESS;END arc1;,接上页,例: 用摩尔型状态机的设计序列检测器,序列检测器在数字通信、雷达和遥控遥测等领域中用于检测同步识别标志。它是一种用来检测一组或多组序列信号的电路,本例中要求检测器连续收到一组串行码(1110010)后,输出检测标志为1;否则,输出为0。 分析:该例子中要求检测的序列码是7位,因此需要7个状态分别记忆连续收到了1,11,111,1110,11100,111001,1110010的7个状态,另外,还需要增加一个初始状态,即“未收到一个有效位”的状态,共8个状态。这8个状态用S0S7来表示,序号就表示已收到有效位的个数。显然,输出检测标志只有在进入S
22、7状态时才输出为1,很显然这是一个摩尔(Moore)型状态机。,序列检测器的状态图,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY jcq IS PORT (clk, xi: IN STD_LOGIC;z: OUT STD_LOGIC); END jcq; ARCHITECTURE archjcq OF jcq ISTYPE state_type IS (S0, S1, S2, S3, S4, S5, S6, S7);SIGNAL present_state, next_state: state_type ; BEGINstate_comb:
23、 PROCESS (present_state, xi)BEGIN CASE present_state ISWHEN S0= z=0;IF xi=1 THEN next_state=S1;ELSE next_state=S0;END IF;,WHEN S1= z z z z z z z=1;IF xi=1 THEN next_state=S1;ELSE next_state=S0; END IF;END CASE;,END PROCESS state_comb;state_clk: PROCESS(clk)BEGINIF clkEVENT AND clk=1 THENpresent_stat
24、e=next_state;END IF;END PROCESS state_clk; END archjcq;,序列检测器的VHDL源文件中,有两个进程:第一个进程说明次态的取值由现态及输入决定,但并没有指出它在什么时候成为现态;第二个进程,可以看到该赋值过程与时钟的上升沿同步。因为序列检测器使用了两个进程来定义有限状态机,故而称之为双进程的有限状态机描述方式。,7.3 Mealy型有限状态机的设计,Mealy型状态机的输出逻辑不仅与当前状态有关,还与当前的输入变量有关,因此,一个基本的Mealy型状态机应具有以下端口信号: 时钟输入端: clk; 输入变量:input; 输出变量:outpu
25、t; 状态复位端: reset;Mealy型状态机的 输出变化比Moore型状态机要领先一个周期,即一旦输入状态发生变化,输出信号即刻发生变化,接下页,双进程状态机-MEALY,接上页,毛刺,消除毛刺,改进方法 1)将输出通过寄存器锁存 2)改为单进程状态机MEALY,接下页,单进程状态机MEALY 消除毛刺,接上页,接下页,序列检测器-将例7-4双进程的MOORE改为单进程的mealy,接上页,不同:输出SOUT延时一个时钟,输出延时具有滤波作用。,7.4 状态机图形编辑设计方法,7.5 状态编码,状态机从状态表达方式可分为:有符号状态机和确定编码状态机 有符号状态机:用文字符号表示状态变量
26、的状态机,其状态编码由VHDL综合器根据具体情况确定。 确定编码状态机:其状态编码可人为控制或由综合器自动对编码方式进行选择。 状态机从编码方式可分为:顺序编码状态机、一位热码编码状态机或其它编码状态机,7.5.1 直接输出型编码,将状态编码直接输出作为控制信号,即output=state;要求对状态机各状态的编码作特殊的选择,以适应控制时序的要求。这种状态机称为状态码直接输出型状态机。,直接输出型编码应用:计数器,表7-1 0809采样机控制信号状态编码表,将状态编码直接输出作为控制信号,每一位的编码值都赋予了实际的控制功能,即:START= current_state(4); ALE =
27、current_state(3) ;OE = current_state(2) ; LOCK = current_state(1) 。,ALE:输入选通端口地址锁存信号,START:转换启动控制信号,EOC:状态转换信号,OE:输出控制信号,7.5 状 态 编 码,7.5.1 直接输出型编码,接下页,根据编码表7-1编写的代码,7.5 状 态 编 码,7.5.1 直接输出型编码,接上页,其他编码方式,用属性定义语句设置,用属性定义语句设置,7.5.2 顺序编码,顺序编码方式就是利用若干个触发器的编码组合来实现n个状态的状态机,这种编码方式最为简单,且使用的触发器数量最少,剩余的非法状态最少,容
28、错技术最为简单。,【例】 . SIGNAL CRURRENT_STATE,NEXT_STATE: STD_LOGIC_VECTOR(2 DOWNTO 0 ); CONSTANT ST0 : STD_LOGIC_VECTOR(2 DOWNTO 0) := “000“ ; CONSTANT ST1 : STD_LOGIC_VECTOR(2 DOWNTO 0) := “001“ ; CONSTANT ST2 : STD_LOGIC_VECTOR(2 DOWNTO 0) := “010“ ; CONSTANT ST3 : STD_LOGIC_VECTOR(2 DOWNTO 0) := “011“ ;
29、CONSTANT ST4 : STD_LOGIC_VECTOR(2 DOWNTO 0) := “100“ ;.,7.5.3 一位热码状态编码 (One-hot encoding),一位热码编码方式就是用n个触发器来实现具有n个状态的状态机,状态机中的每一个状态都由其中一个触发器的状态表示,即当处于某状态时,对应的触发器为1,其余的触发器都置0。一位热码编码方式尽管用了较多的触发器,但其简单的编码方式大为简化了状态译码逻辑,提高了状态转换速度,这对于含有较多的时序逻辑资源,较少的组合逻辑资源的FPGA器件是好的解决方案。,一位热码编码方式选择对话框,一位热码编码(One-hot encoding
30、),一位热码编码方式是用n个触发器实现具有n个状态的状态机,状态机中的每一个状态都由其中一个触发器的状态表示,对应的触发器为1,其余的触发器都置0。,状态机编码方式设置,AssignGlobal Project Synthesis,7.5.4 状态编码设置,用户自定义方式 将需要的编码方式直接写入程序中,不需EDA软件干预,2. 直接设置方法,一位热码形式,3. 用属性定义语句设置,7.6 安全状态机设计,状态机剩余状态:未不需要被定义的 编码组合,这些状态在状态机的 正常运行中 不需要出现的,通常称为非法状态。,7.6.1 程序直接导引法,1)在语句对每一个非法状态作出明确状态转换指示,2)
31、利用OTHERS语句中对未提到的状态作统一处理,7.6.2 状态编码监测法,一位热码编码方式可减少状态转换间的译码组合逻辑资源,但其剩余状态过多,处理方法:正常的状态时,只有1个触发器的状态为1,其余的触发器都置0。在状态机设计中加入对状态1个数是否大于一的判别逻辑,当大于1时,产生报警信号alarm ,系统可根据此信号是否有效决定是否调整状态或转向。,7.6.3 借助EDA优化控制工具生成安全状态机,7.7 硬件数字技术排除毛刺 7.7.1 延时方式去毛刺,7.7.2 逻辑方式去毛刺,7.7.3 定时方式去毛刺,接下页,接上页,习 题,7-1 根据图7-30(a)所示的状态图,分别按照图7-
32、30(b)和图7-30(c)写出对应结构的VHDL状态机。并根据表7-2,分别用3中不同编码方式实现二状态机,并讨论他们的容错措施。,习 题,7-2 举二例说明,有那些常用时序电路是状态机比较典型特殊形式,并说明它们属于什么类型的状态机(编码类型,时序类型和结构类型)。7-3 用mealy机类型,写出控制ADC0809采样的状态机。7-4 请设计一种信号去抖动的电路模型,仿真后,讨论其优缺点和使用范围。7-5 根据7.5节,用表格法和绘图法设计状态机,实现例7-2的功能,用时序仿真波形图验证之。最后将其转变成VHDL程序,将此程序与例7-2相比,讨论他们的表述风格。,实验与设计,7-1 序列检
33、测器设计 (1)实验目的: (2)实验任务: (3)实验思考题:。 (4)实验报告: 基于5E+系统的演示示例:/KX_7C5EE+/EXPERIMENTs/EXP34_SCHK/,实验与设计,7-2 并行ADC采样控制电路实现与硬件验证 (1)实验目的: (2)实验原理: (3)实验任务1:,实验与设计,7-2 并行ADC采样控制电路实现与硬件验证 (4)实验任务2: (5)实验任务3: (6)实验任务4: (7)实验报告:,实验与设计,7-3 数据采集模块和简易存储示波器设计 (1)实验目的: (2)实验原理:,实验与设计,7-3 数据采集模块和简易存储示波器设计 (3)实验内容1: (4
34、)实验内容2: (5)实验内容3: (6)实验内容4: 向另一5E+系统下载:/KX_7C5EE/DEMOs/EXP10_DDS_Core_DAC0832/MCU8951。 (7)实验内容5: (8)实验内容6: (9)实验内容7:,实验与设计,7-4 五功能智能逻辑笔设计 (1)实验目的: (2)实验原理:,实验与设计,7-4 五功能智能逻辑笔设计 (1)实验目的: (2)实验原理:,示例文件:/KX_7C5EE+/EXPERIMENTs/EXP14_LOGIC_PEN/ (3)实验内容:,实验与设计,7-5 比较器加DAC器件实现ADC转换功能电路设计 (1)实验原理: (2)实验内容1:
35、 (3)实验内容2:,实验与设计,7-6 通用异步收发器UART设计 (1) 实验目的: (2) 实验内容1:,实验与设计,(3) 实验内容2: (4) 实验内容3: 另一UART演示示例:/KX_7C5EE+/DEMOs/EXPL14_RS232_PIANO。,实验与设计,7-7 点阵型与字符型液晶显示器驱动控制电路设计 (1)实验目的: (2)实验原理: (3)实验任务1: (4)实验任务2: 以上2类基于5E+系统的LCD的演示示例是: /KX_7C5EE/DEMOs/EXPL18_PS2_64X128LCD/;或/EXPERIMENTs/EXP20_8051_LCD128X64/; 或
36、/EXPERIMENTs/EXP17_KX8051_GPS_FTEST/。,实验与设计,7-8 串行ADC/DAC采样或信号输出控制电路设计 通过网络查阅一些常用串行ADC器件,包括它们的工作性能、使用方法、时序特点。设计出对应的电路,然后用状态机对其控制,最后比较用状态机和CPU的优缺点。 串行ADC/DAC资料查阅文件夹:“PDF实验设计文件”。 基于5E+的示例:/KX_7C5EE+/EXPERIMENTs/EXP40_SADC_SDAC/。 TLV5637和TLV5618A都是双通道DAC,比较适合于实现之前的提出的几个需要双通道DAC输出的实验,如基于DDS的移相信号发生器,里萨如图
37、信号发生器,存储示波器等。,实验与设计,7-9 硬件消抖动电路设计 设计任务:FPGA中的去抖动电路十分常用,在以后的实验中会多次用到。 基于5E+系统的演示示例:/KX_7C5EE+/EXPERIMENTs/EXP41_Di_Tremble/,实验与设计,7-10 状态机控制串/并转换8数码静态显示 (1)实验原理: (2)实验任务1: (3)实验任务2: (4)实验任务3: 演示示例:/KX_7C5EE+/EXPERIMENTs/EXP43_74HC164_8LED/,实验与设计,7-10 状态机控制串/并转换8数码静态显示 (1)实验原理: (2)实验任务1: (3)实验任务2: (4)实验任务3: 演示示例:/KX_7C5EE+/EXPERIMENTs/EXP43_74HC164_8LED/,实验与设计,7-11 数字温度器件DS18B20测控电路设计 设计任务:查阅DALLAS公司数字温度传感器DS18B20的使用方法和工作时序,设计一个状态机,控制并处理来自DS18B20的数据,将测得的温度显示在数码管上。 演示示例文件:/KX_7C5EE+/EXPERIMENTs/EXP19_8051_DS18B20/MCU8951。按复位键K1即可看到液晶的温度显示,可用键设置温控上下限,超出温度限,蜂鸣器报警。,