描述
题目描述:
请编写一个序列检测模块,输入信号端口为data,表示数据有效的指示信号端口为data_valid。当data_valid信号为高时,表示此刻的输入信号data有效,参与序列检测;当data_valid为低时,data无效,抛弃该时刻的输入。当输入序列的有效信号满足0110时,拉高序列匹配信号match。
模块的接口信号图如下:
模块的时序图如下:
请使用状态机实现以上功能,画出状态转移图并使用Verilog HDL编写代码实现以上功能,并编写testbench验证模块的功能.
输入描述:
clk:系统时钟信号
rst_n:异步复位信号,低电平有效
data:单比特信号,待检测的数据
data_valid:输入信号有效标志,当该信号为1时,表示输入信号有效
输出描述:
match:当输入信号data满足目标序列,该信号为1,其余时刻该信号为0
`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input data,
input data_valid,
output reg match
);
parameter IDLE = 0;
parameter s0 = 1;
parameter s1 = 2;
parameter s2 = 3;
parameter s3 = 4;
reg [3:0] state,nx_state;
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
state <= IDLE;
else
state <= nx_state;
end
always@(*)begin
nx_state = IDLE;
case(state)
IDLE:
if(data_valid && !data)
nx_state = s0;
else if(data_valid && data)
nx_state = IDLE;
else
nx_state = nx_state;
s0:
if(data_valid && data)
nx_state = s1;
else if(data_valid && !data)
nx_state = s0;
else
nx_state = nx_state;
s1:
if(data_valid && data)
nx_state = s2;
else if(data_valid && !data)
nx_state = s0;
else
nx_state = nx_state;
s2:
if(data_valid && data)
nx_state = IDLE;
else if(data_valid && !data)
nx_state = s3;
else
nx_state = nx_state;
s3:
if(data_valid && data)
nx_state = s1;
else if(data_valid && !data)
nx_state = s0;
else
nx_state = nx_state;
default: nx_state = IDLE;
endcase
end
always@(*)begin
if(!rst_n)
match <= 0;
else begin
if(state == s3)
match <= 1'b1;
else
match <= 1'b0;
end
end
endmodule