有限状态机是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)begin10 state <= 2'b01;11 Qout <= 1'b1;12 end13 else begin14 state <= 2'b00;15 Qout <= 1'b0;16 end17 end18 2'b01: begin19 if(!A)begin20 state <= 2'b00;21 Qout <= 1'b0;22 end23 else begin24 state <= 2'b01;25 Qout <= 1'b1;26 end27 end28 default:;29 endcase30 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 end12 2'b01: begin13 if(!A)14 state <= 2'b00;15 else16 state <= 2'b01;17 end18 default:;19 endcase20 end21 22 always@(posedge clk or negedge rst_n)23 begin24 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 endcase31 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 begin11 case(current_state)12 2'b00:begin13 if(A)14 next_state = 2'b01;15 else16 next_state = 2'b00;17 end18 2'b01:begin19 if(!A)20 next_state = 2'b00;21 else22 next_state = 2'b01;23 end24 default:;25 end26 27 always @ (*) //状态操作 28 begin29 case(current_state)30 2'b00:Qout <= 1'b0;31 2'b01:Qout <= 1'b1;32 default:;33 endcase34 end
3.状态机设计要求
1)根据设计需求选择合适的风格;
2)case语句中都应加入default语句;
3)巧加DFF中继,提高可靠性;
4)课采用独热编码、格雷码设计状态;
5)记得采用全局复位;