第六章 状态机设计主讲人:徐向民教授目录时序电路的概念时序电路与状态机的关系电路的竞争与冒险有限状态机的描述方法ASM图法状态机设计有限状态 机的分类状态机VHDL实现举例时序电路的概念在组合电路中,任一时刻的稳定输出只取决于当时的输入,而在时序电路中任一时刻的稳定输出, 不仅可能取决于当时的输入,还取决于电路的原来的状态,即与过去的输入情况有关。时序电路的概念下面以一个简单的三位计数器为例,说明时序 电路的结构。设计分析3位计数器,由时钟上升沿触发,计数从000~111,到111后则重新回到000。采用上升沿触发的D触发器作为状 态寄存器,D触发器的示意图和真值表如下:时序电路的概念用A、B、C分别表示3个位,则A+、B+、C+表示A、B、C的次态。其真值表 如下:时序电路的概念三位计数器的结构根据上面的分析,3位计数器需要用到3个状态寄存器。A+、B+、C+是状态寄存器的输入;A、B、 C是状态寄存器的输出。由此可根据时序电路的一般模型可画出3位计数器的结构。时序电路的概念次态逻辑关系的推导通过真值表,可以画出卡诺 图如下:由卡诺图可导出次态逻辑方程:时序电路的概念电路图根据次态电路的组成,可以得到次态逻辑的组成,从而可以得出3位计数器的详细电 路:时序电路与状态机的关系状态机的本质状态机的本质就是对具有逻辑顺序或时序规律事件的一种描述方法。具有逻辑顺序和时序规律的事件都适 合用状态机描述。同步时序逻辑电路符合状态机的一般特征,即具有逻辑顺序和时序规律,所以可以用状态机描述。时序电路与状态机的关系状态机 的基本要素状态:也叫状态变量。在逻辑设计中,使用状态划分逻辑顺序和时序规律。输出:输出指在某一个状态时特定发生的事件。输入:指状态 机中进入每个状态的条件,有的状态机没有输入条件,其中的状态转移较为简单,有的状态机有输入条件,当某个输入条件存在时才能转移到相应的 状态。时序电路与状态机的关系日常生活中的状态机通过状态机的方式,我们可以清晰地描述一个学生的在校生活方式。时序电路与状态机的关系描 述时序电路的状态机的组成组合逻辑组合逻辑又可分为次态逻辑和输出逻辑两个部分。其中:次态逻辑的功能是用来确定有限状态机的下一个状态; 输出逻辑是用来确定有限状态机的输出。存储逻辑寄存器逻辑的功能:用来存储有限状态机的内部状态。电路的竞争与冒险竞争与冒险所谓竞争与冒 险,就是在组合电路中,信号经不同途径传输后,达到电路中某一汇合点的时间有先有后,这种现象成为竞争。由于竞争而使电路输出发生瞬间错误 的现象,称为冒险。在时序逻辑电路中,产生次态的电路和输出电路是组合逻辑电路。组合逻辑电路存在竞争与冒险,可能导致时序系统进入不正确 的状态。使用同步时序逻辑电路可以克服次态逻辑存在竞争与冒险的问题。电路的竞争与冒险竞争与冒险的例子由于延迟时间的存在,当信号C经过 多条路径传送后又重新会合到U3上,由于C-D路径上门的级数与C-E路径不同,导致到达会合点U3的时间有先有后,从而产生瞬间的错误输 出。 电路的竞争与冒险上例中的时序如图毛刺电路的竞争与冒险状态机克服竞争冒险的方法在次态产生组合逻辑电路中,可以通过时序逻辑消除毛 刺,从而克服竞争冒险。通过输出端时序同步的方法消除竞争与冒险(即使用同步时序逻辑电路设计方法。详细实例见后面介绍)。有限状态机的描 述方法状态转移图状态转移列表MDS图ASM图(主要讲解)有限状态机的描述方法ASM图法设计状态机ASM本质上是一个有限状态机,主要 用于同步时序系统。ASM精确地表示出状态转换的时间关系。从形式上看,这种流程图类似于描述软件程序的流程图,但它能和实现它的硬件很好 的对应起来。本章主要学习使用ASM图法描述状态机。ASM图法状态机设计——ASM图组成ASM图的组成状态框用一个矩形框来表示一个状 态。状态的名称写在左上角;状态的二进制编码写在右上角;操作内容写在矩形框内。在同步系统中,状态经历的时间至少是一个时钟周期,也可以 是几个周期。寄存器操作或输出状态名二进制码R? 0C=‘1’T1001ASM图法状态机设计——ASM图组成ASM图的组成判断框用单 入口双出口的菱形或单入口多出口的多边形符号表示。在菱形和多边形框内写检测条件,在分支出口处注明各分支所满足的条件。判断框必须跟着状 态框。判断框的执行与状态框在同一时钟周期内。条件01引出分支引出分支ASM图法状态机设计——ASM图组成ASM图组成条件框用椭圆框 表示。条件框一定是与判断框的一个转移分支相连接,仅当判断框中判断变量满足相应的转移条件时,才进行条件框中标明的操作和信号输出。虽然 条件框和状态框都能执行操作和输出信号,但二者有很大区别。寄存器操作或输出ASM图法状态机设计——ASM图组成状态框与条件框的区别图 a图 bASM图法状态机设计——ASM图组成ASM图法状态机设计——ASM图组成状态框判断框条件框虚线框部分就是一个状态单元,条 件框中R?0也在这个状态单元内执行。ASM图法状态机设计——ASM图组成ASM图的组成状态单元状态单元由一个状态框或 条件框组成 。状态单元的入口必须是状态框的入口,出口可以有几个,但必须指向状态框。仅包含一个状态框,无判断框和条件框的ASM块是一个简单块。每 个状态单元表示一个时钟周期内系统所处的状态,在该状态下完成快内的若干操作。ASM图法状态机设计——硬件实现用ASM图描述一个系统控 制器时,实际上是描述了该控制器的硬件结构和时序工作过程,因此ASM图与硬件有很好的对应关系,ASM图的硬件实现有以下几种方法:用计 数器实现ASM图用多路选择器实现ASM图每个状态一个触发器(定序型)基于ROM法实现ASM图(微程序型)ASM图的硬件实现一共有4 中方法,这里我们重点介绍用计数器实现ASM图的方法。ASM图法状态机设计——硬件实现ASM图的状态分配N个状态变量可以描述2^n个 状态。该ASM图中有3个状态,所以需要两个状态变量。设两个状态变量为Q2Q1,我们选用2个D触发器。用二进制计数序列依次表示状态。 ASM图法状态机设计——硬件实现状态转换表因为10和11状态与输入X无关,所以X值可作任意值处理。表中01未指定状态,采用计数器实 现,因此需考虑因偶然因素出现01状态时,应强迫其次态为00,所以一旦出现01状态后,经过一个时钟周期就可以自动回到有用状态循环。A SM图法状态机设计——硬件实现由状态转换表推导触发器的驱动方程对于复杂的ASM图和相应的状态表可用卡诺图对次态进行化简,得到简化的 驱动方程。ASM图除了可以得到状态表和驱动方程外,还可以得到输出方程ASM图法状态机设计——硬件实现ASM图的硬件实现采用计数器法 实现ASM图,一旦ASM图有很小的改动,就需要重新设计与次态相关的组合电路部分。此外,当系统的状态超过8个时,ASM图的硬件实现也 很复杂。学习ASM图的硬件实现有助于我们更好的理解后续的内容,下面我们将学习如何使用VHDL实现ASM图。ASM图法状态机设计—— 举例举例要求设计一套交叉路口交通信号灯,该路口有一条交通干线与支线,支线上装有传感器,当支线有车通过时,传感器输出信号CAR=1。 正常的工作状态时干线亮绿灯,支线亮红灯;当CAR=1时,干线亮红灯,支线亮绿灯,并开始计时,START_TIEMR=1,当计时结束 ,即信号TIMED=1时,重新回到正常工作状态(干线亮绿灯,支线亮红灯)。ASM图法状态机设计——举例设计步骤根据设计要求,我们先 确定系统的输入:clock, car, timed.然后确定系统的输出:start_timer;major_green, mino r_green. (枚举类型)分析系统所有可能出现的状态:state = G?major_green = 1, minor_gre en = 0;state = R?major_green = 0, minor_green = 1;根据题意,画出ASM图:有限状 态机的分类从信号输出方式上分Mealy型状态机Moore型状态机从结构上分单进程状态机两进程状态机三进程状态机从表达方式上分符号化 状态机确定状态编码状态机顺序编码状态机独热码状态机格雷码状态机从信号输出方式上分Moore型有限状态机是指那些输出信号仅与当前状态 有关的有限状态机,即可以把Moore型有限状态机的输出看成是当前状态的函数。Moore型有限状态机框图:从信号输出方式上分Meal y型有限状态机是指那些输出信号不仅与当前状态有关,而且还与所有的输入信号有关的有限状态机,即可以把Mealy有限状态机的输出看作当 前状态和所有输入信号的函数。可见,Mealy有限状态机要比Moore有限状态机复杂一些。Mealy有限状态机框图:从信号输出方式上 分Moore型和Mealy型有限状态机的区别:Moore型有限状态机仅与当前状态有关,而与输入信号无关;Mealy型有限状态机不但 与当前状态有关,而且还与状态机的输入信号有关。从信号输出方式上分采用何种有限状态机的判别条件:Moore型有限状态机可能要比相应的 Mealy型有限状态机需要更多的状态。Moore型有限状态机的输出与当前的输入部分无关,因此当前输入产生的任何效果将会延迟到下一个 时钟周期。可见,Moore型状态机的最大优点就是可以将输入部分和输出部分隔离开。对于Mealy型有限状态机来说,由于它的输出是输入 信号的函数,因此如果输入信号发生改变,那么输出可以在一个时钟周期内发生改变。从状态机的结构上分单进程描述它就是将状态机的三个逻辑单 元(状态寄存器、下状态产生逻辑、输出逻辑)合并起来,采用一个进程描述。适用于简单的设计;对于复杂的状态机,可读性差,易出错,不利于 EDA软件优化。从状态机的结构上分单进程状态机下一状态组合逻辑寄存输出逻辑当前状态时序逻辑从状态机的结构上分单进程状态机LIBRA RY IEEE ;USE IEEE.STD_LOGIC_1164.ALL ;ENTITY traffic IS POR T( clock , timed , car : IN std_ulogic ; start_timer, major_gre en, minor_green : OUT std_ulogic );END ENTITY traffic ;ARCHITECTU RE asm1 OF traffic IS BEGIN PROCESS (clock, timed, car) TYPE state_type IS (G, R); --这里采用符号化状态机的描述方式 VARIABLE state: state_type; --将状态定义为变量类型 BEGIN IF (rising_edge(c lock)) THEN CASE state IS WHEN G => major_green <= ‘1’; minor_gree n <= ‘0’; 看图说话从状态机的结构上分单进程状态机 IF (car = ‘1’) THEN start_timer <= ‘ 1’; state := R; END IF; WHEN R => major_green <= ‘0’; minor_green <= ‘1’; IF (timed= ‘1’) THEN start_timer <= ‘ 1’; state := G; END IF; END CASE; END IF END PROC ESS;END ARCHITETURE;从状态机的结构上分单进程状态机单进程状态变量可以定义为变量类型,放在进程的说明部分;一般在 进程的开头写上时钟有效边沿的检测语句;注意在这里进程敏感参数表中的car和timed可省去rising_edge(clock)也可 以写成clock’event and clock=‘1’;条件涵盖不完整的if语句会产生寄存器;这是将时序电路和组合电路混合的系统 ,有时会引入不必要的寄存器。如果将描述时序的部分放在具有边沿检测条件的if语句或wait语句的进程中,而将描述组合电路的语句放在普 通的进程中,这样可以有效控制寄存器的引入。从状态机的结构上分双进程状态机第二个进程(纯组合逻辑),描述状态转移条件的判断与输出。第 一个进程(同步时序),格式化地描述次态到现态的转移。一般情况是组合逻辑输出,如果时序允许,尽量插入寄存器输出。从状态机的结构上分双 进程状态机LIBRARY IEEE ;USE IEEE.STD_LOGIC_1164.ALL ;ENTITY traffic IS PORT( clock , timed , car : IN std_ulogic ; start_time r, major_green, minor_green : OUT std_ulogic );END ENTITY traffic ;ARCHITECTURE asm2 OF traffic IS TYPE state_type IS (G, R); -- 利用枚举类型定义状态 SIGNAL pr_state, nx_state : state_type; --将状态机的 现态、次态定义为全局信号,便于在进程间传递信息BEGIN seq: PROCESS (clock) BEGIN IF(ri sing_edge(clock)) THEN pr_state <= nx_state;--次态是寄存器的输入 END IF; --条件涵盖不完整的if语句产生状态寄存器 END PROCESS seq; - -产生状态寄存器的进程从状态机的结构上分双进程状态机 com: PROCESS (pr_state, car, timed) BE GIN start_timer <= ‘0’; CASE pr_state IS WHEN G => major_green <= ‘1’; minor_green <= ‘0’; IF (car = ‘1 ’) THEN start_timer <= ‘1’; nx_state <= R; ELSE nx_state <= G; END IF;从状态机的结构上分双进程状态机 WHEN R => major_green <= ‘0’; minor_green <= ‘1’; IF (timed= ‘1 ’) THEN nx_state <= G; ELSE nx_state <= R; END IF; END CASE; END PROCESS com; --产生次态和输出逻辑的进程END asm2;从状态机的结构上分双进程状态机:双进程中状态变量要定义为SIGNAL类型,用于进程间信息的传递可以在产生寄存器的进程中加 上异步复位语句,用于确定初始状态 seq: PROCESS (clock) BEGIN IF reset=‘1’ THEN pr_state <= G; IF(rising_edge(clock)) THEN pr_state <= next_state; END IF; END PROCESS seq;注意在组合进程中if语句要写完整if-els e 从状态机的结构上分三进程状态机第一个进程(同步时序)格式化描述次态寄存器迁移到现态寄存器第二个进程(状态转移组合逻辑),描述状 态转移条件判断第三个进程(输出组合逻辑),一般使用同步时序逻辑同步输出。从状态机的结构上分三进程状态机LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ;ENTITY traffic IS PORT( clock , timed , car : IN std_ulogic ; start_timer, major_green, min or_green : OUT std_ulogic );END ENTITY traffic ;ARCHITECTURE asm2 OF traffic IS TYPE state_type IS (G, R); --利用枚举类型定义状态 SIGNAL pr_ state, next_state : state_type; --将状态机的现态、次态定义为全局信号,便于在进程间 传递信息BEGIN seq: PROCESS (clock) BEGIN IF(rising_edge(clock)) T HEN pr_state <= next_state;--次态是寄存器的输入 END IF; --条件涵盖不完整的if语句产生状态寄存器 END PROCESS seq; --产生状态寄存器的进程从状态机的结 构上分三进程状态机ns: PROCESS (car, timed, pr_state)BEGIN CASE pr_state IS WHEN G => IF (car = ‘1’) THEN nx_state <= R; ELS E nx_state <= G; WHEN R => IF (timed = ‘1’) THEN n x_state <= G; ELSE nx_state <= R; END IF; END CASE;END PROCESS ns; --产生次态逻辑进程从状态机的结构上分三进程状态机op: PROCESS (car, pr_state) –Mealy State MachineBEGIN start_timer <= ‘0’; IF (pr_state = G) T HEN major_green <= ‘1’; minor_green <= ‘0’; IF (car = ‘1’) THEN start_timer <= ‘1’; END IF; ELSE major _green <= ‘0’; minor_green <= ‘1’; END IF;END PROCESS op;--产生 输出逻辑的进程END asm3;从状态机的结构上分op进程也可以用并行语句改写:start_timer <= ‘1’ WHEN ( pr_state = G AND car = ‘1’)ELSE ‘0’;major_green <= ‘1’WHEN (pr_st ate = G)ELSE ‘0’;minor_green <= ‘1’WHEN (pr_state = R)ELSE ‘0’;注意 :用并行语句改写,不能再使用进程从状态机的结构上分三进程状态机描述状态寄存器的时序进程描述下状态产生逻辑的组合进程定义输出的组合逻 辑进程使用三进程描述状态机,可以达到很好的综合效果。从表达方式上分符号化状态机所谓符号化状态机,就是在程序的说明部分使用TYPE语 句定义枚举类型,其元素用状态机的状态名来定义。状态变量(如状态机的现态和次态)定义为变量或信号,并将状态变量的数据类型定义为含有既 定状态元素的枚举类型。在使用多进程时,为便于信息传递,要将状态变量定义为信号。前面的三种进程描述状态机的例子中,都是使用符号化状态 机的表达方式。从表达方式上分符号化状态机——类型定义语句TYPE 数据类型名 IS 数据类型定义 OF 基本数据类型; 或 T YPE 数据类型名 IS 数据类型定义;例:TYPE st1 IS ARRAY (0 TO 15) OF STD_LOGIC;TY PE week IS (sun, mon, tue, wed, thu, fri, sat);符号化状态机应用TYPE m_sta te IS (st0, st1, st2, st3, st4, st5);SIGNAL present_state, next_s tate : m_state;从表达方式上分确定状态编码状态机使用符号化定义的枚举类型,枚举类型文字元素的编码通常是自动设置的,综 合器根据优化情况、优化控制的设置或设计者的特殊设定来确定各元素具体编码的二进制位数、数值及元素间编码的顺序。也可以在程序中指明编码 方式。常用的编码方式2进制编码格雷码编码One-hot编码从表达方式上分确定状态编码状态机——2进制编码状态机的每一个状态用二进制 位来编码例:实现4状态的状态机,其其二进制编码可为 状态1=“00”状态2=“01”状态3=“10”状态4=“11”需要的寄存器数 量最少,有n个寄存器就可以对2^n个状态进行编码。需要更多的外部辅助逻辑,并且速度较慢。从表达方式上分确定状态编码状态机——格雷码 编码格雷码编码每次仅一个状态位的值发生变化例:实现4状态的状态机,其格雷码编码可为 状态1=“00”状态2=“01”状态3=“11 ”状态4=“10”特点:触发器使用较少,速度较慢,不会产生两位同时翻转的情况。当状态位的输出被异步应用时,格雷码编码是有益的。从表 达方式上分确定状态编码状态机——One-hot编码One hot的编码方案对每一个状态采用一个触发器,即4个状态的状态机需4个触发 器。同一时间仅1个状态位处于有效电平(如逻辑“1”)例:实现4状态的状态机,其one hot编码可为 状态1=“0001”状态2= “0010”状态3=“0100”状态4=“1000”特点:触发器使用较多,但逻辑简单,速度快。从表达方式上分关于one-hot、g ray-code、binary编码使用说明Binary、gray-code编码使用较少的触发器,较多的组合逻辑,而one-hot编 码反之。由于CPLD更多的提供组合逻辑,而FPGA更多的提供触发器资源,所以CPLD多使用gray-code,而FPGA多使用on e-hot编码。对于小型设计使用gray-code和binary编码更有效,而大型状态机使用one-hot编码更有效。从表达方式上 分程序中指明编码方式ARCHITECTURE BEHAV OF BINARY ISTYPE STATE_TYPE IS(S1, S 2, S3, S4, S5, S6, S7);ATTRIBUTE ENUM_ENCODING: STRING;ATTRIBUTE ENUM_ENCODING OF STATE_TYPE: TYPE IS "001 010 011 100 101 110 111 ";ARCHITECTURE BEHAV OF ONE_HOT ISTYPE STATE_TYPE IS(S1, S2, S3, S4, S5, S6, S7);ATTRIBUTE ENUM_ENCODING: STRING;ATTRIBUTE ENUM_EN CODING OF STATE_TYPE: TYPE IS "00000001 00000010 00000100 000010 00 00010000 00100000 01000000 10000000";二进制编码One-hot编码状态机VHDL实现举例 ——Mealy型输出同步Mealy型状态机使用VHDL语言实现以下ASM图描述的状态机仅一个寄存器状态机VHDL实现举例——Mea ly型输出同步输出端无同步------------------------------------------------LIBR ARY ieee;USE ieee.std_logic_1164.all;---------------------------- -------------------ENTITY simple_fsm IS PORT (a, b, d, clk, rst: IN BIT; x: OUT BIT);END simple_fsm;------------------------ -----------------------ARCHITECTURE simple_fsm OF simple_fsm IS T YPE state IS (stateA, stateB); SIGNAL pr_state, nx_state: state;B EGIN----------Lower section: ---------------------- PROCESS (rst, clk) BEGIN IF (rst = ''1'') THEN pr_state <= stateA; ELSI F (clk''EVENT AND clk = ''1'') THEN pr_state <= nx_state; END I F; END PROCESS;-------------Upper section: -------------------- P ROCESS (a, b, d, pr_state) BEGIN CASE pr_state IS WHEN st ateA => x <= a; IF (d = ''1'') THEN nx_state <= stateB; ELS E nx_state <= stateA; END IF; WHEN stateB => x <= b; IF (d = ''1'') THEN nx_state <= stateA; ELSE nx_state < = stateB; END IF; END CASE; END PROCESS;END simple_fsm; 状态 机VHDL实现举例——Mealy型输出同步输出端有同步-------------------------------------- ----------LIBRARY ieee;USE ieee.std_logic_1164.all;-------------- ---------------------------------ENTITY simple_fsm IS PORT (a, b, d, clk, rst: IN BIT; x: OUT BIT);END simple_fsm;---------- -------------------------------------ARCHITECTURE simple_fsm OF s imple_fsm IS TYPE state IS (stateA, stateB); SIGNAL pr_state, nx_ state: state; SIGNAL temp: BIT := ''0'';BEGIN----------Lower sectio n: ---------------------- PROCESS (rst, clk) BEGIN IF (rst = ''1'') THEN pr_state <= stateA; ELSIF (clk''EVENT AND clk = ''1'' ) THEN x <= temp; pr_state <= nx_state; END IF; END PROCESS ;-------------Upper section: -------------------- PROCESS (a, b, d, pr_state) BEGIN CASE pr_state IS WHEN stateA => temp <= a; IF (d = ''1'') THEN nx_state <= stateB; ELSE nx_s tate <= stateA; END IF; WHEN stateB => temp <= b; IF (d = ''1'') THEN nx_state <= stateA; ELSE nx_state <= stateB ; END IF; END CASE; END PROCESS;END simple_fsm; 使用synplify 综合后的RTL图多出一个输出寄存器状态机VHDL实现举例——Mealy型输出同步两种方式的仿真结果对比输出无同步方式实现的Meal y型状态机,其输出结果与时钟不同步。输出同步方式实现的同样的状态机,其输出结果与时钟是同步的。状态机VHDL实现举例——Mealy 型输出同步结论从形式上看,在输出端不使用同步方法时,只存储了pr_state;而使用同步方法时,同时存储了output。对于Mea ly型状态机,可以使用输出同步方式,来设计同步时序电路。对于moore型状态机,则不需要使用输出端同步的描述方式就可以得到同步输出 的效果,这也是moore型状态机的优点之一。状态机VHDL实现举例——进程结构对RTL的影响使用三种进程描述状态机分别使用单进程、 双进程、三进程结构的VHDL语言实现如以下ASM图所示的状态机。状态机VHDL实现举例——进程结构对RTL的影响单进程描述的VHD L代码LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY s_machine1 IS PORT ( clk, reset : IN STD_LOGIC; state_inputs : IN STD_LOGIC _VECTOR (0 TO 1); comb_outputs : OUT INTEGER RANGE 0 TO 15 ); END s_machine2;ARCHITECTURE behv OF s_machine1 IS TYPE FSM_ST IS (s0, s1, s2, s3); VARIABLE state: FSM_ST;BEGIN PROCESS (reset, cl k, state, state_inputs) BEGIN IF reset = ''1'' THEN state <= s0; ELSIF clk = ''1'' AND clk''EVENT THEN CASE state IS WHEN s 0 => comb_outputs <= 5; IF state_inputs = "00" THEN state <= s0; ELSE state <= s1; END IF ; 状态机VHDL实现举例——进程结构对RTL的影响 WHEN s1 => comb_outputs <= 8 ; IF state_inputs = "00" THEN state <= s1; EL SE state <= s2; END IF; WHEN s2 => comb_outp uts <= 12; IF state_inputs = "11" THEN state <= s3 ; ELSE state <= s0; END IF; WHEN s3 => comb_outputs <= 14; IF state_inputs = "11" THEN st ate <= s3; ELSE state <= s0; END IF; END CAS E; END IF; END PROCESS;END behv; --(完)状态机VHDL实现举例——进程结构对RTL 的影响单进程描述RTL图单进程描述状态机内部结构状态机VHDL实现举例——进程结构对RTL的影响双进程描述的VHDL代码LIBRA RY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY s_machine IS PORT ( cl k, reset : IN STD_LOGIC; state_inputs : IN STD_LOGIC_VECTOR ( 0 TO 1); comb_outputs : OUT INTEGER RANGE 0 TO 15 );END s_mac hine;ARCHITECTURE behv OF s_machine IS TYPE FSM_ST IS (s0, s1, s2 , s3); SIGNAL current_state, next_state : FSM_ST;BEGIN REG: PROCE SS (reset, clk) BEGIN IF reset = ''1'' THEN current_state <= s0 ; ELSIF clk = ''1'' AND clk''EVENT THEN current_state <= next _state; END IF; END PROCESS; COM: PROCESS (current_state, sta te_inputs) BEGIN CASE current_state IS WHEN s0 => comb_outputs <= 5; IF state_inputs = "00" THEN next_ state <= s0; ELSE 状态机VHDL实现举例——进程结构对RTL的影响 next_state < = s1; END IF; WHEN s1 => comb_outputs <= 8; IF s tate_inputs = "00" THEN next_state <= s1; ELSE next_state <= s2; END IF; WHEN s2 => comb_outputs <= 1 2; IF state_inputs = "11" THEN next_state <= s3; EL SE next_state <= s0; END IF; WHEN s3 => comb_o utputs <= 14; IF state_inputs = "11" THEN next_state <= s3; ELSE next_state <= s0; END IF; END CA SE; END PROCESS;END behv;状态机VHDL实现举例——进程结构对RTL的影响双进程描述产生的RTL图双进程描 述状态机内部结构状态机VHDL实现举例——进程结构对RTL的影响三进程描述的VHDL代码LIBRARY IEEE;USE IEEE .STD_LOGIC_1164.ALL;ENTITY s_machine2 IS PORT ( clk, reset : IN S TD_LOGIC; state_inputs : IN STD_LOGIC_VECTOR (0 TO 1); comb_outpu ts : OUT INTEGER RANGE 0 TO 15 );END s_machine2;ARCHITECTURE behv OF s_machine2 IS TYPE FSM_ST IS (s0, s1, s2, s3); SIGNAL current _state, next_state: FSM_ST;BEGIN REG: PROCESS (reset, clk) BEGIN IF reset = ''1'' THEN current_state <= s0; ELSI F clk = ''1'' AND clk''EVENT THEN current_state <= next_state; END IF; END PROCESS; COM_STATE: PROCESS(current_state, state_inp uts) BEGIN CASE current_state IS WHEN s0 => IF s tate_inputs = "00" THEN next_state <= s0; ELSE next_state <= s1; END IF; WHEN s1 => IF state_inpu ts = "01" THEN next_state <= s1;状态机VHDL实现举例——进程结构对RTL的影响 ELSE next_state <= s2; END IF; WHEN s2 => I F state_inputs = "10" THEN next_state <= s3; ELSE next_state <= s0; END IF; WHEN s3 => IF state_ inputs = "11" THEN next_state <= s3; ELSE next_ state <= s0; END IF; END CASE; END PROCESS; COM_OU T: PROCESS (current_state) BEGIN CASE current_state IS WHE N s0 => comb_outputs <= 5; WHEN s1 => comb_outputs <= 8; WHEN s2 => comb_outputs <= 12; WHEN s3 => c omb_outputs <= 14; END CASE; END PROCESS;END behv;状态机VH DL实现举例——进程结构对RTL的影响三进程描述产生的RTL图三进程描述状态机内部结构状态机VHDL实现举例——进程结构对RTL的 影响从以上一个很简单的状态机设计的对比上,可以看出,采用单进程方式描述的状态机其RTL电路相对于另外两种描述方式多产生了一个寄存器 。对于简单的设计,采用双进程和三进程综合结果没有差别。建议描述状态机时使用双进程或者三进程的方式。状态机VHDL实现举例——状态编 码对RTL的影响通过以下Moore型状态机来说明状态编码对RTL的影响例:设计一个串行数据流检测器。要求:输入连续的二进制数,当检 测到连续“1”的个数大于3个的时候,输出“1”;其他状态输出“0”。分析:确定所需的状态数,取决于数据流中出现连续“1”的个数,应 该为4个状态。状态机VHDL实现举例——状态编码对RTL的影响画出ASM图如下状态机VHDL实现举例——状态编码对RTL的影响根据 状态转移图,写出VHDL代码----------------------------------------LIBRARY iee e;USE ieee.std_logic_1164.all;----------------------------------- -----ENTITY string_detector IS PORT (d, clk, rst: IN BIT; q : OUT BIT);END string_detector;---------------------------------- -----ARCHITECTURE my_arch OF string_detector IS TYPE state IS (ze ro, one ,two, three); SIGNAL pr_state, nx_state: state;BEGIN ---- -------Lower section;----------- PROCESS (rst, clk) BEGIN IF (rst = ''1'') THEN pr_state <= zero; ELSIF (clk''EVENT AND clk = ''1'') THEN pr_state <= nx_state; END IF; END PROCESS; -----------Upper section:------------ PROCESS (d, pr_state) BEGIN CASE pr_state IS WHEN zero => q <= ''0'';状态机VHDL实现举例——状态编码对RTL的影响 IF (d = ''1'') THEN nx_state <= one; ELSE nx_state <= zero; END IF; WHEN one => q <= ''0''; IF (d = ''1'') THEN nx_state <= two; ELSE nx_state <= zero; END IF; WHEN two => q <= ''0''; IF (d = ''1'') THEN nx_state <= three; ELSE nx_state <= zero; END IF; WHEN three => q <= ''1''; IF (d = ''1'') THEN nx_state <= three; ELSE nx_state <= zero; END IF; END CASE;END PROCESS;END my_arch; 状态机VHDL实现举例——状态编码对RTL的影响使用synplify综合之后,可以看出默认的编码方式是one-hot编码。综合后是one-hot编码方式状态机VHDL实现举例——状态编码对RTL的影响如果将在原来的程序的基础上通过attribute语句指定编码方式,即将结构体的声明部分添加如下代码,可将编码方式改为二进制编码: ATTRIBUTE enum_encoding: string; ATTRIBUTE enum_encoding OF state : TYPE IS "00 01 10 11"; 综合后是binary码编码方式状态机VHDL实现举例——状态编码对RTL的影响除了以上两种方式外,还可以通过软件进行设置编码方式;如果将“FSM Explorer”选项勾选,那么即使是在程序中指定了编码方式,其综合后的状态编码也是one-hot编码;因此,在状态机设计的时候,大家要注意软件的使用细节,应当有意识的通过软件进行性能优化。没有勾选“FSM Explorer” |
|