1、状态机的作用?是什么?

  状态机,顾名思义就是用来描述状态的。完善一点就是在同一的时钟下。更准确说是一种verilogHDL编程思想。

  例如我们每一个系统都可以分为好几种状态,如:开始,初始化,运行,状态1,状态2,状态3,状态4,结束。

2、状态机结构

  1)输出  <=  输入有关+当前状态

  2)输出  <=  当前状态

  3)流水线寄存器 <= 输出  <=  输出+当前状态

3、状态机verilog程序

  一个系统或者一个物体的行为或者一个器件的状态,我们都可以分成好几种状态,那么就可以画出如下图的状态图,当然不可能所有的状态都是这样,但是大穹小异。这里的输出是用k1,k2来表示的,也就是代表当这种状态的时候,我们系统会实行什么行为。

  

  1)一般形式的状态机程序(使用Gray编码)

  module fsm(clk,rst,a,k1,k2,state);

  input clk,rst,a;

  output k1,k2;

  output[1:0] state;

  reg k1,k2;

  reg[1:0] state;

  parameter  idle=2'b00,//空闲的

         start=2'b01,

         stop=2'b10,

         clear=2'b11;

  always@(posedge clk)

     if(!rst)

      begin

        state<=idle;

        k2<=0;

        k1<=0;

       end

    case(state)

      idle:

        if(a) begin state<=start;k1<=0;end

        else begin state<=idle;k2=0;k1=0;end

      start:

        if(!a) state<=stop;

        else state<=stop;

      stop:

        if(a) begin state<=clear; k2<=1;end

        else begin stste<=stop;k2<=0;k1<=0;end

      clear:

        if(!a) begin state<=idle;k2<=0;k1<=1;end

        else  begin state<=clear;k2<=0;k1<=1;end

      default:

        state<=2'bxx;

    endcase

  endmodule

  2)用独热码表示的状态机

  parameter  idle=4'b0000,

         start=4'b0100,

         stop=4'b0010,

         clear=4'b0001;

  这叫独热码,你懂的。

  3)输出<= 状态值 (把状态值直接作为输出) 适用于高速状态机,因为节省时间,节省器件,延迟时间小

  state<=start;  ………………  state<=stoptoclear;  ……………………  state=idle; 

  4)适用于大型复杂设计的多输入状态机,使用always

  //每一个时钟产生一个状态的改变

  always@(posedge clk)

    if(!rst)

      state<=idle;

    else

      state<=nextstate;

  //产生下一状态的组合逻辑

  always@(state or a)

    case(state)

      idle:

        if(a) nextstate=start;

        else nextstate=idle;

      start:

        if(!a) nextstate=stop;

        else nextstate=start;

      stop:

        if(a) nextstate=clear;

        else nextstate=stop;

      clear:

        if(!a) nextstate=idle;

        else nextstate=clear;

      default:

        nextstate=2'bxx;

    endcase

  //产生输出k1的组合逻辑

  always@(state or rest or a)

    if(!rst)

      k1=0;

    else

      if(state==clear&&!a)

        k1=1;  

      else

        k1=0;

  //产生k2的组合逻辑

  always@(state or rst or a)

    if(!srt)

      k2=0;

    else

      if(state==stop&&a)

        k2=1;

      else

        k2=0;

4、总结    

  不同类型的状态机有不同的优势。

