题解 | #输入序列不连续的序列检测#
输入序列不连续的序列检测
https://www.nowcoder.com/practice/f96d0e94ec604592b502b0f1800ed8aa
`timescale 1ns/1ns module sequence_detect( input clk, input rst_n, input data, input data_valid, output reg match );//观察时序图,先输入的在高位或低位都行 //观察时序图,先输入的在高位或低位都行 /* reg [3:0] men; always@(posedge clk or negedge rst_n)begin if(!rst_n)begin men <= 0; end else if(data_valid)begin men <= {men[2:0],data}; end end always@(posedge clk or negedge rst_n)begin if(!rst_n)begin match <= 0; end else begin match <= men[2:0] == 3'b011 && data_valid == 1'b1 && data == 1'b0; end end */ reg [1:0] cs,ns; always@(posedge clk or negedge rst_n)begin if(!rst_n)begin cs <= 0; end else begin cs <= ns; end end always@(*)begin case(cs) 2'b00 : ns = (data_valid) ? ((data==1'b0) ? 2'b01 : 2'b00) : cs; 2'b01 : ns = (data_valid) ? ((data==1'b1) ? 2'b10 : 2'b01) : cs; 2'b10 : ns = (data_valid) ? ((data==1'b1) ? 2'b11 : 2'b10) : cs; 2'b11 : ns = (data_valid) ? ((data==1'b0) ? 2'b00 : 2'b11) : cs; default : ns = 2'd0; endcase end always@(posedge clk or negedge rst_n)begin if(!rst_n)begin match <= 0; end else if(cs == 2'b11 && data == 1'b0 && data_valid == 1'b1)begin match <= 1; end else begin match <= 0; end end endmodule