其中状态A-E表示5比特序列“10010”按顺序正确地出现在码流中。考虑到序列重叠的可能,转换图中还有状态F、G。另外、电路的初始状态设为IDLE。
进一步,我们得出Verilog HDL代码。
//文件:sequence.v
module seqdet( x, z, clk, rst);
input x,clk, rst;
output z;
reg [2:0] state;//状态寄存器
wire z;
parameter IDLE= ‘d0, A=’d1, B=‘d2,
C=’d3, D=‘d4,
E=’d5, F=‘d6,
G=’d7;
assign z=(state==D && x==0) ? 1 :0;
always @(posedge clk or negedge rst) if(!rst)
begin
state《=IDLE;
end
else
casex( state)
IDLE: if(x==1)
begin
state《=A;
end
A: if (x==0)
begin
state《=B;
end
B: if (x==0)
begin
state《=C;
end
else
begin
state《=F;
end
C: if(x==1)
begin
state《=D;
end
else
begin
state《=G;
end
D: if(x==0)
begin
state《=E;
end
else
begin
state《=A;
end
E: if(x==0)
begin
state《=C;
end
else
begin
state《=A;
end
F: if(x==1)
begin
state《=A;
end
else
begin
state《=B;
end
G: if(x==1)
begin
state《=F;
end
default: state《=IDLE;
endcase
endmodule
为了验证其正确性,我们接着编写测试用代码。
//文件:sequence.tf
`timescale 1ns/1ns
module t;
reg clk, rst;
reg [23:0] data;
wire z,x;
assign x=data[23];
initial
begin
clk《=0;
rst《=1;
#2 rst《=0;
#30 rst《=1; //复位信号
data=‘b1100_1001_0000_1001_0100; //码流数据
end
always #10 clk=~clk; //时钟信号
always @ (posedge clk) // 移位输出码流
data={data[22:0],data[23]};
seqdet m ( .x(x), .z(z), .clk(clk), .rst(rst)); //调用序列检测器模块
// Enter fixture code here
endmodule // t
其中、X码流的产生,我们采用了移位寄存器的方式,以方便更改测试数据。仿真结果如下图所示: