题目:含有无关项的序列检测 与上一题类似,这里可以用除了状态机外另一种新的写法:移位寄存器; 第一个always块是一个移位寄存器,在每个时钟上升沿,将数据a移入寄存器中; 移位寄存器内的数据可以在移位脉冲(时钟信号)的作用下依次左移或右移。移位寄存器不仅可以存储数据,还可以用来实现数据的串并转换、分频,构成序列码发生器、序列码检测器,进行数值运算以及数据处理等,它也是数字系统中应用非常广泛的时序逻辑部件之一。
`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块实现检测,每次时钟上升沿,检测当前寄存器的前三位和后三位的数据是否满足条件;
当然也可使用三段式状态机进行检测,不过我觉得太累赘;