以爱情规律为例,浅谈三段式描述状态机

article/2025/9/19 22:27:05

目录

基础概念介绍

状态机的要素

FSM的分类

Verilog描述状态机的方法

一段式描述

两段式描述

三段式描述

 结语


基础概念介绍

        今夜闲来无事,忽然想到最近准备复习一下Verilog语法,所以就侃一侃状态机吧!

        状态机根据状态的数量可以分为两种:有限状态机(Finite State Machine)和无限状态机(Infinite State Machine),本篇文章主要讨论有限状态机的一段式,二段式,和三段式的写法。

        状态机是一种思想方法,往往我们自己就是一台状态机器。

        我们常常说“唉,女友又和我吵架了,所以我最近不在状态呀”来解释自己最近情绪低落,工作不积极的原因。

        从状态机的角度来说就是从 “积极状态” 转变到了“消极状态” ,这就是所谓状态切换,状态切换的条件是“女朋友和我分手了”,对应的人在不同状态也会有不同的表现,这就是状态机的输出

        然后过了几天,当我们又找到新的女朋友时,我们又会回到积极的状态,如此往复。

        从上我们可以看出,其实状态机特别适合用来描述具有先后顺序或者逻辑规律的事情,这就是状态机的本质。

状态机的要素

  • 状态,用来划分逻辑顺序和时序规律
  • 输入,状态改变的条件
  • 输出,某个状态特定发生的事件

FSM的分类

         这两者的区别就在于,如果Mealy和女朋友吵架时还被女朋友打了,他会生气,如果没有被打,他会心里难过,但Moore这个人吧和女朋友吵架了无论有没有被打,只会因为吵架而心里难过。

Verilog描述状态机的方法

        好了,扯淡时间结束,下面我们聊一点干货!

        上面的状态转移图来自HDLBits,这是一个很号的Verilog语法练习网站。描述的是一个两状态的Moore型状态机(输出只与状态有关,与输入无关)

一段式描述

        所谓一段式描述就是将状态转移和状态输出还有状态转移判断都写在一个always块

// Note the Verilog-1995 module declaration syntax here:
module top_module(clk, reset, in, out);input clk;input reset;    // Synchronous reset to state Binput in;output out;//  reg out;parameter A=1'b1,B=1'b0;reg present_state;always @(posedge clk or posedge reset) beginif (reset) begin  present_state <= B;out <= 1'b1;end else begincase (present_state)A:beginif(in) beginpresent_state <= A; //状态转移out <=1'b0; //状态输出endelse beginpresent_state <= B;out <= 1'b1;endendB:beginif(in) beginpresent_state <= B;out <=1'b1;endelse beginpresent_state <= A;out <= 1'b0;endendendcaseendendendmodule

        这样当然能够成功描述出状态转移图所示的状态机,但是因为输入进入时序电路是异步的,所以状态转移判断的电路应该写成组合逻辑,写成一段式相当于把组合逻辑和时序逻辑混写 这样不符合 Verilog组合逻辑和时序逻辑分开描述的代码风格,同时我个人理解:

一段式状态机会延长关键路径,降低状态机性能。

两段式描述

        两段式描述的显著特点有两个:

  1. 状态转移为时序电路
  2. 次态判断状态输出为组合电路
// Note the Verilog-1995 module declaration syntax here:
module top_module(clk, reset, in, out);input clk;input reset;    // Synchronous reset to state Binput in;output out;//  reg out;parameter A = 1'b1,B=1'b0;// Fill in state name declarationsreg present_state, next_state;always@(posedge clk)begin //状态转移if(reset == 1'b1)present_state <= B;else present_state <= next_state;endalways @(*) begincase (present_state) //次态判断,组合逻辑A: if(in)next_state = A;elsenext_state = B;B:if(in)next_state = B;elsenext_state = A;default:next_state = B;// Fill in state transition logicendcasecase (present_state) //输出,组合逻辑A: out = 1'b0;B: out = 1'b1; // Fill in output logicendcaseendendmodule

小技巧:两段式状态机的模板为两个always,一个为 状态转移(@clk)、输出与次态判断(@*) ,以及两个状态 present_statenext_state

         但是两段式的状态机也有缺点,那就是输出为组合逻辑,容易产生毛刺,因此有条件最好在输出的位置插入一个寄存器。

三段式描述

        三段式是在两段式的基础上解决了组合逻辑输出毛刺的问题

  1. 状态转移(时序)
  2. 次态判断(组合)
  3. 电路输出(时序)

        这时总会有个聪明哥站出来说上一句:“哎呀,你把电路输出写成时序逻辑那么输出要延后了呀!”

        请大家试想一下,如果我们电路输出的组合逻辑是根据现态来决定输出的,并且我们暂定状态在每个时钟周期,从A到B再到A这样循环。当state为A时,组合逻辑输入使得next_state为B,下一次时钟沿来临时,next_state将被传递给present_state,此时如果输出的时序逻辑模块是根据现态判断输出(即case语句是判断present_state),那么在B状态的起始,输出的内容将为A状态的输出,并且直到下次时钟沿来临才会改变。

        因此,电路输出将根据next_state来决定。 

