最近在入门verilog语言,在做序列检测的实验时要求该序列检测器可以识别任意输入的序列,即格式、长度不一、即0101、10101、011等字符串,并且有额外的输入端口:目标序列(target)、目标序列长度(length)。但是本人找遍全网只发现了针对特定位数和序列的检测器(;′⌒`)
5bit序列01101的检测器代码如下,如果有需要增添或修改的,还望有大佬指点迷津🙏
module SerialSequenceDetector(
input d,
input rst_n,
input clk,
output reg flag
);
reg [4:0] CurrentSequence;
parameter Sequence=5'd01101;
always @(posedge clk or negedge rst_n)begin
if(!rst_n) begin
CurrentSequence[4:0] <= { CurrentSequence[3:0],d};
if(CurrentSequence[4:0] == Sequence[4:0])
flag <= 1'b1;
else
flag <= 1'b0;
end
end
endmodule
test.v如下:
`timescale 1ns / 1ns
`define halfperiod 10
module SerialSequenceDetector_tb;
// Inputs
reg clk;
reg [23:0]data;
reg rst_n;
// Outputs
wire d;
// Instantiate the Unit Under Test (UUT)
SerialSequenceDetector uut (
.d(d),
.rst_n(rst_n),
.clk(clk),
.flag(flag)
);
always #5 clk = ~clk;
initial begin
clk = 1;
rst_n=0;
#5 rst_n=1;
#15 rst_n=0;data=24'b0011_1100_1101_0110_1001_0100;
#(`halfperiod * 200) $stop; //执行100个时钟周期
end
always@(negedge clk) #10 data = {data[22 : 0], data[23]};
assign d = data[23]; //将最高位输入到序列检测器中
endmodule