“10010”序列检测器的Verilog实现与Modelsim仿真

      序列检测器是时序数字电路中非常常见的设计之一。它的主要功能是将一个指定的序列从数字码流中识别出来。例如检测器收到一组串行码(10010)后,输出标志1,否则,输出0。

      本文引用自https://blog.csdn.net/llxxyy507/article/details/81019999

       在“10010”序列检测器中,有6个状态,加上一个Idle状态,共7个状态。但可以首先通过状态化简,简少Verilog代码量。最初的状态分析如下表。



      可以看到状态“Idle”和状态“0”,“10010”在相同的输入下,下一状态与输出完全一样,故可以化简为一个状态,所有状态化简后的对状态进行命名,编码。

                  

      对“Idle”,“1”,“10”,“100”,“1001”分别状态命名为“Idle”,“S1”,“S10”,“S100”,“S1001”。Verilog程序如下:

module seq_detector(seq,clk,rst,b);       // detector "10010"
input seq,clk,rst;
output b; 

reg b;
reg [4:0]state;

parameter Idle  = 5'b1_0000,
          S1    = 5'b0_1000,
          S10   = 5'b0_0100,
          S100  = 5'b0_0010,
          S1001 = 5'b0_0001;

always @(posedge clk or negedge rst)     //low active
  if (!rst) begin
              state <= Idle;
              b <= 0;
             end
  else 
      case(state)
     Idle: if( seq == 0)
              begin
                state <= Idle;
                b <= 0;
              end
           else
              begin
                state <= S1;
                b <= 0;
              end
 
     S1: if( seq == 0)
              begin
                state <= S10;
                b <= 0;
              end
           else
              begin
                state <= S1;
                b <= 0;
              end

     S10: if( seq == 0)
              begin
                state <= S100;
                b <= 0;
              end
           else
              begin
                state <= S1;
                b <= 0;
              end

     S100: if( seq == 0)
              begin
                state <= Idle;
                b <= 0;
              end
           else
              begin
                state <= S1001;
                b <= 0;
              end

     S1001: if( seq == 0)
              begin
                state <= Idle;
                b <= 1;
              end
           else
              begin
                state <= S1;
                b <= 0;
              end
      
      default state <= 5'bx;
    endcase
endmodule

      testbench文件如下:

`timescale 1ns/1ns
`define halfperiod 20

module t;
reg clk,rst;
reg [23:0]data;
wire seq,b;
assign seq = data[23];

initial
  begin
    clk = 0;
    rst = 1;
    #2 rst = 0;
    #30 rst = 1;
    data = 20'b1100_1001_0000_1001_0100;
    #(`halfperiod * 1000)$stop;
  end

always #(`halfperiod) clk = ~clk;
always @(posedge clk)
         #2 data = {data[22:0],data[23]};

seq_detector m(.seq(seq), .clk(clk), .rst(rst), .b(b) );

endmodule

      通过Modelsim仿真得到的结果如下:


扫描二维码关注公众号,回复: 3324946 查看本文章

      可以看到seq在“10010”序列发生后,b能检测到序列的输入并输出高电平。

猜你喜欢

转载自blog.csdn.net/llxxyy507/article/details/81019999
今日推荐