OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [orpsocv2/] [boards/] [xilinx/] [s3adsp1800/] [rtl/] [verilog/] [clkgen/] [clkgen.v] - Rev 868

Go to most recent revision | Compare with Previous | Blame | View Log

/*
 *
 * Clock, reset generation unit for s3adsp1800 board
 * 
 * Implements clock generation according to design defines
 * 
 */
//////////////////////////////////////////////////////////////////////
////                                                              ////
//// Copyright (C) 2009, 2010 Authors and OPENCORES.ORG           ////
////                                                              ////
//// This source file may be used and distributed without         ////
//// restriction provided that this copyright statement is not    ////
//// removed from the file and that any derivative work contains  ////
//// the original copyright notice and the associated disclaimer. ////
////                                                              ////
//// This source file is free software; you can redistribute it   ////
//// and/or modify it under the terms of the GNU Lesser General   ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any   ////
//// later version.                                               ////
////                                                              ////
//// This source 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 Lesser General Public License for more ////
//// details.                                                     ////
////                                                              ////
//// You should have received a copy of the GNU Lesser General    ////
//// Public License along with this source; if not, download it   ////
//// from http://www.opencores.org/lgpl.shtml                     ////
////                                                              ////
//////////////////////////////////////////////////////////////////////
 
`include "orpsoc-defines.v"
`include "synthesis-defines.v"
 
module clkgen
  (
   // Main clocks in, depending on board
   sys_clk_i,
 
   // Wishbone clock and reset out  
   wb_clk_o,
   wb_rst_o,
 
   // JTAG clock
`ifdef JTAG_DEBUG
   tck_pad_i,
   dbg_tck_o,
`endif      
   // Main memory clocks
`ifdef XILINX_DDR2
   clk133_o,
`endif
 
   // Asynchronous, active low reset in
   rst_n_pad_i
 
   );
 
   input  sys_clk_i;
 
   output wb_rst_o;
   output wb_clk_o;
 
`ifdef JTAG_DEBUG
   input  tck_pad_i;
   output dbg_tck_o;
`endif      
 
`ifdef XILINX_DDR2
   output clk133_o;
`endif
 
   // Asynchronous, active low reset (pushbutton, typically)
   input  rst_n_pad_i;
 
   // First, deal with the asychronous reset
   wire   async_rst;
   wire   async_rst_n;
 
   // Xilinx synthesis tools appear cluey enough to instantiate buffers when and
   // where they're needed, so we do simple assigns for this tech.
   assign async_rst_n = rst_n_pad_i;   
 
   // Everyone likes active-high reset signals...
   assign async_rst = ~async_rst_n;
 
 
`ifdef JTAG_DEBUG   
   assign dbg_tck_o = tck_pad_i;
`endif
 
   //
   // Declare synchronous reset wires here
   //
 
   // An active-low synchronous reset signal (usually a PLL lock signal)
   wire   sync_rst_n;
 
   // An active-low synchronous reset from ethernet PLL
   wire   sync_eth_rst_n;
 
   // IBUF for sys_clk_i
   wire   sys_clk;
   IBUFG ibufg0
     (.I(sys_clk_i), .O(sys_clk));
 
 
   /* DCM0 wires */
   wire 	   dcm0_clk0_prebufg, dcm0_clk0;
   wire 	   dcm0_clkfx_prebufg, dcm0_clkfx;
   wire 	   dcm0_clkdv_prebufg, dcm0_clkdv;
   wire 	   dcm0_locked;
 
 
   /* DCM providing main system/Wishbone clock */
   DCM_SP #( .CLK_FEEDBACK("1X"), 
	     // 125 / 5 = 25 MHz
	     .CLKDV_DIVIDE(5),
	     // 125 * 2/8 = 31.25Mhz
	     .CLKFX_DIVIDE(8), 
             .CLKFX_MULTIPLY(2),
	     // Clkin = 125 Mhz
	     .CLKIN_PERIOD(8.000), 
	     .CLKIN_DIVIDE_BY_2("FALSE"), 
             .CLKOUT_PHASE_SHIFT("NONE"), .DESKEW_ADJUST("SYSTEM_SYNCHRONOUS"), 
             .DFS_FREQUENCY_MODE("LOW"), .DLL_FREQUENCY_MODE("LOW"), 
             .DUTY_CYCLE_CORRECTION("TRUE"), .FACTORY_JF(16'hC080), 
             .PHASE_SHIFT(0), .STARTUP_WAIT("FALSE") ) 
   DCM_SP_INST 
     (
      .CLKFB(dcm0_clk0), 
      .CLKIN(sys_clk), 
      .DSSEN(1'b0), 
      .PSCLK(1'b0), 
      .PSEN(1'b0), 
      .PSINCDEC(1'b0), 
      .RST(1'b0), 
      .CLKDV(dcm0_clkdv_prebufg), 
      .CLKFX(dcm0_clkfx_prebufg), 
      .CLKFX180(), 
      .CLK0(dcm0_clk0_prebufg), 
      .CLK2X(), 
      .CLK2X180(), 
      .CLK90(), 
      .CLK180(), 
      .CLK270(), 
      .LOCKED(dcm0_locked), 
      .PSDONE(), 
      .STATUS());
 
   BUFG dcm0_clk0_bufg
     (// Outputs
      .O                                 (dcm0_clk0),
      // Inputs
      .I                                 (dcm0_clk0_prebufg));
 
   BUFG dcm0_clkfx_bufg
     (// Outputs
      .O                                 (dcm0_clkfx),
      // Inputs
      .I                                 (dcm0_clkfx_prebufg));
 
   BUFG dcm0_clkdv_bufg
     (// Outputs
      .O                                 (dcm0_clkdv),
      // Inputs
      .I                                 (dcm0_clkdv_prebufg));
 
   assign wb_clk_o = dcm0_clkdv;
   assign sync_rst_n = dcm0_locked;
 
 `ifdef XILINX_DDR2
   assign clk133_o = dcm0_clk0; // 125 MHz for now
 `endif
 
   //
   // Reset generation
   //
   //
 
   // Reset generation for wishbone
   reg [15:0] 	   wb_rst_shr;
   always @(posedge wb_clk_o or posedge async_rst)
     if (async_rst)
       wb_rst_shr <= 16'hffff;
     else
       wb_rst_shr <= {wb_rst_shr[14:0], ~(sync_rst_n)};
 
   assign wb_rst_o = wb_rst_shr[15];
 
 
 `ifdef XILINX_DDR2
   /*
   // Reset generation for DDR2 controller
   reg [15:0] 	   ddr2_if_rst_shr;
   always @(posedge ddr2_if_clk_o or posedge async_rst)
     if (async_rst)
       ddr2_if_rst_shr <= 16'hffff;
     else
       ddr2_if_rst_shr <= {ddr2_if_rst_shr[14:0], ~(sync_rst_n)};
 
   assign ddr2_if_rst_o = ddr2_if_rst_shr[15];   
    */
`endif   
 
 
endmodule // clkgen
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.