为了处理有时间上先后的事件,在FPGA中采用状态机的形式完成事件处理。
Mealy 状态机:输出不仅取决于当前状态,还取决于输入状态。
Moore 状态机:组合逻辑的输出只取决于当前状态,而与输入状态无关。
二段式状态机:用两个 always 模块来描述状态机,其中一个 always模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出。不同于一段式状态机的是,它需要定义两个状态,现态和次态,然后通过现态和次态的转换来实现时序逻辑。
三段式状态机:在两个 always 模块描述方法的基础上,使用三个always 模块,一个always 模块采用同步时序描述状态转移,一个 always 采用组合逻辑判断状态转移条件,描述状态转移规律,另一个 always 模块描述状态输出。
module top_module(input clk,input areset, // Asynchronous reset to state Binput in,output out);// parameter A=0, B=1; reg state, next_state;//组合逻辑判断状态转移条件,描述状态转移规律always @(*) begin // This is a combinational always block// State transition logic case(state)A: next_state = in? A:B;B: next_state = in? B:A;endcaseend//同步时序描述状态转移always @(posedge clk, posedge areset) begin // This is a sequential always block// State flip-flops with asynchronous resetif(areset)state <= B; //复位初始状态elsestate <=next_state; //次态转移到现态end//时序逻辑描述输出// Output logic// assign out = (state == ...);// assign out = (state == A)? 0:1;always @(posedge clk, posedge areset) begin // This is a sequential always blockout <= (state == B);endendmodule