两段式直接采用组合逻辑输出,而三段式则通过在组合逻辑后再增加一级寄存器来实现时序逻辑输出。这样做的好处是可以有效地滤去租个逻辑输出的毛刺,同时可以有效地进行时序计算与约束,另外对于总线形式的输出信号来说,容易使总线数据对其,从而减小总线数据间的偏移,减小接收端数据采样出错的频率。
第一个always语句实现同步状态跳转;
第二个always语句实现组合逻辑;
第三个always语句实现同步输出。
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
原文:http://www.cnblogs.com/qidaiymm/p/4908724.html