0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FSM状态机序列检测的方法

冬至子 来源:FPGA探索者 作者:FPGA探索者 2023-06-26 16:45 次阅读

(1)了解状态机:什么是 摩尔型状态机 ,什么是 米利型状态机 ,两者的区别是什么?一段式、二段式、三段式状态机的区别?

(2)使用 状态机产生序列 “11010110”,串行循环输出该序列;

(3)使用 状态机检测“1101” ,串行输入的测试序列为“11101101011010”,输出信号为valid有效信号,检测到时输出高,否则为低, 考虑序列叠加情况 ,比如“1101101”,则有两个“1101”,

即:

1.jpg

11101101011010,在第5个时钟检测到序列,下一个时钟输出高电平;

11101101011010,在第8个时钟检测到序列,下一个时钟输出高电平;

11101101011010,在第13个时钟检测到序列,下一个时钟输出高电平;

给出WORD或PDF版本的报告,包括但不限于文字说明、代码、仿真测试图等。

【解答】:

状态机类型

状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。有限状态机简写为 FSM(Finite State Machine) ,主要分为2大类:

第一类,输出只和状态有关而与输入无关,则称为Moore状态机;

第二类,输出不仅和状态有关而且和输入有关系,则称为Mealy状态机。

** Mealy** :输出信号不仅取决于当前状态,还取决于输入;

** Moore** :输出信号只取决于当前状态;

实现相同的功能时, Mealy型比Moore型能节省一个状态 (大部分情况下能够节省一个触发器资源,其余情况下使用的资源相同,视状态数和状态编码方式决定), Mealy型比Moore型输出超前一个时钟周期

三段式状态机

一段式一个****always ,既描述状态转移,又描述状态的输入输出,当前状态用寄存器输出。一段式写法简单,但是不利于维护,状态扩展麻烦,状态复杂时易出错,不推荐

二段式两个****always ,时序逻辑与组合逻辑分开,一个always块采用同步时序描述状态转移;另一个always块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出, 当前状态用组合逻辑输出,可能出现竞争冒险,产生毛刺,而且不利于约束 ,不利于综合器和布局布线器实现高性能的设计;

三段式三个****always ,一个always模块采用同步时序描述状态转移;一个always采用组合逻辑判断状态转移条件,描述状态转移规律;第三个always块使用同步时序描述状态输出,寄存器输出。

三段式与二段式相比,关键在于根据状态转移规律,在上一状态根据输入条件判断出当前状态的输出,从而在不插入额外时钟节拍的前提下,实现了寄存器输出。

状态机序列检测

使用三段式FSM有限状态机进行序列检测 ,使用 摩尔型状态机 ,最终输出与输入无关。

使用状态机检测“1101”,串行输入的测试序列为“11101101011010”,输出信号为valid有效信号,检测到时输出高,否则为低, 考虑序列叠加情况 ,比如“1101101”,则有两个“1101”,

即:

1.jpg

11101101011010,在第5个时钟检测到序列,下一个时钟输出高电平;

11101101011010,在第8个时钟检测到序列,下一个时钟输出高电平;

11101101011010,在第13个时钟检测到序列,下一个时钟输出高电平;

根据待检测的序列“1101”确定状态,其中:

S1为检测到第1个有效位“1”;

S2为检测到2个有效位“11”;

S3为检测到3个有效位“110”;

S4位检测到4个有效位“1101”;

IDLE为其他状态;

IDLE:初始状态,除S1~S4外的其他所有状态

S1:1, 来1则到S2(11),否则回到IDLE;

S2:11, 来0则到S3(110),否则保持S2(11);

S3:110, 来1则到S4(1101),否则回到IDLE;

S4:1101, 来1则到S2(11),否则回到IDLE;

摩尔型,输出和输入无关,S4时无论输入什么,都输出1

图片

图片

三段式FSM的代码:

/************************************************************
**   Author    :FPGA探索者公众号
**   Times      :2020-7-7
************************************************************/
module FSM_SequDetection_1(
       clk,
       rst_n,
       data_in,
       data_valid
);

input clk;
input rst_n;
input data_in;
output reg data_valid;

//定义状态,这里采用的独热码(One-Hot),FPGA中推荐用独热码和格雷码(Gray)
//状态较少时(4-24个状态)用独热码效果好,状态多时格雷码(状态数大于24)效果好
parameter IDLE = 5'b00001;
parameter S1       = 5'b00010;
parameter S2       = 5'b00100;
parameter S3       = 5'b01000;
parameter S4       = 5'b10000;

