SURF  1.0
DeviceDna7Series.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 -- File : DeviceDna7Series.vhd
3 -- Company : SLAC National Accelerator Laboratory
4 -- Created : 2013-09-25
5 -- Last update: 2016-12-06
6 -------------------------------------------------------------------------------
7 -- Description: Wrapper for the 7 Series 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_7Series_general
31  generic (
32  TPD_G : time := 1 ns;
33  USE_SLOWCLK_G : boolean := false;
34  BUFR_CLK_DIV_G : string := "8";
35  RST_POLARITY_G : sl := '1';
36  SIM_DNA_VALUE_G : bit_vector := X"000000000000000");
37  port (
38  clk : in sl;
39  rst : in sl;
40  slowClk : in sl := '0';
41  dnaValue : out slv(55 downto 0);
42  dnaValid : out sl);
43 end DeviceDna7Series;
44 
45 architecture rtl of DeviceDna7Series is
46 
47  constant DNA_SHIFT_LENGTH_C : natural := 64;
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  signal locClkInv : sl;
77  signal locClkInvR : sl;
78 
79 begin
80 
81  locClk <= slowClk when(USE_SLOWCLK_G) else divClk;
82 
83  locClkInv <= not locClk;
84 
85  BUFR_Inst : BUFR
86  generic map (
87  BUFR_DIVIDE => BUFR_CLK_DIV_G,
88  SIM_DEVICE => "7SERIES")
89  port map (
90  I => clk,
91  CE => '1',
92  CLR => '0',
93  O => divClk);
94 
95  DNA_CLK_INV_BUFR : BUFR
96  generic map (
97  BUFR_DIVIDE => "1",
98  SIM_DEVICE => "7SERIES")
99  port map (
100  I => locClkInv,
101  CE => '1',
102  CLR => '0',
103  O => locClkInvR);
104 
105 
106  RstSync_Inst : entity work.RstSync
107  generic map (
108  TPD_G => TPD_G,
110  port map (
111  clk => locClk,
112  asyncRst => rst,
113  syncRst => locRst);
114 
115  comb : process (dnaDout, locRst, r) is
116  variable v : RegType;
117  begin
118  -- Latch the current value
119  v := r;
120 
121  -- Reset the strobing signals
122  v.dnaRead := '0';
123  v.dnaShift := '0';
124 
125  -- State Machine
126  case (r.state) is
127  ----------------------------------------------------------------------
128  when READ_S =>
129  -- Check the read strobe status
130  if r.dnaRead = '0' then
131  -- Strobe the read of the DNA port
132  v.dnaRead := '1';
133  -- Next State
134  v.state := SHIFT_S;
135  end if;
136  ----------------------------------------------------------------------
137  when SHIFT_S =>
138  -- Shift the data out
139  v.dnaShift := '1';
140  -- Check the shift strobe status
141  if r.dnaShift = '1' then
142  -- Shift register
143  v.dnaValue := r.dnaValue(DNA_SHIFT_LENGTH_C-2 downto 0) & dnaDout;
144  -- Increment the counter
145  v.bitCount := r.bitCount + 1;
146  -- Check the counter value
147  if (r.bitCount = DNA_SHIFT_LENGTH_C-1) then
148  -- Next State
149  v.state := DONE_S;
150  end if;
151  end if;
152  ----------------------------------------------------------------------
153  when DONE_S =>
154  -- Set the valid bit
155  v.dnaValid := '1';
156  ----------------------------------------------------------------------
157  end case;
158 
159  -- Synchronous Reset
160  if locRst = '1' then
161  v := REG_INIT_C;
162  end if;
163 
164  -- Register the variable for next clock cycle
165  rin <= v;
166 
167  end process comb;
168 
169  sync : process (locClkInvR) is
170  begin
171  if (rising_edge(locClkInvR)) then
172  r <= rin after TPD_G;
173  end if;
174  end process sync;
175 
176  DNA_PORT_I : DNA_PORT
177  generic map (
178  SIM_DNA_VALUE => SIM_DNA_VALUE_G)
179  port map (
180  CLK => locClk,
181  READ => r.dnaRead,
182  SHIFT => r.dnaShift,
183  DIN => '0',
184  DOUT => dnaDout);
185 
186  SyncValid : entity work.Synchronizer
187  generic map (
188  TPD_G => TPD_G,
189  STAGES_G => 3)
190  port map (
191  clk => clk,
192  dataIn => r.dnaValid,
193  dataOut => dnaValid);
194 
195  SyncData : entity work.SynchronizerVector
196  generic map (
197  TPD_G => TPD_G,
198  STAGES_G => 2,
199  WIDTH_G => 56)
200  port map (
201  clk => clk,
202  dataIn => r.dnaValue(63 downto 8),
203  dataOut => dnaValue);
204 
205 end rtl;
USE_SLOWCLK_Gboolean := false
out syncRstsl
Definition: RstSync.vhd:36
IN_POLARITY_Gsl := '1'
Definition: RstSync.vhd:28
BUFR_CLK_DIV_Gstring := "8"
std_logic sl
Definition: StdRtlPkg.vhd:28
STAGES_Gpositive := 2
_library_ unisimunisim
in dataInslv( WIDTH_G- 1 downto 0)
in asyncRstsl
Definition: RstSync.vhd:35
out dataOutsl
in clksl
Definition: RstSync.vhd:34
SIM_DNA_VALUE_Gbit_vector := X"000000000000000"
out dnaValueslv( 55 downto 0)
TPD_Gtime := 1 ns
Definition: RstSync.vhd:27
TPD_Gtime := 1 ns
out dataOutslv( WIDTH_G- 1 downto 0)
_library_ ieeeieee
std_logic_vector slv
Definition: StdRtlPkg.vhd:29