为了处理有时间上先后的事件,在FPGA中采用状态机的形式完成事件处理。
Mealy 状态机:输出不仅取决于当前状态,还取决于输入状态。
Moore 状态机:组合逻辑的输出只取决于当前状态,而与输入状态无关。
二段式状态机:用两个 always 模块来描述状态机,其中一个 always模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出。不同于一段式状态机的是,它需要定义两个状态,现态和次态,然后通过现态和次态的转换来实现时序逻辑。
三段式状态机:在两个 always 模块描述方法的基础上,使用三个always 模块,一个always 模块采用同步时序描述状态转移,一个 always 采用组合逻辑判断状态转移条件,描述状态转移规律,另一个 always 模块描述状态输出。
module top_module(
input clk,
input areset, // Asynchronous reset to state B
input 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;
endcase
end
//同步时序描述状态转移
always @(posedge clk, posedge areset) begin // This is a sequential always block
// State flip-flops with asynchronous reset
if(areset)
state <= B; //复位初始状态
else
state <=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 block
out <= (state == B);
end
endmodule