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 触发器组成