状态机-重叠序列检测

描述

设计一个状态机,用来检测序列 1011,要求:

1、进行重叠检测   即10110111 会被检测通过2次

2、寄存器输出,在序列检测完成下一拍输出检测有效

注意rst为低电平复位

信号示意图:

波形示意图:

 

输入描述:

输入信号 clk rst data 
类型 wire

输出描述:

输出信号  flag
类型  reg

简析

题目要求检测1011序列。重复序列检测状态机的难点是确定不同输入的情况下状态如何转移。根据波形,从左向右对序列进行匹配:

  • S0: 初始状态,代表目前没有接收到满足要求的数据。data==1时,等于1011中的第一个数,进入S1状态;data==0时,保持状态。
  • S1:代表目前已经有了1个匹配的数据。data==0时,当前序列为10,等于1011中的前两个数,进入S2状态;data==1时,当前序列为11,不是1011的前两个数,但1是1011的第一个数,所以保持S1状态。
  • S2:代表目前已经有了2个匹配的数据。data==1时,当前序列为101,等于1011中的前三个数,进入S3状态;data==0时,当前序列为100,不是1011的前两三个数,00、0都不能匹配,所以返回S0状态。
  • S3:代表目前已经有了3个匹配的数据。data==1时,当前序列为1011,与要求序列匹配,进入S4桩体;data==0时,当前序列为1010,与要求序列不配,010也不匹配,但10与1011的前两个数匹配,所以进入S2状态。
  • S4:最终状态,代表目前已经得到了匹配的序列,并且在下个周期将flag拉高。data==0时,当前序列为10110,10与要求序列的前两个数匹配,所以进入S2状态;data==1时,当前序列为10111,只有最后一位的1匹配,所以进入S1状态。
    `timescale 1ns/1ns
    
    module sequence_test2(
    	input wire clk  ,
    	input wire rst  ,
    	input wire data ,
    	output reg flag
    );
    //*************code***********//
        parameter S0=0, S1=1, S2=2, S3=3, S4=4;
        reg [2:0] state, nstate;
        
        always@(posedge clk or negedge rst) begin
            if(~rst)
                state <= S0;
            else
                state <= nstate;
        end
        
        always@(*) begin
            if(~rst)
                nstate <= S0;
            else
                case(state)
                    S0     : nstate <= data? S1: S0;
                    S1     : nstate <= data? S1: S2;
                    S2     : nstate <= data? S3: S0;
                    S3     : nstate <= data? S4: S2;
                    S4     : nstate <= data? S1: S2;
                    default: nstate <= S0;
                endcase
        end
        
        always@(posedge clk or negedge rst) begin
            if(~rst)
                flag <= 0;
            else
                flag <= state==S4;
        end
    
    //*************code***********//
    endmodule
    

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值