reg [4:0] current_state;             //现态
reg [4:0] next_state;                 //次态

//三段式FSM,第一段,同步时序逻辑,描述状态切换,这里的写法固定
always @ ( posedge clk )
begin
       if(!rst_n ) begin
              current_state<= IDLE;
       end
       elsebegin
              current_state<= next_state;
       end
end

//三段式FSM,第二段,组合逻辑,判断状态转移条件,描述状态转移规律
//这里面用"="赋值和用"<="没区别
always @ (*)
begin
       if(!rst_n ) begin
              next_state<= IDLE;
       end
       elsebegin
              case(current_state )
                     IDLE:    begin
                            if(data_in == 1 )
                                   next_state<= S1;
                            else
                                   next_state<= IDLE;
                     end
                     S1   :      begin
                            if(data_in == 1 )
                                   next_state<= S2;
                            else
                                   next_state<= IDLE;
                     end
                     S2   :      begin
                            if(data_in == 0 )
                                   next_state<= S3;
                            else
                                   next_state<= S2;
                     end
                     S3   :      begin
                            if(data_in == 1 )
                                   next_state<= S4;
                            else
                                   next_state<= IDLE;
                     end
                     S4   :      begin
                            if(data_in == 1 )
                                   next_state<= S2;
                            else
                                   next_state<= IDLE;
                     end
                     default   : begin
                            next_state<= IDLE;
                     end
              endcase
       end
end

//三段式FSM,第三段,同步时序逻辑,描述状态输出,摩尔型输出
always @ ( posedge clk )
begin
       if(!rst_n ) begin
              data_valid<= 1'b0;
       end
       elsebegin
              case(next_state )
                     S4   : data_valid <= 1'b1;
                     default   : data_valid <= 1'b0;
              endcase
       end
end

endmodule

综合后的RTL图:

图片

其中,状态机部分为:

图片

这里的状态机考虑到复位的情况,不论处在哪个状态,当复位信号有效时,均回到IDLE初始状态。

仿真测试文件(TestBench):

