【 FPGA 】序列检测器 11010 (mealy状态机,moore状态机)

这篇具有很好参考价值的文章主要介绍了【 FPGA 】序列检测器 11010 (mealy状态机,moore状态机)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.mealy状态机和moore状态机me

        状态机是硬件电路设计的常用的描述工具,也是电路设计的重要思想。很早之前我就知道mealy状态机和moore状态机,但是对两者的差别不是非常的清楚,最近在学习系列检测器的设计时对这两种状态机和一段式、三段式状态机有了更深刻的了解,在这里分享自己的见解给大家。有什么理解不准确的地方也希望大家指正。

1.1序列检测器

        在介绍两种状态机之前首先先介绍一下序列检测器。

        序列检测器:从一串数据流中找到需要检测的序列号。例如如下一串数据流,需要检测的序列为11010,则每一次检测到11010时序列检测器需要输出一次使能。

mealy状态机,fpga开发,硬件工程,学习        设计该电路就可以使用状态机来实现。接下来讲解两种状态机区别和用这两种状态机实现该电路的状态图。

1.2.mealy状态机和moore状态机区别

        mealy状态机:输出由当前状态机状态和控制信号共同决定。

        moore状态机:输出仅仅取决于当前的状态机状态。

        下图时两种状态机的状态转移图 

mealy状态机,fpga开发,硬件工程,学习

mealy状态机,fpga开发,硬件工程,学习

        首先解释两种状态机的工作:

        1.mealy状态机:s0状态表示一个最初状态,该状态检测到1表示序列11010的第一个1被检测到,跳转到s1,此时需要检测11010的第二个1,当在检测到第二个1时,跳转到s2,一次类推到跳转到s4,此时如果下一时刻检测到0,则表示检测到了所需要的序列,输出正确。

具体状态解释:s0:等待检测第一个需要的序列

                        s1:已经检测到1,等待检测到第二位1

                        s2:已经检测到11,等待检测第三位0    

                        s3:已经检测到110, 等待检测第四位1

                        s4:已经检测到1101,等待检测第五位0

        检测成功条件:状态机处于s4状态,并且下一个时刻输入的检测信号是0

        2.moore状态机:s0表示一个空闲状态,该状态等待第一位1的到来,当检测到第一个1后,跳转到s1,等待检测第二位1,一次类推直到跳转到s5。

具体状态解释:s0:等待检测第一个需要的序列

                        s1:已经检测到1,等待检测到第二位1

                        s2:已经检测到11,等待检测第三位0    

                        s3:已经检测到110, 等待检测第四位1

                        s4:已经检测到1101,等待检测第五位0

                        s5:已经检测到11010

        检测成功条件:状态机处于s5状态。

        在该电路中,两种状态机本质上,moore状态机是比mealy多一个s5状态,moore状态机就是通过判定是否处于该状态来判定条件是否正确,而mealy状态机则时通过s4状态以及下一个时刻的条件信号是否有效来判定条件是否正确。

2.序列检测器的verilog代码实现

2.1.mealy状态机verilog实现ssf

module sequence_11010_chack (
	input 					clk							,
	input					rst_p						,

    input                   sequence_num                ,

    output                  num_en                      
);

localparam s0   =   5'd0    ;
localparam s1   =   5'd1    ;
localparam s2   =   5'd2    ;
localparam s3   =   5'd4    ;
localparam s4   =   5'd8    ;
localparam s5   =   5'd16   ;  

reg [ 4   : 0 ] cur_state   ;
reg             chack_right ;

reg [ 4   : 0 ] next_state ;

//-----------------------------------------------------------------------
//-----mealy状态机
//---三段式实现
//--序列11010检测
//-----------------------------------------------------------------------

//第一段
always @(posedge clk) begin
    if(rst_p)
        cur_state <= 5'd0 ;
    else 
        cur_state <= next_state ;
end

//第二段
always @( *) begin
    case(cur_state)
        s0 : next_state = (sequence_num) ? s1 : s0 ;
        s1 : next_state = (sequence_num) ? s2 : s0 ;
        s2 : next_state = (sequence_num) ? s2 : s3 ;
        s3 : next_state = (sequence_num) ? s4 : s0 ;
        s4 : next_state = (sequence_num) ? s1 : s0 ;
        default : next_state = s0 ;
    endcase
end

//第三段
always @(posedge clk) begin
    if(rst_p)
        chack_right <= 1'b0 ;
    else begin
        case(cur_state)
            s4 :  chack_right <= (sequence_num) ? 1'b0 : 1'b1 ;
            default : chack_right <= 1'b0 ;
        endcase           
    end
end

assign num_en = chack_right ;

         mealy状态机输出与当前状态以及输入信号有关 可以看到代码中chack_right信号是由cur_state和sequence_num共同决定的。

2.2.moore状态机的Verilog代码实现

