array view <composite_view_identifier> of <composite_subtype_name> is generic( <generic_name> : <generic_subtype_name> ); element( <element_name> : view <composite_subtype_view_name>; <element_name> : in <element_subtype_name>; <element_name> : out <element_subtype_name> ); end array view <composite_view_identifier>;
package cpu_bus_pkg generic( masters_max_jg : positive; slaves_max_jg : positive; awidth_jg : positive; dwidth_jg : positive ); is subtype masters_total_jrt is natural range masters_max_jg - 1 downto 0; constant slaves_total_jc : positive := slaves_max_jg -- individual slaves + masters_max_jg -- master's slave return + 1; -- arbiter's slave return subtype slaves_total_jrt is natural range slaves_total_jc - 1 downto 0; subtype addr_jrt is natural range awidth_jg - 1 downto 0; subtype data_jrt is natural range dwidth_jg - 1 downto 0; subtype master_ctrl_vst is std_logic_vector(masters_total_jrt); subtype slave_ctrl_vst is std_logic_vector(slaves_total_jrt); subtype addr_vst is std_logic_vector(addr_jrt); subtype data_vst is std_logic_vector(data_jrt);
type master_r is -- Master record record addr_vl : addr_vst; -- Address bus to slave devices data_vl : data_vst; -- Data bus from master to slave we_l : std_logic; -- Write enable from master to slave en_vl : slave_ctrl_vst; -- Slave enables from master to slave end record master_r;
type slave_r is -- Slave record record data_vl : data_vst; -- Data bus from slave to master ack_l : std_logic; -- Acknowledge to master from slave err_l : std_logic; -- Error report to master from slave end record slave_r; type slave_a is array(slaves_total_jrt) of slave_r; -- Array of slave return records
type arbiter_r is -- Arbiter record and array record master_rl : master_r; -- Master record to the arbiter bus_req_l : std_logic; -- Bus request from master bus_grnt_l : std_logic; -- Bus grants to master end record arbiter_r; type arbiter_a is arraymasters_total_jrt) of arbiter_r; -- Array of arbiter records
type cpu_bus_r is -- Bus interface record record arbiter_al : arbiter_a; -- Arbiter array of arbiter master control records master_rl : master_r; -- Master record to slaves slave_al : slave_a; -- Array of slave records to master end record cpu_bus_r;
array view s_slave_avw of slave_a is generic( slave_id_jg : slaves_total_jrt ); element( slave_id_jg : buffer slave_r; others : null slave_r ); end array view s_slave_avw;
record view slave_rvw of cpu_bus_r is generic( slave_id_jg : slaves_total_jrt ); element( arbiter_al : null arbiter_a; master_rl : in master_r; slave_al : view slave_a( s_slave_avw( generic map( slave_id_jg => slave_id_jg ) ) ) ); end record view slave_rvw;
record view m_arbiter_rvw of arbiter_r is element( master_rl : buffer master_r; bus_req_l : buffer std_logic; bus_grnt_l : in std_logic ); end record view m_arbiter_rvw;
array view m_arbiter_avw of arbiter_a is generic( master_id_jg : positive ); element( master_id_jg : view arbiter_r(m_arbiter_rvw) ; others : null arbiter_r ); end array view m_arbiter_rvw;
array view m_slave_avw of slave_a is generic( slave_id_jg : slaves_total_jrt ); element( slave_id_jg : buffer slave_r; others : in slave_r ); end array view m_slave_rvw;
record view master_rvw of cpu_bus_r is generic( slave_id_jg : slaves_total_jrt; master_id_jg : masters_total_jrt ); element( arbiter_al : view arbiter_r( m_arbiter_avw( generic map( master_id_jg => master_id_jg ) ) ); master_rl : in master_r; slave_al : view slave_a( m_slave_avw( generic map( slave_id_jg => slave_id_jg ) ) ) ); end record view master_rvw;
record view a_arbiter_rvw of arbiter_r is element( master_rl : in master_r; bus_req_l : in std_logic; bus_grnt_l : buffer std_logic ); end record view a_arbiter_rvw;
array view a_arbiter_avw of arbiter_a is element( others : view arbiter_r(a_arbiter_rvw) ); end array view a_arbiter_rvw;
record view arbiter_rvw of cpu_bus_r is generic( slave_id_jg : slaves_total_jrt ); element( arbiter_al : view arbiter_r(a_arbiter_rvw); master_rl : buffer master_r; slave_al : view slave_a( s_slave_avw( generic map( slave_id_jg => slave_id_jg ) ) ) ); end record view arbiter_grnt_rvw;
package cpu_bus_2m8s_pkg is new cpu_bus_pkg generic map( masters_max_jg => 2, slaves_max_jg => 8, awidth_jg => 12, dwidth_jg => 16 );
use work.cpu_bus_2m8s_pkg.all entity slave_ent is generic ( slave_id_jg : slaves_total_jrt ); port( rst_i : in std_logic clk_i : in std_logic; cpu_bus_rif : view slave_r( slave_rvw( generic map( slave_id_jg => slave_id_jg ) ) ) ); end entity slave_ent; architecture rtl_arch of slave_ent is signal addr_vs : cpu_bus_2m8s_pkg.addr_vst; signal data_in_vs : cpu_bus_2m8s_pkg.data_vst; signal we_s : std_logic; signal en_s : std_logic; signal data_out_vs : cpu_bus_2m8s_pkg.data_vst; signal ack_s : std_logic; signal err_s : std_logic; begin
addr_vs <= cpu_bus_rif.master_rl.addr_vl; data_in_vs <= cpu_bus_rif.master_rl.data_vl; we_s <= cpu_bus_rif.master_rl.we_l; en_s <= cpu_bus_rif.master_rl.en_vl(slave_id_jg); cpu_bus_rif.slave_al(slave_id_jg).data_vl <= data_out_vs; cpu_bus_rif.slave_al(slave_id_jg).ack_l <= ack_s; cpu_bus_rif.slave_al(slave_id_jg).err_l <= err_s; ... end architecture rtl_arch;
use work.cpu_bus_2m8s_pkg.all entity master_ent is generic ( slave_id_jg : slaves_total_jrt; master_id_jg : masters_total_jrt ); port ( rst_i : in std_logic clk_i : in std_logic; cpu_bus_rif : view master_r( master_rvw( generic map( slave_id_jg => slave_id_jg, master_id_jg => master_id_jg ) ) ) ); end entity master_ent; architecture rtl_arch of master_ent is -- Master bus and controls to/from arbiter instance signal addr_vs : cpu_bus_2m8s_pkg.addr_vst; signal data_vs : cpu_bus_2m8s_pkg.data_vst; signal we_s : std_logic; signal en_vs : cpu_bus_2m8s_pkg.slave_ctrl_vst; signal bus_req_s : std_logic; signal bus_grnt_s : std_logic; -- Selected master bus input from arbiter instance signal addr_in_vs : cpu_bus_2m8s_pkg.addr_vst; signal data_in_vs : cpu_bus_2m8s_pkg.data_vst; signal we_in_s : std_logic; signal en_in_vs : cpu_bus_2m8s_pkg.slave_ctrl_vst; -- Return slave bus output when not selected as master signal data_out_vs : cpu_bus_2m8s_pkg.data_vst; signal ack_s : std_logic; signal err_s : std_logic; -- Input slave array when selected as master signal s_slave_as : cpu_bus_2m8s_pkg.slave_a; begin
-- Arbiter interface cpu_bus_rif.arbiter_al(master_id_jg).master_rl.addr_vl <= addr_vs; cpu_bus_rif.arbiter_al(master_id_jg).master_rl.data_vl <= data_vs; cpu_bus_rif.arbiter_al(master_id_jg).master_rl.we_l <= we_s; cpu_bus_rif.arbiter_al(master_id_jg).master_rl.en_vl <= en_vs; cpu_bus_rif.arbiter_al(master_id_jg).bus_req_l <= bus_req_s; bus_grnt_s <= cpu_bus_rif.arbiter_al(master_id_jg).bus_grnt_l; -- Master interface from arbiter addr_in_vs <= cpu_bus_rif.master_rl.addr_in_vl; data_in_vs <= cpu_bus_rif.master_rl.data_in_vl; we_in_s <= cpu_bus_rif.master_rl.we_in_l; en_in_s <= cpu_bus_rif.master_rl.en_in_vl(slave_id_jg); -- Slave interface to other selected master cpu_bus_rif.slave_al(slave_id_jg).data_vl <= data_out_vs; cpu_bus_rif.slave_al(slave_id_jg).ack_l <= ack_out_s; cpu_bus_rif.slave_al(slave_id_jg).err_l <= err_out_s; -- Slave interface from all slaves when selected as master s_slave_as <= cpu_bus_rif.slave_al; ... end architecture rtl_arch;
use work.cpu_bus_2m8s_pkg.all entity arbiter_ent is generic ( slave_id_jg : slaves_total_jrt ); port ( rst_i : in std_logic clk_i : in std_logic; cpu_bus_rif : view arbiter_r( arbiter_rvw( generic map( slave_id_jg => slave_id_jg ) ) ) ); end entity arbiter_ent; architecture rtl_arch of arbiter_ent is -- Master bus and controls to/from arbiter instance signal arbiter_as : cpu_bus_2m8s_pkg.arbiter_a; signal bus_req_vs : std_logic_vector(masters_total_jrt); signal bus_grnt_vs : std_logic_vector(masters_total_jrt); -- Selected master bus input from arbiter array signal addr_in_vs : cpu_bus_2m8s_pkg.addr_vst; signal data_in_vs : cpu_bus_2m8s_pkg.data_vst; signal we_in_s : std_logic; signal en_in_vs : cpu_bus_2m8s_pkg.slave_ctrl_vst; -- Return slave bus output when not selected as master signal data_out_vs : cpu_bus_2m8s_pkg.data_vst; signal ack_s : std_logic; signal err_s : std_logic; begin
-- Arbiter interface arbiter_as <= cpu_bus_rif.arbiter_al -- Generate bus request vector and return bus grant vector for i_jv in masters_total_jrt loop bus_req_vs(i_jv - 1) <= cpu_bus_rif.arbiter_al(i_jv - 1).bus_grnt_l; if (i_jv - 1 = m_select_jg - 1) then cpu_bus_rif.arbiter_al(i_jv - 1).bus_grnt_l <= '1'; else cpu_bus_rif.arbiter_al(i_jv - 1).bus_grnt_l <= '0'; end if; end loop; -- Selected master bus for arbiter slave accesses addr_in_vs <= arbiter_as(m_select_jg - 1).master_rl.addr_vl; data_in_vs <= arbiter_as(m_select_jg - 1).master_rl.data_vl; we_in_s <= arbiter_as(m_select_jg - 1).master_rl.we_l; en_in_vs <= arbiter_as(m_select_jg - 1).master_rl.en_vl; -- Selected master interface from arbiter to slaves on CPU bus interface cpu_bus_rif.master_rl <= arbiter_as(m_select_jg - 1).master_rl; -- Arbiter slave access to selected master cpu_bus_rif.slave_al(slave_id_jg).data_vl <= data_out_vs; cpu_bus_rif.slave_al(slave_id_jg).ack_l <= ack_out_s; cpu_bus_rif.slave_al(slave_id_jg).err_l <= err_out_s; ... end architecture rtl_arch;
use work.cpu_bus_2m8s_pkg.all entity slave_ent is generic( slave_id_jg : slaves_total_jrt ); port( rst_i : in std_logic; clk_i : in std_logic; cpu_bus_rif : view cpu_bus_r( element( arbiter_al : null arbiter_a; master_rl : in master_r; slave_al : view slave_a( element( slave_id_jg : buffer slave_r; others : null slave_r ) ) ) ) ); end entity slave_ent;
use work.cpu_bus_2m8s_pkg.all entity master_ent is generic( slave_id_jg : slaves_total_jrt; master_id_jg : masters_total_jrt ); port( rst_i : in std_logic; clk_i : in std_logic; cpu_bus_rif : view cpu_bus_r( element( arbiter_al : view arbiter_a( element( master_id_jg : view arbiter_r; element( master_rl : buffer master_r; bus_req_l : buffer std_logic; bus_grnt_l : in std_logic ); others : null arbiter_r ); master_rl : in master_r; slave_al : view slave_a( element( slave_id_jg : buffer slave_r; others : in slave_r ) ) ) ) ); end entity master_ent;
use work.cpu_bus_2m8s_pkg.all entity arbiter_ent is generic( slave_id_jg : slaves_total_jrt ); port( rst_i : in std_logic; clk_i : in std_logic; cpu_bus_rif : view cpu_bus_r( element( arbiter_al : view arbiter_a( element( others : view arbiter_r; element( master_rl : in master_r; bus_req_l : in std_logic; bus_grnt_l : buffer std_logic ) ); master_rl : buffer master_r; slave_al : view slave_a( element( slave_id_jg : buffer slave_r; others : null slave_r ) ) ) ) ); end entity arbiter_ent;
use work.cpu_bus_2m8s_pkg.all entity CPU_Bus_top_ent port( rst_i : in std_logic; clk_i : in std_logic ); end entity CPU_Bus_top_ent;
architecture rtl_arch of CPU_Bus_top_ent is signal rst_s : std_logic; signal clk_s : std_logic; signal cpu_bus_rs : cpu_bus_2m8s_pkg.cpu_bus_r;
begin Sonly_inst : entity Sonly_ent port map( rst_i => rst_s, clk_i => clk_s, cpu_bus_rif => cpu_bus_rs ); MplusS_inst : entity MplusS_ent port map( rst_i => rst_s, clk_i => clk_s, cpu_bus_rif => cpu_bus_rs ); AMandS_inst : entity AMandS_ent port map( rst_i => rst_s, clk_i => clk_s, cpu_bus_rif => cpu_bus_rs ); slave_inst2 : entity slave_ent generic map( slave_id_jg => 1 ) port map( rst_i => rst_s, clk_i => clk_s, cpu_bus_rif => cpu_bus_rs ); slave_inst7 : entity slave_ent generic map( slave_id_jg => 6 ) port map( rst_i => rst_s, clk_i => clk_s, cpu_bus_rif => cpu_bus_rs ); ... end architecture rtl_arch;
use work.cpu_bus_2m8s_pkg.all entity Sonly_ent is port( rst_i : in std_logic; clk_i : in std_logic; cpu_bus_rif : view cpu_bus_r( element( arbiter_al : null arbiter_a; master_rl : in master_r; slave_al : view slave_a( element( 0 : buffer slave_r; 5 : buffer slave_r; others : null slave_r ) ) ) ) ); end entity Sonly_ent;
architecture rtl_arch of Sonly_ent is begin slave_inst1 : entity slave_ent generic map( slave_id_jg => 0 ) port map( rst_i => rst_i, clk_i => clk_i, cpu_bus_rif => cpu_bus_rif ); slave_inst6 : entity slave_ent generic map( slave_id_jg => 5 ) port map( rst_i => rst_i, clk_i => clk_i, cpu_bus_rif => cpu_bus_rif ); end architecture rtl_arch;
use work.cpu_bus_2m8s_pkg.all entity MplusS_ent is port( rst_i : in std_logic; clk_i : in std_logic; cpu_bus_rif : view cpu_bus_r( element( arbiter_al : view arbiter_a( element( 0 : view arbiter_r; element( master_rl : buffer master_r; bus_req_l : buffer std_logic; bus_grnt_l : in std_logic ); others : null arbiter_r ); master_rl : in master_r; slave_al : view slave_a( element( 2 : buffer slave_r; 4 : buffer slave_r; 8 : buffer slave_r; others : in slave_r ) ) ) ) ); end entity MplusS_ent;
architecture rtl_arch of MplusS_ent is begin master_inst1 : entity master_ent generic map( slave_id_jg => 8, master_id_jg => 0 ) port map( rst_i => rst_i, clk_i => clk_i, cpu_bus_rif => cpu_bus_rif ); slave_inst3 : entity slave_ent generic map( slave_id_jg => 2 ) port map( rst_i => rst_i, clk_i => clk_i, cpu_bus_rif => cpu_bus_rif ); slave_inst5 : entity slave_ent generic map( slave_id_jg => 4 ) port map( rst_i => rst_i, clk_i => clk_i, cpu_bus_rif => cpu_bus_rif ); end architecture rtl_arch;
use work.cpu_bus_2m8s_pkg.all entity AMandS_ent is port( rst_i : in std_logic; clk_i : in std_logic; cpu_bus_rif : view cpu_bus_r( element( arbiter_al : view arbiter_a( element( 0 : view arbiter_r; element( master_rl : in master_r; bus_req_l : in std_logic; bus_grnt_l : buffer std_logic 1 : null arbiter_r ) ); master_rl : buffer master_r; slave_al : view slave_a( element( 10 : buffer slave_r; 9 : buffer slave_r; 3 : buffer slave_r; 7 : buffer slave_r; others : in slave_r ) ) ) ) ); end entity AMandS_ent;
architecture rtl_arch of AMandS_ent is begin arbiter_inst : entity arbiter_ent generic map( slave_id_jg => 10 ) port map( rst_i => rst_i, clk_i => clk_i, cpu_bus_rif => cpu_bus_rif ); master_inst2 : entity master_ent generic map( slave_id_jg => 9, master_id_jg => 1 ) port map( rst_i => rst_i, clk_i => clk_i, cpu_bus_rif => cpu_bus_rif ); slave_inst4 : entity slave_ent generic map( slave_id_jg => 3 ) port map( rst_i => rst_i, clk_i => clk_i, cpu_bus_rif => cpu_bus_rif ); slave_inst8 : entity slave_ent generic map( slave_id_jg => 7 ) port map( rst_i => rst_i, clk_i => clk_i, cpu_bus_rif => cpu_bus_rif ); end architecture rtl_arch;
use work.vhdl2008_cpu_bus_2m8s_pkg.all entity slave_ent is generic ( slave_id_jg : vhdl2008_cpu_bus_2m8s_pkg.slaves_total_jrt ); port ( rst_i : in std_logic clk_i : in std_logic; master_ri : in vhdl2008_cpu_bus_2m8s_pkg.master_r; slave_rb : buffer vhdl2008_cpu_bus_2m8s_pkg.slave_r ); alias addr_vs is master_ri.addr_vl; alias data_in_vs is master_ri.data_vl; alias we_s is master_ri.we_l; alias en_s is en_vl(slave_id_jg); alias data_out_vs is slave_rb.data_vl; alias ack_s is slave_rb.ack_l; alias err_s is slave_rb.err_l; end entity slave_ent;
use work.vhdl2008_cpu_bus_2m8s_pkg.all entity master_ent is generic ( slave_id_jg : vhdl2008_cpu_bus_2m8s_pkg.slaves_total_jrt master_id_jg : vhdl2008_cpu_bus_2m8s_pkg.masters_total_jrt ); port ( rst_i : in std_logic clk_i : in std_logic; bus_grnt_vi : in vhdl2008_cpu_bus_2m8s_pkg.master_ctrl_vst; arbiter_rb : buffer vhdl2008_cpu_bus_2m8s_pkg.arbiter_r master_ri : in vhdl2008_cpu_bus_2m8s_pkg.master_r; slave_ai : in vhdl2008_cpu_bus_2m8s_pkg.slave_a; slave_rb : buffer vhdl2008_cpu_bus_2m8s_pkg.slave_r ); alias master_op_rs is arbiter_rb.master_rl; alias bus_req_s is arbiter_rb.bus_req_l; alias bus_req_s is bus_grnt_vi(master_id_jg); alias addr_vs is master_ri.addr_vl; alias data_in_vs is master_ri.data_vl; alias we_s is master_ri.we_l; alias en_s is master_ri.en_vl(slave_id_jg); alias data_out_vs is slave_rb.data_vl; alias ack_s is slave_rb.ack_l; alias err_s is slave_rb.err_l; end entity master_ent;
use work.vhdl2008_cpu_bus_2m8s_pkg.all entity arbiter_ent is generic ( slave_id_jg : vhdl2008_cpu_bus_2m8s_pkg.slaves_total_jrt master_id_jg : vhdl2008_cpu_bus_2m8s_pkg.masters_total_jrt ); port ( rst_i : in std_logic clk_i : in std_logic; bus_grnt_vb : buffer vhdl2008_cpu_bus_2m8s_pkg.master_ctrl_vst; arbiter_ai : in vhdl2008_cpu_bus_2m8s_pkg.arbiter_a master_rb : buffer vhdl2008_cpu_bus_2m8s_pkg.master_r; slave_rb : buffer vhdl2008_cpu_bus_2m8s_pkg.slave_r ); alias addr_vs is master_rb.addr_vl; alias data_in_vs is master_rb.data_vl; alias we_s is master_rb.we_l; alias en_s is master_rb.en_vl(slave_id_jg); alias data_out_vs is slave_rb.data_vl; alias ack_s is slave_rb.ack_l; alias err_s is slave_rb.err_l; end entity arbiter_ent;
use work.vhdl2008_cpu_bus_2m8s_pkg.all entity Sonly_ent is port( rst_i : in std_logic clk_i : in std_logic; master_ri : in vhdl2008_cpu_bus_2m8s_pkg.master_r; slave_1_rb : buffer vhdl2008_cpu_bus_2m8s_pkg.slave_r; slave_6_rb : buffer vhdl2008_cpu_bus_2m8s_pkg.slave_r ); end entity Sonly_ent;
architecture rtl_arch of Sonly_ent is begin slave_inst1 : entity slave_ent generic map( slave_id_jg => 0 ) port map( rst_i => rst_i, clk_i => clk_i, master_ri => master_ri, slave_rb => slave_1_rb ); slave_inst6 : entity slave_ent generic map( slave_id_jg => 5 ) port map( rst_i => rst_i, clk_i => clk_i, master_ri => master_ri, slave_rb => slave_6_rb ); end architecture rtl_arch;
use work.vhdl2008_cpu_bus_2m8s_pkg.all entity MplusS_ent is port( rst_i : in std_logic clk_i : in std_logic; bus_grnt_vi : in vhdl2008_cpu_bus_2m8s_pkg.master_ctrl_vst; arbiter_1_rb : buffer vhdl2008_cpu_bus_2m8s_pkg.arbiter_r; master_ri : in vhdl2008_cpu_bus_2m8s_pkg.master_r; slave_ai : in vhdl2008_cpu_bus_2m8s_pkg.slave_a; slave_3_rb : buffer vhdl2008_cpu_bus_2m8s_pkg.slave_r; slave_5_rb : buffer vhdl2008_cpu_bus_2m8s_pkg.slave_r; slave_9_rb : buffer vhdl2008_cpu_bus_2m8s_pkg.slave_r end entity MplusS_ent;
architecture rtl_arch of MplusS_ent is begin master_inst1 : entity master_ent generic map( slave_id_jg => 8, master_id_jg => 0 ) port map( rst_i => rst_i, clk_i => clk_i, bus_grnt_vi => bus_grnt_vi, arbiter_rb => arbiter_1_rb, master_ri => master_ri, slave_ai => slave_ai, slave_rb => slave_9_rb ); slave_inst3 : entity slave_ent generic map( slave_id_jg => 2 ) port map( rst_i => rst_i, master_ri => master_ri, slave_rb => slave_3_rb ); slave_inst5 : entity slave_ent generic map( slave_id_jg => 4 ) port map( rst_i => rst_i, master_ri => master_ri, slave_rb => slave_5_rb ); end architecture rtl_arch;
use work.vhdl2008_cpu_bus_2m8s_pkg.all entity AMandS_ent is port( rst_i : in std_logic; clk_i : in std_logic; bus_grnt_vb : buffer vhdl2008_cpu_bus_2m8s_pkg.master_ctrl_vst; arbiter_1_ri : in vhdl2008_cpu_bus_2m8s_pkg.arbiter_r; master_rb : buffer vhdl2008_cpu_bus_2m8s_pkg.master_r; slave_ai : in vhdl2008_cpu_bus_2m8s_pkg.slave_a; slave_4_rb : buffer vhdl2008_cpu_bus_2m8s_pkg.slave_r; slave_8_rb : buffer vhdl2008_cpu_bus_2m8s_pkg.slave_r; slave_10_rb : buffer vhdl2008_cpu_bus_2m8s_pkg.slave_r; slave_11_rb : buffer vhdl2008_cpu_bus_2m8s_pkg.slave_r end entity AMandS_ent;
architecture rtl_arch of AMandS_ent is signal arbiter_as : vhdl2008_cpu_bus_2m8s_pkg.arbiter_a; begin arbiter_as(0) <= arbiter_1_ri; arbiter_inst : entity arbiter_ent generic map( slave_id_jg => 10 ) port map( rst_i => rst_i, clk_i => clk_i, bus_grnt_vb => bus_grnt_vb, arbiter_ai => arbiter_as, master_rb => master_rb, slave_rb => slave_11_rb ); master_inst2 : entity master_ent generic map( slave_id_jg => 9, master_id_jg => 1 ) port map( rst_i => rst_i, clk_i => clk_i, bus_grnt_vi => bus_grnt_vb, arbiter_rb => arbiter_as(1), master_ri => master_rb, slave_ai => slave_ai, slave_rb => slave_10_rb ); slave_inst4 : entity slave_ent generic map( slave_id_jg => 3 ) port map( rst_i => rst_i, clk_i => clk_i, master_ri => master_rb, slave_rb => slave_4_rb ); slave_inst8 : entity slave_ent generic map( slave_id_jg => 7 ) port map( rst_i => rst_i, clk_i => clk_i, master_ri => master_rb, slave_rb => slave_8_rb ); end architecture rtl_arch;
use work.vhdl2008_cpu_bus_2m8s_pkg.all entity CPU_Bus_top_ent port( rst_i : in std_logic; clk_i : in std_logic ); end entity CPU_Bus_top_ent;
architecture rtl_arch of CPU_Bus_top_ent is signal rst_s : std_logic; signal clk_s : std_logic; signal bus_grnt_vs : vhdl2008_cpu_bus_2m8s_pkg.master_ctrl_vst; signal arbiter_1_rs : vhdl2008_cpu_bus_2m8s_pkg.cpu_bus_r; signal master_rs : vhdl2008_cpu_bus_2m8s_pkg.master_r; signal slave_as : vhdl2008_cpu_bus_2m8s_pkg.slave_a; begin Sonly_inst : entity Sonly_ent port map( rst_i => rst_s, clk_i => clk_s, master_ri => master_rs, slave_1_rb => slave_as(0), slave_6_rb => slave_as(5) ); MplusS_inst : entity MplusS_ent port map( rst_i => rst_s, clk_i => clk_s, bus_grnt_vi => bus_grnt_vs, arbiter_1_rb => arbiter_1_rs, master_ri => master_rs, slave_ai => slave_as, slave_3_rb => slave_as(2), slave_5_rb => slave_as(4), slave_9_rb => slave_as(8) ); AMandS_inst : entity AMandS_ent port map( rst_i => rst_s, clk_i => clk_s, bus_grnt_vb => bus_grnt_vs, arbiter_1_r1 => arbiter_1_rs, master_rb => master_rs, slave_ai => slave_as, slave_4_rb => slave_as(3), slave_8_rb => slave_as(8), slave_10_rb => slave_as(9), slave_11_rb => slave_as(10) ); slave_inst2 : entity slave_ent generic map( slave_id_jg => 1 ) port map( rst_i => rst_s, clk_i => clk_s, master_ri => master_rs, slave_rb => slave_as(1) ); slave_inst7 : entity slave_ent generic map( slave_id_jg => 6 ) port map( rst_i => rst_s, clk_i => clk_s, master_ri => master_rs, slave_rb => slave_as(6) ); ... end architecture rtl_arch;
interface_signal_declaration ::= [ signal ] identifier_list : [ mode ] subtype_indication [ bus ] [ := static_expression ] | [ signal ] identifier_list : view composite_subtype_indication ( mode_view_clause )
mode_view_clause ::= mode_view_indentifier [ ( generic_map_aspect ) ] | formal_composite_element_clause
use work.cpu_bus_2m8s_pkg.all entity master_ent is generic ( slave_id_jg : slaves_total_jrt; master_id_jg : masters_total_jrt ); port ( rst_i : in std_logic clk_i : in std_logic; cpu_bus_rif : view master_r( master_rvw( generic map( slave_id_jg => slave_id_jg, master_id_jg => master_id_jg ) ) ) ); end entity master_ent;
use work.cpu_bus_2m8s_pkg.all entity arbiter_ent is generic( slave_id_jg : slaves_total_jrt ); port( rst_i : in std_logic; clk_i : in std_logic; cpu_bus_rif : view cpu_bus_r( element( arbiter_al : view arbiter_a( element( others : view arbiter_r; element( master_rl : in master_r; bus_req_l : in std_logic; bus_grnt_l : buffer std_logic ) ); master_rl : buffer master_r; slave_al : view slave_a( element( slave_id_jg : buffer slave_r; others : null slave_r ) ) ) ) ); end entity arbiter_ent;
mode_view_declaration ::= [ record | array ] view identifier of composite_subtype_indication is [ formal_generic_clause ] formal_composite_element_clause end [ record | array ] view [ mode_view_simple_name ] ;
record view slave_rvw of cpu_bus_r is generic( slave_id_jg : slaves_total_jrt ); element( arbiter_al : null arbiter_a; master_rl : in master_r; slave_al : view slave_a( s_slave_avw( generic map( slave_id_jg => slave_id_jg ) ) ) ); end record view slave_rvw;
composite_element_clause ::= element ( composite_element_list ) ;
composite_element_declaration ::= identifier_list : [ mode ] subtype_indication [ bus ] [ := static_expression ] | identifier_list : view composite_subtype_indication ( mode_view_clause )
composite_element_list ::= composite_element_declaration { ; composite_element_declaration }
mode ::= in | out | inout | buffer | linkage | null
composite_element_clause ::= element ( composite_element_list ) ;
composite_element_declaration ::= identifier_list : [ mode ] subtype_indication [ bus ] [ := static_expression ] | identifier_list : view composite_subtype_indication ( mode_view_clause )
composite_element_list ::= composite_element_declaration { ; composite_element_declaration }
interface_signal_declaration ::= [ signal ] identifier_list : [ mode ] subtype_indication [ bus ] [ := static_expression ] | [ signal ] identifier_list : view composite_subtype_indication ( mode_view_clause )
mode ::= in | out | inout | buffer | linkage | null
mode_view_clause ::= mode_view_indentifier [ ( generic_map_aspect ) ] | formal_composite_element_clause
mode_view_declaration ::= [ record | array ] view identifier of composite_subtype_indication is [ formal_generic_clause ] formal_composite_element_clause end [ record | array ] view [ mode_view_simple_name ] ;
Global signals: | ||
---|---|---|
Name | Source | Description |
HCLK | Clock source | The bus clock times all bus transfers. All signal timings are related to the rising edge of HCLK. |
HRESETn | Reset controller | The bus reset signal is active LOW and resets the system and the bus. This is the only active LOW AHB-Lite signal. |
Master signals: | ||
Name | Destination | Description |
HADDR[31:0] | Slave and decoder |
The 32-bit system address bus. |
HBURST[2:0] | Slave | The burst type indicates if the transfer is a single transfer or forms part of a burst. Fixed length bursts of 4, 8, and 16 beats are supported. The burst can be incrementing or wrapping. Incrementing bursts of undefined length are also supported. |
HMASTLOCK | Slave | When HIGH, this signal indicates that the current transfer is part of a locked sequence. It has the same timing as the address and control signals. |
HPROT[3:0] | Slave | The protection control signals provide additional information about a bus access and are primarily intended for use by any module that wants to implement some level of protection. The signals indicate if the transfer is an opcode fetch or data access, and if the transfer is a privileged mode access or user mode access. For masters with a memory management unit these signals also indicate whether the current access is cacheable or bufferable. |
HSIZE[2:0] | Slave | Indicates the size of the transfer, that is typically byte, halfword, or word. The protocol allows for larger transfer sizes up to a maximum of 1024 bits. |
HWDATA[31:0] | Slave | The write data bus transfers data from the master to the slaves during write operations. A minimum data bus width of 32 bits is recommended. However, this can be extended to enable higher bandwidth operation. |
HWRITE | Slave | Indicates the transfer direction. When HIGH this signal indicates a write transfer and when LOW a read transfer. It has the same timing as the address signals, however, it must remain constant throughout a burst transfer. |
Slave signals: | ||
---|---|---|
Name | Destination | Description |
HRDATA[31:0] | Multiplexor | During read operations, the read data bus transfers data from the selected slave to the multiplexor. The multiplexor then transfers the data to the master. A minimum data bus width of 32 bits is recommended. However, this can be extended to enable higher bandwidth operation. |
HREADYOUT | Multiplexor | When HIGH, the HREADYOUT signal indicates that a transfer has finished on the bus. This signal can be driven LOW to extend a transfer. |
HRESP | Multiplexor | The transfer response, after passing through the multiplexor, provides the master with additional information on the status of a transfer. When LOW, the HRESP signal indicates that the transfer status is OKAY. When HIGH, the HRESP signal indicates that the transfer status is ERROR. |
Decoder signals: | ||
Name | Destination | Description |
HSELx | Slave | Each AHB-Lite slave has its own slave select signal HSELx and this signal indicates that the current transfer is intended for the selected slave. When the slave is initially selected, it must also monitor the status of HREADY to ensure that the previous bus transfer has completed, before it responds to the current transfer. The HSELx signal is a combinatorial decode of the address bus. |
Multiplexor signals: | ||
Name | Destination | Description |
HRDATA[31:0] | Master | Read data bus, selected by the decoder. |
HREADY | Master and slave | When HIGH, the HREADY signal indicates to the master and all slaves, that the previous transfer is complete. |
HRESP | Master | Transfer response, selected by the decoder. |
I | Attachment | Action | Size | Date | Who | Comment |
---|---|---|---|---|---|---|
![]() |
UC_BAH_AMBA_AHBLite.png | manage | 8.9 K | 2016-10-09 - 14:50 | BrentHahoe | AMBA AHB-Lite Block Diagram |
![]() |
UC_BAH_AMBA_AHBLiteRAMslaveModeViewIP.png | manage | 23.5 K | 2016-10-12 - 18:39 | BrentHahoe | AMBA AHD-Lite Slave Mode View Inputs |
![]() |
UC_BAH_AMBA_AHBLiteRAMslaveModeViewOP.png | manage | 18.7 K | 2016-10-12 - 18:40 | BrentHahoe | AMBA AHD-Lite Slave Mode View Outputs |
![]() |
UC_BAH_AMBA_AHBLite_Master.png | manage | 7.7 K | 2016-09-08 - 11:02 | BrentHahoe | AMBA AHD-Lite Master Interface |
![]() |
UC_BAH_AMBA_AHBLite_Modified.png | manage | 10.5 K | 2016-10-09 - 14:52 | BrentHahoe | AMBA AHB-Lite Modified Block Diagram |
![]() |
UC_BAH_AMBA_AHBLite_MultiMaster.png | manage | 14.4 K | 2016-10-09 - 14:56 | BrentHahoe | AMBA AHB-Lite Multi-master Modified Block Diagram |
![]() |
UC_BAH_AMBA_AHBLite_Multiplexor.png | manage | 9.9 K | 2016-10-09 - 14:53 | BrentHahoe | AMBA AHB-Lite Multiplexor Diagram |
![]() |
UC_BAH_AMBA_AHBLite_RAM1Mx8p.png | manage | 9.8 K | 2016-10-12 - 14:12 | BrentHahoe | AMBA AHD-Lite Slave 1Mx8 plus parity RAM block |
![]() |
UC_BAH_AMBA_AHBLite_Slave.png | manage | 8.4 K | 2016-09-08 - 12:18 | BrentHahoe | AMBA AHD-Lite Slave Interface |
![]() |
UC_BAH_AMBA_AHBLite_SlaveModeView.png | manage | 25.5 K | 2016-10-12 - 17:29 | BrentHahoe | AMBA AHD-Lite Slave Mode View |
![]() |
UC_BAH_CPUAMandSEntity.png | manage | 126.3 K | 2015-09-09 - 19:12 | BrentHahoe | RTL CPU bus arbiter, master and slave hierarchy entity. |
![]() |
UC_BAH_CPUArbiterArrayAndRecord.png | manage | 40.6 K | 2015-08-17 - 17:57 | BrentHahoe | RTL CPU bus arbiter array and record structure. |
![]() |
UC_BAH_CPUArbiterEntity.png | manage | 78.5 K | 2015-09-09 - 19:13 | BrentHahoe | RTL CPU bus arbiter entity. |
![]() |
UC_BAH_CPUBusArbiterModeView.png | manage | 79.7 K | 2015-09-09 - 19:13 | BrentHahoe | RTL CPU bus arbiter mode view. |
![]() |
UC_BAH_CPUBusMasterModeView.png | manage | 88.1 K | 2015-09-09 - 19:14 | BrentHahoe | RTL CPU bus master mode view. |
![]() |
UC_BAH_CPUBusRAMslaveModeViewIP.png | manage | 20.9 K | 2016-10-12 - 14:55 | BrentHahoe | AMBA AHD-Lite Slave 1Mx8 plus parity RAM IP Mode View |
![]() |
UC_BAH_CPUBusRecord.png | manage | 146.7 K | 2015-08-17 - 17:56 | BrentHahoe | RTL CPU bus top record structure. |
![]() |
UC_BAH_CPUBusSlaveModeView.png | manage | 62.2 K | 2015-09-09 - 19:14 | BrentHahoe | RTL CPU bus slave mode view. |
![]() |
UC_BAH_CPUInterfaceTop.png | manage | 46.3 K | 2015-10-01 - 18:22 | BrentHahoe | RTL CPU bus interface top entity hierarchy structure. |
![]() |
UC_BAH_CPUMasterEntity.png | manage | 90.0 K | 2015-09-09 - 19:15 | BrentHahoe | RTL CPU bus master entity. |
![]() |
UC_BAH_CPUMasterRecord.png | manage | 30.3 K | 2015-08-17 - 17:55 | BrentHahoe | RTL CPU bus master record structure. |
![]() |
UC_BAH_CPUMplusSEntity.png | manage | 123.4 K | 2015-09-09 - 19:16 | BrentHahoe | RTL CPU bus master plus slave hierarchy entity. |
![]() |
UC_BAH_CPUSlaveArrayAndRecord.png | manage | 43.7 K | 2015-08-17 - 17:54 | BrentHahoe | RTL CPU bus slave record and array structure. |
![]() |
UC_BAH_CPUSlaveEntity.png | manage | 114.3 K | 2015-09-09 - 19:21 | BrentHahoe | RTL CPU bus slave entity. |
![]() |
UC_BAH_CPUSonlyEntity.png | manage | 88.7 K | 2015-09-09 - 19:17 | BrentHahoe | RTL CPU bus slave only hierarchy entity. |
![]() |
UC_BAH_VHDL2008CPUAMandSEntity.png | manage | 60.3 K | 2015-09-09 - 18:24 | BrentHahoe | Current VHDL2008 RTL CPU bus arbiter, master and slave hierarchy entity. |
![]() |
UC_BAH_VHDL2008CPUArbiterEntity.png | manage | 70.3 K | 2015-09-08 - 13:34 | BrentHahoe | Current VHDL2008 RTL CPU bus arbiter entity. |
![]() |
UC_BAH_VHDL2008CPUInterfaceTop.png | manage | 82.5 K | 2015-09-07 - 17:39 | BrentHahoe | Current VHDL2008 RTL CPU bus interface top entity hierarchy structure. |
![]() |
UC_BAH_VHDL2008CPUMasterEntity.png | manage | 127.3 K | 2015-09-09 - 13:11 | BrentHahoe | Current VHDL2008 RTL CPU bus master entity. |
![]() |
UC_BAH_VHDL2008CPUMplusSEntity.png | manage | 55.1 K | 2015-09-09 - 09:35 | BrentHahoe | Current VHDL2008 RTL CPU bus master plus slave hierarchy entity. |
![]() |
UC_BAH_VHDL2008CPUSlaveEntity.png | manage | 44.0 K | 2015-09-08 - 11:49 | BrentHahoe | Current VHDL2008 RTL CPU bus slave entity. |
![]() |
UC_BAH_VHDL2008CPUSonlyEntity.png | manage | 35.7 K | 2015-09-08 - 19:07 | BrentHahoe | Current VHDL2008 RTL CPU bus slave only hierarchy entity. |