在Verilog中可以采用多种方法来描述有限状态机最常见的方法就是用always和case语句。如下图所示的状态转移图就表示了一个简单的有限状态机:

Verilog学习笔记简单功能实现(三)...............同步有限状态机

图中:图表示了一个四状态的状态机,输入为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
View Code

相关文章: