题解 | #输入序列不连续的序列检测#
输入序列不连续的序列检测
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 ); //根据时序图可以看出,match 是在检测到0110的下一个周期拉高,所以采用moore型状态机(只与当前状态有关) //三段式状态机 reg [2:0] crt_state,nxt_state; //第一段:同步时序逻辑描述状态转移 always@(posedge clk or negedge rst_n) if(!rst_n) crt_state <= 3'd0; else crt_state <= nxt_state; //第二段:组合逻辑描述状态转移规律 always@(*) if(data_valid)begin case(crt_state) 3'd0: nxt_state = (data_valid && ~data) ? 3'd1 : 3'd0; 3'd1: nxt_state = (data_valid && data) ? 3'd2 : 3'd1; 3'd2: begin if(data_valid && data) nxt_state = 3'd3; else if(data_valid && ~data) nxt_state = 3'd1; else nxt_state = 3'd2; end 3'd3: begin if(data_valid && ~data) nxt_state = 3'd4; else if(data_valid && data) nxt_state = 3'd0; else nxt_state = 3'd3; end 3'd4: begin if(data_valid && data) //这里没有说重叠还是不重叠检测 nxt_state = 3'd0;//不重叠检测 // nxt_state = 3'd2;//重叠检测 else nxt_state = 3'd1; end default:nxt_state = 3'd0; endcase end else nxt_state <=3'd0; //第三段:时序逻辑描述状态输出 always@(posedge clk or negedge rst_n) if(!rst_n) match <= 0; else if(nxt_state == 3'd4) match <= 1; else match <= 0; endmodule //第二段:组合逻辑描述状态转移规律 // always@(*) // if(data_valid)begin//这个不对,因为它只是抛弃data_valid无效那一个时刻的输入,其他时刻的输入还要 // case(crt_state) // 3'd0: nxt_state = (data == 0) ? 3'd1 : 3'd0; // 3'd1: nxt_state = (data == 1) ? 3'd2 : 3'd0; // 3'd2: nxt_state = (data == 1) ? 3'd3 : 3'd0; // 3'd3: nxt_state = (data == 0) ? 3'd1 : 3'd0; // 3'd4: nxt_state = (data == 0) ? 3'd1 : 3'd0;//这里没有说重叠还是不重叠检测,就先按不重叠吧 // //3'd4: nxt_state = (data == 0) ? 3'd1 : 3'd2;//重叠检测 // default:nxt_state = 3'd0; // endcase // end // else // nxt_state <=3'd0;