题目:含有无关项的序列检测 alt 与上一题类似,这里可以用除了状态机外另一种新的写法:移位寄存器; 第一个always块是一个移位寄存器,在每个时钟上升沿,将数据a移入寄存器中; 移位寄存器内的数据可以在移位脉冲(时钟信号)的作用下依次左移或右移。移位寄存器不仅可以存储数据,还可以用来实现数据的串并转换、分频,构成序列码发生器、序列码检测器,进行数值运算以及数据处理等,它也是数字系统中应用非常广泛的时序逻辑部件之一。 alt

`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input a,
	output reg match
	);

    reg [8:0]a_reg;
 
    
    always@(posedge clk or negedge rst_n)
        if (!rst_n)
            begin
            a_reg <= 0;
      
            end
        else
            begin
            a_reg     <= {a_reg[8:0],a};
           
            end
    
 always@(posedge clk or negedge rst_n)
     if   (!rst_n)
             begin 
            match <= 0;
             end
    else if ((a_reg[2:0] == 3'b110)&&(a_reg[8:6] == 3'b011))
           begin
            match <= 1;
            end
    else 
            begin
            match <= 0;
            end

        
endmodule

这里我们要检测的序列是九位的,所以我定义了九位的寄存器. 第一个always块实现输入数据的移入,每次时钟上升沿,将a移入; 第二个always块实现检测,每次时钟上升沿,检测当前寄存器的前三位和后三位的数据是否满足条件;

当然也可使用三段式状态机进行检测,不过我觉得太累赘;