题解 | #输入序列不连续的序列检测#
输入序列不连续的序列检测
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;

查看5道真题和解析