news 2026/4/23 18:39:16

15.state_machine

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
15.state_machine

FPGA逃不过的状态机。

状态机,核心是先理解状态机的本质(用硬件电路实现“按规则切换状态、执行动作”),再掌握FPGA中最常用的有限状态机(FSM)设计方法,最后通过实战落地。

一、状态机到底是什么?

状态机(Finite State Machine,FSM)是一种“行为模型”:

  • 核心:系统在有限个状态之间切换,切换的触发条件是“输入信号”,切换时会执行对应的“输出动作”。
  • 举个生活例子:自动贩卖机
    • 状态:待机、投币中、出货、找零;
    • 输入:投币、选商品、无硬币;
    • 输出:出货、退币、亮指示灯。
  • FPGA中的状态机:用Verilog/VHDL描述状态切换逻辑,最终综合成门电路(组合逻辑+时序逻辑),是FPGA设计中最核心的逻辑之一(比如串口通信、协议解析、按键消抖、电机控制都离不开)。

二、FPGA状态机的核心分类

1. 摩尔机(Moore)
  • 特点:输出只由当前状态决定,与输入无关;
  • 优点:输出稳定(无毛刺),逻辑清晰;
  • 例子:状态“出货”→ 输出“电机转动”(不管输入是什么,只要在这个状态就输出)。
2. 米利机(Mealy)
  • 特点:输出由当前状态 + 当前输入共同决定
  • 优点:状态数更少,逻辑更精简;
  • 例子:状态“投币中”+ 输入“投币金额≥商品价格”→ 输出“准备出货”。

✅ 建议:先学摩尔机(逻辑简单、易调试),掌握后再学米利机。

三、FPGA状态机的标准设计流程(Verilog为例)

FPGA中设计状态机,推荐用三段式写法(最规范、易维护、易综合),相比一段式/两段式,三段式将“状态寄存器、状态切换、输出逻辑”分开,调试和修改更方便。

步骤1:定义状态(枚举状态)

parameter定义所有状态(避免魔法数字,提高可读性)。

// 例:按键消抖状态机(摩尔机) module key_fsm( input clk, // 时钟(比如50MHz) input rst_n, // 低电平复位 input key_in, // 按键输入(低电平按下) output reg key_out // 消抖后输出 ); // 步骤1:定义状态(4个状态) parameter IDLE = 2'b00; // 空闲(无按键) parameter KEY_DOWN = 2'b01; // 检测到按键按下 parameter KEY_STABLE= 2'b10; // 按键稳定按下 parameter KEY_UP = 2'b11; // 按键松开 reg [1:0] current_state; // 当前状态 reg [1:0] next_state; // 下一状态 reg [19:0] cnt; // 消抖计数器(50MHz时钟下,计数1ms需要50_000个时钟)
步骤2:第一段——状态寄存器(时序逻辑)

功能:同步更新当前状态(由时钟触发,避免亚稳态)。

// 步骤2:状态寄存器(时序逻辑,clk触发) always @(posedge clk or negedge rst_n) begin if(!rst_n) begin current_state <= IDLE; // 复位回到空闲状态 end else begin current_state <= next_state; // 时钟沿更新为下一状态 end end
步骤3:第二段——状态切换逻辑(组合逻辑)

功能:根据“当前状态 + 输入条件”,确定下一状态。

// 步骤3:状态切换逻辑(组合逻辑) always @(*) begin case(current_state) IDLE: begin if(key_in == 1'b0) // 检测到按键按下 next_state = KEY_DOWN; else next_state = IDLE; end KEY_DOWN: begin if(cnt == 20'd499_999) // 计数1ms(消抖) next_state = KEY_STABLE; else next_state = KEY_DOWN; end KEY_STABLE: begin if(key_in == 1'b1) // 检测到按键松开 next_state = KEY_UP; else next_state = KEY_STABLE; end KEY_UP: begin if(cnt == 20'd499_999) // 计数1ms(消抖) next_state = IDLE; else next_state = KEY_UP; end default: next_state = IDLE; // 防溢出 endcase end
步骤4:第三段——输出逻辑(时序/组合逻辑,摩尔机用时序)

功能:根据当前状态生成输出(摩尔机推荐用时序逻辑,避免组合逻辑毛刺)。

// 步骤4:输出逻辑(时序逻辑,摩尔机) always @(posedge clk or negedge rst_n) begin if(!rst_n) begin key_out <= 1'b0; cnt <= 20'd0; end else begin // 计数器逻辑 case(current_state) KEY_DOWN, KEY_UP: begin if(cnt < 20'd499_999) cnt <= cnt + 1'b1; else cnt <= 20'd0; end default: cnt <= 20'd0; endcase // 输出逻辑 case(current_state) KEY_STABLE: key_out <= 1'b1; // 只有稳定按下时输出高电平 default: key_out <= 1'b0; endcase end end endmodule

四、新手学习的关键注意事项

1. 状态编码选择(新手先记结论)

编码方式

特点

适用场景

二进制编码

占用寄存器少,易出现毛刺

资源紧张时

独热码(One-Hot)

每个状态对应1位,解码简单、无毛刺

FPGA(寄存器多,推荐)

