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. [转]position:relative leaves an empty space

    本文转自:http://stackoverflow.com/questions/5229081/positionrelative-leaves-an-empty-space 在使用relative进行 ...

  2. mount: unknown filesystem type 'LVM2_member'解决方案

    系统启动到request_module: runaway loop modprobe binfmt-464c挂起 利用U盘系统,挂载硬盘出现:mount: unknown filesystem typ ...

  3. Understand

    快捷键: Ctrl+Shift+H 折叠 Ctrl+Alt+F 替换

  4. asp.net Calendar 日历控件用法

    asp.net Calendar 是微软自带的一款日历控件,除了简单显示日期时间外, 还可以绑定一些需要的事件. Calendar_DayRender 事件,是在加载都去时间日期时候的方法,用此方法可 ...

  5. Bootstrap 基本用法

    使用bootstrap框架的步骤: 1.引用bootstrap的css框架,这样可以通过bootstrap来布局: <link rel="stylesheet" href=& ...

  6. part 4 AngularJS ng src directive

  7. Part 3 talking about constraint in sql

    What is Foreign key and how to create a Foreign key constraint? Note:Foreign Keys are used to enforc ...

  8. MVC小例子

    [约定胜于配置] 1. 右键Mode数据层添加新建项,用linq连接数据库 (不要在控制层上直接操控linq,要在数据层新建一个类,来对数据库进行操作) 2. 右键Mode数据层添加类,来完成对数据库 ...

  9. Swift学习链接

    http://wiki.jikexueyuan.com/project/swift/chapter1/02_a_swift_tour.html

  10. 2015-0306—DataLList

    DataList具有repeater的所有功能,不同的是DataList自动将模板绘制成为一个表格,每一行数据都绘制成<tr>. 一.SQL的准备工作: 按照以下代码创建: create ...