题解 | #状态机-重叠序列检测#

状态机-重叠序列检测

https://www.nowcoder.com/practice/10be91c03f5a412cb26f67dbd24020a9

//IC是硬件设计,考虑资源节约,尽量少用额外寄存器
//注意,flag是在条件满足后,打一拍在输出,即S4
//S4中拉高flag后,记得再后续跳转中回低flag信号
`timescale 1ns/1ns

module sequence_test2(
	input wire clk  ,
	input wire rst  ,
	input wire data ,
	output reg flag
);

reg [2: 0]  state   ;

//state 1011
localparam IDLE = 3'd0;  //000  0000
localparam S1   = 3'd1;  //001  0001
localparam S2   = 3'd2;  //010  0010
localparam S3   = 3'd3;  //101  0101
localparam S4   = 3'd4;  //011  1011


always @(posedge clk or negedge rst)
begin
    if(!rst)  
    begin
        state <= IDLE   ; 
        flag  <= 1'b0   ;
    end
    else
        case(state)
            IDLE:
                state <= state + data   ;
            S1:  //0001
                begin
                    flag  <= 1'b0   ;
                    if(!data)
                        state <= S2     ;
                    else
                        state <= S1     ;     
                end
            S2: //0010
                begin
                    flag  <= 1'b0   ;
                    if(data)
                        state <= S3     ;
                    else
                        state <= IDLE   ;  
                end
            S3: //0101
                begin
                    if(data)
                        state <= S4     ;
                    else
                        state <= S2     ;  
                end
            S4: begin
                flag  <= 1'b1   ;
                if(data)
                    state <= S1 ;
                else
                    state <= S2 ;

            end
        default: state <= IDLE  ;
        endcase
end




endmodule

全部评论

相关推荐

否极泰来来来来:解约赔多少
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务