序列检测1011?重复检测&非重复检测

请设计一个检测序列为1011的检测电路?

序列检测一般采用状态机实现。状态机一般采用三段式状态机实现。

重复检测 即在 1011011011 中检测 三次

非重复检测  即在 1011011011 中检测 两次

序列检测示意:

非重复检测 状态转移图

 重复检测 状态转移图

 设计代码和激励代码如下:

module  state(
input        sys_clk             ,
input        sys_rst_n           ,
input        in                  ,
output reg   flag   
);
//独热码定义状态
parameter    S0  = 5'b00001;  //初始状态
parameter    S1  = 5'b00010;  //1
parameter    S2  = 5'b00100;  //10
parameter    S3  = 5'b01000;  //101
parameter    S4  = 5'b10000;  //1011

reg [4:0]   c_state;
reg [4:0]   n_state;

//状态机的第一段采用同步时序描述状态转移
always@(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        c_state<=S0;
    else 
        c_state<=n_state;
end 

//状态机的第二段采用组合逻辑判断状态转移条件
always@(*) begin 
    case(c_state)
        S0  :  begin  
                if(in==1'b1)
                    n_state<=S1;
                else 
                    n_state<=S0;
               end 
        S1  :  begin  
                if(in==1'b0)
                    n_state<=S2;
                else 
                    n_state<=S0;
               end  
        S2  :  begin  
                if(in==1'b1)
                    n_state<=S3;
                else 
                    n_state<=S0;
               end  
        S3  :  begin  
                if(in==1'b1)
                    n_state<=S4;
                else 
                    n_state<=S2;
               end 
        S4  :  begin                 
                if(in==1'b1)
                    n_state<=S0;
                    //n_state<=S1;      /* 不重复检测 在输入为1 跳转S0,重复检测跳转至S1 */
                else 
                    n_state<=S0;    /*不重复检测 在输入为0 跳转S0 */              
                    //n_state<=S2;      /*重复检测跳转至S2*/
               end 

        default : n_state<=S0;
    endcase
end 
//状态机的第三段描述状态输出(这里采用时序电路输出)
always@(posedge sys_clk or negedge sys_rst_n) begin 
    if(!sys_rst_n)
        flag<=1'b0;
    else if(c_state==S4)
        flag<=1'b1;
    else 
        flag<=1'b0;
end 

endmodule
`timescale 1ns/1ns
module  tb_state();
reg  sys_clk            ;
reg  sys_rst_n          ;
reg  in                 ;
wire flag               ;


initial  begin   
    sys_clk<=1'b0;
    sys_rst_n<=1'b0;
    in<=1'b0;
    #20
    sys_rst_n<=1'b1;
    #20
    in<=1'b1;    //模拟序列输入
    #20
    in<=1'b0;
    #20
    in<=1'b1;
    #20
    in<=1'b1;
    #20
    in<=1'b0;
    #20
    in<=1'b1;
    #20
    in<=1'b1;
    #20
    in<=1'b1;
    #20
    in<=1'b0;
    #20
    in<=1'b1;
    #20
    in<=1'b1;
    #20
    in<=1'b0;
    #20
    in<=1'b1;
    #20
    in<=1'b1;
    #20
    in<=1'b0;
    #20
    in<=1'b1;
    #20
    in<=1'b1;
    #20
    in<=1'b0;
    #20
    in<=1'b1;
    #20
    in<=1'b1;
    #20
    in<=1'b0;
    #20
    in<=1'b1;
    #20
    in<=1'b1;
    #20
    in<=1'b1;
    #20
    in<=1'b1;
    #20
    in<=1'b0;
    #20
    in<=1'b1;
    #20
    in<=1'b0;
    #20
    in<=1'b1;
    #20
    in<=1'b1;
    #20
    in<=1'b0;
    #20
    in<=1'b0;
    #20
    in<=1'b1;
    #20
    in<=1'b0;
    #20
    in<=1'b1;
    #20
    in<=1'b0;
    #20
    in<=1'b0;
    #20
    in<=1'b1;
end 

always #10 sys_clk<=~sys_clk;

state   state_inst(
.sys_clk        (sys_clk  )     ,
.sys_rst_n      (sys_rst_n)     ,
.in             (in       )     ,
.flag           (flag     )
);     
endmodule

非重复检测波形图:

在输入为10110111011 序列下 检测到两次目标序列

重复检测波形图:

在输入为10110111011 序列下 检测到三次目标序列

若有不对的地方,敬请指正,万分感谢。

参考资料:1、(117条消息) IC/FPGA校招笔试题分析(四)再看Moore状态机实现序列检测器_摩尔状态机1011序列检测器_李锐博恩的博客-CSDN博客

posted @ 2023-07-28 15:20  余你余生  阅读(505)  评论(0编辑  收藏  举报