有限状态机是Verilog中十分基本也是十分重要的知识。本文对有限状态机做了一个简单介绍。
1.状态机三要素
有限状态机具有三个要素:状态跳转、跳转判断、状态操作;
1)状态跳转:现态跳转到次态;
2)跳转判断:状态跳转的判断条件;
3)状态操作:状态对应的操作;
2.状态机的实现方式
1)一段式:状态机三要素集成于一个 always 块中。
1 always@(posedge clk or negedge rst_n) 2 begin 3 if(!rst_n)begin 4 state <= 2'b00; 5 Qout <= 1'b0; 6 end 7 else case(state) 8 2'b00: begin 9 if(A)begin 10 state <= 2'b01; 11 Qout <= 1'b1; 12 end 13 else begin 14 state <= 2'b00; 15 Qout <= 1'b0; 16 end 17 end 18 2'b01: begin 19 if(!A)begin 20 state <= 2'b00; 21 Qout <= 1'b0; 22 end 23 else begin 24 state <= 2'b01; 25 Qout <= 1'b1; 26 end 27 end 28 default:; 29 endcase 30 end
2)二段式:状态机三要素分别设计于两个 always 块。
1 always@(posedge clk or negedge rst_n) 2 begin 3 if(!rst_n) 4 state <= 2'b00; 5 else case(state) 6 2'b00: begin 7 if(A) 8 state <= 2'b01; 9 else 10 state <= 2'b00; 11 end 12 2'b01: begin 13 if(!A) 14 state <= 2'b00; 15 else 16 state <= 2'b01; 17 end 18 default:; 19 endcase 20 end 21 22 always@(posedge clk or negedge rst_n) 23 begin 24 if(!rst_n) 25 Qout <= 1'b0; 26 else case(state) 27 2'b00: Qout <= 1'b0; 28 2'b01: Qout <= 1'b1; 29 default:; 30 endcase 31 end
3)三段式:状态机三要素分别于三个 always 块。
FMS_THREE
1 always@(posedge clk or negedge rst_n)//状态跳转 2 begin 3 if(!rst_n) 4 current_state <= 2'b00; //复位 5 else 6 current_state <= next_state//在时钟上升沿刷新现状态 7 end 8 9 always@(current_state) //跳转判断 10 begin 11 case(current_state) 12 2'b00:begin 13 if(A) 14 next_state = 2'b01; 15 else 16 next_state = 2'b00; 17 end 18 2'b01:begin 19 if(!A) 20 next_state = 2'b00; 21 else 22 next_state = 2'b01; 23 end 24 default:; 25 end 26 27 always @ (*) //状态操作 28 begin 29 case(current_state) 30 2'b00:Qout <= 1'b0; 31 2'b01:Qout <= 1'b1; 32 default:; 33 endcase 34 end
3.状态机设计要求
1)根据设计需求选择合适的风格;
2)case语句中都应加入default语句;
3)巧加DFF中继,提高可靠性;
4)课采用独热编码、格雷码设计状态;
5)记得采用全局复位;