SURF  1.0
AxiVersion.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 -- File : AxiVersion.vhd
3 -- Company : SLAC National Accelerator Laboratory
4 -- Created : 2013-05-20
5 -- Last update: 2017-02-15
6 -------------------------------------------------------------------------------
7 -- Description: Creates AXI accessible registers containing configuration
8 -- information.
9 -------------------------------------------------------------------------------
10 -- This file is part of 'SLAC Firmware Standard Library'.
11 -- It is subject to the license terms in the LICENSE.txt file found in the
12 -- top-level directory of this distribution and at:
13 -- https://confluence.slac.stanford.edu/display/ppareg/LICENSE.html.
14 -- No part of 'SLAC Firmware Standard Library', including this file,
15 -- may be copied, modified, propagated, or distributed except according to
16 -- the terms contained in the LICENSE.txt file.
17 -------------------------------------------------------------------------------
18 
19 library ieee;
20 use ieee.std_logic_1164.all;
21 use ieee.std_logic_arith.all;
22 use ieee.std_logic_unsigned.all;
23 
24 use work.StdRtlPkg.all;
25 use work.AxiLitePkg.all;
26 
27 --! @see entity
28  --! @ingroup axi
29 entity AxiVersion is
30  generic (
31  TPD_G : time := 1 ns;
33  SIM_DNA_VALUE_G : slv := X"000000000000000000000000";
35  DEVICE_ID_G : slv(31 downto 0) := (others => '0');
36  CLK_PERIOD_G : real := 8.0E-9; -- units of seconds
37  XIL_DEVICE_G : string := "7SERIES"; -- Either "7SERIES" or "ULTRASCALE"
38  EN_DEVICE_DNA_G : boolean := false;
39  EN_DS2411_G : boolean := false;
40  EN_ICAP_G : boolean := false;
41  USE_SLOWCLK_G : boolean := false;
42  BUFR_CLK_DIV_G : positive := 8;
43  AUTO_RELOAD_EN_G : boolean := false;
44  AUTO_RELOAD_TIME_G : real range 0.0 to 30.0 := 10.0; -- units of seconds
45  AUTO_RELOAD_ADDR_G : slv(31 downto 0) := (others => '0'));
46  port (
47  -- AXI-Lite Interface
48  axiClk : in sl;
49  axiRst : in sl;
54  -- Optional: Master Reset
55  masterReset : out sl;
56  -- Optional: FPGA Reloading Interface
57  fpgaEnReload : in sl := '1';
58  fpgaReload : out sl;
59  fpgaReloadAddr : out slv(31 downto 0);
60  upTimeCnt : out slv(31 downto 0);
61  -- Optional: Serial Number outputs
62  slowClk : in sl := '0';
63  dnaValueOut : out slv(127 downto 0);
64  fdValueOut : out slv(63 downto 0);
65  -- Optional: user values
66  userValues : in Slv32Array(0 to 63) := (others => X"00000000");
67  -- Optional: DS2411 interface
68  fdSerSdio : inout sl := 'Z');
69 end AxiVersion;
70 
71 architecture rtl of AxiVersion is
72 
73  constant RELOAD_COUNT_C : integer := integer(AUTO_RELOAD_TIME_G / CLK_PERIOD_G);
74  constant TIMEOUT_1HZ_C : natural := (getTimeRatio(1.0, CLK_PERIOD_G) -1);
75  constant COUNTER_ZERO_C : slv(31 downto 0) := X"00000000";
76 
77  constant BUILD_INFO_C : BuildInfoRetType := toBuildInfo(BUILD_INFO_G);
78  constant BUILD_STRING_ROM_C : Slv32Array(0 to 63) := BUILD_INFO_C.buildString;
79 
80  type RegType is record
81  upTimeCnt : slv(31 downto 0);
82  timer : natural range 0 to TIMEOUT_1HZ_C;
83  scratchPad : slv(31 downto 0);
84  counter : slv(31 downto 0);
85  counterRst : sl;
86  masterReset : sl;
87  fpgaReload : sl;
88  haltReload : sl;
89  fpgaReloadAddr : slv(31 downto 0);
92  end record RegType;
93 
94  constant REG_INIT_C : RegType := (
95  upTimeCnt => (others => '0'),
96  timer => 0,
97  scratchPad => (others => '0'),
98  counter => (others => '0'),
99  counterRst => '0',
100  masterReset => '0',
101  fpgaReload => '0',
102  haltReload => '0',
106 
107  signal r : RegType := REG_INIT_C;
108  signal rin : RegType;
109 
110  signal dnaValue : slv(127 downto 0) := (others => '0');
111  signal fdValue : slv(63 downto 0) := (others => '0');
112  signal masterRstDet : sl := '0';
113  signal asyncRst : sl := '0';
114 
115  attribute rom_style : string;
116  attribute rom_style of BUILD_STRING_ROM_C : constant is "distributed";
117  attribute rom_extract : string;
118  attribute rom_extract of BUILD_STRING_ROM_C : constant is "TRUE";
119  attribute syn_keep : string;
120  attribute syn_keep of BUILD_STRING_ROM_C : constant is "TRUE";
121 
122 begin
123 
124  dnaValueOut <= dnaValue;
125  fdValueOut <= fdValue;
126 
127  GEN_DEVICE_DNA : if (EN_DEVICE_DNA_G) generate
128  DeviceDna_1 : entity work.DeviceDna
129  generic map (
130  TPD_G => TPD_G,
135  port map (
136  clk => axiClk,
137  rst => axiRst,
138  slowClk => slowClk,
139  dnaValue => dnaValue);
140  end generate GEN_DEVICE_DNA;
141 
142  GEN_DS2411 : if (EN_DS2411_G) generate
143  DS2411Core_1 : entity work.DS2411Core
144  generic map (
145  TPD_G => TPD_G,
147  port map (
148  clk => axiClk,
149  rst => axiRst,
150  fdSerSdio => fdSerSdio,
151  fdValue => fdValue);
152  end generate GEN_DS2411;
153 
154  GEN_ICAP : if (EN_ICAP_G) generate
155  Iprog_1 : entity work.Iprog
156  generic map (
157  TPD_G => TPD_G,
161  port map (
162  clk => axiClk,
163  rst => axiRst,
164  slowClk => slowClk,
165  start => r.fpgaReload,
166  bootAddress => r.fpgaReloadAddr);
167  end generate;
168 
169  comb : process (axiReadMaster, axiRst, axiWriteMaster, dnaValue, fdValue,
170  fpgaEnReload, r, userValues) is
171  variable v : RegType;
172  variable axilEp : AxiLiteEndpointType;
173  begin
174  -- Latch the current value
175  v := r;
176 
177  -- Reset strobes
178  v.masterReset := '0';
179 
180  ---------------------------------
181  -- First Stage Boot Loader (FSBL)
182  ---------------------------------
183  -- Check if timer enabled
184  if fpgaEnReload = '1' then
185  v.counter := v.counter + 1;
186  end if;
187 
188  -- Check for reload condition
189  if AUTO_RELOAD_EN_G and (r.counter = RELOAD_COUNT_C) and (fpgaEnReload = '1') and (r.haltReload = '0') then
190  v.fpgaReload := '1';
191  end if;
192 
193  ------------------------
194  -- AXI-Lite Transactions
195  ------------------------
196 
197  -- Determine the transaction type
198  axiSlaveWaitTxn(axilEp, axiWriteMaster, axiReadMaster, v.axiWriteSlave, v.axiReadSlave);
199 
200  axiSlaveRegisterR(axilEp, x"000", 0, BUILD_INFO_C.fwVersion);
201  axiSlaveRegister(axilEp, x"004", 0, v.scratchPad);
202  axiSlaveRegisterR(axilEp, x"008", 0, r.upTimeCnt);
203 
204  axiSlaveRegister(axilEp, x"100", 0, v.haltReload);
205  axiSlaveRegister(axilEp, x"104", 0, v.fpgaReload);
206  axiSlaveRegister(axilEp, x"108", 0, v.fpgaReloadAddr);
207  axiSlaveRegister(axilEp, x"10C", 0, v.masterReset);
208 
209  axiSlaveRegisterR(axilEp, x"300", 0, fdValue);
210  axiSlaveRegisterR(axilEp, x"400", userValues);
211  axiSlaveRegisterR(axilEp, x"500", 0, DEVICE_ID_G);
212 
213  -- axiSlaveRegisterR(axilEp, x"600", 0, BUILD_INFO_C.gitHash);-- axiSlaveRegisterR() Broken, only first 32-bit show up in software
214  axiSlaveRegisterR(axilEp, x"600", 0, BUILD_INFO_C.gitHash(31 downto 0));
215  axiSlaveRegisterR(axilEp, x"604", 0, BUILD_INFO_C.gitHash(63 downto 32));
216  axiSlaveRegisterR(axilEp, x"608", 0, BUILD_INFO_C.gitHash(95 downto 64));
217  axiSlaveRegisterR(axilEp, x"60C", 0, BUILD_INFO_C.gitHash(127 downto 96));
218  axiSlaveRegisterR(axilEp, x"610", 0, BUILD_INFO_C.gitHash(159 downto 128));
219 
220  axiSlaveRegisterR(axilEp, x"700", 0, dnaValue);
221  axiSlaveRegisterR(axilEp, x"800", BUILD_STRING_ROM_C);
222 
223  axiSlaveDefault(axilEp, v.axiWriteSlave, v.axiReadSlave, AXI_ERROR_RESP_G);
224 
225  ---------------------------------
226  -- Uptime counter
227  ---------------------------------
228  if r.timer = TIMEOUT_1HZ_C then
229  v.timer := 0;
230  v.upTimeCnt := r.upTimeCnt + 1;
231  else
232  v.timer := r.timer + 1;
233  end if;
234 
235  --------
236  -- Reset
237  --------
238  if (axiRst = '1') then
239  v := REG_INIT_C;
240  end if;
241 
242  -- Register the variable for next clock cycle
243  rin <= v;
244 
245  -- Outputs
248  fpgaReload <= r.fpgaReload;
250  masterRstDet <= v.masterReset;
251  upTimeCnt <= r.upTimeCnt;
252 
253  end process comb;
254 
255  seq : process (axiClk) is
256  begin
257  if (rising_edge(axiClk)) then
258  r <= rin after TPD_G;
259  end if;
260  end process seq;
261 
262  asyncRst <= axiRst or masterRstDet;
263 
264  U_RstSync : entity work.RstSync
265  generic map (
266  TPD_G => TPD_G)
267  port map (
268  clk => axiClk,
269  asyncRst => asyncRst,
270  syncRst => masterReset);
271 
272 end architecture rtl;
XIL_DEVICE_Gstring := "7SERIES"
Definition: AxiVersion.vhd:37
array(natural range <> ) of slv( 31 downto 0) Slv32Array
Definition: StdRtlPkg.vhd:379
TPD_Gtime := 1 ns
Definition: AxiVersion.vhd:31
out syncRstsl
Definition: RstSync.vhd:36
out upTimeCntslv( 31 downto 0)
Definition: AxiVersion.vhd:60
SIM_DNA_VALUE_Gslv := X"000000000000000000000000"
Definition: AxiVersion.vhd:33
USE_SLOWCLK_Gboolean := false
Definition: Iprog.vhd:30
AxiLiteWriteMasterType
Definition: AxiLitePkg.vhd:111
std_logic sl
Definition: StdRtlPkg.vhd:28
slv( 2239 downto 0) BuildInfoType
Definition: StdRtlPkg.vhd:678
in bootAddressslv( 31 downto 0) := X"00000000"
Definition: Iprog.vhd:38
in axiWriteMasterAxiLiteWriteMasterType
Definition: AxiVersion.vhd:52
out dnaValueOutslv( 127 downto 0)
Definition: AxiVersion.vhd:63
in axiRstsl
Definition: AxiVersion.vhd:49
_library_ ieeeieee
in axiClksl
Definition: AxiVersion.vhd:48
CLK_PERIOD_Greal := 6.4E-9
Definition: DS2411Core.vhd:35
slv( 159 downto 0) gitHash
Definition: StdRtlPkg.vhd:682
in clksl
Definition: DS2411Core.vhd:38
in asyncRstsl
Definition: RstSync.vhd:35
SIM_DNA_VALUE_Gslv := X"000000000000000000000000"
Definition: DeviceDna.vhd:33
out axiWriteSlaveAxiLiteWriteSlaveType
Definition: AxiVersion.vhd:53
in clksl
Definition: DeviceDna.vhd:35
DEVICE_ID_Gslv( 31 downto 0) :=( others => '0')
Definition: AxiVersion.vhd:35
in clksl
Definition: RstSync.vhd:34
in slowClksl := '0'
Definition: AxiVersion.vhd:62
in fpgaEnReloadsl := '1'
Definition: AxiVersion.vhd:57
inout fdSerSdiosl := 'Z'
Definition: AxiVersion.vhd:68
out fpgaReloadsl
Definition: AxiVersion.vhd:58
slv( 1 downto 0) := "11" AXI_RESP_DECERR_C
Definition: AxiLitePkg.vhd:49
AUTO_RELOAD_ADDR_Gslv( 31 downto 0) :=( others => '0')
Definition: AxiVersion.vhd:45
in slowClksl := '0'
Definition: DeviceDna.vhd:37
in userValuesSlv32Array( 0 to 63) :=( others => X"00000000")
Definition: AxiVersion.vhd:66
out axiReadSlaveAxiLiteReadSlaveType
Definition: AxiVersion.vhd:51
AxiLiteReadMasterType
Definition: AxiLitePkg.vhd:59
in startsl
Definition: Iprog.vhd:37
in rstsl
Definition: DS2411Core.vhd:39
EN_ICAP_Gboolean := false
Definition: AxiVersion.vhd:40
TPD_Gtime := 1 ns
Definition: RstSync.vhd:27
AUTO_RELOAD_EN_Gboolean := false
Definition: AxiVersion.vhd:43
EN_DS2411_Gboolean := false
Definition: AxiVersion.vhd:39
AxiLiteReadSlaveType :=(arready => '0',rdata =>( others => '0'),rresp =>( others => '0'),rvalid => '0') AXI_LITE_READ_SLAVE_INIT_C
Definition: AxiLitePkg.vhd:95
out dnaValueslv( 127 downto 0)
Definition: DeviceDna.vhd:38
Definition: Iprog.vhd:26
BUFR_CLK_DIV_Gpositive := 8
Definition: DeviceDna.vhd:31
inout fdSerSdiosl
Definition: DS2411Core.vhd:41
USE_SLOWCLK_Gboolean := false
Definition: DeviceDna.vhd:30
CLK_PERIOD_Greal := 8.0E-9
Definition: AxiVersion.vhd:36
BUFR_CLK_DIV_Gpositive := 8
Definition: AxiVersion.vhd:42
TPD_Gtime := 1 ns
Definition: Iprog.vhd:28
EN_DEVICE_DNA_Gboolean := false
Definition: AxiVersion.vhd:38
AxiLiteReadSlaveType
Definition: AxiLitePkg.vhd:85
AXI_ERROR_RESP_Gslv( 1 downto 0) := AXI_RESP_DECERR_C
Definition: AxiVersion.vhd:34
in rstsl
Definition: Iprog.vhd:35
AUTO_RELOAD_TIME_Greal range 0.0 to 30.0:= 10.0
Definition: AxiVersion.vhd:44
TPD_Gtime := 1 ns
Definition: DeviceDna.vhd:28
USE_SLOWCLK_Gboolean := false
Definition: AxiVersion.vhd:41
out fdValueOutslv( 63 downto 0)
Definition: AxiVersion.vhd:64
XIL_DEVICE_Gstring := "7SERIES"
Definition: DeviceDna.vhd:29
TPD_Gtime := 1 ns
Definition: DS2411Core.vhd:32
out fdValueslv( 63 downto 0)
Definition: DS2411Core.vhd:43
in slowClksl := '0'
Definition: Iprog.vhd:36
in axiReadMasterAxiLiteReadMasterType
Definition: AxiVersion.vhd:50
BUFR_CLK_DIV_Gpositive := 8
Definition: Iprog.vhd:31
AxiLiteWriteSlaveType :=(awready => '0',wready => '0',bresp =>( others => '0'),bvalid => '0') AXI_LITE_WRITE_SLAVE_INIT_C
Definition: AxiLitePkg.vhd:156
out fpgaReloadAddrslv( 31 downto 0)
Definition: AxiVersion.vhd:59
XIL_DEVICE_Gstring := "7SERIES"
Definition: Iprog.vhd:29
in rstsl
Definition: DeviceDna.vhd:36
in clksl
Definition: Iprog.vhd:34
slv( 31 downto 0) fwVersion
Definition: StdRtlPkg.vhd:681
std_logic_vector slv
Definition: StdRtlPkg.vhd:29
out masterResetsl
Definition: AxiVersion.vhd:55
Slv32Array( 0 to 63) buildString
Definition: StdRtlPkg.vhd:680
BUILD_INFO_GBuildInfoType
Definition: AxiVersion.vhd:32