在Verilog中可以采用多种方法来描述有限状态机最常见的方法就是用always和case语句。如下图所示的状态转移图就表示了一个简单的有限状态机:
图中:图表示了一个四状态的状态机,输入为A和Reset,同步时钟为clk,输出信号是K1和K2,状态机只能在信号的上升沿发生。
(A)下面是可综合的Verilog模块设计状态机的典型方法:(格雷码表示状态)
1 module fsm(A,Reset,K2,K1,clk,state); 2 input A,Reset,clk; 3 output K2,K1; 4 output [1:0]state; 5 reg K2,K1; 6 reg [1:0]state; 7 parameter Idel=2'b00, 8 start=2'b01, 9 stop=2'b10, 10 clear=2'b11; 11 always @(posedge clk) 12 if (!Reset) 13 begin 14 state<=Idel; 15 K2<=0; 16 K1<=0; 17 end 18 else 19 case(state) 20 Idel:if (A) 21 begin 22 state<=start; 23 K1<=0; 24 end 25 else 26 begin 27 state<=Idel; 28 K2<=0; 29 K1<=0; 30 end 31 start:if(!A) state<=stop; 32 else state<=start; 33 stop: if(A) 34 begin 35 state<=clear; 36 K2<=1; 37 end 38 else 39 begin 40 state<=stop; 41 K2<=0; 42 K1<=0; 43 end 44 clear:if(!A) 45 begin 46 state<=Idel; 47 K2<=0; 48 K1<=1; 49 end 50 else 51 begin 52 state<=clear; 53 K2<=0; 54 K1<=0; 55 end 56 default:state<=2'bxx; 57 endcase 58 endmodule
(B)用可以综合的Verilog模块设计、用独热码表示状态的状态机
独热码,在英文文献中称做 one-hot code, 直观来说就是有多少个状态就有多少比特,而且只有一个比特为1,其他全为0的一种码制。
1 module fsm(A,Reset,K2,K1,clk,state); 2 input A,Reset,clk; 3 output K2,K1; 4 output [3:0]state; 5 reg K2,K1; 6 reg [3:0]state; 7 parameter Idel=4'b1000, 8 start=4'b0100, 9 stop=4'b0010, 10 clear=4'b0001; 11 always @(posedge clk) 12 if (!Reset) 13 begin 14 state<=Idel; 15 K2<=0; 16 K1<=0; 17 end 18 else 19 case(state) 20 Idel:if (A) 21 begin 22 state<=start; 23 K1<=0; 24 end 25 else 26 begin 27 state<=Idel; 28 K2<=0; 29 K1<=0; 30 end 31 start:if(!A) state<=stop; 32 else state<=start; 33 stop: if(A) 34 begin 35 state<=clear; 36 K2<=1; 37 end 38 else 39 begin 40 state<=stop; 41 K2<=0; 42 K1<=0; 43 end 44 clear:if(!A) 45 begin 46 state<=Idel; 47 K2<=0; 48 K1<=1; 49 end 50 else 51 begin 52 state<=clear; 53 K2<=0; 54 K1<=0; 55 end 56 default:state<=Idel; 57 endcase 58 endmodule