// ========== Copyright Header Begin ==========================================
// OpenSPARC T2 Processor File: rgmii_clk_gen.v
// Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved
// 4150 Network Circle, Santa Clara, California 95054, U.S.A.
// * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
// This program 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; version 2 of the License.
// This program 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 this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
// For the avoidance of doubt, and except that if any non-GPL license
// choice is available it will apply instead, Sun elects to use only
// the General Public License version 2 (GPLv2) at this time for any
// software where a choice of GPL license versions is made
// available with the language indicating that GPLv2 or any later version
// may be used, or where a choice of which version of the GPL is applied is
// otherwise unspecified.
// Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
// CA 95054 USA or visit www.sun.com if you need additional information or
// ========== Copyright Header End ============================================
/*************************************************************************
* File Name : rgmii_clk_gen.v
* Description : Use 250Mhz ref clk to generate
* 125Mhz, 25Mhz and 2.5Mhz clocks.
* To generate 50% duty cycle, the ref clk has to be 250Mhz.
* Parent Module: xmac_2pcs_clk_mux or bmcac_pcs_clk_mux
* Date Created : 1-1-2003
* Copyright (c) 2008, Sun Microsystems, Inc.
* Sun Proprietary and Confidential
*************************************************************************/
/* --------------- tx_rgmii_timer -------------------- */
SYNC_CELL hw_reset_tclk_SYNC_CELL(.D(reset),.CP(ref_clk_250mhz),.Q(hw_reset_tclk));
FD1 d_hw_reset_tclk_FD1(.D(hw_reset_tclk),
wire hw_reset_tclk_lead = hw_reset_tclk & ~d_hw_reset_tclk;
// -----------------------------------------------------------------
// -----------------------------------------------------------------
// -----------------------------------------------------------------
// 25Mhz perios is 40ns. It needs 10, 250Mhz clocks to make 40ns.
// 5 250Mhz clocks for each edge. -> cnt4
// -----------------------------------------------------------------
// -----------------------------------------------------------------
// 2.5Mhz period is 400ns. It needs 100, 250Mhz clocks to make 400ns.
// 50 250Mhz clocks for each edge. -> cnt49
// -----------------------------------------------------------------
wire [5:0] tx_rgmii_timer;
wire cnt3 = tx_rgmii_timer == 6'd03;
wire cnt4 = tx_rgmii_timer == 6'd04;
wire cnt49 = tx_rgmii_timer == 6'd49;
always @ (gmii_mode or sel_clk_25mhz or
toggle = 1'b1; // 1G mode freq = 125mhz
toggle = cnt4; // 100Mhz freq = 25mhz
toggle = cnt49; // 10Mhz freq = 2.5mhz
Counter #(6) tx_rgmii_timer_Counter (.reset(hw_reset_tclk_lead | toggle),
TFF tclk_int_TFF (.toggle(toggle),
.reset(hw_reset_tclk_lead),
endmodule // rgmii_clk_gen