Top secrets sources NedoPC pentevo

Rev

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

// ZX-Evo Base Configuration (c) NedoPC 2008,2009,2010,2011,2012,2013,2014
//
// reset generator

/*
    This file is part of ZX-Evo Base Configuration firmware.

    ZX-Evo Base Configuration firmware is free software:
    you can redistribute it and/or modify it under the terms of
    the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    ZX-Evo Base Configuration firmware is distributed in the hope that
    it will be useful, but WITHOUT ANY WARRANTY; without even
    the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    See the GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with ZX-Evo Base Configuration firmware.
    If not, see <http://www.gnu.org/licenses/>.
*/


`include "../include/tune.v"

module resetter(

        clk,

        rst_in_n,

        rst_out_n );

parameter RST_CNT_SIZE = 4;


        input clk;

        input rst_in_n; // input of external asynchronous reset

        output rst_out_n; // output of end-synchronized reset (beginning is asynchronous to clock)
        reg    rst_out_n;



        reg [RST_CNT_SIZE:0] rst_cnt; // one bit more for counter stopping

        reg rst1_n,rst2_n;



`ifdef SIMULATE
        initial
        begin
                rst_cnt = 0;
                rst1_n = 1'b0;
                rst2_n = 1'b0;
                rst_out_n = 1'b0;
        end
`endif


        always @(posedge clk, negedge rst_in_n)
        if( !rst_in_n ) // external asynchronous reset
        begin
                rst_cnt <= 0;
                rst1_n <= 1'b0;
                rst2_n <= 1'b0;
                rst_out_n <= 1'b0; // this zeroing also happens after FPGA configuration, so also power-up reset happens
        end
        else // clocking
        begin
                rst1_n <= 1'b1;
                rst2_n <= rst1_n;

                if( rst2_n && !rst_cnt[RST_CNT_SIZE] )
                begin
                        rst_cnt <= rst_cnt + 1;
                end

                if( rst_cnt[RST_CNT_SIZE] )
                begin
                        rst_out_n <= 1'b1;
                end
        end


endmodule