前面的文章里状态机采用的是一段式写法,不仅冗杂还容易出错,遗漏没有考虑到的点比如上一篇文章里没有对计数器清零的问题
第一段:同步时序always模块,秒啊书次态迁移到现态:
//1:次态迁移到现态
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
state_c<=IDLE;
end
else begin
state_c<=state_n;
end
end
第二段:组合逻辑的always块,描述状态转移条件
//2:组合逻辑的always块,描述状态转移条件
always@(*)begin
case(state_c)//当前状态
IDLE:begin
if(idle2s1)begin
state=S1;//跳转状态
end
else begin
state_n=state_c;//次态等于现态
end
end
S1:begin
if(s12s2)begin
state_n=S2;//跳转状态
end
else begin
state_n=state_c;//次态等于现态
end
end
S2:begin
if(s12s2)begin
state_n=IDLE;//跳转状态
end
else begin
state_n=state_c;//次态等于现态
end
end
endcase
end
第三段:考虑状态转移条件!
//设计输出
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
out<=1'b0;
end
else begin
out<=xx;
end
end
第四段:输出
//设计输出
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
out<=1'b0;
end
else begin
out<=xx;
end
end