SURF  1.0
AxiI2cCxpReg.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 -- File : AxiI2cCxpReg.vhd
3 -- Company : SLAC National Accelerator Laboratory
4 -- Created : 2014-10-21
5 -- Last update: 2014-10-21
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.AxiI2cCxpPkg.all;
26 use work.I2cPkg.all;
27 
28 --! @see entity
29  --! @ingroup devices_transceivers_cxp
30 entity AxiI2cCxpReg 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 AxiI2cCxpConfigType;
47  -- Global Signals
48  axiClk : in sl;
49  axiRst : in sl);
50 end AxiI2cCxpReg;
51 
52 architecture rtl of AxiI2cCxpReg is
53 
54  constant TX_INDEX_C : natural := 0;
55  constant RX_INDEX_C : natural := 1;
56 
57  constant DEVICE_MAP_C : I2cAxiLiteDevArray(0 to 1) := (
58  TX_INDEX_C => MakeI2cAxiLiteDevType(
59  i2cAddress => "1010000", -- TX Memory Map
60  dataSize => 8, -- in units of bits
61  addrSize => 8, -- in units of bits
62  endianness => '1'), -- Big Endian
63  RX_INDEX_C => MakeI2cAxiLiteDevType(
64  i2cAddress => "1010100", -- RX Memory Map
65  dataSize => 8, -- in units of bits
66  addrSize => 8, -- in units of bits
67  endianness => '1')); -- Big Endian
68 
69  constant NUM_WRITE_REG_C : positive := 3;
70  constant STATUS_SIZE_C : positive := 2;
71  constant NUM_READ_REG_C : positive := (STATUS_SIZE_C+1);
72 
73  constant WRITE_REG_INIT_C : Slv32Array(0 to NUM_WRITE_REG_C-1) := (
74  0 => x"00000000", -- config.rst
75  1 => x"00000000", -- rollOverEn
76  2 => x"00000000"); -- cntRst
77 
78  signal cntRst : sl;
79  signal rollOverEn : slv(STATUS_SIZE_C-1 downto 0);
80  signal cntOut : SlVectorArray(STATUS_SIZE_C-1 downto 0, STATUS_CNT_WIDTH_G-1 downto 0);
81 
82  signal regIn : AxiI2cCxpStatusType;
83 
84  signal readRegister : Slv32Array(0 to NUM_READ_REG_C-1) := (others => x"00000000");
85  signal writeRegister : Slv32Array(0 to NUM_WRITE_REG_C-1) := (others => x"00000000");
86 
87 begin
88 
89  I2cRegMasterAxiBridge_Inst : entity work.I2cRegMasterAxiBridge
90  generic map (
91  TPD_G => TPD_G,
92  DEVICE_MAP_G => DEVICE_MAP_C,
93  EN_USER_REG_G => true,
94  NUM_WRITE_REG_G => (NUM_WRITE_REG_C-1),
95  NUM_READ_REG_G => (NUM_READ_REG_C-1),
97  port map (
98  -- I2C Interface
101  -- AXI-Lite Register Interface
106  -- Optional User Read/Write Register Interface
107  readRegister => readRegister,
108  writeRegisterInit => WRITE_REG_INIT_C,
109  writeRegister => writeRegister,
110  -- Clock and Reset
111  axiClk => axiClk,
112  axiRst => axiRst);
113 
114  -------------------------------
115  -- Synchronization: Outputs
116  -------------------------------
117  config.rst <= writeRegister(0)(0);
118  rollOverEn <= writeRegister(1)(STATUS_SIZE_C-1 downto 0);
119  cntRst <= writeRegister(2)(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(1) => status.irq,
135  statusIn(0) => status.moduleDet,
136  -- Output Status bit Signals (rdClk domain)
137  statusOut(1) => regIn.irq,
138  statusOut(0) => regIn.moduleDet,
139  -- Status Bit Counters Signals (rdClk domain)
140  cntRstIn => cntRst,
141  rollOverEnIn => rollOverEn,
142  cntOut => cntOut,
143  -- Clocks and Reset Ports
144  wrClk => axiClk,
145  rdClk => axiClk);
146 
147  readRegister(2)(1) <= regIn.irq;
148  readRegister(2)(0) <= regIn.moduleDet;
149 
150  readRegister(1)(STATUS_CNT_WIDTH_G-1 downto 0) <= muxSlVectorArray(cntOut, 1); -- irqCnt
151  readRegister(0)(STATUS_CNT_WIDTH_G-1 downto 0) <= muxSlVectorArray(cntOut, 0); -- moduleDetCnt
152 
153 end rtl;
AXI_ERROR_RESP_Gslv( 1 downto 0) := AXI_RESP_SLVERR_C
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
STATUS_CNT_WIDTH_Gnatural range 1 to 32:= 32
integer addrSize
Definition: I2cPkg.vhd:163
AxiLiteWriteMasterType
Definition: AxiLitePkg.vhd:111
std_logic sl
Definition: StdRtlPkg.vhd:28
integer dataSize
Definition: I2cPkg.vhd:162
TPD_Gtime := 1 ns
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 axiWriteMasterAxiLiteWriteMasterType
out cntOutSlVectorArray ( WIDTH_G- 1 downto 0, CNT_WIDTH_G- 1 downto 0)
_library_ ieeeieee
out i2cRegMasterInI2cRegMasterInType
out axiReadSlaveAxiLiteReadSlaveType
out axiWriteSlaveAxiLiteWriteSlaveType
CNT_WIDTH_Gpositive := 32
slv( 1 downto 0) := "10" AXI_RESP_SLVERR_C
Definition: AxiLitePkg.vhd:36
I2cRegMasterOutType
Definition: I2cPkg.vhd:110
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)
in i2cRegMasterOutI2cRegMasterOutType
CNT_RST_EDGE_Gboolean := true
in i2cRegMasterOutI2cRegMasterOutType
NUM_READ_REG_Ginteger range 1 to 128:= 1
AxiLiteReadSlaveType
Definition: AxiLitePkg.vhd:85
in axiWriteMasterAxiLiteWriteMasterType
in axiReadMasterAxiLiteReadMasterType
in statusAxiI2cCxpStatusType
out i2cRegMasterInI2cRegMasterInType
out axiReadSlaveAxiLiteReadSlaveType
in readRegisterSlv32Array( 0 to NUM_READ_REG_G) :=( others => x"00000000")
std_logic_vector slv
Definition: StdRtlPkg.vhd:29