Jan 19, 2017

Verilog code to detect Pattern

Detecting pattern is come in Digital design and it is most commonly question during the interview.

Here is one example of detecting " 100110 " pattern using a FSM.




Click below to get the code



Verilog Code for FSM ->


/// ------------------------- Disclaimer--------------------------------
// CopyRight to Rahul Jain
// Do not use this code in any product , this is just a sample code
/// ------------------------- Start -------------------------------------
module pattern_det (

input din,
input clk,
input rstn,
output pat_det

);

parameter ST0 = 3'd0;
parameter ST1 = 3'd1;
parameter ST2 = 3'd2;
parameter ST3 = 3'd3;
parameter ST4 = 3'd4;
parameter ST5 = 3'd5;

reg [2:0] cur_st;
reg [2:0] next_st;

always @(posedge clk or negedge rstn ) begin
 if(!rstn)
  cur_st <= 3'b0;
 else
  cur_st <= next_st;
end


always @(*) begin
 case(cur_st)
   ST0 : if (din == 1'b1 )
           next_st = ST1;
         else
           next_st = ST0;

  ST1:   if (din == 1'b0 )
           next_st = ST2;
         else
           next_st = ST1;

  ST2:   if (din == 1'b0 )
           next_st = ST3;
         else
           next_st = ST1;
       
  ST3:   if (din == 1'b1 )
           next_st = ST4;
         else
           next_st = ST0;
       
  ST4:   if (din == 1'b1 )
           next_st = ST5;
         else
           next_st = ST2;
       
  ST5:   if (din == 1'b0 )
           next_st = ST0;
         else
           next_st = ST1;
       
       
  default : next_st = ST0;
  endcase
end

assign pat_det  = (cur_st == ST5 && next_st == ST0 );


endmodule


module tb;

reg clk =0 ;
reg rstn =0 ;
reg din =0;
reg [31:0] stim =0 ;
reg inst =0;

always #5 clk = ~clk ;

always @(posedge clk ) begin
#1;
stim[30:0]  = stim[31:1] ;
stim[31]  = stim[22] + stim [24] + stim[2];
if(inst)
 stim[30:25] = 6'b011001 ;

end

initial begin
 #100;
 rstn =1 ;
 #100;
 inst =1 ;
 #10 ;
 inst =0 ;
 #1000;
 $finish;

end

initial begin
  $recordfile("fsm.trn");
  $recordvars();
end

pattern_det DUT(
  .clk(clk),
  .rstn(rstn),
  .din(stim[0])
);

endmodule

/// ------------------------- End -------------------------------------

Simulation Result :



Thanks for reading my Blog.

3 comments:

  1. Thanks for sharing the code .. Nice blog

    ReplyDelete
  2. Sir how can I count how many times the pattern is detected in fsm

    ReplyDelete