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),状态机是一类很重要的时序电路,是很多数字电路的核心部件,是大型电子设计的基础状态机相当于一个控制器,它将一项功能的完成分解为若干步,每一步对应于二进制的一个状态,通过预先设计的顺序在各状态之间进行转换,状态转换的过程就是实现逻辑功能的过程状态机图是指用图形的方式来表示一个设计实体的各种工作状态、内部各工作状态转换的条件以及各工作状态对应的输出信号序列有限状态机 FSM-Finite State Machine,有限状态机是由寄存器组和组合逻辑构成的硬件时序电路,其状态(即由寄存器组的1和0的组合状态所构成的有限个状态)只可能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态,究竟转向哪一状态还是留在原状态不但取决于各个输入值,还取决于当前所在状态。
[这里指的是米里(Mealy)型有限状态机,而摩尔(Moore)型有限状态机究竟转向哪一状态只决于当前状态]对应: Mealy(输出不但取决于各个输入值,还取决于当前所在状态)->时序逻辑电路(不仅与输入有关还和当前状态有关) Moore(输出只取决于当前状态)->组合逻辑电路(只与输入有关),比较:,传统的设计方法是首先绘制出控制器的状态图,并由此列出状态表,再合并消除状态表中的等价状态项在完成状态寄存器的分配之后,根据状态表求出次态及输出方程,最后画出设计原理图采用这种方法设计复杂状态机将会十分繁杂 利用VHDL设计状态机,不需要进行繁琐的状态分配、绘制状态表和化简次态方程设计者不必使用卡诺图进行逻辑化简,不必画电路原理图,也不必搭试硬件电路进行逻辑功能的测试,所有这些工作都可以通过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)高速性能6)高可靠性能7.1.2 一般有限状态机的设计,有限状态机分类: 从信号的输入与输出方式分:Mealy型和Moore型有限状态机 从结构分:单进程状态机和多进程状态机 从状态表达方式分:有符号状态机和确定编码状态机 从编码方式分:顺序编码状态机、一位热码编码状态机或其它编码状态机,有限状态机的结构: 说明部分、主控时序进程、主控组合进程、辅助进程,,*说明部分在architecture与begin之间; * 定义枚举型数据类型: 用于描述状态 *状态变量定义为信号:便于信息传输,状态变量数据类型定义为含有既定状态元素的新定义的数据类型,ARCHITECTURE .ISTYPE 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. 主控时序进程,,,,主控组合进程的任务是根据外部输入的控制信号(包括来自状态机外部的信号和来自状态机内部其它非主控的组合或时序进程的信号),或(和)当前状态的状态值确定下一状态(next_state)的取向,即next_state的取值内容,以及确定对外输出或对内部其它组合或时序进程输出控制信号的内容译码过程,3. 主控组合进程,图7-1 一般状态机结构框图工作示意图,,——用于配合状态机工作的组合进程或时序进程例如: 完成某种算法的进程; 配合状态机工作的其他时序进程; 稳定输出设置的数据锁存器等4. 辅助进程,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY s_machine ISPORT ( 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)--主控时序进程BEGINIF reset = '1' THEN current_state <= s0; --异步复位ELSIF clk='1' AND clk'EVENT 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 => 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状态机的工作时序图,clk=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=12 --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 ADC采样控制设计及多进程结构状态机,在一般状态机的设计过程中,为了能获得可综合的,高效的VHDL状态机描述,建议使用枚举类数据类型来定义状态机的状态,并使用多进程方式来描述状态机的内部逻辑例如可使用两个进程来描述,—个进程描述时序逻辑,包括状态寄存器的工作和寄存器状态的输出,另一个进程描述组合逻辑,包括进程间状态值的传递逻辑以及状态转换值的输出必要时还可以引入第三个进程完成其它的逻辑功能进程描述方式:,两进程描述的第三种和单进程描述方式最为常用,因为将组合逻辑和时序逻辑清楚区分,故综合效果较好,AD采样控制器-AD574启动时序,D[110],图7-3 ADC0809工作时序,AD采样控制器-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 : 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_LOGIC; -- 转换后数据输出锁存时钟信号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 (CLK'EVENT AND CLK='1') THEN current_state<=next_state;END IF;END PROCESS REG ; -- 由信号current_state将当前状态值带出此进程:REG LATCH1: PROCESS (LOCK) --st4进入进程中,在LOCK的上升沿,将转换好的数据锁入BEGINIF LOCK='1' AND LOCK'EVENT THEN REGL <= D ;END IF;END PROCESS LATCH1 ; END behav;,。