题解 | #不重叠序列检测#
不重叠序列检测
https://www.nowcoder.com/practice/9f91a38c74164f8dbdc5f953edcc49cc
`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input data,
output reg match,
output reg not_match
);
reg [3:0] state;
reg [3:0] nstate;
parameter S0 = 4'b0000;
parameter S1 = 4'b0001;
parameter S2 = 4'b0010;
parameter S3 = 4'b0011;
parameter S4 = 4'b0100;
parameter S5 = 4'b0101;
parameter S6 = 4'b0110;
parameter S7 = 4'b0111;
parameter S8 = 4'b1000;
parameter S9 = 4'b1001;
reg flag;
reg nflag;
reg m;
reg [2:0]cnt;
parameter max=6-1;
// 计时
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
cnt <= S1; // 初始化状态
end else if(cnt>=max)
cnt<=3'b0;
else
cnt<=cnt+1;
end
// 状态寄存器更新逻辑
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
state <= S1; // 初始化状态
end else begin
state <= nstate;
end
end
// 状态转移逻辑
always @(*) begin
nstate = state; // 默认不变状态
flag = 0; // 默认情况下不设置flag
case (state)
S1: begin
if (data == 0)
nstate = S2;
else
nstate = S0;
end
S2: begin
if (data == 1)
nstate = S3;
else
nstate = S0;
end
S3: begin
if (data == 1)
nstate = S4;
else
nstate = S0;
end
S4: begin
if (data == 1 )
nstate = S5;
else
nstate = S0;
end
S5: begin
if (data == 0)
nstate = S6;
else
nstate = S0;
end
S6: begin
if (data == 0 ) begin
nstate = S1;
flag=1;
end else
nstate = S0;
end
S0: begin
nflag=1;
if(cnt==max)
nstate=S1;
else
nstate=S0;
end
/*: begin
if (a == 0) begin
nstate = S9;
end else begin
nstate = S1;
end
end
S9: begin
flag=1;
nstate = S1;
end*/
endcase
end
// 输出逻辑
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
not_match <= 1'b0;
else
not_match <= m;
end
//打一拍符合时序
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
m <= 1'b0;
else if (nflag && cnt==max)
m <= nflag;
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
match <= 1'b0;
end else begin
match <= flag;
end
end
endmodule
查看6道真题和解析