题解 | #输入序列连续的序列检测#

输入序列连续的序列检测

https://www.nowcoder.com/practice/d65c2204fae944d2a6d9a3b32aa37b39

本题的序列检测很明显可以采用状态机进行检测,在检测时可以选取一位一位的状态机检测,也可以采取分段的方式进行检测,这样就能做到对状态机的简化
`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input a,
	output reg match
	);
    
    
//     localparam    IDEL_state = 8'b0000_0001;
//     localparam    One_state  = 8'b0000_0010;
//     localparam    Two_state  = 8'b0000_0100;
//     localparam    Thre_state = 8'b0000_1000;
//     localparam    Four_state = 8'b0001_0000;
//     localparam    Five_state = 8'b0010_0000;
//     localparam    Six_state  = 8'b0100_0000;
//     localparam    Seve_state = 8'b1000_0000;
    
    
    localparam    IDEL_state = 2'b00;
    localparam    One_state  = 2'b01;
    localparam    Two_state  = 2'b10;
    localparam    Thre_state = 2'b11;
    
    
    reg    match_reg;
    reg    [1:0]    one_cnt;
    reg    [1:0]    zero_cnt;
    
//     reg    [7:0]    cur_state;
//     reg    [7:0]    nex_state;
    
    reg    [1:0]    cur_state;
    reg    [1:0]    nex_state;
    
    reg    skip_en;
    reg    skip_waite;
    reg    skip_break;
    
//     always@(posedge clk or negedge rst_n)
//     begin
//         if(!rst_n)
//             cur_state <= 8'b0;
//         else
//             cur_state <= nex_state;  
//     end
    
//     always@(*)
//     begin
//         nex_state = IDEL_state;
//         case(cur_state)
//             IDEL_state    :    begin
//                 if(skip_en)
//                     nex_state = One_state;
//                 else
//                     nex_state = IDEL_state;
//                 end
//             One_state     :    begin
//                 if(skip_en)
//                     nex_state = Two_state;
//                 else
//                     nex_state = IDEL_state;
//                 end
//             Two_state    :    begin
//                 if(skip_en)
//                     nex_state = Thre_state;
//                 else
//                     nex_state = IDEL_state;
//                 end
//             Thre_state   :    begin
//                 if(skip_en)
//                     nex_state = Four_state;
//                 else
//                     nex_state = IDEL_state;
//                 end
//             Four_state    :    begin
//                 if(skip_en)
//                     nex_state = Five_state;
//                 else
//                     nex_state = IDEL_state;
//                 end
//             Five_state    :    begin
//                 if(skip_en)
//                     nex_state = Six_state;
//                 else
//                     nex_state = IDEL_state;
//                 end
//             Six_state    :    begin
//                 if(skip_en)
//                     nex_state = Seve_state;
//                 else
//                     nex_state = IDEL_state;
//                 end
//             Seve_state    :    begin
//                 if(skip_en)
//                     nex_state = IDEL_state;
//                 else
//                     nex_state = IDEL_state;
//                 end
//             default       :    begin
//                 nex_state = IDEL_state;
//                 end
//         endcase
//     end
    
//     always@(posedge clk or negedge rst_n)
//     begin
//         if(!rst_n)
//             begin
//                 match_reg <= 1'b0;
//                 skip_en <= 1'b0;
//             end
//         else
//             begin
//                 skip_en <= 1'b0;
//                 case(nex_state)  
//                     IDEL_state    :    begin
//                         match_reg <= 1'b0;
//                         if(a == 1'b0)
//                             skip_en <= 1'b1;
//                         else
//                             skip_en <= 1'b0;
//                         end
//                     One_state     :     begin
//                         match_reg <= 1'b0;
//                         if(a == 1'b1)
//                             skip_en <= 1'b1;
//                         else
//                             skip_en <= 1'b0;
//                         end
//                     Two_state     :     begin
//                         match_reg <= 1'b0;
//                         if(a == 1'b1)
//                             skip_en <= 1'b1;
//                         else
//                             skip_en <= 1'b0;
//                         end
//                     Thre_state    :     begin
//                         match_reg <= 1'b0;
//                         if(a == 1'b1)
//                             skip_en <= 1'b1;
//                         else
//                             skip_en <= 1'b0;
//                         end
//                     Four_state    :    begin
//                         match_reg <= 1'b0;
//                         if(a == 1'b0)
//                             skip_en <= 1'b1;
//                         else
//                             skip_en <= 1'b0;
//                         end
//                     Five_state    :    begin
//                         match_reg <= 1'b0;
//                         if(a == 1'b0)
//                             skip_en <= 1'b1;
//                         else
//                             skip_en <= 1'b0;
//                         end
//                     Six_state     :    begin
//                         match_reg <= 1'b0;
//                         if(a == 1'b0)
//                             skip_en <= 1'b1;
//                         else
//                             skip_en <= 1'b0;
//                         end
//                     Seve_state    :    begin
//                         if(a == 1'b1)
//                             begin
//                                 skip_en <= 1'b1;
//                                 match_reg <= 1'b1;
//                             end
//                         else
//                             begin
//                                 skip_en <= 1'b0;
//                                 match_reg <= 1'b0;
//                             end
//                         end
//                     default       :    match_reg <= 1'b0;
//                 endcase
//             end     
//     end
    


always@(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            cur_state <= 2'b0;
        else
            cur_state <= nex_state;  
    end
    
    always@(*)
    begin
        nex_state = IDEL_state;
        case(cur_state)
            IDEL_state    :    begin
                    if(skip_en)
                        nex_state = One_state;
                    else if(skip_break)
                        nex_state = IDEL_state;
                    else
                        nex_state = IDEL_state;
                end
            One_state     :    begin
                if(skip_en)
                    nex_state = Two_state;
                else if(skip_waite)
                    nex_state = One_state;
                else if(skip_break)
                    nex_state = IDEL_state;
                else
                    nex_state = One_state;
                end
            Two_state    :    begin
                if(skip_en)
                    nex_state = Thre_state;
                else if(skip_waite)
                    nex_state = Two_state;
                else if(skip_break)
                    nex_state = IDEL_state;
                else
                    nex_state = Two_state;
                end
            Thre_state   :    begin
                if(skip_en)
                    nex_state = IDEL_state;
                else if(skip_break)
                    nex_state = IDEL_state;
                else
                    nex_state = Thre_state;
                end
            default       :    begin
                nex_state = IDEL_state;
                end
        endcase
    end
    
    always@(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            begin
                match_reg <= 1'b0;
                skip_en <= 1'b0;
                skip_waite <= 1'b0;
                skip_break <= 1'b0;
                one_cnt <= 2'b0;
                zero_cnt <= 2'b0;
            end
        else
            begin
                skip_waite <= 1'b0;
                skip_en <= 1'b0;
                skip_break <= 1'b0;
                case(nex_state)  
                    IDEL_state    :    begin
                        match_reg <= 1'b0;
                        if(a == 1'b0)
                            skip_en <= 1'b1;
                        else
                            skip_break <= 1'b1;
                        end
                    One_state     :     begin
                        match_reg <= 1'b0;
                        if(a == 1'b1)
                            begin
                                if(one_cnt == 2'd2)
                                    begin
                                        one_cnt <= 2'b0;
                                        skip_en <= 1'b1;
                                        skip_waite <= 1'b0;
                                        skip_break <= 1'b0;
                                    end
                                else
                                    begin
                                        one_cnt <= one_cnt + 1'b1;
                                        skip_waite <= 1'b1;
                                        skip_break <= 1'b0;
                                    end
                            end
                        else
                            begin
                                one_cnt <= 2'b0;
                                skip_en <= 1'b0;
                                skip_waite <= 1'b0;
                                skip_break <= 1'b1;
                            end
                        end
                    Two_state     :     begin
                        match_reg <= 1'b0;
                        if(a == 1'b0)
                            begin
                                if(zero_cnt == 2'd2)
                                    begin
                                        zero_cnt <= 2'b0;
                                        skip_en <= 1'b1;
                                        skip_waite <= 1'b0;
                                        skip_break <= 1'b0;
                                    end
                                else
                                    begin
                                        zero_cnt <= zero_cnt + 1'b1;
                                        skip_waite <= 1'b1;
                                        skip_break <= 1'b0;
                                    end
                            end
                        else
                            begin
                                zero_cnt <= 2'b0;
                                skip_en <= 1'b0;
                                skip_waite <= 1'b0;
                                skip_break <= 1'b1;
                            end
                        end
                    Thre_state    :     begin
                        if(a == 1'b1)
                            begin
                                skip_en <= 1'b1;
                                match_reg <= 1'b1; 
                                skip_break <= 1'b1;
                            end
                        else
                            begin
                                skip_en <= 1'b0;
                                match_reg <= 1'b0;
                                skip_break <= 1'b1;
                            end
                        end
                    default       :    match_reg <= 1'b0;
                endcase
            end     
    end
    
    
    always@(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            match <= 1'b0;
        else
            match <= match_reg;
    end
    
  
endmodule

全部评论

相关推荐

04-29 18:07
常州大学 Java
寂静羽翼:兄弟我已经亲身经历了,双非没实习很多大厂还是会给笔试的,可是有的公司笔试做的好也不给面一直卡着,ssob基本看我没实习都拒绝我了,但是每天投满偶尔也能有一两场初创公司的面试,但是薪资基本在五六千
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务