Subversion Repositories pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

  1. module resetter(
  2.  
  3.         clk,
  4.  
  5.         rst_in_n,
  6.  
  7.         rst_out_n );
  8.  
  9. parameter RST_CNT_SIZE = 4;
  10.  
  11.  
  12.         input clk;
  13.  
  14.         input rst_in_n; // input of external asynchronous reset
  15.  
  16.         output rst_out_n; // output of end-synchronized reset (beginning is asynchronous to clock)
  17.         reg    rst_out_n;
  18.  
  19.  
  20.  
  21.         reg [RST_CNT_SIZE:0] rst_cnt; // one bit more for counter stopping
  22.  
  23.         reg rst1_n,rst2_n;
  24.  
  25.  
  26.  
  27. `ifdef SIMULATE
  28.         initial
  29.         begin
  30.                 rst_cnt = 0;
  31.                 rst1_n = 1'b0;
  32.                 rst2_n = 1'b0;
  33.                 rst_out_n = 1'b0;
  34.         end
  35. `endif
  36.  
  37.  
  38.         always @(posedge clk, negedge rst_in_n)
  39.         if( !rst_in_n ) // external asynchronous reset
  40.         begin
  41.                 rst_cnt <= 0;
  42.                 rst1_n <= 1'b0;
  43.                 rst2_n <= 1'b0;
  44.                 rst_out_n <= 1'b0; // this zeroing also happens after FPGA configuration, so also power-up reset happens
  45.         end
  46.         else // clocking
  47.         begin
  48.                 rst1_n <= 1'b1;
  49.                 rst2_n <= rst1_n;
  50.  
  51.                 if( rst2_n && !rst_cnt[RST_CNT_SIZE] )
  52.                 begin
  53.                         rst_cnt <= rst_cnt + 1;
  54.                 end
  55.  
  56.                 if( rst_cnt[RST_CNT_SIZE] )
  57.                 begin
  58.                         rst_out_n <= 1'b1;
  59.                 end
  60.         end
  61.  
  62.  
  63. endmodule
  64.  
  65.