题目描述
请编写一个序列检测模块,检测输入信号a是否满足01110001序列,当信号满足该序列,给出指示信号match。
模块的接口信号图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/e03f5bd220ffe852ee0d7a80adeaf398.png)
模块的时序图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8dc6a4eb6c250f4ebdefab8bf2e391a4.png)
请使用Verilog HDL实现以上功能
输入描述:
clk:系统时钟信号
rst_n:异步复位信号,低电平有效
a:单比特信号,待检测的数据
输出描述:
match:当输入信号a满足目标序列,该信号为1,其余时刻该信号为0
解题思路
要判断串行的序列等于目标序列,首先需要将串行序列转换成与目标序列位宽相等的数;
所以我们的思路是定义一个移位寄存器,用来接收串行输入的数据,然后用移位寄存器与目标序列做对比。具体实现代码如下 :
`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input a,
output reg match
);
parameter GOAL_SER = 8'b01110001 ;
reg [7:0] sft_reg ;
always@(posedge clk or negedge rst_n)begin
if(~rst_n)begin
sft_reg <= 8'hFF ; // 复位值给全1
end else begin
sft_reg <= {sft_reg[6:0],a};
end
end
always@(posedge clk or negedge rst_n)begin
if(~rst_n)begin
match <= 1'd0 ;
end else if(sft_reg == GOAL_SER ) begin
match <= 1'b1 ;
end else begin
match <= 1'd0 ;
end
end
endmodule
这里注意一个细节,因为目标序列最高位是0,我们的移位寄存器是从低位往高位移;
如果复位给全0,那么复位后的第一个序列如果是111001x,此时其实是不满足目标序列的
但是会误判满足。