状态机FSM的描述方法

FSM的描述方法

在FPGA设计中,“有限状态机”(Finite State Machine,FSM)的描述方式主要有三种方式:一段式、两段式、三段式。

一段式写法,整个状态机写到一个always块(进程)中。在该always块中,即描述了状态转移,又描述了状态的输入和输出。

二段式写法,状态机用两个always块描述。在其中一个always块中,采用同步方式描述状态转移;在另外一个always块中,采用组合逻辑判断状态转移条件、状态转移规律和输出。

三段式写法,状态机用三个always快描述。第一个always块采用同步方式描述状态转移;第二个always块采用组合逻辑判断状态转移条件,描述状态转移规律;第三个always块,利用组合或者同步逻辑描述状态输出。

  ‘两段式写法’相比于‘一段式写法’,优点在于将同步逻辑和组合逻辑放入两个always块中,便于理解和维护,利于综合器优化代码,利于用户添加合适的时序约束条件,利于布局布线;缺点,则是当前状态的输出用组合逻辑实现,用以产生毛刺。‘三段式写法’则弥补了‘两段式写法’的不足,其根据状态转移规律,在上一状态根据输入条件,判断出当前状态的输出,从而在不插入额外时钟条件的情况下,实现寄存器输出。

例如,编写‘101’序列检测器的状态机程序,当检测到输入序列为101时,输出一个高电平信号。

  

三段式写法

moduleseqcheck_101(clk,rst,din,dout);

   inputclk;//clock signal

   inputrst;//reset signal

   inputdin;//data in

   outputreg dout;//data out

   parameteridle=3'b000,one=3'b001,two=3'b010,three=3'b100;

   reg[2:0] c_state;

   reg[2:0] n_state;

   //sequentialstate transition

   always@(posedge clk)

   begin

     if(!rst)

       c_state<=idle;

     else

       c_state<=n_state;

   end

   //combinationalcondition judgment

   always@(c_state or din)

   begin

     n_state=3'bx;

     case(c_state)

     idle:

     begin

       if(din)   

         n_state=one;

       else    

         n_state=idle;

     end

     one:

     begin

       if(din) 

         n_state=one;

       else    

         n_state=two;

     end

     two:

     begin

       if(din)   

         n_state=three;

       else    

         n_state=idle;

     end

     three:

     begin

       if(din)   

         n_state=one;

       else    

         n_state=two;

     end

     default:

       n_state=idle; 

     endcase

   end

   //thesequential output

   always@(posedge clk)

   begin

     if(!rst)

       dout<=1'b0;

     else

       begin

         case(n_state)

           idle:dout<=1'b0;

           one:dout<=1'b0;

           two:dout<=1'b0;

           three:dout<=1'b1;

           default:dout<=1'b0;

         endcase

       end

   end

endmodule

推荐使用三段式描述法,即利于维护,又不会产生毛刺。

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

DC和APR阶段,setup,hold的解决办法

DC时,

setup violation解决:

pipeline, retime

              降低频率;

              增加前级的面积,加大drive,decrease time。

hold violation 解决:等APR后再一起处理

APR时,

setup violation解决:工具自动解决不了的,再ECO

hold violation 解决:加入buffer

buffer, latch, FF, register 区别

buffer:

       两个反相器,先后连接

Latch:

       开关,加上两个反相器,头尾互连

Flip flop:

       两个latch,控制开关为相反信号

Register:

       一般由D 触发器组成


你可能感兴趣的:(fpga)