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/ddr/mem_interface_top_infrastructure.vhd,v $
00015 --* $Revision: 1.6.2.3 $ *
00016 --* $Name: dev $ *
00017 --* $Author: mniegl $ *
00018 --* $Date: 2008/11/03 17:57:43 $ *
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: mem_interface_top_infrastructure.vhd
00033 -- /___/ /\ Date Last Modified: Wed Jun 1 2005
00034 -- \ \ / \Date Created: Mon May 2 2005
00035 -- \___\/\___\
00036 -- Device: Virtex-4
00037 -- Design Name: DDR1_SDRAM
00038 -------------------------------------------------------------------------------
00039
00040
00041 library ieee;
00042
00043 use ieee.std_logic_1164.all;
00044
00045 library unisim;
00046
00047 use unisim.vcomponents.all;
00048
00049
00050
00051
00052
00053 entity mem_interface_top_infrastructure is
00054 port
00055 (
00056 SYS_CLK_N : in ;
00057 SYS_CLK_P : in ;
00058 CLK200_N : in ;
00059 CLK200_P : in ;
00060 SYS_RESET_IN : in ;
00061 LOCK : in ;
00062 CLK : out ;
00063 CLK90 : out ;
00064 CLK200 : out ;
00065 CLK50 : out ;
00066 REFRESH_CLK : out ;
00067 sys_rst : out ;
00068 sys_rst90 : out ;
00069 sys_rst_ref_clk_1 : out
00070 );
00071 end mem_interface_top_infrastructure;
00072
00073
00074
00075
00076
00077 architecture arch of mem_interface_top_infrastructure is
00078
00079
00080 component DCM_BASE
00081 generic(
00082 CLKDV_DIVIDE : := 16.0;
00083 CLKFX_DIVIDE : := 8;
00084 CLKFX_MULTIPLY : := 2;
00085 DCM_PERFORMANCE_MODE : := "MAX_SPEED";
00086 DFS_FREQUENCY_MODE : := "LOW";
00087 DLL_FREQUENCY_MODE : := "HIGH";
00088 DUTY_CYCLE_CORRECTION : := true;
00089 FACTORY_JF : bit_vector := X"F0F0"
00090 );
00091 port(
00092 CLK0 : out ;
00093 CLK180 : out ;
00094 CLK270 : out ;
00095 CLK2X : out ;
00096 CLK2X180 : out ;
00097 CLK90 : out ;
00098 CLKDV : out ;
00099 CLKFX : out ;
00100 CLKFX180 : out ;
00101 LOCKED : out ;
00102 CLKFB : in ;
00103 CLKIN : in ;
00104 RST : in
00105 );
00106 end component;
00107
00108
00109 component BUFG
00110 port(O : out ;
00111 I : in
00112 );
00113 end component;
00114
00115 signal clk0_bufg_in : ;
00116 signal clk90_bufg_in : ;
00117 signal clkdv_bufg_in : ;
00118 signal clk50_bufg_in : ;
00119 signal clk0_bufg_out : ;
00120 signal clk90_bufg_out : ;
00121 signal clkdv_bufg_out : ;
00122 signal clk0_bufg1_out : ;
00123 signal clk50_bufg_out : ;
00124 signal SYS_CLK_IN : ;
00125 signal LOCKED : ;
00126 signal sys_rst_0 : ;
00127 signal sys_rst_1 : ;
00128 signal sys_rst_2 : ;
00129 signal sys_rst_3 : ;
00130 signal sys_rst90_0 : ;
00131 signal sys_rst90_1 : ;
00132 signal sys_rst90_2 : ;
00133 signal sys_rst90_3 : ;
00134 signal sys_rst_ref_clk_0 : ;
00135 signal sys_rst_ref_clk_2 : ;
00136 signal sys_rst_ref_clk : ;
00137 signal REF_CLK200_IN : ;
00138 signal SYS_RESET : ;
00139 signal clk_int : ;
00140 signal clk90_int : ;
00141 signal clk50_int : ;
00142 signal dcm_lock_res : := '0';
00143
00144 begin
00145
00146 CLK <= clk0_bufg_out;
00147 CLK90 <= clk90_bufg_out;
00148 clk_int <= clk0_bufg_out;
00149 clk90_int <= clk90_bufg_out;
00150 CLK200 <= clk0_bufg1_out;
00151 REFRESH_CLK <= clkdv_bufg_out;
00152 CLK50 <= clk50_bufg_out;
00153 clk50_int <= clk50_bufg_out;
00154 SYS_RESET <= not SYS_RESET_IN;
00155 dcm_lock_res <= not LOCK;
00156
00157 --SYS_CLK_IN <= SYS_CLK_P;
00158 --REF_CLK200_IN <= CLK200_P;
00159 --
00160 --input1: BUFG port map
00161 -- ( O => SYS_CLK_IN,
00162 -- I => SYS_CLK_P
00163 -- );
00164 SYS_CLK_IN <= SYS_CLK_P;
00165
00166 --input2: BUFG port map
00167 -- ( O => REF_CLK200_IN,
00168 -- I => CLK200_P
00169 -- );
00170
00171 REF_CLK200_IN <= CLK200_P;
00172
00173
00174 --lvds_sys_clk_input: IBUFGDS_LVPECL_25 port map
00175 -- ( I => SYS_CLK_P,
00176 -- IB => SYS_CLK_N,
00177 -- O => SYS_CLK_IN
00178 -- );
00179 --
00180 --lvpecl_clk200_in: IBUFGDS_LVPECL_25 port map
00181 -- ( I => CLK200_P,
00182 -- IB => CLK200_N,
00183 -- O => REF_CLK200_IN
00184 -- );
00185
00186 DCM_BASE0 : DCM_BASE
00187 generic map(DLL_FREQUENCY_MODE => "HIGH",
00188 DUTY_CYCLE_CORRECTION => true,
00189 CLKDV_DIVIDE => 16.0,
00190 CLKFX_MULTIPLY => 2,
00191 CLKFX_DIVIDE => 8
00192 )
00193 port map(CLK0 => clk0_bufg_in,
00194 CLK180 => open,
00195 CLK270 => open,
00196 CLK2X => open,
00197 CLK2X180 => open,
00198 CLK90 => clk90_bufg_in,
00199 CLKDV => clkdv_bufg_in,
00200 CLKFX => clk50_bufg_in,
00201 CLKFX180 => open,
00202 LOCKED => LOCKED,
00203 CLKFB => clk0_bufg_out,
00204 CLKIN => SYS_CLK_IN,
00205 RST => dcm_lock_res
00206 );
00207
00208 dcm_clk0 : BUFG port map
00209 (O => clk0_bufg_out,
00210 I => clk0_bufg_in
00211 );
00212
00213 dcm_clk90 : BUFG port map
00214 (O => clk90_bufg_out,
00215 I => clk90_bufg_in
00216 );
00217
00218 dcm_clkdv : BUFR port map
00219 (
00220 CE => '1' ,
00221 CLR => '0' ,
00222 O => clkdv_bufg_out,
00223 I => clkdv_bufg_in
00224 );
00225
00226 dcm_clkfx : BUFG port map
00227 (O => clk50_bufg_out,
00228 I => clk50_bufg_in
00229 );
00230
00231 --dcm1_clk0: BUFG port map
00232 -- ( O => clk0_bufg1_out,
00233 -- I => REF_CLK200_IN
00234 -- );
00235 clk0_bufg1_out <= REF_CLK200_IN;
00236
00237 process(clk_int)
00238 begin
00239 if(clk_int'event and clk_int = '1') then
00240 if((SYS_RESET = '1') or
00241 (LOCKED = '0')
00242 or (sys_rst_ref_clk = '1')) then
00243 sys_rst_0 <= '1';
00244 sys_rst_1 <= '1';
00245 sys_rst_2 <= '1';
00246 sys_rst_3 <= '1';
00247 sys_rst <= '1';
00248 else
00249 sys_rst_0 <= '0';
00250 sys_rst_1 <= sys_rst_0;
00251 sys_rst_2 <= sys_rst_1;
00252 sys_rst_3 <= sys_rst_2;
00253 sys_rst <= sys_rst_3;
00254 end if;
00255 end if;
00256 end process;
00257
00258 process(clk90_int)
00259 begin
00260 if(clk90_int'event and clk90_int = '1') then
00261 if((SYS_RESET = '1') or
00262 (LOCKED = '0')
00263 or (sys_rst_ref_clk = '1')) then
00264 sys_rst90_0 <= '1';
00265 sys_rst90_1 <= '1';
00266 sys_rst90_2 <= '1';
00267 sys_rst90_3 <= '1';
00268 sys_rst90 <= '1';
00269 else
00270 sys_rst90_0 <= '0';
00271 sys_rst90_1 <= sys_rst90_0;
00272 sys_rst90_2 <= sys_rst90_1;
00273 sys_rst90_3 <= sys_rst90_2;
00274 sys_rst90 <= sys_rst90_3;
00275 end if;
00276 end if;
00277 end process;
00278
00279 process(clk50_int)
00280 begin
00281 if(clk50_int'event and clk50_int = '1') then
00282 if ((SYS_RESET = '1') or
00283 (LOCKED = '0')
00284 ) then
00285 sys_rst_ref_clk_0 <= '1';
00286 sys_rst_ref_clk_1 <= '1';
00287 sys_rst_ref_clk_2 <= '1';
00288 sys_rst_ref_clk <= '1';
00289 else
00290 sys_rst_ref_clk_0 <= '0';
00291 sys_rst_ref_clk_1 <= sys_rst_ref_clk_0;
00292 sys_rst_ref_clk_2 <= sys_rst_ref_clk_0;
00293 sys_rst_ref_clk <= sys_rst_ref_clk_2;
00294 end if;
00295 end if;
00296 end process;
00297
00298
00299 end arch;