三段式狀態機設計


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     

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM