当前位置:   article > 正文

有限状态机(Finite State Machine,简称FSM)

有限状态机

有限状态机(Finite State Machine,简称FSM)是一种数学模型,用于描述系统在不同状态之间的转换。在数字电路设计中,FSM 是一种常用的设计方法,用于实现复杂的控制逻辑。FSM 可以分为两大类:

  1. Moore 状态机:输出仅依赖于当前状态,与输入无关。
  2. Mealy 状态机:输出不仅依赖于当前状态,还依赖于输入。

在 SystemVerilog 中,FSM 可以通过以下步骤来实现:

1. 定义状态

首先,需要定义状态机的所有可能状态。这些状态通常用枚举类型来表示,以便于代码的可读性和维护性。

typedef enum logic [1:0] {
  STATE_IDLE    = 2'b00,
  STATE_PROCESS = 2'b01,
  STATE_WAIT    = 2'b10,
  STATE_DONE    = 2'b11
} state_t;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2. 定义状态寄存器

接下来,需要定义一个寄存器来保存当前状态。

state_t current_state, next_state;
  • 1

3. 实现状态转换逻辑

always_ffalways_comb 块中,实现状态转换逻辑。always_ff 用于时序逻辑,always_comb 用于组合逻辑。

always_ff @(posedge clk, negedge reset_n) begin
  if (!reset_n) begin
    current_state <= STATE_IDLE;
  end else begin
    current_state <= next_state;
  end
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4. 实现下一状态逻辑

在另一个 always_comb 块中,根据当前状态和输入来计算下一状态。

always_comb begin
  case (current_state)
    STATE_IDLE: begin
      if (start) begin
        next_state = STATE_PROCESS;
      end else begin
        next_state = STATE_IDLE;
      end
    end
    // 其他状态的转换逻辑...
    default: next_state = STATE_IDLE;
  endcase
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

5. 实现输出逻辑

根据状态机的类型(Moore 或 Mealy),实现输出逻辑。

对于 Moore 状态机:

always_comb begin
  case (current_state)
    STATE_IDLE: output = 1'b0;
    STATE_PROCESS: output = 1'b1;
    // 其他状态的输出逻辑...
    default: output = 1'b0;
  endcase
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

对于 Mealy 状态机:

always_comb begin
  case (current_state)
    STATE_IDLE: begin
      if (start) output = 1'b1;
      else output = 1'b0;
    end
    // 其他状态的输出逻辑...
    default: output = 1'b0;
  endcase
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

6. 完整的状态机示例

module fsm_example (
  input logic clk,
  input logic reset_n,
  input logic start,
  output logic output
);

typedef enum logic [1:0] {
  STATE_IDLE    = 2'b00,
  STATE_PROCESS = 2'b01,
  STATE_WAIT    = 2'b10,
  STATE_DONE    = 2'b11
} state_t;

state_t current_state, next_state;

always_ff @(posedge clk, negedge reset_n) begin
  if (!reset_n) begin
    current_state <= STATE_IDLE;
  end else begin
    current_state <= next_state;
  end
end

always_comb begin
  case (current_state)
    STATE_IDLE: begin
      if (start) begin
        next_state = STATE_PROCESS;
      end else begin
        next_state = STATE_IDLE;
      end
    end
    // 其他状态的转换逻辑...
    default: next_state = STATE_IDLE;
  endcase
end

always_comb begin
  case (current_state)
    STATE_IDLE: output = 1'b0;
    STATE_PROCESS: output = 1'b1;
    // 其他状态的输出逻辑...
    default: output = 1'b0;
  endcase
end

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

这个示例展示了一个简单的 Moore 状态机,它有四个状态:空闲(IDLE)、处理(PROCESS)、等待(WAIT)和完成(DONE)。状态机根据 start 输入信号从空闲状态转换到处理状态,输出信号 output 在处理状态时为高电平。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/915512
推荐阅读
相关标签
  

闽ICP备14008679号