// Note the Verilog-1995 module declaration syntax here:
module top_module(clk, reset, in, out);input clk;input reset;    // Synchronous reset to state Binput in;output out;//  reg out;parameter A = 1'b1,B=1'b0;// Fill in state name declarationsreg present_state, next_state;always@(posedge clk)begin //状态转移if(reset == 1'b1)present_state <= B;else present_state <= next_state;endalways @(*) begin//次态判断,组合逻辑case (present_state) A: if(in)next_state = A;elsenext_state = B;B:if(in)next_state = B;elsenext_state = A;default:next_state = B;// Fill in state transition logicendcaseendalways@(posedge clk)begin //电路输出,时序逻辑if(reset)out <= 1'b1;elsebegincase(next_state)A: out <= 1'b0;B: out <= 1'b1;default:out <= 1'b1;endcaseendendendmodule

小技巧:三段式状态机的要点:两个状态(present_state)与三个always(状态转移@(posedge clk)、电路输出@(posedge clk)、次态判断always@(*)) 

 结语

        正所谓,天下武功,唯快不破同样,天下代码,唯练不破。状态机是一种方法论,不仅仅存在于时序电路,更是在编程算法和现实生活中广为存在,可以说,万物本质皆为状态机,我们要保留一颗融会贯通的心,这样学习才能得心应手,游刃有余,好吧今天的成语大会到此结束!


http://chatgpt.dhexx.cn/article/DtJI7C4S.shtml

相关文章

三段式状态机-FSM

三段式代码多&#xff0c;但是有时钟同步&#xff0c;延时少&#xff0c;组合逻辑跟时序逻辑分开并行出错少。 (1)同步状态转移 &#xff08;2&#xff09;当前状态判断接下来的状态 &#xff08;3&#xff09;动作输出 如果程序复杂可以不止三个always 。always 后常接cas…

一段式、两段式和三段式状态机

这里写自定义目录标题 一段式两段式三段式 这张图片是mealy型状态机的结构&#xff0c;Moore型类似&#xff0c;输出与输入无关。 一段式 module moduleName (input clk,input rst_n,input in,output reg [3:0] out );localparam s14d0, s24d1, s34d2, s44d3, s54d4; reg [3:…

FPGA开发基础之三段式状态机

状态机由状态寄存器和组合逻辑电路构成&#xff0c;能够根据控制信号按照预先设定的状态进行状态转移&#xff0c;程序的运行其本质也是状态机&#xff0c;根据输入完成输出&#xff0c;得到新的状态。 在平时硬件电路的设计中经常需要用到状态机&#xff0c;例如CPU的取指、译…

关于三段式状态机第三段是组合逻辑还是时序逻辑的问题?

由于本人一直以来&#xff0c;用的三段式状态机&#xff0c;第三段写法都是组合逻辑写法&#xff0c;但是近期有小伙伴面试小公司&#xff0c;写到状态机的第三段时候&#xff0c;按照我一直用到的组合逻辑来写第三段&#xff0c;提供输出&#xff0c;被提出了质疑&#xff0c;…

【状态机设计】Moore、Mealy状态机、三段式、二段式、一段式状态机书写规范

目录 状态机介绍 状态机类型 Moore 型状态机 Mealy 型状态机 状态机设计流程 自动售卖机 状态机设计&#xff1a;3 段式&#xff08;推荐&#xff09; 实例 实例 状态机修改&#xff1a;2 段式 实例 状态机修改&#xff1a;1 段式&#xff08;慎用&#xff09; 实…

状态机的描述方法案例分析(一段式、二段式、三段式)

上篇博文讲了&#xff1a;FPGA中有限状态机的状态编码采用格雷码还是独热码&#xff1f; 那篇博文讲了状态机的状态编码是用格雷码还是独热码的问题&#xff0c;以及两者之间的优劣。状态机的描述方式采用的是一段式描述方式&#xff0c;也就是将整个状态机全部写到一个always…

FPGA状态机(一段式、二段式、三段式)、摩尔型(Moore)和米勒型(Mealy)

1、状态机 1.1、理论 FPGA不同于CPU的一点特点就是CPU是顺序执行的&#xff0c;而FPGA是同步执行&#xff08;并行&#xff09;的。那么FPGA如何处理明显具有时间上先后顺序的事件呢&#xff1f;这个时候我们就需要使用到状态机了。 状态机简写为 FSM&#xff08;Finite Sta…