module sequence_11010_chack (
	input 					clk							,
	input					rst_p						,

    input                   sequence_num                ,

    output                  num_en                      
);

localparam s0   =   5'd0    ;
localparam s1   =   5'd1    ;
localparam s2   =   5'd2    ;
localparam s3   =   5'd4    ;
localparam s4   =   5'd8    ;
localparam s5   =   5'd16   ;  

reg [ 4   : 0 ] cur_state   ;
reg             chack_right ;

//-----------------------------------------------------------------------------
//----------Moore状态机
//---三段式
//--序列11010检测
//-----------------------------------------------------------------------------
reg [ 4   : 0 ] next_state ;

//第一段
always @(posedge clk) begin
    if(rst_p)
        cur_state <= 5'd0 ;
    else 
        cur_state <= next_state ;
end

//第二段
always @( *) begin
    case(cur_state)
        s0 : next_state = (sequence_num) ? s1 : s0 ;
        s1 : next_state = (sequence_num) ? s2 : s0 ;
        s2 : next_state = (sequence_num) ? s2 : s3 ;
        s3 : next_state = (sequence_num) ? s4 : s0 ;
        s4 : next_state = (sequence_num) ? s2 : s5 ;
        s5 : next_state = (sequence_num) ? s1 : s0 ;
        default : next_state = s0 ;
    endcase
end

//第三段
always @(*) begin
    case(cur_state)
        s5 :  chack_right = 1'b1 ;
        default : chack_right = 1'b0 ;
    endcase           
end

assign num_en = chack_right ;

        moore状态机输出只与当前状态有关,从代码中表示就是输出chack_right信号只要当cur_state处于s5就输出1,反之就输出0。

2.3.仿真代码

