//======================================================================
//
// alpha_clkmgr.v
// ---------------
// Clock and reset implementation for the Cryptech Alpha
// FPGA framework.
//
//
// Author: Pavel Shatov
// Copyright (c) 2016, 2018-2019 NORDUnet A/S All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// - Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// - Neither the name of the NORDUnet nor the names of its contributors may
// be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
// TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//======================================================================
module alpha_clkmgr
(
input wire fmc_clk, // signal from clock pin
output wire io_clk, // buffered i/o clock
output wire sys_clk, // buffered system clock output
output wire sys_rst_n, // system reset output (async set, sync clear, active-low)
output wire core_clk // buffered high speed core clock
);
//
// Parameters
//
parameter integer CLK_CORE_MULT = 4;
//
// STARTUPE2
//
wire cfg_mclk; // 65 MHz (+/- 50%) internal oscillator
wire cfg_eos; // end-of-startup flag
STARTUPE2 #
(
.SIM_CCLK_FREQ (0.0), // config clock frequency for simulation
.PROG_USR ("FALSE") // only used with encrypted bitstreams
)
STARTUPE2_inst
(
.CLK (1'b0), // no external clock
.CFGCLK (), // config clock (unused)
.CFGMCLK (cfg_mclk), // config clock
.EOS (cfg_eos), // end-of-startup flag
.USRCCLKO (1'b0), // custom clock for configuration memory access (unused)
.USRCCLKTS (1'b0), // UG470 recommends this to be held low
.USRDONEO (1'b1), // custom value to drive onto DONE pin (unused)
.USRDONETS (1'b1), // tri-state DONE pin (unused)
.GSR (1'b0), // UG470 recommends hardwiring this low
.GTS (1'b0), // UG470 recommends this to be tied low
.PREQ (), // unused when PROG_USR is disabled
.PACK (1'b0), // only used when PROG_USR is enabled
.KEYCLEARB (1'b1) // unused
);
//
// Wrapper for Xilinx-specific MMCM (Mixed Mode Clock Manager) primitive.
//
wire mmcm_reset; // reset input
wire mmcm_locked; // output clock valid
clkmgr_mmcm #
(
.CLK_CORE_MULT(CLK_CORE_MULT)
)
mmcm_inst
(
.fmc_clk_in (fmc_clk),
.rst_in (mmcm_reset),
.io_clk_out (io_clk),
.sys_clk_out (sys_clk),
.core_clk_out (core_clk),
.locked_out (mmcm_locked)
);
//
// MMCM Controller
//
clkmgr_mmcm_ctrl mmcm_ctrl_inst
(
.clk_in (cfg_mclk),
.reset_n_in (cfg_eos),
.locked_in (mmcm_locked),
.reset_out (mmcm_reset)
);
//
// System Reset Logic
//
clkmgr_reset_gen #(.SHREG_WIDTH(16)) reset_gen_inst
(
.clk_in (sys_clk),
.locked_in (mmcm_locked),
.reset_n_out (sys_rst_n)
);
endmodule
//======================================================================
// EOF alpha_clkmgr.v
//======================================================================