CMX
CMX firmware code in-line documentation
 All Classes Namespaces Files Functions Variables
CMX_delay_generator.vhd
Go to the documentation of this file.
1 
8 ----------------------------------------------------------------------------------
9 library IEEE;
10 use IEEE.STD_LOGIC_1164.ALL;
11 
12 library work;
13 use work.CMXpackage.all;
14 
15 
16 -- Uncomment the following library declaration if using
17 -- arithmetic functions with Signed or Unsigned values
18 --use IEEE.NUMERIC_STD.ALL;
19 
20 -- Uncomment the following library declaration if instantiating
21 -- any Xilinx primitives in this code.
22 library UNISIM;
23 use UNISIM.VComponents.all;
24 use IEEE.MATH_REAL.ALL;
25 
26 use work.CMXpackage.all;
27 
29  generic (
30  start_address : integer); --400(d) will be used starting at the
31  --specified address
32  port (
33  clk40 : in std_logic; --system clock
34  ncs : in std_logic; --ports forwarded to the vme register instances
35  rd_nwr : in std_logic;
36  ds : in std_logic;
37  addr_vme : in std_logic_vector (15 downto 0);
38  data_vme_in : in std_logic_vector (15 downto 0);
39  data_vme_out : out std_logic_vector (15 downto 0);
40  bus_drive : out std_logic;
41  del_register : out del_register_type; -- result read from the registers;
42  upload_delays : out std_logic
43  );
44 end CMX_delay_generator;
45 
46 architecture Behavioral of CMX_delay_generator is
47 
48 
49 
50  component vme_local_switch is
51  port (
52  data_vme_up : out std_logic_vector (15 downto 0);
53  data_vme_from_below : in arr_16;
54  bus_drive_up : out std_logic;
55  bus_drive_from_below : in std_logic_vector);
56  end component vme_local_switch;
57 
58  component vme_inreg_notri_async is
59  generic (
60  ia_vme : integer;
61  width : integer);
62  port (
63  ncs : in std_logic;
64  rd_nwr : in std_logic;
65  ds : in std_logic;
66  addr_vme : in std_logic_vector (15 downto 0);
67  data_vme_in : in std_logic_vector (15 downto 0);
68  data_vme_out : out std_logic_vector (15 downto 0);
69  bus_drive : out std_logic;
70  data_from_vme : out std_logic_vector (width-1 downto 0);
71  data_to_vme : in std_logic_vector (width-1 downto 0));
72  end component vme_inreg_notri_async;
73 
74  component vme_inreg_notri is
75  generic (
76  ia_vme : integer;
77  width : integer);
78  port (
79  clk : in std_logic;
80  ncs : in std_logic;
81  rd_nwr : in std_logic;
82  ds : in std_logic;
83  addr_vme : in std_logic_vector (15 downto 0);
84  data_vme_in : in std_logic_vector (15 downto 0);
85  data_vme_out : out std_logic_vector (15 downto 0);
86  bus_drive : out std_logic;
87  data_from_vme : out std_logic_vector (width-1 downto 0);
88  data_to_vme : in std_logic_vector (width-1 downto 0);
89  read_detect : out std_logic;
90  write_detect : out std_logic);
91  end component vme_inreg_notri;
92 
93  --note no -1 on because clock line adds one signal
94  --signal write_detect : std_logic_vector(numactchan*(numbitsinchan+1) - 1 downto 0);
95  signal data_from_vme : arr_16( numactchan*(numbitsinchan+1) - 1 downto 0);
96  signal data_to_vme : arr_16( numactchan*(numbitsinchan+1) - 1 downto 0);
97 
98  signal data_vme_out_local : arr_16( numactchan*(numbitsinchan+1) - 1 downto 0);
99  signal bus_drive_local : std_logic_vector(numactchan*(numbitsinchan+1) - 1 downto 0);
100 
101 begin
102 
103 
104  vme_local_switch_inst: entity work.vme_local_switch
105  port map (
110 
111  gen_inreg_assign_chan: for ichannel in numactchan-1 downto 0 generate
112  --no -1 because the clock adds one:
113  gen_inreg_assign_sig: for ibit in numbitsinchan downto 0 generate
114 
115  --all register except for the last one are acynchroneous
116  gen_async: if ichannel /= numactchan-1 or ibit /= numbitsinchan generate
117  --ireg=ichannel*(numbitsinchan+1)+ibit --(+1 is for clock)
118 
119  vme_inreg_notri_async_inst : entity work.vme_inreg_notri_async
120  generic map (
121  ia_vme => start_address+2* (ichannel*(numbitsinchan+1)+ibit),
122  width => 16)
123  port map (
124  ncs => ncs,
125  rd_nwr => rd_nwr,
126  ds => ds,
127  addr_vme => addr_vme,
129  data_vme_out => data_vme_out_local(ichannel*(numbitsinchan+1)+ibit),
130  bus_drive => bus_drive_local(ichannel*(numbitsinchan+1)+ibit),
131  data_from_vme => data_from_vme(ichannel*(numbitsinchan+1)+ibit),
132  data_to_vme => data_to_vme(ichannel*(numbitsinchan+1)+ibit));
133 
134  --vme_inreg_async_inst: vme_inreg_async
135  -- generic map (
136  -- ia_vme => start_address+2*(ichannel*(numbitsinchan+1)+ibit),
137  -- width => 16)
138  -- port map (
139  -- ncs => ncs,
140  -- rd_nwr => rd_nwr,
141  -- ds => ds,
142  -- addr_vme => addr_vme,
143  -- data_vme => data_vme,
144  -- data_from_vme => data_from_vme(ichannel*(numbitsinchan+1)+ibit),
145  -- data_to_vme => data_to_vme(ichannel*(numbitsinchan+1)+ibit));
146 
147  end generate gen_async;
148 
149  gen_sync: if ichannel = numactchan-1 and ibit = numbitsinchan generate
150  --ireg=ichannel*(numbitsinchan+1)+ibit --(+1 is for clock)
151  vme_inreg_notri_1: entity work.vme_inreg_notri
152  generic map (
153  ia_vme => start_address+2* (ichannel*(numbitsinchan+1)+ibit),
154  width => 16)
155  port map (
156  clk => clk40,
157  ncs => ncs,
158  rd_nwr => rd_nwr,
159  ds => ds,
160  addr_vme => addr_vme,
162  data_vme_out => data_vme_out_local(ichannel*(numbitsinchan+1)+ibit),
163  bus_drive => bus_drive_local(ichannel*(numbitsinchan+1)+ibit),
164  data_from_vme => data_from_vme(ichannel*(numbitsinchan+1)+ibit),
165  data_to_vme => data_to_vme(ichannel*(numbitsinchan+1)+ibit),
166  read_detect => open,
168 
169  --vme_inreg_sync_inst: vme_inreg
170  -- generic map (
171  -- ia_vme => start_address+2*(ichannel*(numbitsinchan+1)+ibit),
172  -- width => 16)
173  -- port map (
174  -- clk => clk40,
175  -- ncs => ncs,
176  -- rd_nwr => rd_nwr,
177  -- ds => ds,
178  -- addr_vme => addr_vme,
179  -- data_vme => data_vme,
180  -- data_from_vme => data_from_vme(ichannel*(numbitsinchan+1)+ibit),
181  -- data_to_vme => data_to_vme(ichannel*(numbitsinchan+1)+ibit),
182  -- read_detect => open,
183  -- write_detect => upload_delays);
184  end generate gen_sync;
185 
186 
187 
188  del_register( ichannel, ibit ) <= data_from_vme(ichannel*(numbitsinchan+1)+ibit)(4 downto 0);
189  data_to_vme(ichannel*(numbitsinchan+1)+ibit)<=data_from_vme(ichannel*(numbitsinchan+1)+ibit);
190 
191  end generate gen_inreg_assign_sig;
192  end generate gen_inreg_assign_chan;
193 
194  --upload_delays<=write_detect(write_detect'high);
195 
196 end Behavioral;
197 
out data_vme_outstd_logic_vector (15 downto 0)
out read_detectstd_logic
in addr_vmestd_logic_vector (15 downto 0)
out data_vme_outstd_logic_vector (15 downto 0)
in addr_vmestd_logic_vector (15 downto 0)
out data_from_vmestd_logic_vector (width - 1 downto 0)
out del_registerdel_register_type
in data_vme_from_belowarr_16
--! inputs from local registers and from
out data_from_vmestd_logic_vector (width - 1 downto 0)
in data_vme_instd_logic_vector (15 downto 0)
in data_vme_instd_logic_vector (15 downto 0)
out write_detectstd_logic
std_logic_vector (numactchan * (numbitsinchan + 1) - 1 downto 0) bus_drive_local)
in data_to_vmestd_logic_vector (width - 1 downto 0)
out data_vme_upstd_logic_vector (15 downto 0)
--! connect this to
arr_16 (numactchan * (numbitsinchan + 1) - 1 downto 0) data_from_vme)
arr_16 (numactchan * (numbitsinchan + 1) - 1 downto 0) data_vme_out_local)
out bus_drive_upstd_logic
or of all bus drive requests from below
_library_ IEEEIEEE
arr_16 (numactchan * (numbitsinchan + 1) - 1 downto 0) data_to_vme)
in addr_vmestd_logic_vector (15 downto 0)
in data_to_vmestd_logic_vector (width - 1 downto 0)
out data_vme_outstd_logic_vector (15 downto 0)
out bus_drivestd_logic
in data_vme_instd_logic_vector (15 downto 0)
_library_ UNISIMUNISIM
in bus_drive_from_belowstd_logic_vector