1、三段式狀態機與兩段式狀態機的區別
兩段式直接采用組合邏輯輸出,而三段式則通過在組合邏輯后再增加一級寄存器來實現時序邏輯輸出。這樣做的好處是可以有效地濾去租個邏輯輸出的毛刺,同時可以有效地進行時序計算與約束,另外對於總線形式的輸出信號來說,容易使總線數據對其,從而減小總線數據間的偏移,減小接收端數據采樣出錯的頻率。
2、三段式狀態機的基本格式
第一個always語句實現同步狀態跳轉;
第二個always語句實現組合邏輯;
第三個always語句實現同步輸出。
3、實例程序講解
1 //本例主要采用三段式狀態機:在異步復位信號的控制下,一段式狀態機進入IDLE 2 //狀態,q_sig4被復位,一旦sig1或者sig2有效,狀態機進入WAIT狀態,如果sig1和sig2同時有效,那么 3 //狀態機進入DONE狀態,如果sig4還有效,那么q_sig4置位,同時狀態機進入IDLE狀態。 4 5 module three_seg_fsm(clk,reset,sig1,sig2,sig3,q_sig4); 6 //數據聲明部分 7 input clk,reset,sig1,sig2,sig3; 8 9 output reg q_sig4; 10 11 reg [1:0] current_state, next_state; 12 13 //參數聲明 14 parameter IDLE = 2'b00; 15 parameter WAIT = 2'b01; 16 parameter DONE = 2'b10; 17 18 //狀態跳轉程序設計 19 always @(posedge clk or posedge reset) 20 if(reset) 21 current_state <= IDLE; 22 else 23 current_state <= next_state; 24 25 //狀態跳轉輸出 26 always @(current_state or sig1 or sig2 or sig3) 27 begin 28 case(current_state) 29 IDLE: begin 30 if(sig1 || sig2) 31 begin 32 next_state = WAIT; 33 end 34 else 35 begin 36 next_state = IDLE; 37 end 38 end 39 WAIT: begin 40 if(sig2 && sig3) 41 begin 42 next_state = DONE; 43 end 44 else 45 begin 46 next_state = WAIT; 47 end 48 end 49 50 DONE:begin 51 if(sig3) 52 begin 53 next_state = IDLE; 54 end 55 else 56 begin 57 next_state = DONE; 58 end 59 end 60 61 default: begin 62 next_state = IDLE; 63 end 64 endcase 65 end 66 67 //邏輯輸出 68 always @(posedge clk or posedge reset) 69 if(reset) 70 q_sig4 <= 1'b0; 71 else 72 begin 73 case(next_state) 74 IDLE, 75 WAIT: q_sig4 <= 1'b0; 76 DONE: q_sig4 <= 1'b1; 77 default: q_sig4 <= 1'b0; 78 endcase 79 end 80 81 endmodule
