Verilog序列检测器-两例

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
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页
实付 9.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值