news 2026/6/10 15:00:32

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/10 12:54:43

小白也能学会的Jupyter远程开发:基于TensorFlow-v2.9镜像实操教学

小白也能学会的Jupyter远程开发&#xff1a;基于TensorFlow-v2.9镜像实操教学 在人工智能项目日益普及的今天&#xff0c;很多初学者刚入门就卡在了第一步——环境配置。明明照着教程一步步来&#xff0c;却总是遇到Python版本不兼容、CUDA驱动报错、pip安装失败等问题。更让人…

作者头像 李华
网站建设 2026/6/10 10:56:07

Transformer模型详解实战:在TensorFlow 2.9镜像中快速上手训练

Transformer模型实战&#xff1a;基于TensorFlow 2.9镜像的高效训练指南 在当今AI研发节奏日益加快的背景下&#xff0c;一个常见的痛点浮出水面&#xff1a;为什么明明写好了模型代码&#xff0c;却卡在环境配置上数小时甚至数天&#xff1f; 尤其是当你要复现一篇论文、启动一…

作者头像 李华
网站建设 2026/6/10 10:55:19

FaceFusion人脸掩码实战:告别融合边缘毛刺的终极解决方案

FaceFusion人脸掩码实战&#xff1a;告别融合边缘毛刺的终极解决方案 【免费下载链接】facefusion Next generation face swapper and enhancer 项目地址: https://gitcode.com/GitHub_Trending/fa/facefusion 你是否曾经遇到过这样的困扰&#xff1a;精心挑选的人脸融合…

作者头像 李华
网站建设 2026/6/10 14:01:06

如何充分利用D-Tale社区资源进行pandas数据可视化

如何充分利用D-Tale社区资源进行pandas数据可视化 【免费下载链接】dtale Visualizer for pandas data structures 项目地址: https://gitcode.com/gh_mirrors/dt/dtale 作为一款强大的pandas数据可视化工具&#xff0c;D-Tale让数据分析变得更加直观高效。但对于新手用…

作者头像 李华
网站建设 2026/6/10 10:59:05

终极AI小说生成器:智能创作工具完全指南

终极AI小说生成器&#xff1a;智能创作工具完全指南 【免费下载链接】AI_NovelGenerator 使用ai生成多章节的长篇小说&#xff0c;自动衔接上下文、伏笔 项目地址: https://gitcode.com/GitHub_Trending/ai/AI_NovelGenerator 你是否曾经梦想创作一部长篇小说&#xff0…

作者头像 李华
网站建设 2026/6/10 12:37:21

如何一键智能修改《艾尔登法环》存档:5个超实用技巧

如何一键智能修改《艾尔登法环》存档&#xff1a;5个超实用技巧 【免费下载链接】ER-Save-Editor Elden Ring Save Editor. Compatible with PC and Playstation saves. 项目地址: https://gitcode.com/GitHub_Trending/er/ER-Save-Editor 你是否曾在《艾尔登法环》中因…

作者头像 李华