• 二、有限状态机(FSM)


    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、总结    

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

  • 相关阅读:
    关于sifari兼容性的一个问题
    HTML标签的应用(新手)
    HTML标签的应用(新手)
    未完成的开锁动画演示
    HTML标签的应用(新手)
    HTML新手向
    C++
    STL之set
    C++输入输出
    提升一下逼格
  • 原文地址:https://www.cnblogs.com/qidaiymm/p/4902530.html
Copyright © 2020-2023  润新知