Advertisement
Andrei_M

Detect_pattern.verilog

Oct 29th, 2019
366
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module pattern
  2.   (
  3.   input i, clk, rst_b,
  4.   output reg o
  5.   );
  6.  
  7.   localparam S0_ST = 3 'd0 ; //3 bits pt ca avem 6 stari, 2^3 = 8, S6,S7 raman nefolosite
  8.   localparam S1_ST = 3 'd1 ;
  9.   localparam S2_ST = 3 'd2 ;
  10.   localparam S3_ST = 3 'd3 ;
  11.   localparam S4_ST = 3 'd4 ;
  12.   localparam S5_ST = 3 'd5 ;
  13.  
  14.  
  15.   reg [ 2 : 0 ] st ; //3 bits tot pt ca 3 variabile (S0 = 000 sau ABC, unde A=0,B=0,C=0; A,B,C sunt variabilele
  16.   reg [ 2 : 0 ] st_nxt ;
  17.  
  18.  
  19.   always @ (*) //actualizezi starea urmatoare
  20.       case ( st )
  21.         S0_ST : st_nxt = i ? S1_ST : S0_ST;
  22.         S1_ST : st_nxt = i ? S1_ST : S2_ST;
  23.         S2_ST : st_nxt = i ? S3_ST : S0_ST;
  24.         S3_ST : st_nxt = i ? S4_ST : S2_ST;
  25.         S4_ST : st_nxt = i ? S1_ST : S5_ST;
  26.         S5_ST : st_nxt = i ? S3_ST : S0_ST;
  27.       endcase
  28.    
  29.    
  30.    
  31.  always @ (*) begin //actualizezi output-ul
  32.     o = 0'd0;
  33.     if(st == S5_ST)
  34.       o = 0'd1;
  35.     else
  36.       o = 0'd0;
  37.  end  
  38.  
  39. always @ ( posedge clk , negedge rst_b ) //actualizeaza starea
  40.   if (! rst_b ) st <= S0_ST ; //reset active, st becomes first state
  41.  else st <= st_nxt ;
  42.  
  43.  endmodule
  44.  
  45.  
  46.  
  47. //Testbench now:
  48.  
  49. module pattern_tb
  50.   (
  51.   output reg i, clk, rst_b,
  52.   output o
  53.   );
  54.  
  55.   pattern test
  56.   (
  57.     .i(i),
  58.     .clk(clk),
  59.     .rst_b(rst_b),
  60.     .o(o)
  61.    
  62.   );
  63.  
  64.  
  65.  initial begin
  66.    i = 1'd1; //semnalul este pe caietul Ioanei
  67.    
  68.    #200 i = 1'd0;
  69.    #100 i = 1'd1;
  70.    #200 i = 1'd0;
  71.    #200 i = 1'd1;
  72.    #100 i = 1'd0;
  73.    #100 i = 1'd1;
  74.    #200 i = 1'd0;
  75. end  
  76.  
  77.  
  78. initial begin
  79.    clk = 1'd0;
  80.    repeat(23) #50 clk = ~clk; //perioada este 100
  81.    //repetam de 23 de ori pt ca avem 11 perioade ale ceasului, dar avem 50 frecventa pt fiecare clk, deci 22 de ori + 1 pt ca incepi de pe 0 si termini pe 0
  82.    //daca pui doar 22, nu ajunge la ultimul 0 unde se schimba iar output-ul
  83. end
  84.    
  85.    
  86. initial begin  
  87.     rst_b = 1'd0;
  88.     #5 rst_b = 1'd1;
  89. end  
  90.    
  91. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement