SURF  1.0
DeviceDnaUltraScale.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 -- File : DeviceDnaUltraScale.vhd
3 -- Company : SLAC National Accelerator Laboratory
4 -- Created : 2015-06-17
5 -- Last update: 2016-04-13
6 -------------------------------------------------------------------------------
7 -- Description: Wrapper for the UltraScale DNA_PORT
8 -------------------------------------------------------------------------------
9 -- This file is part of 'SLAC Firmware Standard Library'.
10 -- It is subject to the license terms in the LICENSE.txt file found in the
11 -- top-level directory of this distribution and at:
12 -- https://confluence.slac.stanford.edu/display/ppareg/LICENSE.html.
13 -- No part of 'SLAC Firmware Standard Library', including this file,
14 -- may be copied, modified, propagated, or distributed except according to
15 -- the terms contained in the LICENSE.txt file.
16 -------------------------------------------------------------------------------
17 
18 library ieee;
19 use ieee.std_logic_1164.all;
20 use ieee.std_logic_arith.all;
21 use ieee.std_logic_unsigned.all;
22 
23 use work.StdRtlPkg.all;
24 
25 library unisim;
26 use unisim.vcomponents.all;
27 
28 --! @see entity
29  --! @ingroup xilinx_UltraScale_general
31  generic (
32  TPD_G : time := 1 ns;
33  USE_SLOWCLK_G : boolean := false;
34  BUFR_CLK_DIV_G : natural := 8;
35  RST_POLARITY_G : sl := '1';
36  SIM_DNA_VALUE_G : slv := X"000000000000000000000000");
37  port (
38  clk : in sl;
39  rst : in sl;
40  slowClk : in sl := '0';
41  dnaValue : out slv(95 downto 0);
42  dnaValid : out sl);
43 end DeviceDnaUltraScale;
44 
45 architecture rtl of DeviceDnaUltraScale is
46 
47  constant DNA_SHIFT_LENGTH_C : natural := 96;
48 
49  type StateType is (READ_S, SHIFT_S, DONE_S);
50 
51  type RegType is record
52  state : StateType;
53  bitCount : natural range 0 to DNA_SHIFT_LENGTH_C-1;
54  dnaValue : slv(DNA_SHIFT_LENGTH_C-1 downto 0);
55  dnaValid : sl;
56  dnaRead : sl;
57  dnaShift : sl;
58  end record RegType;
59 
60  constant REG_INIT_C : RegType := (
61  state => READ_S,
62  bitCount => 0,
63  dnaValue => (others => '0'),
64  dnaValid => '0',
65  dnaRead => '0',
66  dnaShift => '0');
67 
68  signal r : RegType := REG_INIT_C;
69  signal rin : RegType;
70 
71  signal dnaDout : sl;
72  signal divClk : sl;
73  signal locClk : sl;
74  signal locRst : sl;
75 
76 begin
77 
78  locClk <= slowClk when(USE_SLOWCLK_G) else divClk;
79 
80  BUFGCE_DIV_Inst : BUFGCE_DIV
81  generic map (
82  BUFGCE_DIVIDE => BUFR_CLK_DIV_G)
83  port map (
84  I => clk,
85  CE => '1',
86  CLR => '0',
87  O => divClk);
88 
89  RstSync_Inst : entity work.RstSync
90  generic map (
91  TPD_G => TPD_G,
93  port map (
94  clk => locClk,
95  asyncRst => rst,
96  syncRst => locRst);
97 
98  comb : process (dnaDout, locRst, r) is
99  variable v : RegType;
100  begin
101  -- Latch the current value
102  v := r;
103 
104  -- Reset the strobing signals
105  v.dnaRead := '0';
106  v.dnaShift := '0';
107 
108  -- State Machine
109  case (r.state) is
110  ----------------------------------------------------------------------
111  when READ_S =>
112  -- Check the read strobe status
113  if r.dnaRead = '0' then
114  -- Strobe the read of the DNA port
115  v.dnaRead := '1';
116  -- Next State
117  v.state := SHIFT_S;
118  end if;
119  ----------------------------------------------------------------------
120  when SHIFT_S =>
121  -- Shift the data out
122  v.dnaShift := '1';
123  -- Check the shift strobe status
124  if r.dnaShift = '1' then
125  -- Shift register
126  v.dnaValue := r.dnaValue(DNA_SHIFT_LENGTH_C-2 downto 0) & dnaDout;
127  -- Increment the counter
128  v.bitCount := r.bitCount + 1;
129  -- Check the counter value
130  if (r.bitCount = DNA_SHIFT_LENGTH_C-1) then
131  -- Next State
132  v.state := DONE_S;
133  end if;
134  end if;
135  ----------------------------------------------------------------------
136  when DONE_S =>
137  -- Set the valid bit
138  v.dnaValid := '1';
139  ----------------------------------------------------------------------
140  end case;
141 
142  -- Synchronous Reset
143  if locRst = '1' then
144  v := REG_INIT_C;
145  end if;
146 
147  -- Register the variable for next clock cycle
148  rin <= v;
149 
150  end process comb;
151 
152  sync : process (locClk) is
153  begin
154  if (falling_edge(locClk)) then
155  r <= rin after TPD_G;
156  end if;
157  end process sync;
158 
159  DNA_PORT_I : DNA_PORTE2
160  generic map (
161  SIM_DNA_VALUE => SIM_DNA_VALUE_G)
162  port map (
163  CLK => locClk,
164  READ => r.dnaRead,
165  SHIFT => r.dnaShift,
166  DIN => '0',
167  DOUT => dnaDout);
168 
169  SyncValid : entity work.Synchronizer
170  generic map (
171  TPD_G => TPD_G,
172  STAGES_G => 3)
173  port map (
174  clk => clk,
175  dataIn => r.dnaValid,
176  dataOut => dnaValid);
177 
178  SyncData : entity work.SynchronizerVector
179  generic map (
180  TPD_G => TPD_G,
181  STAGES_G => 2,
182  WIDTH_G => DNA_SHIFT_LENGTH_C)
183  port map (
184  clk => clk,
185  dataIn => r.dnaValue,
186  dataOut => dnaValue);
187 
188 end rtl;
out syncRstsl
Definition: RstSync.vhd:36
IN_POLARITY_Gsl := '1'
Definition: RstSync.vhd:28
std_logic sl
Definition: StdRtlPkg.vhd:28
STAGES_Gpositive := 2
in dataInslv( WIDTH_G- 1 downto 0)
in asyncRstsl
Definition: RstSync.vhd:35
out dataOutsl
in clksl
Definition: RstSync.vhd:34
out dnaValueslv( 95 downto 0)
USE_SLOWCLK_Gboolean := false
TPD_Gtime := 1 ns
Definition: RstSync.vhd:27
TPD_Gtime := 1 ns
out dataOutslv( WIDTH_G- 1 downto 0)
SIM_DNA_VALUE_Gslv := X"000000000000000000000000"
std_logic_vector slv
Definition: StdRtlPkg.vhd:29