VL28 输入序列不连续的序列检测
看题目我们可以发现,只有在检测到连续的0110序列的时候,才会拉高match信号,如果是单独的0—过一段周期又1–01这样是不被认为是match的,也就是说单独的信号都会跳转到IDLE。
这样说起来好像不是很明显,咱们这边画个图看看:
只有满足data_valid有效并且数值正确的时候才会往下跳转,其他情况直接跳IDLE重新检测。
这一题注意哈,牛课上给出的测试样例实际上match信号是要提前一个周期拉高的,match比图里需要提前一个周期,所以我这直接用组合逻辑给match赋值。
`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input data,
input data_valid,
output reg match
);
parameter IDLE = 7'b000_0001,
S1 = 7'b000_0010,
S2 = 7'b000_0100,
S3 = 7'b000_1000,
S4 = 7'b001_0000,
S5 = 7'b010_0000,
FAIL = 7'b100_0000;
reg [6:0]state,next_state;
reg [2:0]cnt;
//状态机-1
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
state <= IDLE;
else
state <= next_state;
end
//状态机-2
always@(*)
begin
if(~rst_n)
next_state <= IDLE;
else
case(state)
IDLE:next_state <= ((~data)&&data_valid)?S1:IDLE;
S1:next_state <= ((data)&&data_valid)?S2:IDLE;
S2:next_state <= ((data)&&data_valid)?S3:IDLE;
S3:next_state <= data_valid?IDLE:S3;
default:next_state <= IDLE;
endcase
end
//状态机-3
always@(*)
begin
if(~rst_n)
match <= 1'b0;
else if(~data && (state == S3))
match <= 1'b1;
else
match <= 1'b0;
end
endmodule
完成!