题解 | #输入序列连续的序列检测#
输入序列连续的序列检测
https://www.nowcoder.com/practice/d65c2204fae944d2a6d9a3b32aa37b39
`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input a,
output reg match
);
reg [8:0] cs;
reg [8:0] ns;
parameter IDLE = 9'b0_0000_0001,
S0 = 9'b0_0000_0010,
S1 = 9'b0_0000_0100,
S2 = 9'b0_0000_1000,
S3 = 9'b0_0001_0000,
S4 = 9'b0_0010_0000,
S5 = 9'b0_0100_0000,
S6 = 9'b0_1000_0000,
S7 = 9'b1_0000_0000;
//1st
always @ (posedge clk or negedge rst_n)
begin
if (~rst_n)
cs <= IDLE;
else
cs <= ns;
end
//2nd
always @ (*)
begin
case(cs)
IDLE : ns = (a == 1'b0)? S0 :IDLE;
S0 : ns = (a == 1'b1)? S1 :S0;
S1 : ns = (a == 1'b1)? S2 :S0;
S2 : ns = (a == 1'b1)? S3 :S0;
S3 : ns = (a == 1'b0)? S4 :IDLE;
S4 : ns = (a == 1'b0)? S5 :IDLE;
S5 : ns = (a == 1'b0)? S6 :IDLE;
S6 : ns = (a == 1'b1)? S7 :S0;
S7 : ns = (a == 1'b1)? IDLE :S0;
default : ns = IDLE;
endcase
end
//3rd
reg match_tmp; //根据波形,序列a符合要求之后还要打一拍再输出match
always @ (posedge clk or negedge rst_n)
begin
if (~rst_n) begin
match_tmp <= 1'b0;
match <= 1'b0;
end
else begin
match_tmp <= (ns == S7); //不要用错成cs
match <= match_tmp;
end
end
endmodule
