序列检测
需要注意输出是否是需要用D触发器缓存一拍
VL26
module sequence_detect(
input clk,
input rst_n,
input a,
output reg match
);
parameter IDLE=4'd0;
parameter S0=4'd1;
parameter S1=4'd2;
parameter S2=4'd3;
parameter S3=4'd4;
parameter S4=4'd5;
parameter S5=4'd6;
parameter S6=4'd7;
parameter S7=4'd8;
parameter S8=4'd9;
reg [3:0] state;
reg [3:0] next_state;
wire match_w;
always@(posedge clk, negedge rst_n)begin
if(!rst_n) state<=IDLE;
else state<=next_state;
end
always@(*)begin
case(state)
IDLE:next_state=(!a)?S0:IDLE;
S0:next_state=(a)?S1:S0;
S1:next_state=(a)?S2:S0;
S2:next_state=S3;
S3:next_state=S4;
S4:next_state=S5;
S5:next_state=(a)?S6:S0;
S6:next_state=(a)?S7:S0;
S7:next_state=(!a)?S8:IDLE;
S8:next_state=(a)?IDLE:S0;
endcase
end
assign match_w = state==S8;
always@(posedge clk, negedge rst_n)begin
if(!rst_n) match<=0;
else match<=match_w;
end
endmodule
不重叠序列的检测
我的思路是状态机,然后分别设置两组状态,M0-5(match),U0-5(unmatch),然后在任何一个Mx状态,下一个输入不对就跳到U状态,U状态不检测输入,直接一路走到U5输出unmatch
module sequence_detect(
input clk,
input rst_n,
input data,
output reg match,
output reg not_match
);
parameter IDLE=4'd0;
parameter M0=4'd1;
parameter M1=4'd2;
parameter M2=4'd3;
parameter M3=4'd4;
parameter M4=4'd5;
parameter M5=4'd6;
parameter U0=4'd7;
parameter U1=4'd8;
parameter U2=4'd9;
parameter U3=4'd10;
parameter U4=4'd11;
parameter U5=4'd12;
reg [3:0] state;
reg [3:0] next_state;
wire match_w;
wire unmatch_w;
always@(posedge clk, negedge rst_n)begin
if(!rst_n) state<=IDLE;
else state<=next_state;
end
always@(posedge clk, negedge rst_n)begin
if(!rst_n)begin
match<=0;
not_match<=0;
end
else begin
match<=(next_state==M5);
not_match<=(next_state==U5);
end
end
always@(*)begin
case(state)
IDLE:next_state=(!data)?M0:U0;
M0:next_state=(data)?M1:U1;
M1:next_state=(data)?M2:U2;
M2:next_state=(data)?M3:U3;
M3:next_state=(!data)?M4:U4;
M4:next_state=(!data)?M5:U5;
M5:next_state=(!data)?M0:U0;
U0:next_state=U1;
U1:next_state=U2;
U2:next_state=U3;
U3:next_state=U4;
U4:next_state=U5;
U5:next_state=(!data)?M0:U0;
default:next_state=IDLE;
endcase
end
endmodule
另外一个思路是拿一个计数器计数,每一步把对应的串行输入存到对应位置上,存完6个数直接比较
module sequence_detect(
input clk,
input rst_n,
input data,
output reg match,
output reg not_match
);
reg [2:0]count;
reg [5:0]tmp;
always@(posedge clk, negedge rst_n)begin
if(!rst_n)begin
count<=3'b101;
end
else begin
if(count == 3'b0) count<=3'b101;
else count <= count - 1'b1;
end
end
always@(posedge clk, negedge rst_n)begin
if(!rst_n) tmp<=0;
else tmp[count]<=data;
end
always@(posedge clk, negedge rst_n)begin
if(!rst_n)begin
match<=0;
not_match<=0;
end
else begin
if(count==0)begin
if(tmp==6'b011100)begin
match<=1;
not_match<=0;
end
else begin
match<=0;
not_match<=1;
end
end
else begin
match<=0;
not_match<=0;
end
end
end
endmodule
输入序列不连续的序列检测
只是多了一个data_va