eFEX firmware  1.7.3
ATLAS l1-calo - electron and tau feature extraction firmware for eFEX boards

Back to eFEX documentation
clocks_7s_extphy.vhd
1 -- clocks_7s_extphy
2 --
3 -- Generates a 125MHz ethernet clock and 31MHz ipbus clock from the 200MHz reference
4 -- Also an unbuffered 200MHz clock for IO delay calibration block
5 -- Includes reset logic for ipbus
6 --
7 -- Dave Newbold, April 2011
8 --
9 -- Updated for eFEX to use 125MHz reference and produce buffered 200MHz clock
10 -- and soft reset now mapped to 125 MHz domain
11 --
12 -- $Id$
13 
14 library ipbus_lib;
15 use ipbus_lib.all;
16 
17 library ieee;
18 use ieee.std_logic_1164.all;
19 use ieee.numeric_std.all;
20 library unisim;
21 use unisim.VComponents.all;
22 
24  port(
25  sysclk_p: in std_logic;
26  sysclk_n: in std_logic;
27  clko_125: out std_logic;
28  clko_200: out std_logic;
29  clko_ipb: out std_logic;
30  locked: out std_logic;
31  nuke: in std_logic := '0';
32  soft_rst: in std_logic := '0';
33  rsto_125: out std_logic;
34  rsto_ipb: out std_logic;
35  rsto_ipb_ctrl: out std_logic;
36  onehz: out std_logic
37  );
38 
40 
41 architecture rtl of clocks_7s_extphy is
42 
43  signal dcm_locked, sysclk,clk_200, clk_ipb_i, clk_125_i, clkfb, clk_ipb_b, clk_125_b: std_logic;
44  signal d17, d17_d: std_logic;
45  signal nuke_i, nuke_d, nuke_d2: std_logic := '0';
46  signal rst, srst, rst_ipb, rst_125, rst_ipb_ctrl: std_logic := '1';
47  signal rctr: unsigned(3 downto 0) := "0000";
48 
49 begin
50 
51  ibufgds0: IBUFGDS port map(
52  i => sysclk_p,
53  ib => sysclk_n,
54  o => sysclk
55  );
56 
57  bufg200: BUFG port map(
58  i => clk_200,
59  o => clko_200
60  );
61 
62  bufg125: BUFG port map(
63  i => clk_125_i,
64  o => clk_125_b
65  );
66 
67  clko_125 <= clk_125_b;
68 
69  bufgipb: BUFG port map(
70  i => clk_ipb_i,
71  o => clk_ipb_b
72  );
73 
74  clko_ipb <= clk_ipb_b;
75 
76  mmcm: MMCME2_BASE
77  generic map(
78  clkfbout_mult_f => 8.0,
79  clkout1_divide => 8,
80  clkout2_divide => 32,
81  clkout3_divide => 5,
82  clkin1_period => 8.0
83  )
84  port map(
85  clkin1 => sysclk,
86  clkfbin => clkfb,
87  clkfbout => clkfb,
88  clkout1 => clk_125_i,
89  clkout2 => clk_ipb_i,
90  clkout3 => clk_200,
91  locked => dcm_locked,
92  rst => '0',
93  pwrdwn => '0'
94  );
95 
96  clkdiv: entity ipbus_lib.ipbus_clock_div
97  port map(
98  clk => sysclk,
99  d17 => d17,
100  d28 => onehz
101  );
102 
103  process(sysclk)
104  begin
105  if rising_edge(sysclk) then
106  d17_d <= d17;
107  if d17='1' and d17_d='0' then
108  rst <= nuke_d2 or not dcm_locked;
109  nuke_d <= nuke_i; -- Time bomb (allows return packet to be sent)
110  nuke_d2 <= nuke_d;
111  end if;
112  end if;
113  end process;
114 
115  locked <= dcm_locked;
116 
117  process(clk_ipb_b)
118  begin
119  if rising_edge(clk_ipb_b) then
120  rst_ipb <= rst;
121  nuke_i <= nuke;
122  end if;
123  end process;
124 
125  rsto_ipb <= rst_ipb;
126 
127  process(clk_ipb_b)
128  begin
129  if rising_edge(clk_ipb_b) then
130  rst_ipb_ctrl <= rst;
131  end if;
132  end process;
133 
134  rsto_ipb_ctrl <= rst_ipb_ctrl;
135 
136  srst <= '1' when rctr /= "0000" else '0';
137 
138  process(clk_125_b)
139  begin
140  if rising_edge(clk_125_b) then
141  rst_125 <= rst or srst;
142  if srst = '1' or soft_rst = '1' then
143  rctr <= rctr + 1;
144  end if;
145  end if;
146  end process;
147 
148  rsto_125 <= rst_125;
149 
150 end rtl;