2 use ieee.std_logic_1164.all;
3 use ieee.std_logic_unsigned.all;
4 use ieee.numeric_std.all;
6 use work.lx_rocon_pkg.all;
8 -- IRC bus interconnect
13 reset_i : in std_logic;
15 address_i : in std_logic_vector(4 downto 0);
16 next_ce_i : in std_logic;
17 data_i : in std_logic_vector(31 downto 0);
18 data_o : out std_logic_vector(31 downto 0);
20 bls_i : in std_logic_vector(3 downto 0);
22 irc_i : in IRC_INPUT_Array_Type(7 downto 0)
26 architecture Behavioral of bus_irc is
28 signal irc_o_s : IRC_OUTPUT_Array_Type(7 downto 0);
29 signal reset_index_event_s : std_logic_vector(7 downto 0);
30 signal reset_index_event2_s : std_logic_vector(7 downto 0);
31 signal reset_ab_error_s : std_logic_vector(7 downto 0);
32 signal state_o_s : std_logic_vector(3 downto 0);
33 signal state_o_r : std_logic_vector(3 downto 0);
35 signal irc_en_s : std_logic;
36 signal irc_bls_s : std_logic_vector(3 downto 0);
37 signal irc_addr_s : std_logic_vector(3 downto 0);
38 signal irc_data_s : std_logic_vector(31 downto 0);
39 signal irc_out_s : std_logic;
40 signal irc_out_r : std_logic;
42 signal reset_reg_s : std_logic;
43 signal reset_reg_r : std_logic;
44 signal reset_reg_wr_s : std_logic;
46 signal reset_s : std_logic;
47 signal ce_s : std_logic;
57 reset_index_event_i => reset_index_event_s(0),
58 reset_index_event2_i => reset_index_event2_s(0),
59 reset_ab_error_i => reset_ab_error_s(0),
69 reset_index_event_i => reset_index_event_s(1),
70 reset_index_event2_i => reset_index_event2_s(1),
71 reset_ab_error_i => reset_ab_error_s(1),
81 reset_index_event_i => reset_index_event_s(2),
82 reset_index_event2_i => reset_index_event2_s(2),
83 reset_ab_error_i => reset_ab_error_s(2),
93 reset_index_event_i => reset_index_event_s(3),
94 reset_index_event2_i => reset_index_event2_s(3),
95 reset_ab_error_i => reset_ab_error_s(3),
105 reset_index_event_i => reset_index_event_s(4),
106 reset_index_event2_i => reset_index_event2_s(4),
107 reset_ab_error_i => reset_ab_error_s(4),
117 reset_index_event_i => reset_index_event_s(5),
118 reset_index_event2_i => reset_index_event2_s(5),
119 reset_ab_error_i => reset_ab_error_s(5),
129 reset_index_event_i => reset_index_event_s(6),
130 reset_index_event2_i => reset_index_event2_s(6),
131 reset_ab_error_i => reset_ab_error_s(6),
141 reset_index_event_i => reset_index_event_s(7),
142 reset_index_event2_i => reset_index_event2_s(7),
143 reset_ab_error_i => reset_ab_error_s(7),
147 irc_proc : irc_proc_main
157 irc_i(0) => irc_o_s(0).count,
158 irc_i(1) => irc_o_s(1).count,
159 irc_i(2) => irc_o_s(2).count,
160 irc_i(3) => irc_o_s(3).count,
161 irc_i(4) => irc_o_s(4).count,
162 irc_i(5) => irc_o_s(5).count,
163 irc_i(6) => irc_o_s(6).count,
164 irc_i(7) => irc_o_s(7).count,
165 irc_index_reset_o => reset_index_event_s,
168 mem_en_i => irc_en_s,
169 mem_we_i => irc_bls_s,
170 mem_addr_i => irc_addr_s,
171 mem_data_i => data_i,
172 mem_data_o => irc_data_s
175 reset_s <= reset_reg_r or reset_i;
178 process(next_ce_i, ce_s, reset_reg_r, bls_i, address_i, irc_data_s, data_i, irc_o_s)
184 irc_bls_s <= (others => '0');
185 irc_addr_s <= (others => '0');
186 reset_ab_error_s <= (others => '0');
187 reset_index_event2_s <= (others => '0');
188 state_o_s <= (others => '0');
190 reset_reg_wr_s <= '0';
192 -- Incoming bus request
193 if next_ce_i = '1' then
195 -- 0 & axis & irc / index - (all read from bram) (R/W)
196 -- 1 & axis & 0 - status register (R/W)
197 -- 1 & 000 & 1 - reset
198 if address_i(4) = '0' then
200 irc_addr_s <= address_i(3 downto 0);
205 -- Maybe these would be better to latch in next_ce_i cycle,
206 -- and then just pass them
207 elsif address_i(0) = '0' then
209 state_o_s(0) <= irc_o_s(to_integer(unsigned(address_i(3 downto 1)))).state.mark;
210 state_o_s(1) <= irc_o_s(to_integer(unsigned(address_i(3 downto 1)))).state.ab_error;
211 state_o_s(2) <= irc_o_s(to_integer(unsigned(address_i(3 downto 1)))).state.index_event;
212 state_o_s(3) <= irc_o_s(to_integer(unsigned(address_i(3 downto 1)))).state.index;
214 if bls_i(0) = '1' then
215 if data_i(1) = '1' then
216 reset_ab_error_s(to_integer(unsigned(address_i(3 downto 1)))) <= '1';
218 if data_i(2) = '1' then
219 reset_index_event2_s(to_integer(unsigned(address_i(3 downto 1)))) <= '1';
222 elsif address_i = "10001" then
224 if bls_i(0) = '1' then
225 reset_reg_s <= data_i(0);
226 reset_reg_wr_s <= '1';
229 state_o_s(0) <= reset_reg_r;
230 state_o_s(3 downto 1) <= (others => '0');
239 process(ce_s, irc_data_s, irc_out_r, state_o_r)
242 data_o <= (others => '0');
246 if irc_out_r = '1' then
247 data_o <= irc_data_s;
249 data_o(3 downto 0) <= state_o_r;
258 wait until clk_i'event and clk_i= '1';
260 irc_out_r <= irc_out_s;
261 state_o_r <= state_o_s;
263 if reset_i = '1' then
265 elsif reset_reg_wr_s = '1' then
266 reset_reg_r <= reset_reg_s;