您的位置:首页 > 其它

Verilog序列检测器-两例

2017-12-03 21:23 417 查看

1

  序列检测器在数据通讯,雷达和遥测等领域中用与检测步识别标志。它是一种用来检测一组或多组序列信号的电路。例如检测器收到一组串行码{1110010}后,输出标志1,否则,输出0。

  考查这个例子,每收到一个符合要求的串行码就需要用一个状态进行记忆。串行码长度为7位,需要7个状态;另外,还需要增加一个“未收到一个有效位”的状态,共8个状态;S0~S7,状态标记符的下标表示有几个有效位被读出。

  画出状态转换图,如图所示,很显然这是一个莫尔状态机。8个状态机根据编码原则可以用3位二进制数来表示。

  



module seq(in,out,state,clk,reset);
input in,clk,reset; output out;output[2:0]state;
reg[2:0]state;reg out;
parameter s0='d0,s1='d1,s2='d2,s3='d3,s4='d4,s5='d5,s6='d6,s7='d7;
always @(posedge clk)
begin if(reset) begin state<=s0;out<=0;end
else casex(state)
s0:begin
if(in==0) begin state<=s0;out<=0;end
else      begin state<=s1;out<=0;end
end
s1:begin
if(in==0) begin state<=s0;out<=0;end
else      begin state<=s2;out<=0;end
end
s2:begin
if(in==0) begin state<=s0;out<=0;end
else      begin state<=s3;out<=0;end
end
s3:begin
if(in==0) begin state<=s4;out<=0;end
else      begin state<=s3;out<=0;end
end
s4:begin
if(in==0) begin state<=s5;out<=0;end
else      begin state<=s1;out<=0;end
end
s5:begin
if(in==0) begin state<=s0;out<=0;end
else      begin state<=s6;out<=0;end
end
s6:begin
if(in==0) begin state<=s7;out<=1;end
else      begin state<=s2;out<=0;end
end
s7:begin
if(in==0) begin state<=s0;out<=0;end
else      begin state<=s1;out<=0;end
end
default:state<=s0;
endcase
end
endmodule


仿真图片



  状态机处于S3状态时,若再输入一个“1”,为什么状态机仍停留在S3状态,而不是其他状态?

   答:因为连续四个1了,而检测要求的是三个1;所以检测还是当作连续三个1来算。

2

  设计一个“1001”串行数据检测器。使得但输出序列中出现“1001”时,结果中就输出1。输入/输出如下所示:

  输入x:000 101 010 010 011 101 001 110 101

  输出z:000 000 000 010 010 000 001 000 000

  初始状态设为s0,此时检测数据序列为“0000”,当再检测到一个0时,仍为s0,当检测到1时,进入下一个状态s1,此时序列为“0001”;当在状态s1检测到0时,进入到状态s2,此时序列为“0010”,当检测到1时,仍为s1;当在状态s2检测到0时,进入到状态s3,此时序列为“0100”,当检测到1时,进入s1;当在状态s3检测到0时,进入s0,当检测到1时,进入状态s4,此时序列为“1001”,结果输出为1;当在s4检测到0时,进入状态s2,当检测到1时,进入状态s1。状态图如下:



module sjjcq10_3(x,z,clk,reset,state);
input x,clk,reset;
output z;
output[2:0]state;
reg[2:0]state;
reg z;
parameter s0='d0,s1='d1,s2='d2,s3='d3,s4='d4;
always@(posedge clk)
begin
if(reset)begin state<=s0;z<=0;end
else
casex(state)
s0: begin
if(x==0) begin state<=s0;z<=0;end
else     begin state<=s1;z<=0;end
end
s1: begin
if(x==0) begin state<=s2;z<=0;end
else  begin state<=s1;z<=0;end
end
s2:begin
if(x==0) begin state<=s3;z<=0;end
else  begin state<=s1;z<=0;end
end
s3:begin
if(x==0) begin state<=s0;z<=0;end
else  begin state<=s4;z<=1;end
end
s4:begin
if(x==0) begin state<=s2;z<=0;end
else  begin state<=s1;z<=0;end
end
default: state<=s0;
endcase
end
endmodule
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息