/************************************************************
**   Author    :FPGA探索者公众号
**   Times      :2020-7-7
************************************************************/
`timescale 1 ns/1 ns


module FSM_2_tb();


reg clk;
reg rst_n;
reg data_in;
wire data_valid;


FSM_SequDetection   U1(
  .clk(clk),
  .rst_n(rst_n),
  .data_in(data_in),
  .data_valid(data_valid)
);


initial 
begin 
  clk = 0;
  rst_n = 0;
  #15;
  rst_n = 1;
  data_in = 1;#10;
  data_in = 1;#10;
  data_in = 1;#10;
  data_in = 0;#10;
  data_in = 1;#10;
  data_in = 1;#10;
  data_in = 0;#10;
  data_in = 1;#10;
  data_in = 0;#10;
  data_in = 1;#10;
  data_in = 1;#10;
  data_in = 0;#10;
  data_in = 1;#10;
  data_in = 0;#10;
  #50;
  $stop;  //停止仿真
end 


always #5 clk = ~clk;


endmodule

ModelSim仿真如下,输入“1_1101101_0_1101”,检测到3次有效的“1101”。

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RTL
    RTL
    +关注

    关注

    1

    文章

    385

    浏览量

    59849
  • 状态机
    +关注

    关注

    2

    文章

    492

    浏览量

    27564
  • fsm
    fsm
    +关注

    关注

    0

    文章

    35

    浏览量

    12828
  • 状态寄存器
    +关注

    关注

    0

    文章

    39

    浏览量

    7106
  • MODELSIM仿真
    +关注

    关注

    0

    文章

    15

    浏览量

    7321
收藏 人收藏

    评论

    相关推荐

    Verilog状态机+设计实例

    在verilog中状态机的一种很常用的逻辑结构,学习和理解状态机的运行规律能够帮助我们更好地书写代码,同时作为一种思想方法,在别的代码设计中也会有所帮助。 一、简介 在使用过程中我们常说
    的头像 发表于 02-12 19:07 4214次阅读
    Verilog<b class='flag-5'>状态机</b>+设计实例

    状态机编程

    ,有限状态机FSM)是实时系统设计中的一种数学模型,是一种重要的、易于建立的、应用比较广泛的、以描述控制特性为主的建模方法,它可以应用于从系统分析到设计(包括硬件、软件)的所有阶段。很多实时系统,特别是
    发表于 07-10 18:00

    浅谈有限状态机FSM——以序列检测为例

    :1101序列检测器Mealy状态机状态转移图1101序列检测器Moore
    发表于 09-25 09:35

    如何去实现有限状态机FSM的程序设计呢

    什么是有限状态机FSM呢?如何去实现有限状态机FSM的程序设计呢?
    发表于 01-21 07:04

    使用ModelSim自动生成状态机FSM状态转换图

    HDL代码设计中重要的内容之一就是设计程序的状态机FSM状态转换控制着整个程序的流程,为了理解程序,我们经常需要把状态机状态转换图画出来
    发表于 02-10 15:39 1.5w次阅读
    使用ModelSim自动生成<b class='flag-5'>状态机</b><b class='flag-5'>FSM</b>的<b class='flag-5'>状态</b>转换图

    初学者对有限状态机FSM)的设计的认识

    有限状态机FSM)是一种常见的电路,由时序电路和组合电路组成。设计有限状态机的第一步是确定采用Moore状态机还是采用Mealy状态机
    发表于 02-11 13:51 4323次阅读
    初学者对有限<b class='flag-5'>状态机</b>(<b class='flag-5'>FSM</b>)的设计的认识

    Linux编程之有限状态机FSM的理解与实现

    有限状态机(finite state machine)简称FSM,表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用。
    发表于 05-15 16:53 2028次阅读
    Linux编程之有限<b class='flag-5'>状态机</b><b class='flag-5'>FSM</b>的理解与实现

    使用函数指针的方法实现状态机

    之前写过一篇状态机的实用文章,很多朋友说有几个地方有点难度不易理解,今天给大家换种简单写法,使用函数指针的方法实现状态机状态机简介 有限状态机
    的头像 发表于 10-19 09:36 2424次阅读
    使用函数指针的<b class='flag-5'>方法</b>实现<b class='flag-5'>状态机</b>

    摩尔型状态机与米利型状态机的区别是什么

    FSM有限状态机序列产生,序列检测,是FPGA和数字IC相关岗位必须要掌握的知识点,在笔试和面试中都非常常见。
    的头像 发表于 03-14 17:42 1.8w次阅读

    Verilog状态机的类型

    有限状态机(Finite-State Machine,FSM),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
    的头像 发表于 06-01 15:23 1919次阅读
    Verilog<b class='flag-5'>状态机</b>的类型

    序列检测一定要用状态机吗?

    那些年,你总是不停的说序列检测,每当有人谈到序列检测你便说自己会一、二、三段式moore、mealy型状态机,茴字有几种写法...
    的头像 发表于 06-26 16:52 809次阅读
    <b class='flag-5'>序列</b><b class='flag-5'>检测</b>一定要用<b class='flag-5'>状态机</b>吗?

    基于LSM6DSOX的FSM状态机的腕部动作识别

    电子发烧友网站提供《基于LSM6DSOX的FSM状态机的腕部动作识别.pdf》资料免费下载
    发表于 07-31 10:23 0次下载
    基于LSM6DSOX的<b class='flag-5'>FSM</b><b class='flag-5'>状态机</b>的腕部动作识别

    什么是状态机状态机的种类与实现

    状态机,又称有限状态机(Finite State Machine,FSM)或米利状态机(Mealy Machine),是一种描述系统状态变化
    的头像 发表于 10-19 10:27 9735次阅读

    什么是有限状态机?如何解决传统有限状态机状态爆炸」问题?

    有限状态机(Finite State Machine,简称FSM)是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列以及如何响应来自外界的各种事件。
    的头像 发表于 02-17 16:09 6280次阅读
    什么是有限<b class='flag-5'>状态机</b>?如何解决传统有限<b class='flag-5'>状态机</b>「<b class='flag-5'>状态</b>爆炸」问题?

    在Verilog中实现Moore型和Mealy型状态机方法简析

    编写能够被综合工具识别的状态机,首先需要理解状态机的基本概念和分类。状态机(FSM)是表示有限个状态以及在这些
    的头像 发表于 05-01 11:38 1684次阅读