题解 | #不重叠序列检测#
不重叠序列检测
https://www.nowcoder.com/practice/9f91a38c74164f8dbdc5f953edcc49cc
- FSM;
- 六个状态,s0,s1,s2,s3,s4,s5;
- 一个计数器cnt,从0计数到5;
- 状态转移条件按照题意011100决定;
- 计数器为0时进入s0状态,计数器为5时,判断状态是否在s5,是就是想要的序列,否则不是。
/*********************************************************************************************
Module Name: sequence_no
Description: 检测的序列为011100
Time/Edition/Editor:
2023.4.27/v1.0/HouXin
*********************************************************************************************/
`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input data,
output reg match,
output reg not_match
);
//定义各个状态
parameter s0 = 5'd0;
parameter s1 = 5'd1;
parameter s2 = 5'd2;
parameter s3 = 5'd3;
parameter s4 = 5'd4;
parameter s5 = 5'd5;
reg [6:0]curr_state;
reg [6:0]next_state;
//计数器:cnt
reg [3:0] cnt;
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt <= 4'd0;
end
else if (cnt == 4'd5)begin
cnt <= 4'd0;
end
else begin
cnt <= cnt + 1'b1;
end
end
//FSM one step
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
curr_state <= s0;
end
else begin
curr_state <= next_state;
end
end
//FSM second step 011100
always@(*)begin
case(curr_state)
s0:
if(cnt == 4'd0)begin
if(data==0)begin
next_state = s1; //0
end
else begin
next_state = s0;
end
end
s1:
if(data==1)begin
next_state = s2; //1
end
else begin
next_state = s0;
end
s2:
if(data==1)begin
next_state = s3; //1
end
else begin
next_state = s0;
end
s3:
if(data==1)begin
next_state = s4; //1
end
else begin
next_state = s0;
end
s4:
if(data===0)begin
next_state = s5; //0
end
else begin
next_state = s0;
end
s5:
if(data===0)begin
next_state = s5; //0
end
else begin
next_state = s0;
end
default:next_state = s0;
endcase
end
// FSM 3 step
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
match <= 1'b0;
not_match <= 1'b0;
end
else if(cnt==4'd5) begin
if(curr_state == s5)begin
match <= 1'b1;
not_match <= 1'b0;
end
else begin
match <= 1'b0;
not_match <= 1'b1;
end
end
else begin
match <= 1'b0;
not_match <= 1'b0;
end
end
endmodule
查看14道真题和解析
基恩士成长空间 442人发布