FSM有限状态机(三段式)-Verilog实现

article/2025/9/19 22:09:37

一. 状态机理论基础

状态机基本概念:

状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。
以上是标准解释,其实状态机就是为了解决比如IIC协议这种状态多的模块,状态多意味着直接用使能来一一判断各功能触发与否会很复杂,那么此时用状态机就可以巧妙的将所有可能的状态“串”起来,简单根据实时情况实现功能的跳变;所有逻辑顺序和时序规律的事情都可以适合用状态机来描述。
在这里插入图片描述

有限状态机类型:

第一类:若输出只和状态有关而与输入无关,则称为Moore状态机
第二类:输出不仅和状态有关而且和输入有关系,则称为Mealy状态机
两个状态机类型都常用,但一般Moore型状态机消耗的状态会比Mealy多

有限状态机的verilog三种具体实现方式:

分别有一、二、三段式状态机实现方式,这里推荐使用三段式状态机(大部分情况下,有时2段式会更好)
所谓一、二、三段粗暴理解就是可以分别使用一、二、三个always块去实现一有限个状态机
一段式:“状态变量变化,状态转移,输出” 三者全部放到一个always模块里面去实现,新手往往就会这样做,虽然这样似乎比较符合思 路,但这 样写出来的代码过于冗长,难以维护更新,还不符合时序逻辑和组合逻辑分开写的要点,因此不推荐。
二段式:将状态变量变化独立到一个always模块时序逻辑实现,状态转移和输出放到一个always模块里面组合逻辑实现,这样输出容易产生毛刺等不稳定因素。
三段式:在二的基础上,将输出独立时序逻辑输出,可以理解为独立到一个always块中用时钟沿触发,这样做层次分明,可读性强,维护简单,输出还稳定,时序逻辑可以有效“过滤输出”毛刺的问题,但是有些情况下二段式性能会更好,因为输出不用等拍,直接输出。

如何写一个高质量的状态机:

1、安全性:综合实现无毛刺异常扰动,状态机要完备,既不会进入死循环,哪怕偶然跑偏也能恢复到正常状态(三度段式+状态完备);
2、速度:速度要快,满足设计频率的要求;
3、面积:面积要小,满足设计的面积要求;
4、易懂易维护性:FSM设计要清晰易懂,易维护(采用三段式)。

2、3需要有较强的电路时序分析功底才能比较好的优化,要非常熟悉verilog综合(DC)出来的电路情况,要有一定的静态时序分析(STA)和优化的能力,初学者能做好1、4就很不错了。

二.Verilog实现状态机例子

2.1FSM实现实现11010110序列输出

状态机设计
module FSM_gener(input					clk,input					rst_n,output reg				data_current
);//变量分配定义reg	[3:0] state_current;reg	[3:0] state_next;reg 	  data_next;localparam       			//使用格雷码,减少数据翻转,减小误码率和功耗IDEL  = 4'b0000,ONE   = 4'b0001,TWO   = 4'b0011,THREE = 4'b0010,FOUR  = 4'b0110,FIVE  = 4'b0111,SIX   = 4'b0101,SEVEN = 4'b0100,EIGHT  = 4'b1100;//第一段状态机,时序逻辑状态更新always@( posedge clk or negedge rst_n ) beginif( !rst_n )state_current <= IDEL;elsestate_current <= state_next;end//第二段状态机,组合逻辑状态判断跳转always@( * ) begincase( state_current )IDEL:beginstate_next <= ONE;	data_next <= 1'b0;endONE:beginstate_next <= TWO;data_next <= 1'b1;endTWO: beginstate_next <= THREE;data_next <= 1'b1;endTHREE:beginstate_next <= FOUR;data_next <= 1'b0;endFOUR:beginstate_next <= FIVE;data_next <= 1'b1;endFIVE:beginstate_next <= SIX;data_next <= 1'b0;endSIX: beginstate_next <= SEVEN;data_next <= 1'b1;endSEVEN:beginstate_next <= EIGHT;data_next <= 1'b1;endEIGHT:beginstate_next <= IDEL;data_next <= 1'b0;enddefault:beginstate_next <= IDEL;data_next <= 1'b0;endendcaseend//第三段状态机,时序逻辑数据输出always@( posedge clk or negedge rst_n ) beginif( !rst_n )data_current <= 1'b0;elsedata_current <= data_next;endendmodule
仿真验证
`timescale 1ns/1ns
`define clock_period 20module FSM_gener_tb();reg					clk;reg					rst_n;wire				data_current;FSM_gener FSM_gener0(.clk(clk),.rst_n(rst_n),.data_current(data_current));initial begin clk = 1'b1; endalways#( `clock_period )    clk = ~clk;initial beginrst_n = 0;#( `clock_period*10  );rst_n = 1;		#( `clock_period*10 + 1'b1 );#( `clock_period*50 );$stop;endendmodule

仿真结果如下所示,状态机循环输出11010110满足设计要求
在这里插入图片描述

2.2 连续字符串"1101"检测

点击此处访问链接https://blog.csdn.net/weixin_42455055/article/details/119832332


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

相关文章

Verilog描述有限状态机(一段式、二段式、三段式)

有限状态机&#xff08;FSM&#xff09;的输出取决于过去状态以及当前输入&#xff0c;是时序逻辑电路。适合描述那些发生有先后顺序或者有逻辑规律的事情&#xff0c;状态机的本质就是对具有逻辑顺序或时序规律的事件进行描述的一种方法&#xff0c;广泛用于多种场合。 因此&…

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

目录 基础概念介绍 状态机的要素 FSM的分类 Verilog描述状态机的方法 一段式描述 两段式描述 三段式描述 结语 基础概念介绍 今夜闲来无事&#xff0c;忽然想到最近准备复习一下Verilog语法&#xff0c;所以就侃一侃状态机吧&#xff01; 状态机根据状态的数量可以分为两…

三段式状态机-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…