题目
请编写一个序列检测模块,检测输入信号a是否满足01110001序列,当信号满足该序列,给出指示信号match。模块的接口信号图如下:
模块的时序图如下:
输入输出描述如下:
信号 | 类型 | 输入/输出 | 位宽 | 描述 |
---|---|---|---|---|
clk | wire | Intput | 1 | 系统时钟信号 |
rst_n | wire | Intput | 1 | 异步复位信号,低电平有效 |
a | wire | Intput | 1 | 单比特信号,待检测的数据 |
match | reg | Output | 1 | 当输入信号a满足目标序列,该信号为1,其余时刻该信号为0 |
答案
在这里采用移位操作来检测串行输入的单比特信号a是否满足01110001,注意在这里满足是指任意8个时钟周期内满足输入的a为01110001,就给出信号match。比如输入的序列为01110001110001,在这里,在第8个时钟周期时,识别到串行输入的a为01110001,则给出一个match信号,而在第14个时钟周期,从第7个时钟周期算,到第14个时钟周期(01110001110001),其串行输入的值为01110001,再次给出一个match信号,即检测是重叠的检测。
`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input a,
output reg match
);
reg [7:0] data_reg;
always @(posedge clk or negedge rst_n)
if(!rst_n)
data_reg <= 8'b0000_0000;
else
data_reg <= {data_reg,a};
always @(posedge clk or negedge rst_n)
if(!rst_n)
match <= 1'b0;
else if(data_reg == 8'b0111_0001)
match <= 1'b1;
else
match <= 1'b0;
endmodule