FPGA初学三段式状态机写法
段式状态机在第一个 always 模块采用同步时序逻辑方式描述状态转移,第二个 always 模块采用组合逻辑方式描述状态转移规律,第三个 always 描述电路的输出。通 常让输出信号经过寄存器缓存之后再输出,消除电路毛刺。这种状态机也是比较推崇的, 主要是由于维护方便,组合逻辑与时序逻辑完全独立。
module detect_3( input clk_i, input rst_n_i, output out_o );
reg out_r; //状态声明和状态编码
reg [1:0] Current_state;
reg [1:0] Next_state;
parameter [1:0] S0=2’b00;
parameter [1:0] S1=2’b01;
parameter [1:0] S2=2’b10;
parameter [1:0] S3=2’b11; //时序逻辑:描述状态转换
always@(posedge clk_i)
begin
if(!rst_n_i)
Current_state<=0;
else
Current_state<=Next_state;
end
always@(*)
begin
case(Current_state) //组合逻辑:描述下一状态
S0: Next_state = S1;
S1: Next_state = S2;
S2: Next_state = S3;
S3: begin Next_state = Next_state;
end
default :Next_state = S0;
endcase
end
always@(posedge clk_i) //输出逻辑:让输出 out,经过寄存器 out_r 锁存后输出,消除毛刺
begin
if(!rst_n_i)
out_r<=1’b0;
else
begin
case(Current_state)
S0,S2:out_r<=1’b0;
S1,S3:out_r<=1’b1;
default :out_r<=out_r;
endcase
end
end
assign out_o=out_r;