【基本知识】FMS有限状态机设计

  有限状态机是Verilog中十分基本也是十分重要的知识。本文对有限状态机做了一个简单介绍。

1.状态机三要素

  有限状态机具有三个要素:状态跳转、跳转判断、状态操作;

  1)状态跳转:现态跳转到次态;

  2)跳转判断:状态跳转的判断条件;

  3)状态操作:状态对应的操作;

2.状态机的实现方式

  1)一段式:状态机三要素集成于一个 always 块中。

 1     always@(posedge clk or negedge rst_n)
 2     begin
 3       if(!rst_n)begin
 4         state <= 2'b00;
 5         Qout <= 1'b0;
 6       end
 7       else case(state)
 8         2'b00: begin
 9           if(A)begin
10             state <= 2'b01;
11             Qout <= 1'b1;
12           end
13           else begin
14             state <= 2'b00;
15             Qout <= 1'b0;
16           end
17         end
18         2'b01: begin
19           if(!A)begin
20             state <= 2'b00;
21             Qout <= 1'b0;
22           end
23           else begin
24             state <= 2'b01;
25             Qout <= 1'b1;
26           end
27         end
28         default:;
29       endcase
30     end
FMS_ONE

  2)二段式:状态机三要素分别设计于两个 always 块。

 1     always@(posedge clk or negedge rst_n)
 2      begin
 3        if(!rst_n)
 4          state <= 2'b00;
 5        else case(state)
 6          2'b00: begin
 7            if(A)
 8              state <= 2'b01;
 9            else 
10              state <= 2'b00;
11          end
12          2'b01: begin
13            if(!A)
14              state <= 2'b00;
15            else
16              state <= 2'b01;
17          end
18          default:;
19        endcase
20      end
21  
22           always@(posedge clk or negedge rst_n)
23      begin
24        if(!rst_n)
25          Qout <= 1'b0;
26        else case(state)
27          2'b00: Qout <= 1'b0;
28          2'b01: Qout <= 1'b1;
29          default:;
30        endcase
31      end
FMS_TWO

  3)三段式:状态机三要素分别于三个 always 块。

FMS_THREE
 1     always@(posedge clk or negedge rst_n)//状态跳转
 2     begin
 3       if(!rst_n)    
 4                 current_state <= 2'b00;     //复位
 5       else 
 6                 current_state <= next_state//在时钟上升沿刷新现状态
 7     end
 8 
 9         always@(current_state)          //跳转判断                    
10     begin
11             case(current_state)
12                 2'b00:begin
13                     if(A)
14                         next_state = 2'b01;
15                     else
16                         next_state = 2'b00;
17                 end
18                 2'b01:begin
19                     if(!A)
20                         next_state = 2'b00;
21                     else
22                         next_state = 2'b01;
23                 end
24                 default:;
25     end
26 
27         always @ (*)                     //状态操作 
28         begin
29             case(current_state)
30                 2'b00:Qout <= 1'b0;
31                 2'b01:Qout <= 1'b1;
32                 default:;
33             endcase
34         end

3.状态机设计要求

  1)根据设计需求选择合适的风格;

  2)case语句中都应加入default语句;

  3)巧加DFF中继,提高可靠性;

  4)课采用独热编码、格雷码设计状态;

  5)记得采用全局复位;

猜你喜欢

转载自www.cnblogs.com/yjw951012/p/10964420.html
今日推荐