题解 | #不重叠序列检测#
不重叠序列检测
https://www.nowcoder.com/practice/9f91a38c74164f8dbdc5f953edcc49cc
`timescale 1ns/1ns module sequence_detect( input clk, input rst_n, input data, output reg match, output reg not_match ); reg [2:0] curr_st; reg [2:0] next_st; reg [2:0] cnt; parameter M0 = 3'b0; parameter M1 = 3'b01; parameter M2 = 3'b10; parameter M3 = 3'b11; parameter M4 = 3'b100; parameter M5 = 3'b101; parameter M6 = 3'b110; always @(posedge clk or negedge rst_n)begin if(rst_n == 1'b0) curr_st <= M0; else curr_st <= next_st; end always@(*)begin case(curr_st) M0: if(data == 1'b0) next_st = M1; else next_st = M0; M1: if(data == 1'b1) next_st = M2; else next_st = M0; M2: if(data == 1'b1) next_st = M3; else next_st = M0; M3: if(data == 1'b1) next_st = M4; else next_st = M0; M4: if(data == 1'b0) next_st = M5; else next_st = M0; M5: if(data == 1'b0) next_st = M6; else next_st = M0; M6: if(data == 1'b0) next_st = M1; else next_st = M0; endcase end always@(posedge clk or negedge rst_n)begin if(rst_n == 1'b0) cnt <= 'b0; else if(cnt < 3'b101) cnt <= cnt + 1'b1; else cnt <= 'b0; end always@(posedge clk or negedge rst_n)begin if(rst_n == 1'b0)begin match <= 0; not_match<=0; end else if(cnt == 3'b101 && next_st == M6)begin match <= 1; not_match <= 0; end else if(cnt == 3'b101 && next_st != M6)begin match <= 0; not_match <= 1; end else begin match <= 0; not_match<=0; end end endmodule