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;
14 -- Address (needs just last 4 bits, rest is wired to CE)
15 address_i : in std_logic_vector(3 downto 0);
18 data_i : in std_logic_vector(31 downto 0);
19 data_o : out std_logic_vector(31 downto 0);
22 bls_i : in std_logic_vector(3 downto 0);
25 irc1_i : in IRC_INPUT_Type;
26 irc2_i : in IRC_INPUT_Type;
27 irc3_i : in IRC_INPUT_Type;
28 irc4_i : in IRC_INPUT_Type;
29 -- Secondary data bus (slave)
30 address_2_i : in std_logic_vector(3 downto 0);
31 ce_2_i : in std_logic;
33 rd_2_i : in std_logic;
34 bls_2_i : in std_logic_vector(3 downto 0);
35 ta_2_o : out std_logic
39 architecture Behavioral of bus_irc is
41 signal irc1_s, irc2_s, irc3_s, irc4_s : IRC_OUTPUT_Type;
42 signal reset_index_event_s : std_logic_vector(3 downto 0);
43 signal reset_ab_error_s : std_logic_vector(3 downto 0);
44 signal irc_en_s : std_logic;
45 signal irc_bls_s : std_logic_vector(3 downto 0);
46 signal irc_addr_s : std_logic_vector(2 downto 0);
47 signal irc_data_s : std_logic_vector(31 downto 0);
57 reset_index_event_i => reset_index_event_s(0),
58 reset_ab_error_i => reset_ab_error_s(0),
68 reset_index_event_i => reset_index_event_s(1),
69 reset_ab_error_i => reset_ab_error_s(1),
79 reset_index_event_i => reset_index_event_s(2),
80 reset_ab_error_i => reset_ab_error_s(2),
90 reset_index_event_i => reset_index_event_s(3),
91 reset_ab_error_i => reset_ab_error_s(3),
95 irc_proc : irc_proc_main
100 irc1_i.qcount => irc1_s.qcount,
101 irc1_i.index => irc1_s.index,
102 irc1_i.index_event => irc1_s.index_event,
103 irc2_i.qcount => irc2_s.qcount,
104 irc2_i.index => irc2_s.index,
105 irc2_i.index_event => irc2_s.index_event,
106 irc3_i.qcount => irc3_s.qcount,
107 irc3_i.index => irc3_s.index,
108 irc3_i.index_event => irc3_s.index_event,
109 irc4_i.qcount => irc4_s.qcount,
110 irc4_i.index => irc4_s.index,
111 irc4_i.index_event => irc4_s.index_event,
112 irc_index_reset_o => reset_index_event_s,
113 -- BRAM access (the other port)
115 mem_en_i => irc_en_s,
116 mem_we_i => irc_bls_s,
117 mem_addr_i => irc_addr_s,
118 mem_data_i => data_i,
119 mem_data_o => irc_data_s
123 process(ce_i, ce_2_i, rd_i, rd_2_i, bls_i, bls_2_i, address_i, address_2_i, irc_data_s, irc1_s, irc2_s, irc3_s, irc4_s, data_i)
124 variable ce_v : std_logic;
125 variable rd_v : std_logic;
126 variable bls_v : std_logic_vector(3 downto 0);
127 variable address_v : std_logic_vector(3 downto 0);
131 data_o <= (others => 'X');
133 irc_bls_s <= (others => '0');
134 irc_addr_s <= (others => 'X');
135 reset_ab_error_s <= (others => '0');
138 ce_v := ce_i or ce_2_i;
143 address_v := address_i;
144 elsif ce_2_i = '1' then
147 address_v := address_2_i;
150 bls_v := (others => '0');
151 address_v := (others => '0');
157 -- 0 & axis & irc / index - (all read from bram) (R/w)
158 -- 1 & axis & 0 - status register (R/W)
159 if address_v(3) = '0' then
160 irc_addr_s <= address_i(2 downto 0);
163 data_o <= irc_data_s;
164 elsif address_v(0) = '0' then
167 case address_v(2 downto 1) is
169 data_o(0) <= irc1_s.mark;
170 data_o(1) <= irc1_s.ab_error;
172 data_o(0) <= irc2_s.mark;
173 data_o(1) <= irc2_s.ab_error;
175 data_o(0) <= irc3_s.mark;
176 data_o(1) <= irc3_s.ab_error;
178 data_o(0) <= irc4_s.mark;
179 data_o(1) <= irc4_s.ab_error;
184 data_o(31 downto 2) <= (others => '0');
186 elsif bls_v(0) = '1' and data_i(0) = '1' then
187 reset_ab_error_s(to_integer(unsigned(address_v(2 downto 1)))) <= '1';
197 if clk_i = '1' and clk_i'event then
200 if rd_i = '0' and rd_2_i = '1' then