SURF  1.0
AxiI2cSfpReg.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 -- File : AxiI2cSfpReg.vhd
3 -- Company : SLAC National Accelerator Laboratory
4 -- Created : 2014-04-18
5 -- Last update: 2015-07-20
6 -------------------------------------------------------------------------------
7 -- Description: AXI-Lite Register Acess 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.AxiI2cSfpPkg.all;
26 use work.I2cPkg.all;
27 
28 --! @see entity
29  --! @ingroup devices_transceivers_sfp
30 entity AxiI2cSfpReg is
31  generic (
32  TPD_G : time := 1 ns;
33  STATUS_CNT_WIDTH_G : natural range 1 to 32 := 32;
34  ALLOW_TX_DISABLE_G : boolean := false;
36  port (
37  -- I2C Register Interface
40  -- AXI-Lite Register Interface
45  -- Register Inputs/Outputs
47  config : out AxiI2cSfpConfigType;
48  -- Global Signals
49  axiClk : in sl;
50  axiRst : in sl);
51 end AxiI2cSfpReg;
52 
53 architecture rtl of AxiI2cSfpReg is
54 
55  constant DEVICE_MAP_C : I2cAxiLiteDevArray(0 to 1) := (
56  0 => MakeI2cAxiLiteDevType(
57  i2cAddress => "1010000", -- Configuration PROM
58  dataSize => 8, -- in units of bits
59  addrSize => 8, -- in units of bits
60  endianness => '1'), -- Big endian
61  1 => MakeI2cAxiLiteDevType(
62  i2cAddress => "1010001", -- Diagnostic Monitoring
63  dataSize => 8, -- in units of bits
64  addrSize => 8, -- in units of bits
65  endianness => '1')); -- Big endian
66 
67  constant NUM_WRITE_REG_C : positive := 4;
68  constant STATUS_SIZE_C : positive := 3;
69  constant NUM_READ_REG_C : positive := (STATUS_SIZE_C+1);
70 
71  constant WRITE_REG_INIT_C : Slv32Array(0 to NUM_WRITE_REG_C-1) := (
72  0 => x"00000000", -- config.txDisable
73  1 => x"00000003", -- config.rateSel
74  2 => x"00000000", -- rollOverEn
75  3 => x"00000000"); -- cntRst
76 
77  signal cntRst : sl;
78  signal rollOverEn : slv(STATUS_SIZE_C-1 downto 0);
79  signal cntOut : SlVectorArray(STATUS_SIZE_C-1 downto 0, STATUS_CNT_WIDTH_G-1 downto 0);
80 
81  signal regIn : AxiI2cSfpStatusType;
82 
83  signal readRegister : Slv32Array(0 to NUM_READ_REG_C-1) := (others => x"00000000");
84  signal writeRegister : Slv32Array(0 to NUM_WRITE_REG_C-1) := (others => x"00000000");
85 
86 begin
87 
88  I2cRegMasterAxiBridge_Inst : entity work.I2cRegMasterAxiBridge
89  generic map (
90  TPD_G => TPD_G,
91  DEVICE_MAP_G => DEVICE_MAP_C,
92  EN_USER_REG_G => true,
93  NUM_WRITE_REG_G => NUM_WRITE_REG_C-1,
94  NUM_READ_REG_G => NUM_READ_REG_C-1,
96  port map (
97  -- I2C Interface
100  -- AXI-Lite Register Interface
105  -- Optional User Read/Write Register Interface
106  readRegister => readRegister,
107  writeRegisterInit => WRITE_REG_INIT_C,
108  writeRegister => writeRegister,
109  -- Clock and Reset
110  axiClk => axiClk,
111  axiRst => axiRst);
112 
113  -------------------------------
114  -- Synchronization: Outputs
115  -------------------------------
116  config.txDisable <= writeRegister(0)(0) when(ALLOW_TX_DISABLE_G = true) else '0';
117  config.rateSel <= writeRegister(1)(1 downto 0);
118  rollOverEn <= writeRegister(2)(STATUS_SIZE_C-1 downto 0);
119  cntRst <= writeRegister(3)(0);
120 
121  -------------------------------
122  -- Synchronization: Inputs
123  -------------------------------
124  SyncStatusVec_Inst : entity work.SyncStatusVector
125  generic map (
126  TPD_G => TPD_G,
127  OUT_POLARITY_G => '1',
128  CNT_RST_EDGE_G => true,
129  COMMON_CLK_G => true,
131  WIDTH_G => STATUS_SIZE_C)
132  port map (
133  -- Input Status bit Signals (wrClk domain)
134  statusIn(2) => status.txFault,
135  statusIn(1) => status.moduleDetL,
136  statusIn(0) => status.rxLoss,
137  -- Output Status bit Signals (rdClk domain)
138  statusOut(2) => regIn.txFault,
139  statusOut(1) => regIn.moduleDetL,
140  statusOut(0) => regIn.rxLoss,
141  -- Status Bit Counters Signals (rdClk domain)
142  cntRstIn => cntRst,
143  rollOverEnIn => rollOverEn,
144  cntOut => cntOut,
145  -- Clocks and Reset Ports
146  wrClk => axiClk,
147  rdClk => axiClk);
148 
149  readRegister(3)(2) <= regIn.txFault;
150  readRegister(3)(1) <= regIn.moduleDetL;
151  readRegister(3)(0) <= regIn.rxLoss;
152 
153  readRegister(2)(STATUS_CNT_WIDTH_G-1 downto 0) <= muxSlVectorArray(cntOut, 2); -- txFaultCnt
154  readRegister(1)(STATUS_CNT_WIDTH_G-1 downto 0) <= muxSlVectorArray(cntOut, 1); -- moduleDetCnt
155  readRegister(0)(STATUS_CNT_WIDTH_G-1 downto 0) <= muxSlVectorArray(cntOut, 0); -- rxLossCnt
156 
157 end rtl;
out axiReadSlaveAxiLiteReadSlaveType
AXI_ERROR_RESP_Gslv( 1 downto 0) := AXI_RESP_SLVERR_C
array(natural range <> ) of slv( 31 downto 0) Slv32Array
Definition: StdRtlPkg.vhd:379
in axiWriteMasterAxiLiteWriteMasterType
out axiWriteSlaveAxiLiteWriteSlaveType
integer addrSize
Definition: I2cPkg.vhd:163
TPD_Gtime := 1 ns
in axiReadMasterAxiLiteReadMasterType
AxiLiteWriteMasterType
Definition: AxiLitePkg.vhd:111
std_logic sl
Definition: StdRtlPkg.vhd:28
integer dataSize
Definition: I2cPkg.vhd:162
sl endianness
Definition: I2cPkg.vhd:90
array(natural range <> ,natural range <> ) of sl SlVectorArray
Definition: StdRtlPkg.vhd:669
WIDTH_Gpositive := 16
array(natural range <> ) of I2cAxiLiteDevType I2cAxiLiteDevArray
Definition: I2cPkg.vhd:176
COMMON_CLK_Gboolean := false
DEVICE_MAP_GI2cAxiLiteDevArray := I2C_AXIL_DEV_ARRAY_DEFAULT_C
in i2cRegMasterOutI2cRegMasterOutType
in axiWriteMasterAxiLiteWriteMasterType
out cntOutSlVectorArray ( WIDTH_G- 1 downto 0, CNT_WIDTH_G- 1 downto 0)
out axiReadSlaveAxiLiteReadSlaveType
CNT_WIDTH_Gpositive := 32
slv( 1 downto 0) := "10" AXI_RESP_SLVERR_C
Definition: AxiLitePkg.vhd:36
I2cRegMasterOutType
Definition: I2cPkg.vhd:110
STATUS_CNT_WIDTH_Gnatural range 1 to 32:= 32
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
in writeRegisterInitSlv32Array( 0 to NUM_WRITE_REG_G) :=( others => x"00000000")
I2cRegMasterInType
Definition: I2cPkg.vhd:79
out writeRegisterSlv32Array( 0 to NUM_WRITE_REG_G)
out axiWriteSlaveAxiLiteWriteSlaveType
in i2cRegMasterOutI2cRegMasterOutType
CNT_RST_EDGE_Gboolean := true
_library_ ieeeieee
out i2cRegMasterInI2cRegMasterInType
AXI_ERROR_RESP_Gslv( 1 downto 0) := AXI_RESP_SLVERR_C
NUM_READ_REG_Ginteger range 1 to 128:= 1
AxiLiteReadSlaveType
Definition: AxiLitePkg.vhd:85
out i2cRegMasterInI2cRegMasterInType
in readRegisterSlv32Array( 0 to NUM_READ_REG_G) :=( others => x"00000000")
ALLOW_TX_DISABLE_Gboolean := false
in statusAxiI2cSfpStatusType
std_logic_vector slv
Definition: StdRtlPkg.vhd:29