news 2026/6/25 3:44:00

19.三段式状态机

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
19.三段式状态机

写状态机时总感觉逻辑混乱,调试起来一头雾水?
或者状态跳转总是出问题,时序怎么都调不顺?

使用三段式状态机——让代码结构清晰、调试轻松!

一、为什么需要三段式

如果把状态机的所有逻辑都写在一个always块里,就像把所有工具扔进一个工具箱——找起来费劲,用起来混乱

三段式状态机就是把状态机拆成三个明确的部分:

  1. 状态定义:明确有哪些状态

  2. 次态逻辑:决定下一步去哪

  3. 输出逻辑:每个状态下要做什么

这样拆开,调试时就能精准定位问题:是状态定义错了?跳转条件不对?还是输出有问题?

二、编写三段式状态机

第一段,状态定义

首先,明确你的状态机有哪些状态,并用寄存器保存当前状态。

// 状态定义(推荐独热码,一个状态一个bit,避免歧义) parameter S0 = 2'b00; parameter S1 = 2'b01; parameter S2 = 2'b10; reg [1:0] current_state, next_state; // 状态寄存器(时序逻辑,每个时钟沿更新) always @(posedge clk or posedge reset) begin if (reset) current_state <= S0; // 复位时回到初始状态 else current_state <= next_state; // 正常工作时状态更新 end

状态编码可以用二进制、独热码(one-hot)或格雷码。独热码虽然占用资源多,但逻辑简单、不易出错,特别适合初学者。

第2段,次态逻辑

根据当前状态和输入信号,决定下一个状态是什么。

// 次态逻辑(组合逻辑,立即计算) always @(*) begin case (current_state) S0: if (input_condition) // 满足条件才跳转 next_state = S1; else next_state = S0; // 不满足就保持 S1: next_state = S2; // 无条件跳转到S2 S2: next_state = S0; // 执行完回到初始状态 default: next_state = S0; // 防错,默认回到初始状态 endcase end

如果多个状态都能跳转到同一个状态,代码该怎么写更简洁?

第3段:输出逻辑

输出逻辑有两种写法,根据需求选择:

写法一:组合逻辑输出(立即响应)

// 组合逻辑输出(当前状态一变,输出立刻变) always @(*) begin case (current_state) S0: output = 1'b0; S1: output = 1'b1; // 进入S1时,output立刻变1 S2: output = 1'b0; default: output = 1'b0; endcase end

写法二:时序逻辑输出(延迟一拍)

// 时序逻辑输出(等到下一个时钟沿才变化) always @(posedge clk) begin if (reset) output <= 1'b0; else begin case (current_state) S1: output <= 1'b1; // 进入S1后,下个时钟沿output才变1 default: output <= 1'b0; endcase end end

稳定无毛刺,但响应慢一拍。

关键选择:你的输出需要立刻生效,还是可以等一个时钟周期?根据实际需求选择

三、三段式的优势

  1. 结构清晰:调试时一眼就能看出问题在哪一段

  2. 时序友好:状态更新和输出分离,更容易满足时序约束

  3. 维护简单:加状态、改跳转条件都不会牵一发而动全身

  4. 可读性强:别人接手你的代码也能快速看懂

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/22 0:40:15

清华镜像源加速pip安装:优化TensorFlow-v2.9环境配置速度

清华镜像源加速pip安装&#xff1a;优化TensorFlow-v2.9环境配置速度 在深度学习项目启动阶段&#xff0c;最让人焦灼的往往不是模型设计或算法调优&#xff0c;而是卡在第一步——pip install tensorflow。你盯着终端里缓慢爬升的进度条&#xff0c;下载速度时断时续&#xff…

作者头像 李华
网站建设 2026/6/15 17:54:38

基于多时间尺度滚动优化的多能源微网双层调度模型:MATLAB 实践

MATLAB代码&#xff1a;基于多时间尺度滚动优化的多能源微网双层调度模型 关键词&#xff1a;多能源微网 多时间尺度 滚动优化 微网双层模型 优化调度 主要内容&#xff1a;代码主要是一个多能源微网的优化调度问题&#xff0c;首先对于下层多能源微网模型&#xff0c;考虑以其…

作者头像 李华
网站建设 2026/6/18 17:10:48

Pytorch-UNet深度学习可视化终极指南:揭秘模型注意力机制

Pytorch-UNet深度学习可视化终极指南&#xff1a;揭秘模型注意力机制 【免费下载链接】Pytorch-UNet PyTorch implementation of the U-Net for image semantic segmentation with high quality images 项目地址: https://gitcode.com/gh_mirrors/py/Pytorch-UNet 在医学…

作者头像 李华
网站建设 2026/6/19 19:57:35

Sniffle:蓝牙5和4.x LE嗅探器的终极指南

Sniffle&#xff1a;蓝牙5和4.x LE嗅探器的终极指南 【免费下载链接】Sniffle A sniffer for Bluetooth 5 and 4.x LE 项目地址: https://gitcode.com/gh_mirrors/sn/Sniffle 想要深入了解蓝牙设备的通信过程&#xff1f;Sniffle就是你的完美选择&#xff01;作为一款专…

作者头像 李华
网站建设 2026/6/18 7:54:29

线程的本质和进程的本质区别是什么

1.线程的本质和进程的本质区别是什么线程与进程是操作系统中两种重要的执行单位&#xff0c;其本质区别体现在资源分配、调度粒度、通信机制、上下文切换开销及健壮性等多个维度&#xff0c;具体如下&#xff1a;1. 资源分配与独立性进程&#xff1a;是操作系统资源分配的基本单…

作者头像 李华