always @(posedge clk or negedge rst_n) begin if(!rst_n) pstate<=idle; else pstate<=nstate; end
always @(pstate or data or data_valid) begin case(pstate) idle: if(data_valid && !data) nstate=s1_d0; //第一位匹配 else nstate=idle; s1_d0: if(data_valid) begin if(data) nstate = s2_d01; //数据有效且为1,即前两位01匹配,下一状态为s2_d01 elsenstate = s1_d0; //数据有效但为0,即只有第一位0匹配,下一状态为s1_d0 end elsenstate = s1_d0; //数据无效,保持在s1_d0 s2_d01: if(data_valid) begin if(data) nstate = s3_d011; //数据有效且为1,即前三位011匹配,下一状态为s3_d011 elsenstate = s1_d0; //数据有效但为0,即只有第一位0匹配,下一状态为s1_d0 end elsenstate = s2_d01; //数据无效,保持在s2_d01 s3_d011: if(data_valid) begin if(!data) nstate = s4_d0110; //数据有效且为0,即前四位0110匹配,下一状态为s4_d0110 elsenstate = idle; //数据有效但为1,即不匹配,下一状态为idle end elsenstate = s3_d011; //数据无效,保持在s3_d011 s4_d0110: if(data_valid) begin if(!data) nstate = s1_d0; //数据有效且为0,即匹配目标序列的第一位0,下一状态为s1_d0 elsenstate = idle; //数据有效但为1,不匹配目标序列,下一状态为idle end elsenstate = idle; //数据无效,下一状态为idle default: nstate=idle; endcase end
always @(pstate or rst_n) begin if(!rst_n==1) match=1'b0; elseif(pstate==s4_d0110) //进入状态s4_d0110表示四位数据都匹配,把匹配指示信号match拉高 match=1'b1; else match=1'b0; end