格雷码

相邻状态只有1位变化,抗干扰

高速状态切换

✅ 新手建议:用独热码(比如4个状态用4位:IDLE=4'b0001,KEY_DOWN=4'b0010...),FPGA寄存器多,独热码综合效率更高。

2. 避坑指南
  • ❌ 不要用一段式写法(状态+输出混在一起,调试难);
  • ❌ 状态切换逻辑不要漏default(避免综合出锁存器);
  • ❌ 输出逻辑尽量用时序逻辑(摩尔机),减少毛刺;
  • ✅ 复位必须加(所有寄存器初始化,避免未知状态);
  • ✅ 状态数不要太多(建议≤16个,复杂逻辑拆分成多个子状态机)。

五、新手实战路线(从易到难)

  1. 入门级:按键消抖(上面的例子)、LED流水灯(状态机控制亮灭顺序);
  2. 进阶级:串口收发(用状态机解析UART协议)、PWM波生成(状态机控制占空比);
  3. 提升级:I2C/SPI协议解析(米利机,输入+状态决定输出)、简单游戏(比如贪吃蛇的状态控制)。

六、学习工具推荐

  1. 仿真工具:ModelSim(验证状态机逻辑是否正确,看状态切换波形);
  2. 开发板:Altera DE10-Lite / Xilinx Nexys A7(新手入门性价比高);
  3. 辅助学习
    • 书籍:《FPGA设计实战》《Verilog HDL数字系统设计》;
    • 视频:B站“小梅哥FPGA教程”“野火FPGA教程”(新手友好);
    • 在线仿真:EDA Playground(无需装软件,直接写Verilog仿真)。

七、快速上手技巧

  1. 先画状态转移图(比如用Visio/ProcessOn),把每个状态、输入条件、输出写清楚,再写代码;
  2. 仿真时重点看current_statenext_state的波形,确认状态切换是否符合预期;
  3. 从最简单的2状态机(比如“空闲→工作→空闲”)开始,逐步增加状态数。

总结:FPGA状态机的核心是“三段式写法+状态转移逻辑”,新手先吃透摩尔机,用按键消抖、LED流水灯练手,再进阶到协议解析。关键是多写、多仿真、多上板验证,遇到问题先看波形(状态切换是否正确),再定位代码问题。

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

Wan2.2-T2V-A14B适合哪些行业?这5大领域最具潜力

Wan2.2-T2V-A14B适合哪些行业&#xff1f;这5大领域最具潜力 你有没有想过&#xff0c;未来拍电影可能不再需要摄影棚、灯光组和复杂的剪辑流程&#xff1f; 只需输入一句描述&#xff1a;“夕阳下&#xff0c;穿旗袍的女子撑着油纸伞走过青石板路&#xff0c;雨滴轻敲屋檐”&a…

作者头像 李华
网站建设 2026/4/23 11:12:13

【完整源码+数据集+部署教程】电子废物检测回收系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

一、背景意义 随着全球电子产品的快速发展和普及&#xff0c;电子废物&#xff08;E-waste&#xff09;问题日益严重。根据联合国环境规划署的报告&#xff0c;全球每年产生的电子废物数量已超过5000万吨&#xff0c;预计到2030年这一数字将达到7400万吨。电子废物不仅占用了大…

作者头像 李华
网站建设 2026/4/23 12:35:44

计算机毕设Java民宿后台管理系统的设计与实现 基于Java的民宿在线管理平台的设计与开发 Java技术在民宿后台管理系统中的应用与实现

计算机毕设Java民宿后台管理系统的设计与实现f5tia9 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 随着互联网的普及和人们生活水平的提高&#xff0c;民宿行业迅速发展。传统…

作者头像 李华
网站建设 2026/4/23 12:34:04

JeeLowCode低代码开发框架完整部署指南

JeeLowCode是一款基于Spring Boot Vue3的企业级低代码开发框架&#xff0c;采用多模块架构设计&#xff0c;专为快速构建企业级管理系统而生。本指南将带您从零开始完成整个项目的部署配置&#xff0c;避开常见技术陷阱。 【免费下载链接】jeelowcode &#x1f525;JeeLowCode…

作者头像 李华
网站建设 2026/4/23 11:13:05

减肥后为什么体重容易反弹?脂肪细胞竟然有“肥胖记忆”!

很多朋友都有过这样的经历&#xff1a;辛辛苦苦减下来的体重&#xff0c;没过多久就又悄悄爬回来了。这背后&#xff0c;可能不只是“管不住嘴”那么简单。2024年12月&#xff0c;《Nature》杂志上的一项研究揭示了一个令人惊讶的真相&#xff1a;你的脂肪细胞&#xff0c;竟然…

作者头像 李华
网站建设 2026/4/23 12:35:20

智能体(Agent)

&#x1f4a1; 每天认识一个AI行业术语&#xff1a;智能体&#x1f916; 在人工智能的世界里&#xff0c;有一个术语你可能听说过&#xff0c;但不一定完全了解——智能体&#xff08;Agent&#xff09;。&#x1f50d; 智能体的定义&#xff1a;智能体&#xff0c;也被称为AI代…

作者头像 李华