00001 --**************************************************************
00002 --* *
00003 --* The source code for the ATLAS BCM "AAA" FPGA is made *
00004 --* available via the GNU General Public License (GPL) *
00005 --* unless otherwise stated below. *
00006 --* *
00007 --* In case of problems/questions/bug reports etc. please *
00008 --* contact michael.niegl@cern.ch *
00009 --* *
00010 --**************************************************************
00011
00012 --**************************************************************
00013 --* *
00014 --* $Source: /local/reps/bcmfpga/bcm_aaa/bcm_aaa/ddr2/ddr2_mem_infrastructure.vhd,v $
00015 --* $Revision: 1.5.2.4 $ *
00016 --* $Name: dev $ *
00017 --* $Author: mniegl $ *
00018 --* $Date: 2008/11/03 21:55:53 $ *
00019
00020
00021 --* *
00022 --**************************************************************
00023 -------------------------------------------------------------------------------
00024 -- Copyright (c) 2005 Xilinx, Inc.
00025 -- This design is confidential and proprietary of Xilinx, All Rights Reserved.
00026 -------------------------------------------------------------------------------
00027 -- ____ ____
00028 -- / /\/ /
00029 -- /___/ \ / Vendor: Xilinx
00030 -- \ \ \/ Version: 1.6
00031 -- \ \ Application : MIG
00032 -- / / Filename: ddr2_mem_infrastructure.vhd
00033 -- /___/ /\ Date Last Modified: Wed Jun 1 2005
00034 -- \ \ / \Date Created: Mon May 2 2005
00035 -- \___\/\___\
00036 --
00037 -- Device: Virtex-4
00038 -- Design Name: DDR2_V4
00039 -------------------------------------------------------------------------------
00040
00041
00042 library ieee;
00043
00044 use ieee.std_logic_1164.all;
00045
00046 use ieee.std_logic_unsigned.all;
00047
00048 use ieee.numeric_std.all;
00049
00050 library unisim;
00051
00052 use unisim.vcomponents.all;
00053
00054
00055
00056
00057
00058
00059 entity ddr2_mem_infrastructure is
00060 port (
00061 SYS_RESET_IN : in ;
00062 SYS_CLK_P : in ;
00063 SYS_CLK_N : in ;
00064 CLK200_P : in ;
00065 CLK200_N : in ;
00066 LOCK : in ;
00067 CLK : out ;
00068 CLK90 : out ;
00069 CLK50 : out ;
00070 CLK200 : out ;
00071 REFRESH_CLK : out ;
00072 sys_rst : out ;
00073 sys_rst90 : out ;
00074 sys_rst_ref_clk_1 : out
00075 );
00076
00077 end entity;
00078
00079
00080
00081
00082
00083
00084 architecture arc_infrastructure of ddr2_mem_infrastructure is
00085
00086
00087 component BUFG
00088 port(
00089 O : out ;
00090 I : in
00091 );
00092 end component;
00093
00094 signal clk0_bufg_in : ;
00095 signal clk90_bufg_in : ;
00096 signal clkdv_bufg_in : ;
00097 signal clk50_bufg_in : ;
00098 signal clk0_bufg_out : ;
00099 signal clk90_bufg_out : ;
00100 signal clkdv_bufg_out : ;
00101 signal clk50_bufg_out : ;
00102 signal dcm_lock : ;
00103 signal dcm_lock_res : ;
00104 signal sys_rst_0 : ;
00105 signal sys_rst_1 : ;
00106 signal sys_rst_2 : ;
00107 signal sys_rst_3 : ;
00108 signal sys_rst90_0 : ;
00109 signal sys_rst90_1 : ;
00110 signal sys_rst90_2 : ;
00111 signal sys_rst90_3 : ;
00112 signal sys_rst_ref_clk_0 : ;
00113 signal sys_rst_ref_clk : ;
00114 signal sys_rst_ref_clk_1r : ;
00115 signal SYS_RESET : ;
00116
00117 begin
00118
00119 sys_rst_ref_clk_1 <= sys_rst_ref_clk_1r;
00120 SYS_RESET <= not SYS_RESET_IN;
00121 CLK <= clk0_bufg_out;
00122 CLK90 <= clk90_bufg_out;
00123 CLK200 <= clk0_bufg_out;
00124 REFRESH_CLK <= clkdv_bufg_out;
00125 CLK50 <= clk50_bufg_out;
00126 dcm_lock_res <= not LOCK;
00127
00128
00129 DCM_BASE0 : DCM_BASE
00130 generic map (
00131 CLKDV_DIVIDE => 16.0, -- Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5
00132 -- 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0
00133 CLKFX_DIVIDE => 8, -- Can be any interger from 1 to 32
00134 CLKFX_MULTIPLY => 2, -- Can be any integer from 2 to 32
00135 CLKIN_DIVIDE_BY_2 => false, -- TRUE/FALSE to enable CLKIN divide by two feature
00136 CLKIN_PERIOD => 5.0, -- Specify period of input clock in ns from 1.25 to 1000.00
00137 CLKOUT_PHASE_SHIFT => "NONE", -- Specify phase shift mode of NONE or FIXED
00138 CLK_FEEDBACK => "1X", -- Specify clock feedback of NONE or 1X
00139 DCM_AUTOCALIBRATION => true, -- DCM calibrartion circuitry TRUE/FALSE
00140 DCM_PERFORMANCE_MODE => "MAX_SPEED", -- Can be MAX_SPEED or MAX_RANGE
00141 DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS" , -- SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or
00142 -- an integer from 0 to 15
00143 DFS_FREQUENCY_MODE => "LOW", -- LOW or HIGH frequency mode for frequency synthesis
00144 DLL_FREQUENCY_MODE => "HIGH", -- LOW, HIGH, or HIGH_SER frequency mode for DLL
00145 DUTY_CYCLE_CORRECTION => true, -- Duty cycle correction, TRUE or FALSE
00146 FACTORY_JF => X"F0F0", -- FACTORY JF Values Suggested to be set to X"F0F0
00147 PHASE_SHIFT => 0, -- Amount of fixed phase shift from -255 to 1023
00148 STARTUP_WAIT => false) -- Delay configuration DONE until DCM LOCK, TRUE/FALSE
00149 port map (
00150 CLK0 => CLK0_bufg_in , --CLK0_bufg_in, -- 0 degree DCM CLK ouptput
00151 CLK180 => open, -- 180 degree DCM CLK output
00152 CLK270 => open, -- 270 degree DCM CLK output
00153 CLK2X => open, -- 2X DCM CLK output
00154 CLK2X180 => open, -- 2X, 180 degree DCM CLK out
00155 CLK90 => clk90_bufg_in, -- 90 degree DCM CLK output
00156 CLKDV => clkdv_bufg_in, -- Divided DCM CLK out (CLKDV_DIVIDE)
00157 CLKFX => clk50_bufg_in, -- DCM CLK synthesis out (M/D)
00158 CLKFX180 => open, -- 180 degree CLK synthesis out
00159 LOCKED => dcm_lock, -- DCM LOCK status output
00160 CLKFB => clk0_bufg_out, --CLK0_bufg_in, -- DCM clock feedback
00161 CLKIN => SYS_CLK_P , -- Clock input (from IBUFG, BUFG or DCM)
00162 RST => dcm_lock_res -- DCM asynchronous reset input
00163 );
00164
00165
00166 dcm_clk0 : BUFG
00167 port map (
00168 O => clk0_bufg_out,
00169 I => clk0_bufg_in
00170 );
00171
00172
00173 dcm_clk90 : BUFG
00174 port map (
00175 O => clk90_bufg_out,
00176 I => clk90_bufg_in
00177 );
00178
00179
00180 dcm_clkdv : BUFR
00181 port map (
00182 CE => '1' ,
00183 CLR => '0' ,
00184 O => clkdv_bufg_out,
00185 I => clkdv_bufg_in
00186 );
00187
00188
00189 dcm_clkfx : BUFG
00190 port map (
00191 O => clk50_bufg_out,
00192 I => clk50_bufg_in
00193 );
00194
00195
00196 process(clk0_bufg_out)
00197 begin
00198 if clk0_bufg_out'event and clk0_bufg_out = '1' then
00199
00200 if ((SYS_RESET = '1') or (dcm_lock = '0') or (sys_rst_ref_clk = '1')) then
00201 sys_rst_0 <= '1';
00202 sys_rst_1 <= '1';
00203 sys_rst_2 <= '1';
00204 sys_rst_3 <= '1';
00205 sys_rst <= '1';
00206 else
00207 sys_rst_0 <= '0';
00208 sys_rst_1 <= sys_rst_0;
00209 sys_rst_2 <= sys_rst_1;
00210 sys_rst_3 <= sys_rst_2;
00211 sys_rst <= sys_rst_3;
00212
00213 end if;
00214 end if;
00215 end process;
00216
00217
00218 process(clk90_bufg_out)
00219 begin
00220 if clk90_bufg_out'event and clk90_bufg_out = '1' then
00221
00222 if ((SYS_RESET = '1') or (dcm_lock = '0') or (sys_rst_ref_clk = '1')) then
00223 sys_rst90_0 <= '1';
00224 sys_rst90_1 <= '1';
00225 sys_rst90_2 <= '1';
00226 sys_rst90_3 <= '1';
00227 sys_rst90 <= '1';
00228 else
00229 sys_rst90_0 <= '0';
00230 sys_rst90_1 <= sys_rst90_0;
00231 sys_rst90_2 <= sys_rst90_1;
00232 sys_rst90_3 <= sys_rst90_2;
00233 sys_rst90 <= sys_rst90_3;
00234 end if;
00235 end if;
00236 end process;
00237
00238
00239 process(clk50_bufg_out)
00240 begin
00241 if clk50_bufg_out'event and clk50_bufg_out = '1' then
00242
00243 if ((SYS_RESET = '1') or (dcm_lock = '0')) then
00244 sys_rst_ref_clk_0 <= '1';
00245 sys_rst_ref_clk_1r <= '1';
00246 sys_rst_ref_clk <= '1';
00247 else
00248 sys_rst_ref_clk_0 <= '0';
00249 sys_rst_ref_clk_1r <= sys_rst_ref_clk_0;
00250 sys_rst_ref_clk <= sys_rst_ref_clk_1r;
00251 end if;
00252 end if;
00253 end process;
00254
00255 end arc_infrastructure;