题解 | #输入序列不连续的序列检测#
输入序列不连续的序列检测
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
查看6道真题和解析