0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

状态机常见的3种类型 状态机案例设计

西西 来源:博客园 作者:中国的孩子 2020-08-08 10:57 次阅读

1、状态机设计

Mealy 机方框图

状态寄存器输出当前的信号,用来控制下一个状态是什么,和当前状态下的输出是什么。

Moore机方框图

2、状态机---3种类型

二元的:(CPLD与阵列扇入比较多,寄存器比较少)

S1 = 001, S2 = 010, S3 = 011, S3 = 100,etc。。。

枚举的:

S1 = 100, S2 = 110, S3 = 101, S4 = 111,etc。。。

One Hot:每1 个状态机只有1个寄存器(FPGA触发器比较多)

S1 = 00000001, S2 =00000010,S3 = 00000100,etc。。。

3、对生剩余状态的处理

1、在CASE 语句中增加语句,对每个非法状态明确地给出状态轮换的指示;

2、用OTHERS语句来对未提及的状态做统一处理。

Moore 型状态机设计

摩尔型的有限状态机的输出只与当前状态有关,而与输入信号的当前值无关,且仅丰时钟信号边沿到来时才发生变化。

要实现这种结构,必须使用暂存信号(如 temp)来存储电路的输出值,当今信号在时钟边沿出现时才能够更新输出。

例:

library ieee;

use ieee.std_logic_1164.all;

entity s_machine2 is

port(

clk, reset : in std_logic;

x : in std_logic;

z : out std_logic

);

architecture behav of s_machine2 is

type m_state is(s0, s1, s2);

signal present_state, next_state : m_state;

signal temp : std_logic;

begin

-----------------------时序进程---------------------------

reg : process(reset, clk)

begin

if reset = ‘1’ then present_state 《= s0;

elsif clk = ‘1’ and clk‘event then

z 《=temp; --只有在时钟的上升沿时,输出才会发生变化。是同步输出。

prsent_state 《=nxet_state;

end if;

end process;

-------------------------组合进程-----------------------------

com : process(present_state, x)

begin

case prsent_state is

when s0 =》

if x = ’0‘ then next_state 《= s0;

else next_state 《= s1;

end if;

temp 《= ’0‘;

when s1 =》

if x = ’0‘ then next_state 《= s0;

else next_state 《= s2;

end if;

temp 《= ’0‘;

when s2 =》

if x = ’0‘; then next_state 《= s0; temp 《= ’1‘;

else next_state 《= s2; temp 《= ’0‘;

end if

end case;

end process;

end behv;

Mearly 型的有限状态机设计

米立状态机的输出信号是当前状态和输出信号的函数,它的输出在输入变化后立即发生变化,

不依赖时钟信号的同步。是异步输出。

例:

library ieee;

use ieee.std_logic_1164.all;

entity s_machine1 is

port(

clk, reset : in std_logic;

x : in std_logic;

z : out std_logic

);

end s_machine1;

architecture behav of s_machine2 is

type m_state is(s0, s1, s2);

signal present_state, next_state : m_state;

begin

-----------------------时序进程---------------------------

reg : process(reset, clk)

begin

if reset = ’1‘ then present_state 《= s0;

elsif clk = ’1‘ and clk’event then

prsent_state 《=nxet_state;

end if;

end process;

-------------------------组合进程-----------------------------

com : process(present_state, x)

begin

case prsent_state is

when s0 =》

if x = ‘0’ then next_state 《= s0;

else next_state 《= s1;

end if;

z 《= ‘0’;

when s1 =》

if x = ‘0’ then next_state 《= s0;

else next_state 《= s2;

end if;

z 《= ‘0’;

when s2 =》

if x = ‘0’; then next_state 《= s0; z 《= ‘1’;

else next_state 《= s2; z《= ‘0’;

end if

end case;

end process;

end behv;

可以看到在该程序中,只要输入有变化,输出z就会有变化,它并不依赖于时钟的上升沿。

怎样确保一个进程是组合进程:

1、不出现带沿的语句,即组合进程中决不能出现用时钟沿控制的敏感信号;

2、在组合电路的进程中,给出输出端口的缺省值,这样可以防止锁存器的生成;

3、在敏感清单中包含所有的输入量,防止锁存器的生成。

敏感清单不全的话综合时可能出现敬告。

例:下例敏感清单中输入端口不全,可能出现锁存器

p0 : process (a)

begin

q 《= a and b;

end process p0;

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

下面是一个实例,洗衣机的工作过程:

TYPE state_type IS(idle, fill, heat_w, wash, drain);

entity wm is

port(

clk, reset, door_closed, full : in std_logic;

heat_demand, done, empty : in std_logic;

water, spin, heat, pump : out std_logic

);

end wm;

architecture behave of wm is

------------------------说明部分--------------------------

--说明部分用枚举数据类型来字义状态机中的状态;并把状态变量(如现态和次态)定义为信号。

type state_type is (

idle, fill, heat_w, wash, drain);

signal state : state_type;

begin

process (clk, reset)

begin

if reset = ‘1’ then

state 《= idle;

elsif clk‘event and clk= ’1‘ then

case state is

when idle =》

if door_closed = ’1‘ then

state 《= fill;

else

state 《= idle;

end if

when fill =》

if full =’1‘; then

state 《= neat_w;

else

state 《= fill;

when others =》

state 《= idle;

end case

end if;

end process;

----------------------------------------------

利用两个进程(纯组合逻辑措施一)

--------------时序进程----------------------------

--时序进程是指在时钟驱动下负责状态转换的进程,只表示次态和现态的关系

process(clk, reset)

begin

if reset =’1‘ then

