FPGA设计基础02——FSM有限状态机
除了常用的计数器之外,状态机也能和计数器一样实现状态转换的效果。
1.状态机处理的多数是乱序,像1-3-2。因为如果是顺序的我们可以用计数器来实现,如1-2-3。
2.我们平时都喜欢直接写状态机
直接用一个always语句和case的结合就能完成状态机的设计
其中 状态有 IDLE 、A、 B
//状态机
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
state <= IDLE;
end
else
case(state)
IDLE:if(条件)
state <= A;
else
state <= IDLE;
A:if(条件)
state <= B;
else
state <= A;
B:if(条件)
state <= A;
else
state <= B;
default: state <= IDLE;
endcase
end
3.当然最好的方法是,采用三段式的状态机写法。
第一段:将要来临的状态(next)赋给现在的状态(current),IDLE为初始状态
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
state_current<= waiting;
end
else begin
state_current<= state_next;
end
end
第二段:组合逻辑的 always 块,完成状态怎么转移的代码。当前为3个状态:IDLE、S1、S2。
always@(*)begin
case(state_current)
waiting:begin
if(条件)begin
state_next = S1;
end
else begin
state_next = state_current;
end
end
S1:begin
if(条件)begin
state_next = S2;
end
else begin
state_next = state_current;
end
end
S2:begin
if(条件)begin
state_next = waiting;
end
else begin
state_next = state_current;
end
end
default:begin
state_next = waiting;
end
endcase
end
第三段:设计输出信号,即什么状态干什么事情(一段 always 代码设计一个信号)
always @(posedge clk or negedge rst_n)begin //out1信号always块
if(!rst_n)begin
out1 <=1'b0
end
else if(state_current==S1)begin
out1 <= 1'b1; //S1状态时,out1给什么值
end
else begin
out1 <= 1'b0; //其余状态,out1给什么值
end
end
always @(posedge clk or negedge rst_n)begin //out2信号always块
if(!rst_n)begin
out2 <=1'b0
end
else if(state_current==S1)begin
out2 <= 1'b1; //S1状态时,out2给什么值
end
else begin
out2 <= 1'b0; //其余状态,out2给什么值
end
end