`timescale 1ns/1ps

module sequence_11010_chack_tb;

  // Parameters

  //Ports
  reg  clk=0;
  reg  rst_p=1;
  reg  sequence_num=0;
  reg [4:0] tb_data = 5'b11010;
  wire  num_en;

  sequence_11010_chack  sequence_11010_chack_inst (
    .clk(clk),
    .rst_p(rst_p),
    .sequence_num(sequence_num),
    .num_en(num_en)
  );

always #5  clk = ! clk ;

initial begin
    #201;
    rst_p = 1'b0 ;

    //1
    @(posedge clk)begin
        sequence_num <= tb_data[4]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[3]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[2]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[1]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[0]  ;
        tb_data <= {tb_data[3:0],tb_data[4]};
    end

    //2
    @(posedge clk)begin
        sequence_num <= tb_data[4]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[3]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[2]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[1]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[0]  ;
        tb_data <= {tb_data[3:0],tb_data[4]};
    end

    //3
    @(posedge clk)begin
        sequence_num <= tb_data[4]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[3]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[2]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[1]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[0]  ;
        tb_data <= {tb_data[3:0],tb_data[4]};
    end
    
    //4
    @(posedge clk)begin
        sequence_num <= tb_data[4]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[3]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[2]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[1]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[0]  ;
        tb_data <= {tb_data[3:0],tb_data[4]};
    end

    //5
    @(posedge clk)begin
        sequence_num <= tb_data[4]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[3]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[2]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[1]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[0]  ;
        tb_data <= {tb_data[3:0],tb_data[4]};
    end

    //6
    @(posedge clk)begin
        sequence_num <= tb_data[4]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[3]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[2]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[1]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[0]  ;
        tb_data <= {tb_data[3:0],tb_data[4]};
    end

    //7
    @(posedge clk)begin
        sequence_num <= tb_data[4]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[3]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[2]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[1]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[0]  ;
        tb_data <= {tb_data[3:0],tb_data[4]};
    end

    //移位方向改变

    //1
    @(posedge clk)begin
        sequence_num <= tb_data[4]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[3]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[2]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[1]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[0]  ;
        tb_data <= {tb_data[0],tb_data[4:1]};
    end

    //2
    @(posedge clk)begin
        sequence_num <= tb_data[4]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[3]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[2]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[1]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[0]  ;
        tb_data <= {tb_data[0],tb_data[4:1]};
    end

    //3
    @(posedge clk)begin
        sequence_num <= tb_data[4]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[3]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[2]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[1]  ;
    end
    @(posedge clk)begin
        sequence_num <= tb_data[0]  ;
        tb_data <= {tb_data[0],tb_data[4:1]};
    end

    #100; 
    $stop;
end

endmodule

仿真结果如下:

mealy状态机,fpga开发,硬件工程,学习

 3.Reference

本文参考了csdn、知乎上相关文章。如果存在什么问题请指正!!!

完成工程和仿真代码如下链接免费下载:【免费】verilog序列检测器,序列11010,(mealy状态机和moore状态机)资源-CSDN文库文章来源地址https://www.toymoban.com/news/detail-754105.html

到了这里,关于【 FPGA 】序列检测器 11010 (mealy状态机,moore状态机)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • “01110”双输入口序列检测器的Verilog设计

    设计一个序列检测功能的时序电路,如图所示。其输入信号有clr、clk、A、 B,输出信号Z。其中clk为时钟信号, clr是低电平有效的异步复位信号,A、B是输入数据信号。有一个二进制串行数据D0D1D2D3……Dx,以两位为一组顺序送入电路,D0送入A,D1送到B,以此类推。电路检测此

    2024年02月12日
    浏览(43)
  • 实验四 用集成移位寄存器实现序列检测器

    一、实验要求 用移位寄存器和与非门设计一个 1101 序列检测器。电路连续不停地工作,对 串行输入的序列进行检测,当连续检测 4 个码元符合检测码 1101 时,检测器输出 为 1 ,指示灯亮,其他情况下输出为 0 ,指示灯灭。 二、实验设备 1 . Mini-FPGA 开发板( Cyclone IV 系列

    2024年02月03日
    浏览(46)
  • 利用Verilog HDL实现序列检测器,附上仿真程序。

    序列检测器的逻辑功能就是将一个指定的比特序列从一串较长的比特流中识别出来。 例如:针对一个较长的比特流010010010011110101010…,我们希望能将比特序列为“10010”的序列检测出来,并且每次检测到10010就将输出置“1”. 注意:如序列”100100100…\\\",根据以上的介绍,会在

    2024年02月06日
    浏览(65)
  • 序列检测器(两种设计方法和四种检测模式|verilog代码|Testbench|仿真结果)

    目录 一、前言 二、状态机法和寄存器法 2.1状态机法 2.11 使用状态机检测“1001” 2.12 verilog代码 2.13 testbench 2.14仿真结果 2.2移位寄存器法 2.21 使用移位寄存器法检测1001 2.22 verilog代码 2.23 testbench 2.24仿真结果 三、重叠检测与非重叠检测(检测序列1001) 3.1重叠检测 3.11 重叠检测

    2024年02月04日
    浏览(47)
  • vivado序列检测器verilog代码ego1开发板验证

    名称:vivado序列检测器verilog代码ego1开发板验证 软件:VIVADO 语言:Verilog 代码功能: 设计一个111序列检测器。 要求:当检测到3个或3个以上的1时,输出为1,其他输入情况输出为0. 画出状态转移图,完成 Verilog描述。 本代码已在ego1开发板验证,开发板如下,其他开发板可以修改管

    2024年02月03日
    浏览(56)
  • 用jk触发器设计一个011序列检测器的设计分析过程

       心得体会:经过此次设计,加深了对时序逻辑电路的理解,当要求对一个连续的一串信号进行输入输出处理时可以用到有记忆存储、反馈功能的jk触发器或者d触发器。

    2024年02月04日
    浏览(47)
  • 【状态机设计】Moore、Mealy状态机、三段式、二段式、一段式状态机书写规范

    目录 状态机介绍 状态机类型 Moore 型状态机 Mealy 型状态机 状态机设计流程 自动售卖机 状态机设计:3 段式(推荐) 实例 实例 状态机修改:2 段式 实例 状态机修改:1 段式(慎用) 实例 状态机修改:Moore 型 实例 实例   有限状态机(Finite-State Machine,FSM),简称状态机,是

    2024年02月03日
    浏览(51)
  • 【数字IC手撕代码】Verilog模三检测器(判断输入序列能否被三整除)|题目|原理|设计|仿真

    芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区 联合力荐 !近500篇 数字IC精品文章收录 ! 【数字IC精品文章收录】学习路线·基础知识·总线·脚本语言·芯片求职·EDA工具·低功耗设计Verilog·STA·设计·验证·FPGA·架构·AMBA·书籍 本系列旨在提

    2024年02月16日
    浏览(41)
  • 【FPGA】跨时钟域问题(二)(单bit信号跨时钟域 1. 电平同步器 2. 边沿同步器 3. 脉冲检测器)

    作者:安静到无声 个人主页 作者简介:人工智能和硬件设计博士生、CSDN与阿里云开发者博客专家,多项比赛获奖者,发表SCI论文多篇。 Thanks♪(・ω・)ノ 如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦! o( ̄▽ ̄)d ლ(°◕‵ƹ′◕ლ)希望在传播知

    2024年02月16日
    浏览(41)
  • 12-同步状态机的结构以及Mealy和Moore状态机的区别,Verilog实现有限状态机的4种方式,以及总结有限状态机设计的一般步骤

    由于寄存器传输级(RTL)描述的是以时序逻辑抽象所得到的有限状态机为依据,因此,把一个时序逻辑抽象成一个同步有限状态机是设计可综合风格的Verilog HDL模块的关键。 在本章节中,在了解状态机结构的基础上通过各种实例,由浅入深地介绍各种可综合风格的Verilog HDL模

    2024年01月17日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包