| 1 |
2 |
federico.a |
|
| 2 |
|
|
--*******************************************************************
|
| 3 |
|
|
--** ****
|
| 4 |
|
|
--** AHB system generator ****
|
| 5 |
|
|
--** ****
|
| 6 |
|
|
--** Author: Federico Aglietti ****
|
| 7 |
|
|
--** federico.aglietti\@opencores.org ****
|
| 8 |
|
|
--** ****
|
| 9 |
|
|
--*******************************************************************
|
| 10 |
|
|
--** ****
|
| 11 |
|
|
--** Copyright (C) 2004 Federico Aglietti ****
|
| 12 |
|
|
--** federico.aglietti\@opencores.org ****
|
| 13 |
|
|
--** ****
|
| 14 |
|
|
--** This source file may be used and distributed without ****
|
| 15 |
|
|
--** restriction provided that this copyright statement is not ****
|
| 16 |
|
|
--** removed from the file and that any derivative work contains ****
|
| 17 |
|
|
--** the original copyright notice and the associated disclaimer.****
|
| 18 |
|
|
--** ****
|
| 19 |
|
|
--** THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY ****
|
| 20 |
|
|
--** EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ****
|
| 21 |
|
|
--** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ****
|
| 22 |
|
|
--** FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR ****
|
| 23 |
|
|
--** OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ****
|
| 24 |
|
|
--** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ****
|
| 25 |
|
|
--** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE ****
|
| 26 |
|
|
--** GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ****
|
| 27 |
|
|
--** BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ****
|
| 28 |
|
|
--** LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ****
|
| 29 |
|
|
--** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ****
|
| 30 |
|
|
--** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ****
|
| 31 |
|
|
--** POSSIBILITY OF SUCH DAMAGE. ****
|
| 32 |
|
|
--** ****
|
| 33 |
|
|
--*******************************************************************
|
| 34 |
|
|
library ieee;
|
| 35 |
|
|
use ieee.std_logic_1164.all;
|
| 36 |
|
|
use ieee.std_logic_arith.all;
|
| 37 |
|
|
use ieee.std_logic_unsigned.all;
|
| 38 |
|
|
|
| 39 |
|
|
use work.ahb_funct.all;
|
| 40 |
|
|
use work.ahb_package.all;
|
| 41 |
|
|
use work.ahb_configure.all;
|
| 42 |
|
|
--use work.ahb_matrix.all;
|
| 43 |
|
|
|
| 44 |
|
|
entity ahb_arbiter is
|
| 45 |
|
|
generic(
|
| 46 |
|
|
num_arb: in integer:= 2;
|
| 47 |
|
|
num_arb_msts: in integer range 1 to 15:= 4;
|
| 48 |
|
|
def_arb_mst: in integer range 0 to 15:= 2;
|
| 49 |
|
|
num_slvs: in integer range 1 to 15:= 3;
|
| 50 |
|
|
alg_number: in integer range 0 to 5:= 2);
|
| 51 |
|
|
port(
|
| 52 |
|
|
hresetn: in std_logic;
|
| 53 |
|
|
hclk: in std_logic;
|
| 54 |
|
|
remap: in std_logic;
|
| 55 |
|
|
mst_in_v: in mst_out_v_t(num_arb_msts-1 downto 0);
|
| 56 |
|
|
mst_out_v: out mst_in_v_t(num_arb_msts-1 downto 0);
|
| 57 |
|
|
slv_out_v: out slv_in_v_t(num_slvs-1 downto 0);
|
| 58 |
|
|
slv_in_v: in slv_out_v_t(num_slvs-1 downto 0));
|
| 59 |
|
|
end;
|
| 60 |
|
|
|
| 61 |
|
|
|
| 62 |
|
|
architecture rtl of ahb_arbiter is
|
| 63 |
|
|
|
| 64 |
|
|
--*******************************************************************
|
| 65 |
|
|
--******************** SIGNAL DECLARATION ***************************
|
| 66 |
|
|
--*******************************************************************
|
| 67 |
|
|
|
| 68 |
|
|
signal s_grant_master, grant_master: integer range 0 to 15;
|
| 69 |
|
|
signal s_master_sel, master_sel: std_logic_vector(3 downto 0);
|
| 70 |
|
|
signal s_r_master_sel, r_master_sel: std_logic_vector(3 downto 0);
|
| 71 |
|
|
signal r_master_busy: std_logic_vector(1 downto 0);
|
| 72 |
|
|
|
| 73 |
|
|
signal turn, s_turn: integer range 0 to num_arb_msts-1;
|
| 74 |
|
|
signal random: integer range 0 to 2**(nb_bits(num_arb_msts));
|
| 75 |
|
|
signal seed, s_seed: std_logic_vector(9 downto 0);
|
| 76 |
|
|
|
| 77 |
|
|
type vecran is array (2**(nb_bits(num_arb_msts)) downto 0) of integer;
|
| 78 |
|
|
signal vect_ran: vecran;
|
| 79 |
|
|
signal vect_ran_round: vecran;
|
| 80 |
|
|
|
| 81 |
|
|
|
| 82 |
|
|
signal haddr_page: std_logic_vector(31 downto 0);
|
| 83 |
|
|
signal htrans_reg: std_logic_vector(1 downto 0);--"00"|"01"|"10"
|
| 84 |
|
|
signal hsel: std_logic_vector(num_slvs-1 downto 0);
|
| 85 |
|
|
|
| 86 |
|
|
|
| 87 |
|
|
signal s_dec_hready: std_logic;
|
| 88 |
|
|
signal req_ored: std_logic;
|
| 89 |
|
|
signal hbusreq_msk: std_logic_vector(num_arb_msts-1 downto 0);
|
| 90 |
|
|
|
| 91 |
|
|
signal split_reg: std_logic_vector(num_arb_msts-1 downto 0);
|
| 92 |
|
|
|
| 93 |
|
|
signal r_slv_in_v: slv_in_v_t(num_slvs-1 downto 0);
|
| 94 |
|
|
signal mst_in_sel: slv_in_t;
|
| 95 |
|
|
signal slv_in_sel: mst_in_t;
|
| 96 |
|
|
|
| 97 |
|
|
--DEAFULT SLAVE BEHAVIOUR
|
| 98 |
|
|
|
| 99 |
|
|
signal r_def_slave_hsel, def_slave_hsel: std_logic;
|
| 100 |
|
|
signal def_slave_hready: std_logic;
|
| 101 |
|
|
|
| 102 |
|
|
signal addr_arb_matrix: addr_matrix_t(0 downto 0);
|
| 103 |
|
|
|
| 104 |
|
|
--*******************************************************************
|
| 105 |
|
|
--***************** END OF SIGNAL DECLARATION ************************
|
| 106 |
|
|
--*******************************************************************
|
| 107 |
|
|
|
| 108 |
|
|
begin
|
| 109 |
|
|
|
| 110 |
|
|
addr_arb_matrix(0)(num_slvs-1 downto 0) <= arb_matrix(num_arb)(num_slvs-1 downto 0) when (remap='0') else rarb_matrix(num_arb)(num_slvs-1 downto 0);
|
| 111 |
|
|
|
| 112 |
|
|
req_ored_pr:process(hbusreq_msk)
|
| 113 |
|
|
variable v_req_ored: std_logic;
|
| 114 |
|
|
begin
|
| 115 |
|
|
v_req_ored := '0';
|
| 116 |
|
|
for i in 0 to num_arb_msts-1 loop
|
| 117 |
|
|
v_req_ored := v_req_ored or hbusreq_msk(i);
|
| 118 |
|
|
end loop;
|
| 119 |
|
|
req_ored <= v_req_ored;
|
| 120 |
|
|
end process;
|
| 121 |
|
|
|
| 122 |
|
|
bus_req_mask_pr:process(split_reg, grant_master, mst_in_v)
|
| 123 |
|
|
begin
|
| 124 |
|
|
for i in 0 to num_arb_msts-1 loop
|
| 125 |
|
|
if (mst_in_v(i).htrans=busy or split_reg(i)='1' or (grant_master/=num_arb_msts and grant_master/=i and mst_in_v(grant_master).hlock='1')) then
|
| 126 |
|
|
hbusreq_msk(i) <= '0';
|
| 127 |
|
|
else
|
| 128 |
|
|
hbusreq_msk(i) <= mst_in_v(i).hbusreq;
|
| 129 |
|
|
end if;
|
| 130 |
|
|
end loop;
|
| 131 |
|
|
end process;
|
| 132 |
|
|
|
| 133 |
|
|
|
| 134 |
|
|
--********************************************************
|
| 135 |
|
|
-- synchronization processes (flip flops)
|
| 136 |
|
|
--********************************************************
|
| 137 |
|
|
s_master_sel <= conv_std_logic_vector(s_grant_master, 4) when (s_dec_hready='1') else master_sel;
|
| 138 |
|
|
s_r_master_sel <= master_sel when (s_dec_hready='1' and htrans_reg/=busy) else r_master_sel;
|
| 139 |
|
|
|
| 140 |
|
|
master_pr:process(hresetn, hclk)
|
| 141 |
|
|
begin
|
| 142 |
|
|
if hresetn='0' then
|
| 143 |
|
|
grant_master <= def_arb_mst;
|
| 144 |
|
|
master_sel <= conv_std_logic_vector(def_arb_mst, 4);
|
| 145 |
|
|
r_master_sel <= conv_std_logic_vector(def_arb_mst, 4);
|
| 146 |
|
|
turn <= 0;
|
| 147 |
|
|
htrans_reg <= idle;
|
| 148 |
|
|
elsif hclk'event and hclk='1' then
|
| 149 |
|
|
grant_master <= s_grant_master after 1 ns;
|
| 150 |
|
|
master_sel <= s_master_sel after 1 ns;
|
| 151 |
|
|
r_master_sel <= s_r_master_sel after 1 ns;
|
| 152 |
|
|
turn <= s_turn after 1 ns;
|
| 153 |
|
|
if conv_integer(master_sel) /= num_arb_msts then
|
| 154 |
|
|
htrans_reg <= mst_in_sel.htrans after 1 ns;
|
| 155 |
|
|
else
|
| 156 |
|
|
htrans_reg <= idle;
|
| 157 |
|
|
end if;
|
| 158 |
|
|
end if;
|
| 159 |
|
|
end process;
|
| 160 |
|
|
|
| 161 |
|
|
update_pr:process(
|
| 162 |
|
|
req_ored,
|
| 163 |
|
|
hbusreq_msk,
|
| 164 |
|
|
grant_master,
|
| 165 |
|
|
mst_in_v,
|
| 166 |
|
|
htrans_reg,
|
| 167 |
|
|
mst_in_sel,
|
| 168 |
|
|
slv_in_sel,
|
| 169 |
|
|
split_reg,
|
| 170 |
|
|
turn,
|
| 171 |
|
|
random)
|
| 172 |
|
|
variable t_turn, t_grant_master: integer;
|
| 173 |
|
|
begin
|
| 174 |
|
|
t_turn := turn;
|
| 175 |
|
|
t_grant_master := grant_master;
|
| 176 |
|
|
--nohready=> grant no change
|
| 177 |
|
|
--hready&busy(real master)=> grant no change
|
| 178 |
|
|
--hready&nobusy&req => arbitration
|
| 179 |
|
|
--hready&nobusy&noreq&default master not splitted => default master
|
| 180 |
|
|
--hready&nobusy&noreq&default master splitted => dummy master
|
| 181 |
|
|
if (slv_in_sel.hready='1') then
|
| 182 |
|
|
if ((grant_master/=num_arb_msts and mst_in_v(grant_master).htrans/=busy and htrans_reg/=busy) or (grant_master=num_arb_msts)) then
|
| 183 |
|
|
if (req_ored='1') then
|
| 184 |
|
|
case alg_number is
|
| 185 |
|
|
when 0 => --fixed
|
| 186 |
|
|
fixed_priority(t_turn, t_grant_master, hbusreq_msk, turn);
|
| 187 |
|
|
when 1 => --round robin
|
| 188 |
|
|
round_robin(def_arb_mst, t_turn, t_grant_master, hbusreq_msk, turn);
|
| 189 |
|
|
when 2 => --random
|
| 190 |
|
|
random_priority(def_arb_mst, t_turn, t_grant_master, random, hbusreq_msk, turn);
|
| 191 |
|
|
when 3 => --fair1
|
| 192 |
|
|
if (grant_master/=num_arb_msts and hbusreq_msk(grant_master)='0') or (grant_master=num_arb_msts) then
|
| 193 |
|
|
fixed_priority(t_turn, t_grant_master, hbusreq_msk, turn);
|
| 194 |
|
|
end if;
|
| 195 |
|
|
when 4 => --fair2
|
| 196 |
|
|
if (grant_master/=num_arb_msts and hbusreq_msk(grant_master)='0') or (grant_master=num_arb_msts) then
|
| 197 |
|
|
round_robin(def_arb_mst, t_turn, t_grant_master, hbusreq_msk, turn);
|
| 198 |
|
|
end if;
|
| 199 |
|
|
when 5 => --fair3
|
| 200 |
|
|
if (grant_master/=num_arb_msts and hbusreq_msk(grant_master)='0') or (grant_master=num_arb_msts) then
|
| 201 |
|
|
random_priority(def_arb_mst, t_turn, t_grant_master, random, hbusreq_msk, turn);
|
| 202 |
|
|
end if;
|
| 203 |
|
|
when others => --NOT IMPLEMENTED
|
| 204 |
|
|
assert FALSE report "### NOT IMPLEMENTED!" severity FAILURE;
|
| 205 |
|
|
end case;
|
| 206 |
|
|
elsif (split_reg(def_arb_mst)='0') then--ready+no_busy+no_req=> default if not splitted!!
|
| 207 |
|
|
t_grant_master := def_arb_mst;
|
| 208 |
|
|
t_turn := def_arb_mst;
|
| 209 |
|
|
else--ready+no_busy+no_req+def_master splitted => dummy_master!!
|
| 210 |
|
|
t_grant_master := num_arb_msts;
|
| 211 |
|
|
end if;
|
| 212 |
|
|
--else (busy) then SAME MASTER
|
| 213 |
|
|
end if;
|
| 214 |
|
|
--else (no_ready) then SAME MASTER
|
| 215 |
|
|
end if;
|
| 216 |
|
|
s_grant_master <= t_grant_master;
|
| 217 |
|
|
s_turn <= t_turn;
|
| 218 |
|
|
end process;
|
| 219 |
|
|
|
| 220 |
|
|
s_seed_pr:process(seed)
|
| 221 |
|
|
begin
|
| 222 |
|
|
for i in 9 downto 1 loop
|
| 223 |
|
|
s_seed(i) <= seed(i-1);
|
| 224 |
|
|
end loop;
|
| 225 |
|
|
s_seed(0) <= not(seed(9) xor seed(6));
|
| 226 |
|
|
end process;
|
| 227 |
|
|
|
| 228 |
|
|
seed_pr:process(hresetn, hclk)
|
| 229 |
|
|
variable v_random: integer range 0 to 2**(nb_bits(num_arb_msts));
|
| 230 |
|
|
begin
|
| 231 |
|
|
if hresetn='0' then
|
| 232 |
|
|
seed <= (others => '0');--"1101010001";
|
| 233 |
|
|
random <= 0;
|
| 234 |
|
|
--synopsys translate_off
|
| 235 |
|
|
for i in 0 to 2**(nb_bits(num_arb_msts)) loop
|
| 236 |
|
|
vect_ran(i) <= 0;
|
| 237 |
|
|
vect_ran_round(i) <= 0;
|
| 238 |
|
|
end loop;
|
| 239 |
|
|
--synopsys translate_on
|
| 240 |
|
|
elsif hclk'event and hclk='1' then
|
| 241 |
|
|
seed <= s_seed after 1 ns;
|
| 242 |
|
|
v_random := conv_integer(seed(nb_bits(num_arb_msts)+3 downto 4));
|
| 243 |
|
|
if v_random < num_arb_msts then
|
| 244 |
|
|
random <= v_random after 1 ns;
|
| 245 |
|
|
else
|
| 246 |
|
|
random <= turn after 1 ns;--(v_random - num_arb_msts);
|
| 247 |
|
|
end if;
|
| 248 |
|
|
--synopsys translate_off
|
| 249 |
|
|
vect_ran(v_random) <= vect_ran(v_random) + 1;
|
| 250 |
|
|
vect_ran_round(random) <= vect_ran_round(random) + 1;
|
| 251 |
|
|
--synopsys translate_on
|
| 252 |
|
|
end if;
|
| 253 |
|
|
end process;
|
| 254 |
|
|
|
| 255 |
|
|
|
| 256 |
|
|
|
| 257 |
|
|
--synopsys translate_off
|
| 258 |
|
|
assert not (hclk'event and hclk='1' and master_sel=num_arb_msts) report "DUMMY MASTER selection!!!" severity WARNING;
|
| 259 |
|
|
assert not (hclk'event and hclk='1' and master_sel=def_arb_mst) report "DEFAULT MASTER selection!!!" severity WARNING;
|
| 260 |
|
|
assert not (hclk'event and hclk='1' and (master_sel>num_arb_msts or r_master_sel>num_arb_msts)) report "####ERROR in MASTER selection!!!" severity FAILURE;
|
| 261 |
|
|
--synopsys translate_on
|
| 262 |
|
|
|
| 263 |
|
|
|
| 264 |
|
|
--*********************************************************
|
| 265 |
|
|
-- MASTER MUXES
|
| 266 |
|
|
--*********************************************************
|
| 267 |
|
|
|
| 268 |
|
|
add_pr:process(master_sel, r_master_sel, mst_in_v)
|
| 269 |
|
|
variable def_addr: std_logic_vector(31 downto 0);
|
| 270 |
|
|
begin
|
| 271 |
|
|
|
| 272 |
|
|
haddr_page(31 downto 10) <= mst_in_v(def_arb_mst).haddr(31 downto 10);
|
| 273 |
|
|
|
| 274 |
|
|
mst_in_sel.hwdata <= mst_in_v(def_arb_mst).hwdata;
|
| 275 |
|
|
mst_in_sel.haddr <= mst_in_v(def_arb_mst).haddr;
|
| 276 |
|
|
mst_in_sel.hwrite <= mst_in_v(def_arb_mst).hwrite;
|
| 277 |
|
|
mst_in_sel.hsize <= mst_in_v(def_arb_mst).hsize;
|
| 278 |
|
|
mst_in_sel.hburst <= mst_in_v(def_arb_mst).hburst;
|
| 279 |
|
|
mst_in_sel.hprot <= mst_in_v(def_arb_mst).hprot;
|
| 280 |
|
|
mst_in_sel.htrans <= mst_in_v(def_arb_mst).htrans;
|
| 281 |
|
|
for i in 0 to num_arb_msts-1 loop
|
| 282 |
|
|
if i=conv_integer(r_master_sel) then
|
| 283 |
|
|
mst_in_sel.hwdata <= mst_in_v(i).hwdata;
|
| 284 |
|
|
end if;
|
| 285 |
|
|
if i=conv_integer(master_sel) then
|
| 286 |
|
|
haddr_page(31 downto 10) <= mst_in_v(i).haddr(31 downto 10);
|
| 287 |
|
|
mst_in_sel.haddr <= mst_in_v(i).haddr;
|
| 288 |
|
|
mst_in_sel.hwrite <= mst_in_v(i).hwrite;
|
| 289 |
|
|
mst_in_sel.hsize <= mst_in_v(i).hsize;
|
| 290 |
|
|
mst_in_sel.hburst <= mst_in_v(i).hburst;
|
| 291 |
|
|
mst_in_sel.hprot <= mst_in_v(i).hprot;
|
| 292 |
|
|
mst_in_sel.htrans <= mst_in_v(i).htrans;
|
| 293 |
|
|
end if;
|
| 294 |
|
|
end loop;
|
| 295 |
|
|
if master_sel=num_arb_msts then
|
| 296 |
|
|
mst_in_sel.htrans <= idle;
|
| 297 |
|
|
end if;
|
| 298 |
|
|
end process;
|
| 299 |
|
|
|
| 300 |
|
|
process(slv_in_sel, s_grant_master)--N.B.: Request=>Grant comb. path!
|
| 301 |
|
|
begin
|
| 302 |
|
|
for i in 0 to num_arb_msts-1 loop
|
| 303 |
|
|
mst_out_v(i).hready <= slv_in_sel.hready;
|
| 304 |
|
|
mst_out_v(i).hresp <= slv_in_sel.hresp;
|
| 305 |
|
|
mst_out_v(i).hrdata <= slv_in_sel.hrdata;
|
| 306 |
|
|
if (s_grant_master=i) then
|
| 307 |
|
|
mst_out_v(i).hgrant <= '1';
|
| 308 |
|
|
else
|
| 309 |
|
|
mst_out_v(i).hgrant <= '0';
|
| 310 |
|
|
end if;
|
| 311 |
|
|
end loop;
|
| 312 |
|
|
end process;
|
| 313 |
|
|
|
| 314 |
|
|
--*********************************************************
|
| 315 |
|
|
-- SLAVE MUXES
|
| 316 |
|
|
--*********************************************************
|
| 317 |
|
|
|
| 318 |
|
|
process(hresetn, hclk)
|
| 319 |
|
|
variable v_hready: std_logic;
|
| 320 |
|
|
begin
|
| 321 |
|
|
if hresetn='0' then
|
| 322 |
|
|
for i in num_slvs-1 downto 0 loop
|
| 323 |
|
|
r_slv_in_v(i).hsel <= '0';
|
| 324 |
|
|
end loop;
|
| 325 |
|
|
elsif hclk='1' and hclk'event then
|
| 326 |
|
|
if s_dec_hready='1' then
|
| 327 |
|
|
r_def_slave_hsel <= def_slave_hsel;
|
| 328 |
|
|
for i in num_slvs-1 downto 0 loop
|
| 329 |
|
|
r_slv_in_v(i).hsel <= hsel(i) after 1 ns;
|
| 330 |
|
|
end loop;
|
| 331 |
|
|
end if;
|
| 332 |
|
|
end if;
|
| 333 |
|
|
end process;
|
| 334 |
|
|
|
| 335 |
|
|
process(r_slv_in_v, slv_in_v, def_slave_hready)
|
| 336 |
|
|
begin
|
| 337 |
|
|
s_dec_hready <= def_slave_hready;
|
| 338 |
|
|
for i in num_slvs-1 downto 0 loop
|
| 339 |
|
|
if(r_slv_in_v(i).hsel='1') then
|
| 340 |
|
|
s_dec_hready <= slv_in_v(i).hready;
|
| 341 |
|
|
end if;
|
| 342 |
|
|
end loop;
|
| 343 |
|
|
-- hready_t <= slv_in_v(num_slvs).hready;--ready ....
|
| 344 |
|
|
slv_in_sel.hready <= def_slave_hready;
|
| 345 |
|
|
slv_in_sel.hrdata <= (others => '-');--for LOW POWER!!!
|
| 346 |
|
|
slv_in_sel.hresp <= error_resp;--.... and ERROR ....
|
| 347 |
|
|
for i in num_slvs-1 downto 0 loop
|
| 348 |
|
|
if r_slv_in_v(i).hsel='1' then
|
| 349 |
|
|
-- hready_t <= slv_in_v(i).hready;
|
| 350 |
|
|
slv_in_sel.hready <= slv_in_v(i).hready;
|
| 351 |
|
|
slv_in_sel.hresp <= slv_in_v(i).hresp;
|
| 352 |
|
|
slv_in_sel.hrdata <= slv_in_v(i).hrdata;
|
| 353 |
|
|
end if;
|
| 354 |
|
|
end loop;
|
| 355 |
|
|
end process;
|
| 356 |
|
|
|
| 357 |
|
|
|
| 358 |
|
|
--*********************************************************
|
| 359 |
|
|
-- SPLIT handling
|
| 360 |
|
|
--*********************************************************
|
| 361 |
|
|
|
| 362 |
|
|
process(hresetn, hclk)
|
| 363 |
|
|
variable v_split_reg: std_logic_vector(num_arb_msts-1 downto 0);
|
| 364 |
|
|
begin
|
| 365 |
|
|
if hresetn='0' then
|
| 366 |
|
|
split_reg <= (others => '0');
|
| 367 |
|
|
elsif hclk'event and hclk='1' then
|
| 368 |
|
|
v_split_reg := split_reg;
|
| 369 |
|
|
for j in num_slvs-1 downto 0 loop
|
| 370 |
|
|
for i in num_arb_msts-1 downto 0 loop
|
| 371 |
|
|
v_split_reg(i) := v_split_reg(i) and not slv_in_v(j).hsplit(i);
|
| 372 |
|
|
end loop;
|
| 373 |
|
|
if (r_slv_in_v(j).hsel='1') then
|
| 374 |
|
|
if (slv_in_v(j).hready='1' and slv_in_v(j).hresp=split_resp and master_sel/=num_arb_msts) then
|
| 375 |
|
|
v_split_reg(conv_integer(master_sel)) := '1';
|
| 376 |
|
|
end if;
|
| 377 |
|
|
end if;
|
| 378 |
|
|
end loop;
|
| 379 |
|
|
split_reg <= v_split_reg after 1 ns;
|
| 380 |
|
|
end if;
|
| 381 |
|
|
end process;
|
| 382 |
|
|
|
| 383 |
|
|
--*********************************************************
|
| 384 |
|
|
-- AHB DECODER
|
| 385 |
|
|
--*********************************************************
|
| 386 |
|
|
-- min 1KB of address space for each slave:
|
| 387 |
|
|
process(haddr_page, master_sel, mst_in_v, mst_in_sel, s_dec_hready, addr_arb_matrix)
|
| 388 |
|
|
variable addr_low_std : std_logic_vector(31 downto 0);
|
| 389 |
|
|
variable addr_high_std : std_logic_vector(31 downto 0);
|
| 390 |
|
|
variable v_hmastlock: std_logic;
|
| 391 |
|
|
begin
|
| 392 |
|
|
v_hmastlock := '0';
|
| 393 |
|
|
for i in num_arb_msts-1 downto 0 loop
|
| 394 |
|
|
if (v_hmastlock='0' and master_sel=conv_std_logic_Vector(i,4) and mst_in_v(i).hlock='1') then
|
| 395 |
|
|
v_hmastlock := '1';
|
| 396 |
|
|
end if;
|
| 397 |
|
|
end loop;
|
| 398 |
|
|
def_slave_hsel <= '1'; --default slave selected
|
| 399 |
|
|
for i in num_slvs-1 downto 0 loop
|
| 400 |
|
|
slv_out_v(i).hmastlock <= v_hmastlock;
|
| 401 |
|
|
slv_out_v(i).haddr <= mst_in_sel.haddr;
|
| 402 |
|
|
slv_out_v(i).hmaster <= master_sel;
|
| 403 |
|
|
slv_out_v(i).hready <= s_dec_hready;
|
| 404 |
|
|
slv_out_v(i).hwrite <= mst_in_sel.hwrite;
|
| 405 |
|
|
slv_out_v(i).hwdata <= mst_in_sel.hwdata;
|
| 406 |
|
|
slv_out_v(i).hsize <= mst_in_sel.hsize;
|
| 407 |
|
|
slv_out_v(i).hburst <= mst_in_sel.hburst;
|
| 408 |
|
|
slv_out_v(i).hprot <= mst_in_sel.hprot;
|
| 409 |
|
|
slv_out_v(i).htrans <= mst_in_sel.htrans;
|
| 410 |
|
|
addr_low_std := conv_std_logic_vector(addr_arb_matrix(0)(i).low, 32);
|
| 411 |
|
|
addr_high_std := conv_std_logic_vector(addr_arb_matrix(0)(i).high, 32);
|
| 412 |
|
|
if (haddr_page(31 downto 10) >= addr_low_std(31 downto 10) and (haddr_page(31 downto 10) <= addr_high_std(31 downto 10))) then
|
| 413 |
|
|
hsel(i) <= '1';
|
| 414 |
|
|
def_slave_hsel <= '0';
|
| 415 |
|
|
slv_out_v(i).hsel <= '1';
|
| 416 |
|
|
else
|
| 417 |
|
|
hsel(i) <= '0';
|
| 418 |
|
|
slv_out_v(i).hsel <= '0';
|
| 419 |
|
|
end if;
|
| 420 |
|
|
end loop;
|
| 421 |
|
|
end process;
|
| 422 |
|
|
|
| 423 |
|
|
|
| 424 |
|
|
--DEFAULT SLAVE BEHAVIOUR
|
| 425 |
|
|
|
| 426 |
|
|
process(hresetn, hclk)
|
| 427 |
|
|
begin
|
| 428 |
|
|
if hresetn='0' then
|
| 429 |
|
|
def_slave_hready <= '1';
|
| 430 |
|
|
elsif hclk'event and hclk='1' then
|
| 431 |
|
|
if (def_slave_hsel='1' and s_dec_hready='1' and mst_in_sel.htrans/=idle) then
|
| 432 |
|
|
def_slave_hready <= '0' after 1 ns;
|
| 433 |
|
|
else
|
| 434 |
|
|
def_slave_hready <= '1' after 1 ns;
|
| 435 |
|
|
end if;
|
| 436 |
|
|
end if;
|
| 437 |
|
|
end process;
|
| 438 |
|
|
|
| 439 |
|
|
|
| 440 |
|
|
|
| 441 |
|
|
--synopsys translate_off
|
| 442 |
|
|
assert not(hclk'event and hclk='1' and r_def_slave_hsel='1') report "####ERROR: NO SLAVE SELECTED!!!" severity error;
|
| 443 |
|
|
--synopsys translate_on
|
| 444 |
|
|
|
| 445 |
|
|
end rtl;
|
| 446 |
|
|
|
| 447 |
|
|
|