第6章 VHDL状态机

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

PROCESS (clk,reset) BEGIN IF reset = '1' THEN state <= s0; ELSIF (clk'EVENT AND clk = '1') THEN CASE state IS WHEN s0=> state <= s1; output <= '0'; WHEN s1=> IF input = '1' THEN state <= s0; ELSE state <= s1; END IF; output <= '1' ; END CASE; END IF; END PROCESS; END a;
图6.2 自动售货机状态转换图
6.4 状态机的VHDL设计
1、状态机的VHDL设计步骤
用VHDL设计状态机的步骤是:①分析控制器 设计指标,建立系统算法模型图,即状态转移图; ②分析被控对象的时序状态,确定控制器状态机的 各个状态及输入、输出条件;③应用VHDL语言完 成状态机的描述。
2、状态机的基本结构 状态机一般由三个模块构成:状态寄存器、 次态逻辑和输出逻辑。
4、状态机的VHDL设计相关语句
4.1 状态机的状态定义语句
一般在使用状态机之前应该定义状态的枚举类型, 定义可以在状态机描述的源文件中,也可以在专门的程 序包中。 TYPE m_state IS (st0,st1,st2,st3,st4,st5); 以上定义是将表征状态机的每一状态用文字符号来 表示的,即符号化的状态机,也可以直接在程序或开发 软件中指明状态机的编码方式:
(2)描述次态逻辑的进程:
process(current_state,其他输入信号) begin next_state<=current_state; case current_state is when state1=> … next_state<=某个状态; … when state2=> … end case; end process;
图6.1 自动售货机控制系统组成
首先设定逻辑变量:设投币信号A、B为输入逻辑变 量,投入一枚一元硬币时用A=1表示,未投入时A=变量,分别用Z和Y表示,给出矿泉水时 Z=1,不给时Z=0,找回一枚五角硬币时Y=1,不找时Y=0。 根据上面的功能描述,可用三个状态S0,S1,S2表 示,未投币前的初始状态为S0,投入五角硬币以后为 S1,投入一元硬币后(包括投入一枚一元硬币和投入两 枚五角硬币的情况)为S2,再投入一枚五角硬币后电路 返回S0,同时输出为Z=1,Y=0;如果投入的是一枚一元 硬币,则电路也应能返回S0,同时输出为Z=1,Y=1。
WHEN ST2 => g1 <= '1'; r2 <= '1'; nxstate <= ST3; WHEN ST3 => y1 <= '1'; r2 <= '1'; nxstate <= ST4; WHEN ST4 => r1 <= '1'; g2 <= '1'; IF (s1 = '0' AND s2 = '0') THEN nxstate <= ST5; ELSIF (s1 = '1' AND s2 = '0') THEN nxstate <= ST6; ELSE nxstate <= ST4; END IF; WHEN ST5 => r1 <= '1'; g2 <= '1'; nxstate <= ST6;
三种fsm描述方法比较比较项目一段式描述方法两段式描述方法三段式描述方法推荐等级不推荐推荐最优推荐代码简洁程度相对复杂的fsm而言冗长最简洁简洁进程个数123是否利于时序约束不利于利于利于是否有组合逻辑输出可以无组合逻辑输出多数情况有组合逻辑输出无组合逻辑输出是否利于综合与布局布线不利于利于利于代码的可靠性与可维护度低高最好代码风格的规范性低任意度较大格式化规范格式化规范一般在使用状态机之前应该定义状态的枚举类型定义可以在状态机描述的源文件中也可以在专门的程序包中
PROCESS (state, s1, s2) BEGIN r1 <= '0'; y1 <= '0'; g1 <= '0'; r2 <= '0'; y2 <= '0'; g2 <= '0'; CASE state IS WHEN ST0 => g1 <= '1'; r2 <= '1'; IF s2 = s1 THEN nxstate <= ST1; ELSIF (s1 = '0' AND s2 = '1') THEN nxstate <= ST2; ELSE nxstate <= ST0; END IF; WHEN ST1 => g1 <= '1'; r2 <= '1'; nxstate <= ST2;
Mealy
,
图6.3 一般状态机结构框图
3、状态机的VHDL设计方法 在使用VHDL描述状态机时,通常从状态 机的三个基本模块入手,可以分为一段式、二 段式和三段式FSM描述方法,有的地方也称为 单进程、两进程和三进程FSM描述方法。
单进程(一段式)FSM描述方法是将整个状态机的三个模 块合并起来,写到1个进程里面,在该进程中即描述状态转 移,又描述状态的输入和输出; 两进程(二段式)FSM描述方法是用2个进程来描述状态 机,其中当前状态寄存器用一个同步时序进程来描述,输出逻 辑和次态逻辑合并起来,用另一个组合逻辑进程来描述; 三进程(三段式)FSM描述方法是将状态机的三个模块分 别用三个进程来描述,一个同步时序进程描述状态寄存器,一 个组合逻辑进程描述次态逻辑,最后输出逻辑单独用一个进程 来描述。 一般而言,推荐的FSM描述方法是后两种,即两段式和三 段式FSM描述方法。
(2)二段式状态机:
--Moore型状态机的二段式描述: LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY statmach IS PORT (clock, s1, s2, reset : IN std_logic; r1, y1, g1, r2, y2, g2 : OUT std_logic); END ; ARCHITECTURE eXemplar OF statmach IS TYPE state_t IS ( ST0, ST1, ST2, ST3, ST4, ST5, ST6, ST7 ); SIGNAL state, nxstate : state_t; BEGIN PROCESS (reset, clock) BEGIN IF (reset='1') THEN state <= ST0 ; ELSIF clock'event and clock='1' THEN state <= nxstate ; END IF ; END PROCESS;
HDL可编程逻辑器件 第6章 VHDL状态机
什么是状态机? 状态机是一种具有指定数目的状态的概 念机,它在某个指定的时刻仅处于一个状 态,状态的改变是对输入事件的响应。状态 机的基本要素有三个:状态、输入条件和输 出。
6.1 状态机的优势
1.状态机克服了纯硬件数字系统顺序方式控制不灵活的 缺点; 2.状态机的结构相对简单,设计方案相对固定; 3、状态机容易构成性能良好的同步时序逻辑模块; 4、与VHDL的其他描述方式相比,状态机的VHDL表述丰富 多样、程序层次分明,结构清晰,易读易懂;在排错、 修改和模块移植方面也有其独到的好处; 5、在高速运算和控制方面,状态机更有其巨大的优势。 6、高可靠性。
三种FSM描述方法比较
比较项目 推荐等级 代码简洁程度 (相对复杂的FSM而言) 进程个数 是否利于时序约束 是否有组合逻辑输出 是否利于综合与布局布线 代码的可靠性与可维护度 代码风格的规范性 一段式描述方法 不推荐 冗长 1 不利于 可以无组合逻辑输出 不利于 低 低,任意度较大 两段式描述方法 推荐 最简洁 2 利于 多数情况有组合逻辑输出 利于 高 格式化,规范 三段式描述方法 最优推荐 简洁 3 利于 无组合逻辑输出 利于 最好 格式化,规范
6.3 状态机的基本描述方式
状态机的基本描述方式有三种:状态转移图,状态转移 表,HDL语言描述。 状态转移图是状态机描述的最自然的方式。状态转移图经 常在设计规划阶段定义逻辑功能时使用,通过图形化的方式非 常有助于理解设计意图。 状态转移表是用列表的方式描述状态机,是数字逻辑电路 常用的设计方法之一,经常被用于对状态化简,对于可编程逻 辑设计,由于可用逻辑资源比较丰富,而且状态编码要考虑设 计的稳定性,安全性等因素,所以并不经常使用状态转移表优 化状态。 HDL语言描述状态机具有设计程序层次分明,结构清晰, 易读易懂的优点,在排错、修改和模块移植方面,初学者特别 容易掌握。通过一些规范的描述方法,可以使HDL语言描述的 状态机更安全、稳定、高效、易于维护。
状态机实例: 自动售货机在公共场所随处可见,它是一种根 据投入的钱币自动付货的机器。作为商业自动化的 常用设备,它不受时间、地点的限制,能节省人力、 方便交易。常见的自动售货机一般有两个投币口: 一元投币口和五角投币口。假设每次只能投入一枚 一元或五角的硬币,投入一元五角硬币后机器自动 给出一瓶矿泉水,投入两元硬币后,在给出一瓶矿 泉水的同时找回一枚五角的硬币。整个机器的工作 是由数字电路构成的控制系统来控制完成的。
library ieee; use ieee.std_logic_1164.all; entity stmch1 is port(clk, in1, rst: in std_logic; out1: out std_logic); end stmch1; architecture behave of stmch1 is type state_values is (sx, s0, s1); signal state, next_state: state_values; begin
WHEN ST6 => r1 <= '1'; g2 <= '1'; nxstate <= ST7; WHEN ST7 => r1 <= '1'; y2 <= '1'; nxstate <= ST0; END CASE; END PROCESS; END eXemplar;
--Mealy型状态机的二段式描述:
(3)描述输出逻辑的进程:
process(current_state,其他输入信号) begin output<=缺省值 case current_state is when state1=> output<=xxx; … end case; end process;
4.4 VHDL状态机实例 (1)一段式状态机: Library IEEE ; use IEEE.std_logic_1164.all ; ENTITY statmach IS PORT( clk : IN BIT; input : IN BIT; reset : IN BIT; output: OUT BIT); END statmach; ARCHITECTURE a OF statmach IS TYPE STATE_TYPE IS (s0, s1); SIGNAL state: STATE_TYPE; BEGIN
4.2 状态变量定义语句
我们还需要定义状态机的两个特殊的状态变量:当 前状态和下一状态(现态和次态): signal current_state:m_state; signal next_state:m_state;
4.3 状态机的三个模块进程描述语句 (1)描述状态寄存器的进程: process(reset,clk) begin if reset=‘1’ then current_state<=初始状态; elsif clk’event and clk=‘1’ then current_state<=next_state; end if; end process;
6.2 状态机类型
根据状态机的状态数是否为有限个,可将状态机分为有限状态机 (Finite State Machine,FSM)和无限状态机(Infinite State Machine,ISM)。逻辑设计中一般所涉及的状态都是有限的,所以 以后我们所说的状态机都指有限状态机,用FSM表示。 从状态机的信号输出方式上分,有Moore型和Mealy型两类状态机。 从输出时序上看, Moore型属于同步输出状态机,其输出仅为当前状态 的函数,这类状态机在输入发生变化时必须等待时钟的到来,时钟使状 态发生变化时才导致输出的变化。 Mealy型属于异步输出状态机,其输 出是当前状态和所有输入信号的函数,它的输出是在输入变化后立即发 生的,不依赖时钟的同步。
相关文档
最新文档