Subversion Repositories ngs

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

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