三段式状态机_verilog

这是一篇转载的文章&#xff0c;但是个人理解笔者将前两个always块结构搞错了&#xff0c;自行纠正了一下。 原文链接 https://www.jianshu.com/p/5eee434ab24d 1. 三段式要求 有限状态机采用三段式风格&#xff0c;即三个always块描述状态机. 第一个时序逻辑always块用来描…

2021-08-21Verilog三段式状态机的写法,标准示例和仿真。

Verilog三段式状态机的写法&#xff0c;标准示例和仿真。 第一段&#xff1a;同步状态转移。第一个always块格式化描述次态寄存器迁移到现态寄存器。 第二段&#xff1a;当前状态判断接下来的状态。组合逻辑always模块&#xff0c;描述状态转移条件判断用current_state 第三段&…

verilog 3段式状态机

3段式状态机&#xff1a; 3段式状态机写法&#xff0c;写出下图状态转换图。 1 确定输入输出信号&#xff0c;及其类型&#xff08;是wire还是reg&#xff09;&#xff1b; 2 声明内部信号&#xff0c;一般需要定义current_state和next_state&#xff1b; 3 用3个always语句描…

三段式状态机设计

状态机设计需满足的几个要求&#xff1a; 1. 三段式要求 有限状态机采用三段式风格&#xff0c;即三个always块描述状态机. 第一个组合逻辑always块用来描述下一状态的转移&#xff08;next state logic&#xff09; 第二个时序逻辑always块用来描述当前状态.&#xff08;cur…

三段式状态机浅析

三段式状态机 文章目录 三段式状态机三段式状态机优点书写格式formater整形器状态机书写举例 关注作者 三段式状态机优点 将组合逻辑与时序逻辑分开&#xff0c;所写代码层次清晰&#xff0c;方便理解和后续的维护相较两段式状态机&#xff0c;解决了输出毛刺的影响。 书写格…

(三段式)有限状态机【原理+实例】

状态机的基本要素&#xff1a;输入、输出、状态。 状态机根据状态变化是否与输入条件有关分为两类&#xff1a;即Moore型状态机和Mealy型状态机。 Moore型状态机的状态变化仅和当前状态有关&#xff0c;而与输入条件无关&#xff1b; Mealy型状态机的状态变化不仅和当前状态…

状态机设计(一段式、两段式和三段式)

三段式状态机 第一段&#xff0c;时序always块&#xff0c;状态跳转 第二段&#xff0c;组合always块&#xff0c;状态更新 第三段&#xff0c;时序always块&#xff0c;输出控制 两段式状态机 两段式状态机是把三段式状态机的第二段和第三段合为一段&#xff0c;那么两段式…

FPGA——三段式状态机(1)

状态机全称是有限状态机&#xff08;Finite State Machine、FSM&#xff09;&#xff0c;是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。状态机可根据控制信号完成预定的状态转换&#xff0c;由组合逻辑电路和寄存器组成&#xff0c;可由状态转换表或状态转…

状态机详解(一段式、二段式、三段式)

一、有限状态机FSM&#xff08;Finite State Machine&#xff09; 组成元素&#xff1a; 输入、状态、状态转移条件、输出。 可以分为两类&#xff1a; Mealy状态机&#xff1a;时序逻辑的输出不仅取决于当前状态&#xff0c;还与输入有关&#xff1b; Moore状态机&#xff1a…

三段式状态机理解浅析

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a;https://blog.csdn.net/weixin_43070186/article/details/82085463 关于FSM的写法按照always块的个数来划分可以分为一段式…

彻底搞懂状态机(一段式、两段式、三段式)

转自&#xff1a;https://blog.csdn.net/wordwarwordwar/article/details/78509445 实例&#xff1a;FSM实现10010串的检测 状态转移图&#xff1a;初始状态S0&#xff0c;a 0,z 0.如果检测到1&#xff0c;跳转到S1。 下一状态S1&#xff0c;a 1,z 0.如果检测到0&#xff…

Verilog:三段式状态机(数字钟)

状态机在FPGA的设计中是至关重要的&#xff0c;使用的频率也很高&#xff0c;废话不多说在这里介绍一下三段式状态机如何设计。 设计状态机首先要清楚状态有几种&#xff0c;状态转移图是怎样的&#xff0c;各个状态的输出是怎样的。了解了这三样之后就可以开始设计实验所需要的…

三段式有限状态机

一段式、二段式、三段式状态机是按照书写FSM时使用的always块数目进行划分的&#xff0c;一般而言对于简单的状态机&#xff0c;可以使用一段式&#xff0c;其代码量以及使用资源都最少&#xff0c;但如果状态机较复杂&#xff0c;一段式状态机会对代码维护产生很大的不便&…