有限状态机--优化版

1、在前面《有限状态机--更正版》的建模模块中,我采取了左图方法建模,得出下图一正确结果

module fsm5(clock,reset,coin,news_out);

  input clock,reset;
  input [1:0]coin;
  output news_out;
  
  reg [1:0]pres_state;
  reg rnews_out;
  
  
  parameter s0=2'd0;
  parameter s1=2'd1;
  parameter s2=2'd2;
  parameter s3=2'd3;
  
  
  
  always @(posedge clock)
  begin
    if(!reset)
      pres_state<=s0;
    else
    case(pres_state) 
      s0 :
        case(coin)
          2'd0 : 
          begin
            pres_state<=s0;
            rnews_out<=0;
          end
          2'd1 : 
          begin
            pres_state<=s1;
            rnews_out<=0;
          end
          2'd2 : 
          begin
            pres_state<=s2;
            rnews_out<=0;
          end
        endcase
    
      s1 :
        case(coin)
          2'd0 :
          begin
            pres_state<=s1;
            rnews_out<=0;
          end
          2'd1 :
          begin
            pres_state<=s2;
            rnews_out<=0;
          end
          2'd2 : 
          begin
            pres_state<=s0;
            rnews_out<=1;
          end
        endcase
    
      s2 :
        case(coin)
          2'd0 :
          begin
            pres_state<=s2;
            rnews_out<=0;
          end
          2'd1 : 
          begin
            pres_state<=s0;
            rnews_out<=1;
          end
          2'd2 : 
          begin
            pres_state<=s0;
            rnews_out=1;
          end
        endcase
      s3 :
        begin
          rnews_out=1;
          pres_state<=s0;
        end
    endcase
  end

  

图一


2、但我若添加一个next_state中间寄存器,编写代码。出现下面图2结果:

module finite_state_module(clock,reset,coin,news_out);
  input clock,reset;
  input [1:0]coin;
  output news_out;
  
  reg [1:0]pres_state,next_state;
  reg rnews_out;
  
  
  parameter s0=2'd0;
  parameter s1=2'd1;
  parameter s2=2'd2;
  parameter s3=2'd3;
  
  
  always @(posedge clock,negedge reset)
  begin
    if(!reset)
     begin
        pres_state<=s0;
       
     end
    else
      pres_state<=next_state;
  end
   

//这种建模方式与方法一的差别即是方法二采用两个过程块,并设置了中间变量next_state,第一个always过程块是根据时钟变化,将 pres_state置为next_state,而第二个always过程块是根据 pres_state,coin的变化,更改next_state和news_out。而方法一种采用一个always过程块,当上升沿到来时,根据coin的变化,直接更改pres_state和news_out的状态。
  always @(pres_state,coin)

  begin
    case(pres_state) 
      s0 :
        case(coin)
          2'd0 : 
          begin
            next_state=s0;
            rnews_out=0;
          end
          2'd1 : 
          begin
            next_state=s1;
            rnews_out=0;
          end
          2'd2 : 
          begin
            next_state=s2;
            rnews_out=0;
          end
        endcase
    
      s1 :
        case(coin)
          2'd0 :
          begin
            next_state=s1;
            rnews_out=0;
          end
          2'd1 :
          begin
            next_state=s2;
            rnews_out=0;
          end
          2'd2 : 
          begin
            next_state=s0;
            rnews_out=1;
          end
        endcase
    
      s2 :
        case(coin)
          2'd0 :
          begin
            next_state=s2;
            rnews_out=0;
          end
          2'd1 : 
          begin
            next_state=s0;
            rnews_out=1;
          end
          2'd2 : 
          begin
            next_state=s0;
            rnews_out=1;
          end
        endcase
      s3 :
        begin
          rnews_out=1;
          next_state=s0;
        end
    endcase
  end
    
  assign news_out=rnews_out;
    
endmodule


       图二


图一图一对比可知,图二在仿真时刻30ns,news_out就变成了“1”,但此时暂时只输入了两个“01”,即投入两个5毛,还没达到一块五状态。除此之外,后面的仿真波形都是对的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章