前言
上课时讲了两段式状态机和三段式状态机,不过对于概念依旧有点模糊。自己记了一点,以便期末回顾用。
一般来说,模块内有几个always
就是几段式。但是具体情况还需看代码分析。
参考资料
Verilog状态机常见三种写法
状态机的一段式、二段式、三段式的区别-电子发烧友网
Verilog实现二段式和三段式有限状态机-CSDN博客
对于经典三段式状态机的自己之前一些认识的误区-CSDN博客
一段式
顾名思义,全模块只有一个always
,在该模块中既描述状态转移,又描述状态的输入和输出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 module fsm(Clock,Reset,A,K2,K1,state); input Clock, Reset, A; output K2, K1; output [1 :0 ] state; reg K2, K1; reg [1 :0 ] state ; parameter Idle = 2'b00 , Start = 2'b01 , Stop = 2'b10 , Clear = 2'b11 ; always @(posedge Clock) if (!Reset) begin state <= Idle; K2 <=0 ; K1 <=0 ; end else case (state) Idle: if (A) begin state <= Start; K1<=0 ; end else begin state <= Idle; K2<=0 ; K1<=0 ; end Start: if (!A) state <= Stop; else state <= Start; Stop: if (A) begin state <= Clear; K2<= 1 ; end else begin state <= Stop; K2<=0 ; K1<=0 ; end Clear: if (!A) begin state <=Idle; K2<=0 ; K1<=1 ; end else begin state <= Clear; K2<=0 ; K1<=0 ; end default : state<=2'bxx ; endcase endmodule
两段式
何谓两段式?这两段是什么?
同步时序描述状态转移
组合逻辑判断状态转移条件、描述状态转移规律及其输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 module fsm ( Clock, Reset, A, K2, K1 ); input Clock, Reset, A; output K2, K1; reg K2, K1; reg [1 :0 ] state, nextstate; parameter Idle = 2'b00 , Start = 2'b01 , Stop = 2'b10 , Clear = 2'b11 ; always @(posedge Clock) if (!Reset) state <= Idle; else state <= nextstate; always @(state or A) case (state) Idle: if (A) begin nextstate = Start; K1 = 1 ; K2 = 0 ; end else nextstate = Idle; Start: if (!A) begin nextstate = Stop; K1 = 0 ; K2 = 1 ; end else nextstate = Start; Stop: if (A) begin nextstate = Clear; K2 = 1 ; K1 = 0 ; end else nextstate = Stop; Clear: if (!A) begin nextstate = Idle; K2 = 0 ; K1 = 0 ; end else nextstate = Clear; default : nextstate = 2'bxx ; endcase endmodule
三段式
三段式在两段式的基础上,将状态输出单独分离出来,使程序结构更加直观。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 module fsm ( Clock, Reset, A, K2, K1 ); input Clock, Reset, A; output K2, K1; reg K2, K1; reg [1 :0 ] state, nextstate; parameter Idle = 2'b00 , Start = 2'b01 , Stop = 2'b10 , Clear = 2'b11 ; always @(posedge Clock) if (!Reset) state <= Idle; else state <= nextstate; always @(state or A) case (state) Idle: if (A) nextstate = Start; else nextstate = Idle; Start: if (!A) nextstate = Stop; else nextstate = Start; Stop: if (A) nextstate = Clear; else nextstate = Stop; Clear: if (!A) nextstate = Idle; else nextstate = Clear; default : nextstate = 2'bxx ; endcase always @(state or Reset or A) if (!Reset) K1 = 0 ; else if (state == Clear && !A) K1 = 1 ; else K1 = 0 ; always @(state or Reset or A) if (!Reset) K2 = 0 ; else if (state == Stop && A) K2 = 1 ; else K2 = 0 ; endmodule