热度 18| ||
状态机主要由状态转移、状态转移条件和输出三部分组成,确定了这三部分基本上一个状态机就确定了。
以前学习的状态机都是两段式,但是比较复杂的状态机还是应该将三部分分开来实现,这样每部分的功能比较独立,验证和差错的时候比较容易;以后需要修改也非常方便。
状态转移部分比较固定,使用时序逻辑控制,一般为以下结构:
always @(posedge clk) begin
// 视情况需要复位的话补上复位
current_state <= next_state;
end
状态转移条件部分根据现态和输入(有些情况),用组合逻辑实现,一般为以下结构:
always @(*) begin // 组合逻辑建议使用@(*)
// 视情况需要复位补上复位
case (current_state)
s0: begin
// 视情况是否与输入有关
next_state = s1;
end
s1: begin
// 视情况是否与输入有关
next_state = s2;
end
default: begin
next_state = s0;
end
endcase
end
输出部分使用时序逻辑控制,一般以下结构:(此处的输出指现态、还没有跳到next_state时的输出)
always @(posedge clk) begin
// 视情况需要复位的话补上复位
case (current_state/next_state)
// 注意这里的敏感列表可选current_state和next_state,区别仅仅是输出信号是否晚一个时钟周期
s0: begin
end
s1: begin
end
s2: begin
end
default: begin
end
endcase
end
// 常见的输出还可以用组合逻辑输出