state 《= idle;

elsif clk’event and clk = ‘1’ then

state 《= next_state;

end if;

end process;

------------------组合进程---------------------

组合进程的任务是根据输入信号和现态对输出端口赋值以及确定状态机的下一个状态,由于没有任何信号

的赋值是通过其他某个信号的跳变来触发的,所以不会产生寄存器。一般用CASE 或IF语句来实现

process(state, door_closed, full,

heat_demand, done, empty)

begin

case state is

when idle =》

if door_closed =‘1’ then

next_state 《= fill;

else

next_state 《= idle;

end if;

when fill =》

if full = ‘1’ then

next_state 《= heat_w;

else

next_state 《= fill;

end case;

end if;

end process;

process(state)

begin

water_i 《= ‘0’;

spin_i 《= ‘0’;

heat_i 《= ‘0’;

pump_i 《= ‘0’;

case state is

when idle =》

when fill =》

water_i 《= ‘1’;

when heat_w =》

spin_i 《=‘1’;

heat_i 《= ‘1’;

when wash =》

spin_i 《= ‘1’;

when drain =》

spin_i 《= ‘1’;

pump_i 《= ‘i’;

end case;

end process;

--------------寄存输出---------------------

process (clk)

begin

if rising_edge(clk) then

water 《= water_i;

spin 《= spin_i;

heat 《= heat_i;

pump 《= pump_i;

end if;

end process

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5336

    浏览量

    120230
  • 状态机
    +关注

    关注

    2

    文章

    492

    浏览量

    27529
收藏 人收藏

    评论

    相关推荐

    Verilog状态机+设计实例

    在verilog中状态机的一很常用的逻辑结构,学习和理解状态机的运行规律能够帮助我们更好地书写代码,同时作为一思想方法,在别的代码设计中也会有所帮助。 一、简介 在使用过程中我们常
    的头像 发表于 02-12 19:07 4050次阅读
    Verilog<b class='flag-5'>状态机</b>+设计实例

    玩转Spring状态机

    说起Spring状态机,大家很容易联想到这个状态机和设计模式中状态模式的区别是啥呢?没错,Spring状态机就是状态模式的一
    的头像 发表于 06-25 14:21 931次阅读
    玩转Spring<b class='flag-5'>状态机</b>

    有限状态机有什么类型

    在实际的应用中,根据有限状态机是否使用输入信号,设计人员经常将其分为Moore型有限状态机和Mealy型有限状态机种类型
    发表于 04-06 09:00

    状态机是什么?什么是消息触发类型状态机

    状态机可归纳为哪几个要素?状态机可分为哪几种?什么是消息触发类型状态机
    发表于 04-19 06:02

    如何写好状态机

    如何写好状态机:状态机是逻辑设计的重要内容,状态机的设计水平直接反应工程师的逻辑功底,所以许多公司的硬件和逻辑工程师面试中,状态机设计几乎是必选题目。本章在引入
    发表于 06-14 19:24 97次下载

    状态机举例

    状态机举例 你可以指定状态寄存器和状态机状态。以下是一个有四状态的普通
    发表于 03-28 15:18 982次阅读

    状态机代码生成工具

    状态机代码生成工具状态机代码生成工具状态机代码生成工具状态机代码生成工具
    发表于 11-19 15:12 9次下载

    状态机原理及用法

    状态机原理及用法状态机原理及用法状态机原理及用法
    发表于 03-15 15:25 0次下载

    状态机概述 如何理解状态机

    本篇文章包括状态机的基本概述以及通过简单的实例理解状态机
    的头像 发表于 01-02 18:03 1w次阅读
    <b class='flag-5'>状态机</b>概述  如何理解<b class='flag-5'>状态机</b>

    什么是状态机 状态机的描述三方法

    状态机 1、状态机是许多数字系统的核心部件,是一类重要的时序逻辑电路。通常包括三个部分:一是下一个状态的逻辑电路,二是存储状态机当前状态的时
    的头像 发表于 11-16 17:39 2.7w次阅读

    FPGA:状态机简述

    是FPGA设计中一非常重要、非常根基的设计思想,堪称FPGA的灵魂,贯穿FPGA设计的始终。 02. 状态机简介 什么是状态机状态机通过不同的
    的头像 发表于 11-05 17:58 7372次阅读
    FPGA:<b class='flag-5'>状态机</b>简述

    什么是状态机状态机5要素

    玩单片还可以,各个外设也都会驱动,但是如果让你完整的写一套代码时,却无逻辑与框架可言。这说明编程还处于比较低的水平,你需要学会一好的编程框架或者一编程思想!比如模块化编程、状态机
    的头像 发表于 07-27 11:23 2w次阅读
    什么是<b class='flag-5'>状态机</b>?<b class='flag-5'>状态机</b>5要素

    状态模式(状态机)

    share,作者:亚索老哥)),原来状态机还可以这么简单地玩~~亚索老哥提出的状态机六步法(1)、定义状态接口(2)、定义系统当前状态指针(3
    发表于 12-16 16:53 9次下载
    <b class='flag-5'>状态</b>模式(<b class='flag-5'>状态机</b>)

    Verilog状态机类型

    有限状态机(Finite-State Machine,FSM),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
    的头像 发表于 06-01 15:23 1839次阅读
    Verilog<b class='flag-5'>状态机</b>的<b class='flag-5'>类型</b>

    什么是状态机状态机种类与实现

    状态机,又称有限状态机(Finite State Machine,FSM)或米利状态机(Mealy Machine),是一描述系统状态变化
    的头像 发表于 10-19 10:27 9450次阅读