SURF  1.0
AxiI2cQsfpReg.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 -- File : AxiI2cQsfpReg.vhd
3 -- Company : SLAC National Accelerator Laboratory
4 -- Created : 2014-04-24
5 -- Last update: 2015-07-20
6 -------------------------------------------------------------------------------
7 -- Description: AXI-Lite Register Access Module
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_unsigned.all;
21 use ieee.std_logic_arith.all;
22 
23 use work.StdRtlPkg.all;
24 use work.AxiLitePkg.all;
25 use work.AxiI2cQsfpPkg.all;
26 use work.I2cPkg.all;
27 
28 --! @see entity
29  --! @ingroup devices_transceivers_qsfp
30 entity AxiI2cQsfpReg is
31  generic (
32  TPD_G : time := 1 ns;
33  STATUS_CNT_WIDTH_G : natural range 1 to 32 := 32;
35  port (
36  -- I2C Register Interface
39  -- AXI-Lite Register Interface
44  -- Register Inputs/Outputs
46  config : out AxiI2cQsfpConfigType;
47  -- Global Signals
48  axiClk : in sl;
49  axiRst : in sl);
50 end AxiI2cQsfpReg;
51 
52 architecture rtl of AxiI2cQsfpReg is
53 
54  constant DEVICE_MAP_C : I2cAxiLiteDevArray(0 to 1) := (
55  0 => MakeI2cAxiLiteDevType(
56  i2cAddress => "1010000", -- Configuration PROM
57  dataSize => 8, -- in units of bits
58  addrSize => 8, -- in units of bits
59  endianness => '1'), -- Big endian
60  1 => MakeI2cAxiLiteDevType(
61  i2cAddress => "1010001", -- Diagnostic Monitoring
62  dataSize => 8, -- in units of bits
63  addrSize => 8, -- in units of bits
64  endianness => '1')); -- Big endian
65 
66  constant NUM_WRITE_REG_C : positive := 5;
67  constant STATUS_SIZE_C : positive := 2;
68  constant NUM_READ_REG_C : positive := (STATUS_SIZE_C+1);
69 
70  signal cntRst : sl;
71  signal rollOverEn : slv(STATUS_SIZE_C-1 downto 0);
72  signal cntOut : SlVectorArray(STATUS_SIZE_C-1 downto 0, STATUS_CNT_WIDTH_G-1 downto 0);
73 
74  signal regIn : AxiI2cQsfpStatusType;
75 
76  signal readRegister : Slv32Array(0 to NUM_READ_REG_C-1) := (others => x"00000000");
77  signal writeRegister : Slv32Array(0 to NUM_WRITE_REG_C-1) := (others => x"00000000");
78 
79 begin
80 
81  I2cRegMasterAxiBridge_Inst : entity work.I2cRegMasterAxiBridge
82  generic map (
83  TPD_G => TPD_G,
84  DEVICE_MAP_G => DEVICE_MAP_C,
85  EN_USER_REG_G => true,
86  NUM_WRITE_REG_G => NUM_WRITE_REG_C-1,
87  NUM_READ_REG_G => NUM_READ_REG_C-1,
89  port map (
90  -- I2C Interface
93  -- AXI-Lite Register Interface
98  -- Optional User Read/Write Register Interface
99  readRegister => readRegister,
100  writeRegister => writeRegister,
101  -- Clock and Reset
102  axiClk => axiClk,
103  axiRst => axiRst);
104 
105  -------------------------------
106  -- Synchronization: Outputs
107  -------------------------------
108  config.modSel <= writeRegister(0)(0);
109  config.rst <= writeRegister(1)(0);
110  config.lpMode <= writeRegister(2)(0);
111  rollOverEn <= writeRegister(3)(STATUS_SIZE_C-1 downto 0);
112  cntRst <= writeRegister(4)(0);
113 
114  -------------------------------
115  -- Synchronization: Inputs
116  -------------------------------
117  SyncStatusVec_Inst : entity work.SyncStatusVector
118  generic map (
119  TPD_G => TPD_G,
120  OUT_POLARITY_G => '1',
121  CNT_RST_EDGE_G => true,
122  COMMON_CLK_G => true,
124  WIDTH_G => STATUS_SIZE_C)
125  port map (
126  -- Input Status bit Signals (wrClk domain)
127  statusIn(1) => status.modPrst,
128  statusIn(0) => status.interrupt,
129  -- Output Status bit Signals (rdClk domain)
130  statusOut(1) => regIn.modPrst,
131  statusOut(0) => regIn.interrupt,
132  -- Status Bit Counters Signals (rdClk domain)
133  cntRstIn => cntRst,
134  rollOverEnIn => rollOverEn,
135  cntOut => cntOut,
136  -- Clocks and Reset Ports
137  wrClk => axiClk,
138  rdClk => axiClk);
139 
140  readRegister(2)(1) <= regIn.modPrst;
141  readRegister(2)(0) <= regIn.interrupt;
142 
143  readRegister(1)(STATUS_CNT_WIDTH_G-1 downto 0) <= muxSlVectorArray(cntOut, 1); -- modPrstCnt
144  readRegister(0)(STATUS_CNT_WIDTH_G-1 downto 0) <= muxSlVectorArray(cntOut, 0); -- interruptCnt
145 
146 end rtl;
out i2cRegMasterInI2cRegMasterInType
AXI_ERROR_RESP_Gslv( 1 downto 0) := AXI_RESP_SLVERR_C
array(natural range <> ) of slv( 31 downto 0) Slv32Array
Definition: StdRtlPkg.vhd:379
out axiWriteSlaveAxiLiteWriteSlaveType
integer addrSize
Definition: I2cPkg.vhd:163
out axiWriteSlaveAxiLiteWriteSlaveType
out axiReadSlaveAxiLiteReadSlaveType
AxiLiteWriteMasterType
Definition: AxiLitePkg.vhd:111
std_logic sl
Definition: StdRtlPkg.vhd:28
integer dataSize
Definition: I2cPkg.vhd:162
in axiReadMasterAxiLiteReadMasterType
sl endianness
Definition: I2cPkg.vhd:90
in i2cRegMasterOutI2cRegMasterOutType
array(natural range <> ,natural range <> ) of sl SlVectorArray
Definition: StdRtlPkg.vhd:669
WIDTH_Gpositive := 16
in axiWriteMasterAxiLiteWriteMasterType
array(natural range <> ) of I2cAxiLiteDevType I2cAxiLiteDevArray
Definition: I2cPkg.vhd:176
in statusAxiI2cQsfpStatusType
COMMON_CLK_Gboolean := false
DEVICE_MAP_GI2cAxiLiteDevArray := I2C_AXIL_DEV_ARRAY_DEFAULT_C
in axiWriteMasterAxiLiteWriteMasterType
out cntOutSlVectorArray ( WIDTH_G- 1 downto 0, CNT_WIDTH_G- 1 downto 0)
TPD_Gtime := 1 ns
out axiReadSlaveAxiLiteReadSlaveType
CNT_WIDTH_Gpositive := 32
slv( 1 downto 0) := "10" AXI_RESP_SLVERR_C
Definition: AxiLitePkg.vhd:36
I2cRegMasterOutType
Definition: I2cPkg.vhd:110
AXI_ERROR_RESP_Gslv( 1 downto 0) := AXI_RESP_SLVERR_C
in axiReadMasterAxiLiteReadMasterType
in rollOverEnInslv( WIDTH_G- 1 downto 0) :=( others => '0')
AxiLiteReadMasterType
Definition: AxiLitePkg.vhd:59
NUM_WRITE_REG_Ginteger range 1 to 128:= 1
slv( 9 downto 0) i2cAddress
Definition: I2cPkg.vhd:160
_library_ ieeeieee
I2cRegMasterInType
Definition: I2cPkg.vhd:79
out writeRegisterSlv32Array( 0 to NUM_WRITE_REG_G)
in i2cRegMasterOutI2cRegMasterOutType
CNT_RST_EDGE_Gboolean := true
NUM_READ_REG_Ginteger range 1 to 128:= 1
AxiLiteReadSlaveType
Definition: AxiLitePkg.vhd:85
STATUS_CNT_WIDTH_Gnatural range 1 to 32:= 32
out i2cRegMasterInI2cRegMasterInType
in readRegisterSlv32Array( 0 to NUM_READ_REG_G) :=( others => x"00000000")
std_logic_vector slv
Definition: StdRtlPkg.vhd:29