序列检测器的设计
序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出1,否则输出0。由于这种检测的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及正确序列,直到在连续的检测中所收到的每一位码都与预置数的对应码相同。在检测过程中,任何一位不相等都将回到初始状态重新开始检测。
以检测6位序列数“110100”为例,介绍序列检测器的设计。
根据序列检测器原理,可以得出序列检测器的状态转换图如下。
module SCHK_6B(CLK_DIV_OUT_1HZ,RST,din,sout,q);
input CLK_DIV_OUT_1HZ;
input RST;
input din;
output sout;
output[3:0] q;
reg[3:0] q;
parameter s0=0,s1=1,s2=2,s3=3,s4=4,s5=5,s6=6;
reg[6:0]cst,nst;
always@(posedge CLK_DIV_OUT_1HZ, negedge RST)
begin
if(!RST)
cst <= s0;
else
cst <= nst;
end
always@(cst,din)
begin
case(cst)
s0: if(din) nst <= s1; else nst <= s0;
s1: if(din) nst <= s2; else nst <= s0;
s2: if(!din) nst <= s3; else nst <= s2;
s3: if(din) nst <= s4; else nst <= s0;//s0
s4: if(!din) nst <= s5; else nst <= s2;
s5: if(!din) nst <= s6; else nst <= s1;
s6: if(din) nst <= s1; else nst <= s0;
default: nst <= s0;
endcase
end
assign sout = (cst == s6) ? 1 : 0;
always@(cst)
begin
case(cst)
s0: q = 4'd0;
s1: q = 4'd1;
s2: q = 4'd2;
s3: q = 4'd3;
s4: q = 4'd4;
s5: q = 4'd5;
s6: q = 4'd6;
default: q = 4'd0;
endcase
end
endmodule
时序仿真如下图所示: