最近在做fpga逻辑实现数据帧头拼接分包时刚接触状态机,随便记一点目前的入门理解。
一段二段不用就没管了,直接无脑三段式。
首先,三段式状态机是因为代码从外部看上去分成三块,分别描述状态机的切换状态时间,切换状态条件,不同状态下的操作。直接上模板,管你听没听懂,套就完了!
step1:变量定义
如下面例子中,仅使用三个状态,则定义一个两位状态寄存器即可,更多状态可根据需求拓展。
reg [1:0] current_state,next_state
parameter ini_state = 2'b00;
parameter state1 = 2'b01;
parameter state2 = 2'b10;
step2:
三段式状态机其一,时序迁移模块
always @(posedge clk or reset)
begin
if(!M00_AXI_aresetn)
current_state <= ini_state;
else
current_state <= next_state;
end
step3:
三段式状态机其二,状态迁移模块
always @ (/填入状态跳转条件下的所有信号名称/)
begin
if(!reset)
next_state = ini_state; //复位了,回初始状态
else
current_state <= next_state //进入下一状态
case(current_state)
ini_state: begin
if(/判断条件/)next_state = state1; //例:在xx条件下,从ini切到state1状态
else next_state = ini_state;
//想切别的状态各个儿加
end
state1; begin
if(/判断条件/)next_state = state2; //例:在xx条件下,从state1切到state2状态
else next_state = ini_state;
//想切别的状态各个儿加
end
state2: begin
if(/判断条件/)next_state = state1; //例:在xx条件下,从state2切回state1状态
else next_state = ini_state;
//想切别的状态各个儿加
end
step4:
三段式状态机其三,功能模块
就是每个状态下你想干啥。
always @ (*) begin
case(current_state)
inni_state: begin
//ini状态下干的事儿//
end
state1; begin
//state1状态下干的事儿//
end
state2; begin
//state1状态下干的事儿//
end
default: begin
//默认//
end
endcase
end
Fin