一、序列检测器
序列检测器的逻辑功能就是将一个指定的比特序列从一串较长的比特流中识别出来。
例如:针对一个较长的比特流010010010011110101010…,我们希望能将比特序列为“10010”的序列检测出来,并且每次检测到10010就将输出置“1”.
注意:如序列”100100100…",根据以上的介绍,会在第六个比特的时刻输出会置1,但是,在第9个比特时输出不会被置”1“,虽然第4-8比特也构成了”10010“,但是却与第一次的”10010“重叠,因此不能算作有效检测。
二、状态转移图
设:
S0表示初始态,代表检测到第一个比特为0,即”0“;
S1是第二个状态,代表检测到第一个比特为1,即”1“;
S2是第三个状态,代表检测到的序列为”10“;
S3是第四个状态,代表检测到的序列为”100“;
S4是第五个状态,代表检测到的序列为”1001“;
注意:该状态的设定已经化简掉多余状态。
三、序列检测器Verilog HDL程序
1、源程序
代码如下:
module SeqDetecter(
clk,
reset_n,
bits,
Det_Done
);
input clk;
input reset_n;
input bits;
output reg Det_Done;
parameter S0 = 5'b00001;
parameter S1 = 5'b00010;
parameter S2 = 5'b00100;
parameter S3 = 5'b01000;
parameter S4 = 5'b10000;
reg [4:0] state;
always @(posedge clk,negedge reset_n)
if(!reset_n)
state <= 5'b00001;
else begin
case(state)
S0: if(bits == 0) state<=S0; else state<=S1;
S1: if(bits == 0) state<=S2; else state<=S1;
S2: if(bits == 0) state<=S3; else state<=S1;
S3: if(bits == 0) state<=S0; else state<=S4;
S4: if(bits == 0) state<=S0; else state<=S1;
default: state<=S0;
endcase
end
always @(posedge clk,negedge reset_n)
if(!reset_n)
Det_Done<=0;
else begin
case(state)
S0: Det_Done <= 1'b0;
S1: Det_Done <= 1'b0;
S2: Det_Done <= 1'b0;
S3: Det_Done <= 1'b0;
S4: if(bits == 0) Det_Done<=1'b1; else Det_Done<=1'b0;
default:Det_Done <= 1'b0;
endcase
end
endmodule
2、测试平台程序
代码如下(示例):
`timescale 1ns / 1ns
module seq_detecter_tb;
reg sclk;
reg sreset_n;
wire oDet_Done;
wire x;
reg [23:0]seqs;
SeqDetecter inst0(
.clk(sclk),
.reset_n(sreset_n),
.bits(x),
.Det_Done(oDet_Done)
);
initial sclk = 0;
always #10 sclk = ~sclk;
assign x = seqs[23];
initial begin
sreset_n = 1;
seqs = 23'b0;
#200;
sreset_n = 0;
#20;
sreset_n = 1;
seqs = 20'b1100_1001_0000_1001_0100;
#1000;
$stop;
end
always @(posedge sclk)
seqs = {seqs[22:0],seqs[23]};
endmodule
该处使用的url网络请求的数据。
四、仿真结果
五、总结
本博文实现了一个简单的基于状态机的序列检测器,并给出了仿真结果,可以作为Verilog HDL学习中,时序电路设计的练习题目。