Verilog三段式状态机描述(转载)有自己理解的部分

Verilog三段式状态机描述(转载)

 

时序电路的状态是一个状态变量集合,这些状态变量在任意时刻的值都包含了为确定电路的未来行为而必需考虑的所有历史信息。

状态机采用VerilogHDL语言编码,建议分为三个always段完成。

三段式建模描述FSM的状态机输出时,只需指定case敏感表为次态寄存器, 然后直接在每个次态的case分支中描述该状态的输出即可,不用考虑状态转移条件。

三段式描述方法虽然代码结构复杂了一些,但是换来的优势是:使FSM做到了同步寄存器输出,消除了组合逻辑输出的不稳定与毛刺的隐患,而且更利于时序路径分组,一般来说在FPGA/CPLD等可编程逻辑器件上的综合与布局布线效果更佳。

示列如下:

 

 

//第一个进程,同步时序always模块,格式化描述次态寄存器迁移到现态寄存器,时序部分,用于切换状态机

always @ (posedge clk or negedge rst_n)    //异步复位

 if(!rst_n)

   current_state <= IDLE;   //第一个进程只有current_state 被赋值,next_state在第二个进程被赋值

 else

   current_state <= next_state;   //注意,使用的是非阻塞赋值

 

//第二个进程,组合逻辑always模块,描述状态转移条件判断,根据敏感变量执行状态转换

always @ (current_state)        //电平触发,或各种触发信号。

  begin

    next_state = IDLE;  //要初始化,使得系统复位后能进入正确的状态

    case(current_state)

    S1: if(...)

       next_state = S2;           //阻塞赋值

    ...

    endcase

end

 

//第三个进程,同步时序always模块,格式化描述次态寄存器输出

always @ (posedge clk or negedge rst_n)

...//初始化

 case(next_state)

S1:

   out1 <= 1'b1;                //注意是非阻塞逻辑

S2:

   out2 <= 1'b1;

default:...      //default的作用是免除综合工具综合出锁存器

endcase

end

你可能感兴趣的:(FPGA基础知识)