二、有限状态机(FSM)的更多相关文章

  1. cocos2d-x 游戏开发之有限状态机(FSM) (二)

    cocos2d-x 游戏开发之有限状态机(FSM)  (二) 1 状态模式

  2. 有限状态机FSM(自动售报机Verilog实现)

    有限状态机FSM(自动售报机Verilog实现) FSM 状态机就是一种能够描述具有逻辑顺序和时序顺序事件的方法. 状态机有两大类:Mealy型和Moore型. Moore型状态机的输出只与当前状态有 ...

  3. Atitit. 有限状态机 fsm 状态模式

    Atitit. 有限状态机 fsm 状态模式 1. 有限状态机 1 2. "状态表"和"状态轮换表" 1 3. 有限状态机概念(状态(State)事件(Even ...

  4. cocos2d-x 游戏开发之有限状态机(FSM) (四)

    cocos2d-x 游戏开发之有限状态机(FSM) (四) 虽然我们了解了FSM,并且可以写自己的FSM,但是有更好的工具帮我们完成这个繁琐的工作.SMC(http://smc.sourceforge ...

  5. cocos2d-x 游戏开发之有限状态机(FSM) (三)

    cocos2d-x 游戏开发之有限状态机(FSM) (三) 有限状态机简称FSM,现在我们创建一个专门的FSM类,负责管理对象(Monkey)的状态.然后Monkey类就实现了行为与状态分离.Monk ...

  6. cocos2d-x 游戏开发之有限状态机(FSM) (一)

    cocos2d-x 游戏开发之有限状态机(FSM) (一) 参考:http://blog.csdn.net/mgphuang/article/details/5845252<Cocos2d-x游 ...

  7. 有限状态机FSM

    有限状态机(Finite-state machine)又称有限状态自动机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型.常用与:正则表达式引擎,编译器的词法和语法分析,游戏设计,网络 ...

  8. [原创][FPGA]有限状态机FSM学习笔记(一)

    1. 概述--何为有限状态机FSM? 有限状态机-Finite State Machine,简写为FSM,是表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用.通常 ...

  9. [转载][FPGA]有限状态机FSM学习笔记(二)

    1. Mealy和Moore状态机的互换 对于给定的时序逻辑功能,可以用Mealy机实现,也可以用Moore机实现.根据Moore机比Mealy机输出落后一个周期的特性,可以实现两种状态机之间的转换. ...

  10. Linux编程之有限状态机FSM的理解与实现

    有限状态机(finite state machine)简称FSM,表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用.FSM是一种逻辑单元内部的一种高效编程方法,在 ...

随机推荐

  1. QTREE2 spoj 913. Query on a tree II 经典的倍增思想

    QTREE2 经典的倍增思想 题目: 给出一棵树,求: 1.两点之间距离. 2.从节点x到节点y最短路径上第k个节点的编号. 分析: 第一问的话,随便以一个节点为根,求得其他节点到根的距离,然后对于每 ...

  2. JS测试浏览器类型的代码

    function getOs(url,title) { var OsObject = ""; if(navigator.userAgent.indexOf("MSIE&q ...

  3. ASP.NET MVC 4 SimpleMembership Provider (1)

    新的ASP.NET MVC 4.0 提供了一个新的Membership Provider,叫SimpleMembership. 首先,我们建立一个新的solution 首先我们先看一下web.conf ...

  4. c#抽象类相关

    abstract class mylass { public int age{get;set} public abstract void SaiHi(); } 1,抽象类中可以有实例成员,也可以有抽象 ...

  5. 如何加密android apk

    经过了忙碌的一周终于有时间静下来写点东西了,我们继续介绍android apk防止反编译技术的另一种方法.前两篇我们讲了加壳技术(http://my.oschina.net/u/2323218/blo ...

  6. INSERT IGNORE 与 INSERT INTO的区别

    例 insert ignore表示,如果中已经存在相同的记录,则忽略当前新数据: insert ignore into table(name)  select  name from table2 例 ...

  7. 复习IOS多线程知识

    线程的注意点 1.不要同时开太多的线程(1~3条线程即可,不要超过5条) 2.线程概念 * 主线程 : UI线程,显示.刷新UI界面,处理UI控件的事件 * 子线程 : 后台线程,异步线程 3.不要把 ...

  8. 20150313--AJAX

    from,提交信息,抛弃当前页面,并刷新页面. AJAX,从当前页面获取信息,并提交.反馈信息,不会抛弃页面. 例: 用户注册时,验证用户名是否已存在, 创建两个标准控件:TextBox1,Label ...

  9. 9款让你眼前一亮的HTML5/CSS3示例及源码

    1.HTML5 3D点阵列波浪翻滚动画 今天我们要再分享一款基于HTML5 3D的点阵列波浪翻滚动画特效,同样是非常的壮观. 在线演示 源码下载 2.HTML5小球弹跳动画 很不错的3D小球 今天我要 ...

  10. JS函数式编程【译】2.3 函数式程序员的工具集