SURF  1.0
AxiLtc2270Deser.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 -- File : AxiLtc2270Deser.vhd
3 -- Company : SLAC National Accelerator Laboratory
4 -- Created : 2014-04-21
5 -- Last update: 2015-01-20
6 -------------------------------------------------------------------------------
7 -- Description: ADC DDR Deserializer
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.AxiLtc2270Pkg.all;
25 
26 library unisim;
27 use unisim.vcomponents.all;
28 
29 --! @see entity
30  --! @ingroup devices_Linear_lct2270
31 entity AxiLtc2270Deser is
32  generic (
33  TPD_G : time := 1 ns;
34  DELAY_INIT_G : Slv5VectorArray(0 to 1, 0 to 7) := (others => (others => (others => '0')));
35  IODELAY_GROUP_G : string := "AXI_LTC2270_IODELAY_GRP");
36  port (
37  -- ADC Ports
38  clkInP : in sl;
39  clkInN : in sl;
40  clkOutP : out sl;
41  clkOutN : out sl;
42  dataP : in Slv8Array(0 to 1);
43  dataN : in Slv8Array(0 to 1);
44  orP : in sl;
45  orN : in sl;
46  -- ADC Data Interface (axiClk domain)
47  adcValid : out slv(0 to 1);
48  adcData : out Slv16Array(0 to 1); -- 2's complement
49  -- Register Interface (axiClk domain)
50  dmode : in slv(1 downto 0);
51  -- Register Interface (refclk200MHz domain)
54  -- Clocks and Resets
55  axiClk : in sl;
56  axiRst : in sl;
57  adcClk : in sl; -- Up to 20 MHz
59 end AxiLtc2270Deser;
60 
61 architecture rtl of AxiLtc2270Deser is
62 
63  signal adcInClk,
64  adcClock : sl;
65  signal dmux : slv(1 downto 0);
66  signal adcDataPs,
67  adcDataNs,
68  adcDataP,
69  adcDataN,
70  adcDataNd,
71  adcDmuxA,
72  adcDmuxB : Slv8Array(0 to 1);
73  signal data : Slv16Array(0 to 1);
74 
75  attribute IODELAY_GROUP : string;
76  attribute IODELAY_GROUP of IDELAYCTRL_Inst : label is IODELAY_GROUP_G;
77 
78 begin
79 
80  ClkOutBufDiff_0 : entity work.ClkOutBufDiff
81  port map (
82  clkIn => adcClk,
83  clkOutP => clkOutP,
84  clkOutN => clkOutN);
85 
86  IBUFDS_OR : IBUFDS
87  generic map (
88  DIFF_TERM => true)
89  port map (
90  I => orP,
91  IB => orN,
92  O => open);
93 
94  IBUFGDS_0 : IBUFGDS
95  port map (
96  I => clkInP,
97  IB => clkInN,
98  O => adcInClk);
99 
100  BUFG_0 : BUFG
101  port map (
102  I => adcInClk,
103  O => adcClock);
104 
105  SynchVector_Inst : entity work.SynchronizerVector
106  generic map(
107  WIDTH_G => 2)
108  port map(
109  clk => adcClock,
110  dataIn => dmode,
111  dataOut => dmux);
112 
113  IDELAYCTRL_Inst : IDELAYCTRL
114  port map (
115  RDY => delayOut.rdy, -- 1-bit output: Ready output
116  REFCLK => refClk200MHz, -- 1-bit input: Reference clock input
117  RST => delayIn.rst); -- 1-bit input: Active high reset input
118 
119  GEN_CH :
120  for ch in 0 to 1 generate
121  GEN_DAT :
122  for i in 0 to 7 generate
123 
124  AxiLtc2270DeserBit_Inst : entity work.AxiLtc2270DeserBit
125  generic map(
126  TPD_G => TPD_G,
127  DELAY_INIT_G => DELAY_INIT_G(ch, i),
129  port map (
130  -- ADC Data (clk domain)
131  dataP => dataP(ch)(i),
132  dataN => dataN(ch)(i),
133  Q1 => adcDataPs(ch)(i),
134  Q2 => adcDataNs(ch)(i),
135  -- IO_Delay (refClk200MHz domain)
136  delayInLoad => delayIn.load,
137  delayInData => delayIn.data(ch, i),
138  delayOutData => delayOut.data(ch, i),
139  -- Clocks
140  clk => adcClock,
141  refClk200MHz => refClk200MHz);
142 
143  end generate GEN_DAT;
144 
145  process(adcClock)
146  variable i : integer;
147  begin
148  if rising_edge(adcClock) then
149  adcDataP(ch) <= adcDataPs(ch) after TPD_G;
150  adcDataN(ch) <= adcDataNs(ch) after TPD_G;
151  adcDataNd(ch) <= adcDataN(ch) after TPD_G;
152  if dmux(ch) = '0' then
153  adcDmuxA(ch) <= adcDataNd(ch) after TPD_G;
154  adcDmuxB(ch) <= adcDataP(ch) after TPD_G;
155  else
156  adcDmuxA(ch) <= adcDataP(ch) after TPD_G;
157  adcDmuxB(ch) <= adcDataN(ch) after TPD_G;
158  end if;
159  for i in 7 downto 0 loop
160  data(ch)(2*i+1) <= adcDmuxB(ch)(i) after TPD_G;
161  data(ch)(2*i) <= adcDmuxA(ch)(i) after TPD_G;
162  end loop;
163  end if;
164  end process;
165 
166  SyncFifo_Inst : entity work.SynchronizerFifo
167  generic map(
168  DATA_WIDTH_G => 16)
169  port map(
170  -- Asynchronous Reset
171  rst => axiRst,
172  --Write Ports (wr_clk domain)
173  wr_clk => adcClock,
174  din => data(ch),
175  --Read Ports (rd_clk domain)
176  rd_clk => axiClk,
177  valid => adcValid(ch),
178  dout => adcData(ch));
179 
180  end generate GEN_CH;
181 
182 end rtl;
IODELAY_GROUP_Gstring := "AXI_LTC2270_IODELAY_GRP"
in delayinAxiLtc2270DelayInType
std_logic sl
Definition: StdRtlPkg.vhd:28
in dinslv( DATA_WIDTH_G- 1 downto 0)
out adcValidslv( 0 to 1)
out delayOutDataslv( 4 downto 0)
DELAY_INIT_Gslv( 4 downto 0) :=( others => '0')
in dataInslv( WIDTH_G- 1 downto 0)
out delayOutAxiLtc2270DelayOutType
out doutslv( DATA_WIDTH_G- 1 downto 0)
Slv5VectorArray ( 0 to 1, 0 to 7) data
in dataNSlv8Array( 0 to 1)
in dataPSlv8Array( 0 to 1)
DELAY_INIT_GSlv5VectorArray ( 0 to 1, 0 to 7):=( others =>( others =>( others => '0')))
in dmodeslv( 1 downto 0)
out dataOutslv( WIDTH_G- 1 downto 0)
array(natural range <> ) of slv( 15 downto 0) Slv16Array
Definition: StdRtlPkg.vhd:395
_library_ ieeeieee
IODELAY_GROUP_Gstring := "AXI_LTC2270_IODELAY_GRP"
array(natural range <> ,natural range <> ) of slv( 4 downto 0) Slv5VectorArray
Definition: StdRtlPkg.vhd:664
out adcDataSlv16Array( 0 to 1)
array(natural range <> ) of slv( 7 downto 0) Slv8Array
Definition: StdRtlPkg.vhd:403
in delayInDataslv( 4 downto 0)
TPD_Gtime := 1 ns
DATA_WIDTH_Ginteger range 1 to ( 2** 24):= 16
std_logic_vector slv
Definition: StdRtlPkg.vhd:29