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/main/clocks.vhd,v $
00015 --* $Revision: 1.27.2.5 $ *
00016 --* $Name: dev $ *
00017 --* $Author: mniegl $ *
00018 --* $Date: 2008/11/03 18:48:14 $ *
00019
00020
00021 --* *
00022 --**************************************************************
00023
00024 library ieee;
00025
00026 use ieee.std_logic_1164.all;
00027
00028 use ieee.std_logic_arith.all;
00029
00030 use ieee.std_logic_unsigned.all;
00031
00032 library unisim;
00033
00034 use unisim.vcomponents.all;
00035
00036
00037
00038
00039
00040
00041 entity clocks is
00042 port (RESET : in ;
00043 SYSCLK : in ;
00044 REFCLK : in ;
00045 BCLK4X : in ;
00046 UPPER_MGTCLK_PAD_P_IN_EX : in (1 downto 0);
00047 UPPER_MGTCLK_PAD_N_IN_EX : in (1 downto 0);
00048 SYSCLK_INT : out ;
00049 DDRCLK : out ;
00050 REFCLK_P : out ;
00051 REFCLK_N : out ;
00052 BCLK : out ;
00053 BCLK2X_P : out ;
00054 BCLK2X_N : out ;
00055 BCLK4X_P : out ;
00056 BCLK4X_N : out ;
00057 RIOCLK_1 : out ;
00058 RIOCLK_2 : out ;
00059 SATA_CLK : out ;
00060 SATA_LOGIC_CLK : out ;
00061 CLK_50MHz_OUT : out ;
00062 EMAC_CLK : out ;
00063 INTTRIG_CLK : out ;
00064 CLK_HZ : out ;
00065 XTAL_SEL : out ;
00066 CLK_DET : in ;
00067 LOCK : out
00068 );
00069 end clocks;
00070
00071
00072
00073
00074
00075
00076 architecture coldplay of clocks is
00077
00078 signal rioclk_1_i : := '0';
00079 signal rioclk_1_ii : := '0';
00080 signal sysclk_buf : := '0';
00081 signal refclk_p_i : := '0';
00082 signal refclk_n_i : := '0';
00083 signal bclk_i : := '0';
00084 signal bclk2x_p_i : := '0';
00085 signal sataclk_i : := '0';
00086 signal sataclk_ii : := '0';
00087 signal fb1_i : := '0';
00088 signal fb1_o : := '0';
00089 signal fb2_i : := '0';
00090 signal fb2_o : := '0';
00091 signal dcmlock1 : := '0';
00092 signal dcmlock2 : := '0';
00093 signal clk1, clk2, clk3 : := '0';
00094
00095 attribute syn_keep : ;
00096 attribute syn_keep of "rioclk_1_i" : signal is true;
00097 attribute syn_keep of "sataclk_i" : signal is true;
00098
00099
00100 component MGT_CLOCK_MODULE
00101 port
00102 (
00103 ------------------- Input Differential Clocks from Pads -------------------
00104 UPPER_MGTCLK_PAD_N_IN : in ;
00105 UPPER_MGTCLK_PAD_P_IN : in ;
00106 ------------------------- Output Reference Clocks -------------------------
00107 REFCLK1_OUT : out
00108
00109 );
00110 end component;
00111
00112
00113 component clock_divider is
00114 generic(
00115 DIVISION_FACTOR : range 0 to 127 := 2; --only even numbers
00116 INITIAL_VALUE : range 0 to 127 := 2 --only even numbers
00117 );
00118 port(
00119 CLK_IN : in ;
00120 CLK_OUT : out
00121 );
00122 end component;
00123
00124
00125 component prescaler is
00126 generic (divider : range 0 to 127 := 10);
00127 port (CLK : in ; --! Clock Input
00128 CE : in ; --! Clock Enable
00129 R : in ; --! Reset
00130 TC : out --! Clock Output
00131 );
00132 end component;
00133
00134 begin
00135
00136
00137 LOCK <= dcmlock1 and dcmlock2;
00138 XTAL_SEL <= not CLK_DET;
00139
00140
00141 SYSCLK_BUFFER : IBUFG
00142 port map
00143 (
00144 O => sysclk_buf,
00145 I => SYSCLK
00146 );
00147
00148 SYSCLK_INT <= sysclk_buf;
00149
00150
00151 mgt_clock_module_110 : MGT_CLOCK_MODULE
00152 port map
00153 (
00154 ------------------- Input Differential Clocks from Pads ---------------
00155 UPPER_MGTCLK_PAD_N_IN => UPPER_MGTCLK_PAD_N_IN_EX(1),
00156 UPPER_MGTCLK_PAD_P_IN => UPPER_MGTCLK_PAD_P_IN_EX(1),
00157 ------------------------- Output Reference Clocks ---------------------
00158 REFCLK1_OUT => rioclk_1_i
00159 );
00160
00161
00162 mgt_clock_module_102 : MGT_CLOCK_MODULE
00163 port map
00164 (
00165 ------------------- Input Differential Clocks from Pads ---------------
00166 UPPER_MGTCLK_PAD_N_IN => UPPER_MGTCLK_PAD_N_IN_EX(0),
00167 UPPER_MGTCLK_PAD_P_IN => UPPER_MGTCLK_PAD_P_IN_EX(0),
00168 ------------------------- Output Reference Clocks ---------------------
00169 REFCLK1_OUT => sataclk_i
00170 );
00171
00172
00173 rioclkbuf : BUFG port map(O => rioclk_1_ii, I => rioclk_1_i);
00174
00175 sataclkbuf : BUFG port map(O => sataclk_ii, I => sataclk_i); --, CE => '1', CLR => '0');
00176
00177 DDRCLK <= rioclk_1_ii;
00178 RIOCLK_1 <= rioclk_1_i;
00179 RIOCLK_2 <= rioclk_1_i;
00180 SATA_CLK <= sataclk_i;
00181
00182
00183 sata_clk_i : clock_divider
00184 generic map(
00185 DIVISION_FACTOR => 2, --only even numbers
00186 INITIAL_VALUE => 2 --only even numbers
00187 )
00188 port map(
00189 CLK_IN => sataclk_ii ,
00190 CLK_OUT => SATA_LOGIC_CLK
00191 );
00192
00193
00194
00195 dcm_1 : DCM_BASE
00196 generic map (
00197 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
00198 -- 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0
00199 CLKFX_DIVIDE => 2, -- Can be any interger from 1 to 32
00200 CLKFX_MULTIPLY => 4, -- Can be any integer from 2 to 32
00201 CLKIN_DIVIDE_BY_2 => false, -- TRUE/FALSE to enable CLKIN divide by two feature
00202 CLKIN_PERIOD => 10.0, -- Specify period of input clock in ns from 1.25 to 1000.00
00203 CLKOUT_PHASE_SHIFT => "NONE", -- Specify phase shift mode of NONE or FIXED
00204 CLK_FEEDBACK => "1X", -- Specify clock feedback of NONE or 1X
00205 DCM_AUTOCALIBRATION => true, -- DCM calibrartion circuitry TRUE/FALSE
00206 DCM_PERFORMANCE_MODE => "MAX_SPEED", -- Can be MAX_SPEED or MAX_RANGE
00207 DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS" , -- SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or
00208 -- an integer from 0 to 15
00209 DFS_FREQUENCY_MODE => "LOW", -- LOW or HIGH frequency mode for frequency synthesis
00210 DLL_FREQUENCY_MODE => "LOW", -- LOW, HIGH, or HIGH_SER frequency mode for DLL
00211 DUTY_CYCLE_CORRECTION => true, -- Duty cycle correction, TRUE or FALSE
00212 FACTORY_JF => X"F0F0", -- FACTORY JF Values Suggested to be set to X"F0F0
00213 PHASE_SHIFT => 0, -- Amount of fixed phase shift from -255 to 1023
00214 STARTUP_WAIT => false) -- Delay configuration DONE until DCM LOCK, TRUE/FALSE
00215 port map (
00216 CLK0 => fb1_o, -- 0 degree DCM CLK ouptput
00217 CLK180 => open, -- 180 degree DCM CLK output
00218 CLK270 => open, -- 270 degree DCM CLK output
00219 CLK2X => refclk_p_i , -- 2X DCM CLK output
00220 CLK2X180 => refclk_n_i, -- 2X, 180 degree DCM CLK out
00221 CLK90 => open, -- 90 degree DCM CLK output
00222 CLKDV => open, -- Divided DCM CLK out (CLKDV_DIVIDE)
00223 CLKFX => open, --refclk_p_i,--bclk4x_p_i, -- DCM CLK synthesis out (M/D)
00224 CLKFX180 => open, -- 180 degree CLK synthesis out
00225 LOCKED => dcmlock1, -- DCM LOCK status output
00226 CLKFB => fb1_i, -- DCM clock feedback
00227 CLKIN => sysclk_buf , -- Clock input (from IBUFG, BUFG or DCM)
00228 RST => '0' -- DCM asynchronous reset input
00229 );
00230
00231 EMAC_CLK <= sysclk_buf;
00232 FB1_BUF : BUFG port map (O => fb1_i, I => fb1_o);
00233
00234 REFCLKP_BUF : BUFG port map (O => REFCLK_P, I => refclk_p_i);
00235 REFCLK_N <= refclk_n_i;
00236
00237
00238
00239 dcm_2 : DCM_BASE
00240 generic map (
00241 CLKDV_DIVIDE => 4.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
00242 -- 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0
00243 CLKFX_DIVIDE => 4, -- Can be any interger from 1 to 32
00244 CLKFX_MULTIPLY => 2, -- Can be any integer from 2 to 32
00245 CLKIN_DIVIDE_BY_2 => false, -- TRUE/FALSE to enable CLKIN divide by two feature
00246 CLKIN_PERIOD => 6.4, -- Specify period of input clock in ns from 1.25 to 1000.00
00247 CLKOUT_PHASE_SHIFT => "NONE", -- Specify phase shift mode of NONE or FIXED
00248 CLK_FEEDBACK => "1X", -- Specify clock feedback of NONE or 1X
00249 DCM_AUTOCALIBRATION => true, -- DCM calibrartion circuitry TRUE/FALSE
00250 DCM_PERFORMANCE_MODE => "MAX_SPEED", -- Can be MAX_SPEED or MAX_RANGE
00251 DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS" , -- SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or
00252 -- an integer from 0 to 15
00253 DFS_FREQUENCY_MODE => "LOW", -- LOW or HIGH frequency mode for frequency synthesis
00254 DLL_FREQUENCY_MODE => "LOW", -- LOW, HIGH, or HIGH_SER frequency mode for DLL
00255 DUTY_CYCLE_CORRECTION => true, -- Duty cycle correction, TRUE or FALSE
00256 FACTORY_JF => X"F0F0", -- FACTORY JF Values Suggested to be set to X"F0F0
00257 PHASE_SHIFT => 0, -- Amount of fixed phase shift from -255 to 1023
00258 STARTUP_WAIT => false) -- Delay configuration DONE until DCM LOCK, TRUE/FALSE
00259 port map (
00260 CLK0 => fb2_o, -- 0 degree DCM CLK ouptput
00261 CLK180 => open, --bclk4x_n_i, -- 180 degree DCM CLK output
00262 CLK270 => open, -- 270 degree DCM CLK output
00263 CLK2X => open, -- 2X DCM CLK output
00264 CLK2X180 => open, -- 2X, 180 degree DCM CLK out
00265 CLK90 => open, -- 90 degree DCM CLK output
00266 CLKDV => bclk_i, -- Divided DCM CLK out (CLKDV_DIVIDE)
00267 CLKFX => bclk2x_p_i , -- DCM CLK synthesis out (M/D)
00268 CLKFX180 => open, --bclk2x_n_i, -- 180 degree CLK synthesis out
00269 LOCKED => dcmlock2, -- DCM LOCK status output
00270 CLKFB => fb2_i, -- DCM clock feedback
00271 CLKIN => rioclk_1_ii , --bclk4x_p_i, -- Clock input (from IBUFG, BUFG or DCM)
00272 RST => '0' -- DCM asynchronous reset input
00273 );
00274
00275 BCLK4X_P <= fb2_i;
00276 FB2_BUF : BUFG port map (O => fb2_i, I => fb2_o);
00277
00278 BCLK_BUF : BUFG port map (O => BCLK, I => bclk_i);
00279
00280 BCLK2X_P_BUF : BUFG port map (O => BCLK2X_P, I => bclk2x_p_i);
00281 BCLK2X_N <= '0';
00282 BCLK4X_N <= '0';
00283
00284
00285 gen_50MHz : clock_divider
00286 generic map(
00287 DIVISION_FACTOR => 2, --only even numbers
00288 INITIAL_VALUE => 2 --only even numbers
00289 )
00290 port map(
00291 CLK_IN => sysclk_buf ,
00292 CLK_OUT => CLK_50MHz_OUT
00293 );
00294
00295
00296 div1 : prescaler
00297 generic map (divider => 100)
00298 port map(
00299 CLK => sysclk_buf,
00300 CE => '1' ,
00301 R => RESET ,
00302 TC => clk1
00303 );
00304
00305
00306 div2 : prescaler
00307 generic map (divider => 100)
00308 port map(
00309 CLK => clk1,
00310 CE => '1' ,
00311 R => RESET ,
00312 TC => clk2
00313 );
00314
00315
00316 div3 : prescaler
00317 generic map (divider => 100)
00318 port map(
00319 CLK => clk2,
00320 CE => '1' ,
00321 R => RESET ,
00322 TC => clk3
00323 );
00324
00325 INTTRIG_CLK <= clk3;
00326
00327
00328 div4 : prescaler
00329 generic map (divider => 100)
00330 port map(
00331 CLK => clk3,
00332 CE => '1' ,
00333 R => RESET ,
00334 TC => CLK_HZ
00335 );
00336
00337 end coldplay;
00338