Verilog状态机实现

FPGA开发过程中,当系统行为依赖多个状态,不同时间触发不同的状态迁移,或者需要复杂决策逻辑控制,使用状态机(Finite State Machine, FSM)设计是一种比好的处理方式。

Verilog状态机通常分为Moore型和Mealy型。Moore型状态机的输出仅与当前状态有关,而Mealy型的输出与当前状态和输入信号有关。设计时需明确状态机的类型,避免混合逻辑导致输出不稳定。

常见编码方式包括二进制编码、格雷码和独热码(One-Hot)。独热码适合FPGA实现,每状态占用一个触发器,逻辑简单但资源消耗较大;格雷码适合低功耗设计;二进制编码节省资源但需注意状态跳转时的毛刺问题。

状态转移条件需用组合逻辑明确描述,避免锁存器生成。

推荐三段式状态机设计,步骤如下:

  1. 状态定义
// 常用编码方式(二进制状态编码 或 one-hot编码):
// 状态声明
parameter IDLE   = 3'b001;
parameter START  = 3'b010;
parameter RUN    = 3'b100;
  1. 状态寄存器(采用时序逻辑,优化布线)
reg [2:0] current_state, next_state;

always @(posedge clk or negedge rst_n) begin
  if (!rst_n) current_state <= IDLE;   // 异步复位
  else        current_state <= next_state; // 状态更新
end
  1. 状态转移逻辑(组合逻辑)
always @(*) begin
  // 默认防止锁存器
  next_state = current_state; 
  
  case (current_state)
    IDLE: 
      if (start_signal) next_state = START;
    
    START: 
      if (config_done) next_state = RUN;
      else if (timeout) next_state = IDLE;
    
    RUN:
      if (stop_signal)  next_state = IDLE;
    
    default: next_state = IDLE; // 安全机制
  endcase
end
  1. 输出逻辑(比如Moore型)
// Moore状态机:输出仅依赖当前状态
reg [1:0] status_led;

always @(*) begin
  case (current_state)
    IDLE:   status_led = 2'b00;
    START:  status_led = 2'b01;
    RUN:    status_led = 2'b10;
    default:status_led = 2'b11; // 错误指示
  endcase
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值