CMX
CMX firmware code in-line documentation
 All Classes Namespaces Files Functions Variables
CMX_cable_clocked_80Mbps_input_module.vhd
Go to the documentation of this file.
1 ----------------------------------------------------------------------------------
8 --transmission over the RTM cables
9 ----------------------------------------------------------------------------------
10 
11 library IEEE;
12 use IEEE.STD_LOGIC_1164.ALL;
13 use IEEE.NUMERIC_STD.ALL;
14 
15 library UNISIM;
16 use UNISIM.VComponents.all;
17 
18 library work;
19 use work.CMXpackage.all;
20 
21 
23  generic (
25  port (
26  data : out std_logic_vector( (numbits_in_cable_connector*2)-1 downto 0);
27  parity_error : out std_logic;
28  forwarded_clock : out std_logic;
29  ddr_data_in : in std_logic_vector(numbits_in_cable_connector downto 0);
30  buf_clk40 : in std_logic; -- global 40 MHz clock
31  buf_clk200 : in std_logic; -- global 200 MHz clock for iodelay calibration
32  pll_locked : in std_logic; -- is the main MMCM locked?
33  del_array : in cable_del_array_type(numbits_in_cable_connector downto 0);
34  upload_delays: in std_logic
35  );
36 
37 end CMX_cable_clocked_80Mbps_input_module;
38 
39 
40 architecture Behavioral of CMX_cable_clocked_80Mbps_input_module is
41 
42 
43 
44  signal delayed_ddr_data_in : std_logic_vector(numbits_in_cable_connector-1 downto 0); -- after putting the
45  -- data through the
46  -- delay module
47 
48  signal delayed_cable_clock : std_logic;
49  signal delayed_cable_clock_buffered: std_logic;
50 
51  signal PDATA, NDATA: std_logic_vector(numbits_in_cable_connector - 1 downto 0);
52 
53  signal i_pll_locked: std_logic;
54 
55  signal parity_P : std_logic;
56  signal parity_N : std_logic;
57  signal parity_P_tmp : std_logic_vector(numbits_in_cable_connector - 1 downto 0);
58  signal parity_N_tmp : std_logic_vector(numbits_in_cable_connector - 1 downto 0);
59 
60 
61  --component CMX_RTM_data_delay
62  -- generic (
63  -- inst_IDELAYCTRL: std_logic :='1');
64  -- port (
65  -- RTM_data : in std_logic_vector(numbitsinchan_LVDS_RTM downto 0);
66  -- REF_CLK_200 : in std_logic;
67  -- REF_CLK_READY : in std_logic;
68  -- CLK_40 : in std_logic;
69  -- del_register : in del_register_rtm_type;
70  -- upload_delays : in std_logic;
71  -- IDELAYCTRL_RDY : out std_logic;
72  -- delayed_RTM_data : out std_logic_vector(numbitsinchan_LVDS_RTM downto 0));
73  --end component;
74 
75 
76 begin
77 
78 
79  --the data straight from the RTM module are passed through the IDELAY
80  -- CMX_RTM_data_delay_i: CMX_RTM_data_delay
81  -- generic map (
82  -- inst_IDELAYCTRL => inst_IDELAYCTRL)
83  -- port map (
84  -- RTM_data => RTM_data,
85  -- REF_CLK_200 => buf_clk200,
86  -- REF_CLK_READY => pll_locked,
87  -- CLK_40 => buf_clk40,
88  -- del_register => del_register_rtm,
89  -- upload_delays => upload_delays,
90  -- IDELAYCTRL_RDY => open,
91  -- delayed_RTM_data(numbitsinchan_LVDS_RTM-1 downto 0) => delayed_RTM_data,
92  -- delayed_RTM_data(numbitsinchan_LVDS_RTM) => delayed_RTM_clock);
93  --
96 
97  BUFR_inst : BUFR
98  generic map (
99  BUFR_DIVIDE => "BYPASS", -- Values: "BYPASS", "1", "2", "3", "4", "5", "6", "7", "8"
100  SIM_DEVICE => "VIRTEX6" -- Must be set to "VIRTEX6"
101  )
102  port map (
104  CE => '1',
105  CLR => '0',
107  );
108 
109  --- BUFG_inst: BUFG
110  --- port map (
111  --- O => delayed_cable_clock_buffered,
112  --- I => delayed_cable_clock);
113 
114  i_pll_locked <= not pll_locked;
115 
116  bitgen: for bitnum in 0 to numbits_in_cable_connector - 1 generate
117  IDDR_inst : IDDR
118  generic map (
119  DDR_CLK_EDGE => "OPPOSITE_EDGE", --"SAME_EDGE_PIPELINED", -- "OPPOSITE_EDGE", "SAME_EDGE"
120  -- or "SAME_EDGE_PIPELINED"
121  INIT_Q1 => '0', -- Initial value of Q1: '0' or '1'
122  INIT_Q2 => '0', -- Initial value of Q2: '0' or '1'
123  SRTYPE => "SYNC") -- Set/Reset type: "SYNC" or "ASYNC"
124  port map (
125  Q1 => PDATA(bitnum), -- 1-bit output for positive edge of clock
126  Q2 => NDATA(bitnum), -- 1-bit output for negative edge of clock
127  C => delayed_cable_clock_buffered, -- 1-bit clock input
128  CE => '1', -- 1-bit clock enable input
129  D => delayed_ddr_data_in(bitnum), -- 1-bit DDR data input
130  R => i_pll_locked, -- 1-bit reset
131  S => '0' -- 1-bit set
132  );
133  end generate bitgen;
134 
136  begin
137  if rising_edge(delayed_cable_clock_buffered) then
139  data( numbits_in_cable_connector-1 downto 0) <= PDATA;
141  end if;
142  end process;
143 
144  parity_P_tmp(0) <=PDATA(0) xor '1';
145  xor_gen_P: for bitnum in 1 to (numbits_in_cable_connector-1) generate
146  parity_P_tmp(bitnum) <= PDATA(bitnum) xor parity_P_tmp(bitnum-1);
147  end generate xor_gen_P;
149 
150  parity_N_tmp(0) <=NDATA(0) xor '1';
151  xor_gen_N: for bitnum in 1 to (numbits_in_cable_connector-1) generate
152  parity_N_tmp(bitnum) <= NDATA(bitnum) xor parity_N_tmp(bitnum-1);
153  end generate xor_gen_N;
155 
156 
158 
159 end Behavioral;
out datastd_logic_vector ((numbits_in_cable_connector * 2) - 1 downto 0)
std_logic_vector (numbits_in_cable_connector - 1 downto 0) NDATA
std_logic_vector (numbits_in_cable_connector - 1 downto 0) PDATA
std_logic_vector (numbits_in_cable_connector - 1 downto 0) parity_P_tmp
std_logic_vector (numbits_in_cable_connector - 1 downto 0) parity_N_tmp
in del_arraycable_del_array_type (numbits_in_cable_connector downto 0)
std_logic_vector (numbits_in_cable_connector - 1 downto 0) delayed_ddr_data_in
in ddr_data_instd_logic_vector (numbits_in_cable_connector downto 0)