From 5bcd087d993559abe984e0951d84145e9abde8ec Mon Sep 17 00:00:00 2001 From: Tomasz Wlostowski <tomasz.wlostowski@cern.ch> Date: Tue, 4 Oct 2011 14:04:00 +0200 Subject: [PATCH] wishbone: wb_conmax: removed module from the Manifest (no longer used, kept for legacy designs) --- modules/wishbone/Manifest.py | 2 +- modules/wishbone/wb_conmax/Manifest.py | 2 +- .../wb_conmax/wb_conmax_master_if.vhd | 188 +++++++------ modules/wishbone/wb_conmax/wb_conmax_rf.vhd | 97 ++++--- .../wishbone/wb_conmax/wb_conmax_slave_if.vhd | 263 +++++++++--------- modules/wishbone/wb_conmax/wb_conmax_top.vhd | 7 +- modules/wishbone/wb_conmax/wbconmax_pkg.vhd | 37 +-- modules/wishbone/wb_conmax/xwb_conmax.vhd | 242 ++++++++++++++++ 8 files changed, 532 insertions(+), 306 deletions(-) create mode 100644 modules/wishbone/wb_conmax/xwb_conmax.vhd diff --git a/modules/wishbone/Manifest.py b/modules/wishbone/Manifest.py index e5452b42..68c3aaa5 100644 --- a/modules/wishbone/Manifest.py +++ b/modules/wishbone/Manifest.py @@ -5,7 +5,7 @@ modules = { "local" : "wb_onewire_master", "wb_i2c_master", "wb_bus_fanout", - "wb_conmax", +# "wb_conmax", "wb_dpram", "wb_gpio_port", "wb_simple_timer", diff --git a/modules/wishbone/wb_conmax/Manifest.py b/modules/wishbone/wb_conmax/Manifest.py index b4dc1c43..9a028fe9 100644 --- a/modules/wishbone/wb_conmax/Manifest.py +++ b/modules/wishbone/wb_conmax/Manifest.py @@ -1,3 +1,3 @@ files = ["wb_conmax_pri_dec.vhd", "wb_conmax_pri_enc.vhd", "wb_conmax_arb.vhd", "wb_conmax_msel.vhd", "wbconmax_pkg.vhd", "wb_conmax_slave_if.vhd", "wb_conmax_master_if.vhd", "wb_conmax_rf.vhd", - "wb_conmax_top.vhd" ]; + "xwb_conmax.vhd" ]; diff --git a/modules/wishbone/wb_conmax/wb_conmax_master_if.vhd b/modules/wishbone/wb_conmax/wb_conmax_master_if.vhd index 1862520f..31db7650 100644 --- a/modules/wishbone/wb_conmax/wb_conmax_master_if.vhd +++ b/modules/wishbone/wb_conmax/wb_conmax_master_if.vhd @@ -6,7 +6,7 @@ -- Author : Grzegorz Daniluk -- Company : Elproma -- Created : 2011-02-12 --- Last update: 2010-02-16 +-- Last update: 2011-09-12 -- Platform : FPGA-generics -- Standard : VHDL ------------------------------------------------------------------------------- @@ -36,74 +36,80 @@ use ieee.numeric_std.all; library work; use work.wbconmax_pkg.all; +use work.wishbone_pkg.all; entity wb_conmax_master_if is + generic( + g_adr_width : integer; + g_sel_width : integer; + g_dat_width : integer); port( clk_i : in std_logic; rst_i : in std_logic; --Master interface - wb_master_i : in t_wb_i; - wb_master_o : out t_wb_o; + wb_master_i : in t_wishbone_slave_in; + wb_master_o : out t_wishbone_slave_out; --Slaves(0 to 15) interface - wb_slaves_i : in t_conmax_slaves_i; - wb_slaves_o : out t_conmax_slaves_o - ); + wb_slaves_i : in t_wishbone_master_in_array(0 to 15); + wb_slaves_o : out t_wishbone_master_out_array(0 to 15) + ); end wb_conmax_master_if; architecture behaviour of wb_conmax_master_if is - signal s_slv_sel : std_logic_vector(3 downto 0); + + signal s_slv_sel : std_logic_vector(3 downto 0); signal s_cyc_o_next : std_logic_vector(15 downto 0); - signal s_cyc_o : std_logic_vector(15 downto 0); + signal s_cyc_o : std_logic_vector(15 downto 0); begin --Select logic - s_slv_sel <= wb_master_i.addr(c_aw-1 downto c_aw-4); + s_slv_sel <= wb_master_i.adr(g_adr_width-1 downto g_adr_width-4); --Address & Data Pass - GEN_OUTS: - for I in 0 to 15 generate - wb_slaves_o(I).addr <= wb_master_i.addr; - wb_slaves_o(I).sel <= wb_master_i.sel; - wb_slaves_o(I).data <= wb_master_i.data; - wb_slaves_o(I).we <= wb_master_i.we; - wb_slaves_o(I).cyc <= s_cyc_o(I); - wb_slaves_o(I).stb <= wb_master_i.stb when(s_slv_sel=std_logic_vector( - to_unsigned(I, 4)) ) else '0'; - end generate; - - wb_master_o.data <= wb_slaves_i( 0).data when(s_slv_sel="0000") else - wb_slaves_i( 1).data when(s_slv_sel="0001") else - wb_slaves_i( 2).data when(s_slv_sel="0010") else - wb_slaves_i( 3).data when(s_slv_sel="0011") else - wb_slaves_i( 4).data when(s_slv_sel="0100") else - wb_slaves_i( 5).data when(s_slv_sel="0101") else - wb_slaves_i( 6).data when(s_slv_sel="0110") else - wb_slaves_i( 7).data when(s_slv_sel="0111") else - wb_slaves_i( 8).data when(s_slv_sel="1000") else - wb_slaves_i( 9).data when(s_slv_sel="1001") else - wb_slaves_i(10).data when(s_slv_sel="1010") else - wb_slaves_i(11).data when(s_slv_sel="1011") else - wb_slaves_i(12).data when(s_slv_sel="1100") else - wb_slaves_i(13).data when(s_slv_sel="1101") else - wb_slaves_i(14).data when(s_slv_sel="1110") else - wb_slaves_i(15).data when(s_slv_sel="1111") else - (others=>'0'); + GEN_OUTS : + for I in 0 to 15 generate + wb_slaves_o(I).adr <= wb_master_i.adr; + wb_slaves_o(I).sel <= wb_master_i.sel; + wb_slaves_o(I).dat <= wb_master_i.dat; + wb_slaves_o(I).we <= wb_master_i.we; + wb_slaves_o(I).cyc <= s_cyc_o(I); + wb_slaves_o(I).stb <= wb_master_i.stb when(s_slv_sel = std_logic_vector( + to_unsigned(I, 4)) ) else '0'; + end generate; + + wb_master_o.dat <= wb_slaves_i(0).dat when(s_slv_sel = "0000") else + wb_slaves_i(1).dat when(s_slv_sel = "0001") else + wb_slaves_i(2).dat when(s_slv_sel = "0010") else + wb_slaves_i(3).dat when(s_slv_sel = "0011") else + wb_slaves_i(4).dat when(s_slv_sel = "0100") else + wb_slaves_i(5).dat when(s_slv_sel = "0101") else + wb_slaves_i(6).dat when(s_slv_sel = "0110") else + wb_slaves_i(7).dat when(s_slv_sel = "0111") else + wb_slaves_i(8).dat when(s_slv_sel = "1000") else + wb_slaves_i(9).dat when(s_slv_sel = "1001") else + wb_slaves_i(10).dat when(s_slv_sel = "1010") else + wb_slaves_i(11).dat when(s_slv_sel = "1011") else + wb_slaves_i(12).dat when(s_slv_sel = "1100") else + wb_slaves_i(13).dat when(s_slv_sel = "1101") else + wb_slaves_i(14).dat when(s_slv_sel = "1110") else + wb_slaves_i(15).dat when(s_slv_sel = "1111") else + (others => '0'); --Control Signal Pass - G1: for I in 0 to 15 generate - s_cyc_o_next(I) <= s_cyc_o(I) when ( wb_master_i.cyc='1' and wb_master_i.stb='0') else - wb_master_i.cyc when ( s_slv_sel=std_logic_vector(to_unsigned(I, 4)) ) else - '0'; + G1 : for I in 0 to 15 generate + s_cyc_o_next(I) <= s_cyc_o(I) when (wb_master_i.cyc = '1' and wb_master_i.stb = '0') else + wb_master_i.cyc when (s_slv_sel = std_logic_vector(to_unsigned(I, 4))) else + '0'; end generate; process(clk_i) begin - if( clk_i'event and clk_i='1') then - if(rst_i='1') then + if(clk_i'event and clk_i = '1') then + if(rst_i = '1') then s_cyc_o(15 downto 0) <= (others => '0'); else s_cyc_o(15 downto 0) <= s_cyc_o_next(15 downto 0); @@ -111,58 +117,58 @@ begin end if; end process; - wb_master_o.ack <= wb_slaves_i( 0).ack when(s_slv_sel="0000") else - wb_slaves_i( 1).ack when(s_slv_sel="0001") else - wb_slaves_i( 2).ack when(s_slv_sel="0010") else - wb_slaves_i( 3).ack when(s_slv_sel="0011") else - wb_slaves_i( 4).ack when(s_slv_sel="0100") else - wb_slaves_i( 5).ack when(s_slv_sel="0101") else - wb_slaves_i( 6).ack when(s_slv_sel="0110") else - wb_slaves_i( 7).ack when(s_slv_sel="0111") else - wb_slaves_i( 8).ack when(s_slv_sel="1000") else - wb_slaves_i( 9).ack when(s_slv_sel="1001") else - wb_slaves_i(10).ack when(s_slv_sel="1010") else - wb_slaves_i(11).ack when(s_slv_sel="1011") else - wb_slaves_i(12).ack when(s_slv_sel="1100") else - wb_slaves_i(13).ack when(s_slv_sel="1101") else - wb_slaves_i(14).ack when(s_slv_sel="1110") else - wb_slaves_i(15).ack when(s_slv_sel="1111") else + wb_master_o.ack <= wb_slaves_i(0).ack when(s_slv_sel = "0000") else + wb_slaves_i(1).ack when(s_slv_sel = "0001") else + wb_slaves_i(2).ack when(s_slv_sel = "0010") else + wb_slaves_i(3).ack when(s_slv_sel = "0011") else + wb_slaves_i(4).ack when(s_slv_sel = "0100") else + wb_slaves_i(5).ack when(s_slv_sel = "0101") else + wb_slaves_i(6).ack when(s_slv_sel = "0110") else + wb_slaves_i(7).ack when(s_slv_sel = "0111") else + wb_slaves_i(8).ack when(s_slv_sel = "1000") else + wb_slaves_i(9).ack when(s_slv_sel = "1001") else + wb_slaves_i(10).ack when(s_slv_sel = "1010") else + wb_slaves_i(11).ack when(s_slv_sel = "1011") else + wb_slaves_i(12).ack when(s_slv_sel = "1100") else + wb_slaves_i(13).ack when(s_slv_sel = "1101") else + wb_slaves_i(14).ack when(s_slv_sel = "1110") else + wb_slaves_i(15).ack when(s_slv_sel = "1111") else '0'; - wb_master_o.err <= wb_slaves_i( 0).err when(s_slv_sel="0000") else - wb_slaves_i( 1).err when(s_slv_sel="0001") else - wb_slaves_i( 2).err when(s_slv_sel="0010") else - wb_slaves_i( 3).err when(s_slv_sel="0011") else - wb_slaves_i( 4).err when(s_slv_sel="0100") else - wb_slaves_i( 5).err when(s_slv_sel="0101") else - wb_slaves_i( 6).err when(s_slv_sel="0110") else - wb_slaves_i( 7).err when(s_slv_sel="0111") else - wb_slaves_i( 8).err when(s_slv_sel="1000") else - wb_slaves_i( 9).err when(s_slv_sel="1001") else - wb_slaves_i(10).err when(s_slv_sel="1010") else - wb_slaves_i(11).err when(s_slv_sel="1011") else - wb_slaves_i(12).err when(s_slv_sel="1100") else - wb_slaves_i(13).err when(s_slv_sel="1101") else - wb_slaves_i(14).err when(s_slv_sel="1110") else - wb_slaves_i(15).err when(s_slv_sel="1111") else + wb_master_o.err <= wb_slaves_i(0).err when(s_slv_sel = "0000") else + wb_slaves_i(1).err when(s_slv_sel = "0001") else + wb_slaves_i(2).err when(s_slv_sel = "0010") else + wb_slaves_i(3).err when(s_slv_sel = "0011") else + wb_slaves_i(4).err when(s_slv_sel = "0100") else + wb_slaves_i(5).err when(s_slv_sel = "0101") else + wb_slaves_i(6).err when(s_slv_sel = "0110") else + wb_slaves_i(7).err when(s_slv_sel = "0111") else + wb_slaves_i(8).err when(s_slv_sel = "1000") else + wb_slaves_i(9).err when(s_slv_sel = "1001") else + wb_slaves_i(10).err when(s_slv_sel = "1010") else + wb_slaves_i(11).err when(s_slv_sel = "1011") else + wb_slaves_i(12).err when(s_slv_sel = "1100") else + wb_slaves_i(13).err when(s_slv_sel = "1101") else + wb_slaves_i(14).err when(s_slv_sel = "1110") else + wb_slaves_i(15).err when(s_slv_sel = "1111") else '0'; - wb_master_o.rty <= wb_slaves_i( 0).rty when(s_slv_sel="0000") else - wb_slaves_i( 1).rty when(s_slv_sel="0001") else - wb_slaves_i( 2).rty when(s_slv_sel="0010") else - wb_slaves_i( 3).rty when(s_slv_sel="0011") else - wb_slaves_i( 4).rty when(s_slv_sel="0100") else - wb_slaves_i( 5).rty when(s_slv_sel="0101") else - wb_slaves_i( 6).rty when(s_slv_sel="0110") else - wb_slaves_i( 7).rty when(s_slv_sel="0111") else - wb_slaves_i( 8).rty when(s_slv_sel="1000") else - wb_slaves_i( 9).rty when(s_slv_sel="1001") else - wb_slaves_i(10).rty when(s_slv_sel="1010") else - wb_slaves_i(11).rty when(s_slv_sel="1011") else - wb_slaves_i(12).rty when(s_slv_sel="1100") else - wb_slaves_i(13).rty when(s_slv_sel="1101") else - wb_slaves_i(14).rty when(s_slv_sel="1110") else - wb_slaves_i(15).rty when(s_slv_sel="1111") else + wb_master_o.rty <= wb_slaves_i(0).rty when(s_slv_sel = "0000") else + wb_slaves_i(1).rty when(s_slv_sel = "0001") else + wb_slaves_i(2).rty when(s_slv_sel = "0010") else + wb_slaves_i(3).rty when(s_slv_sel = "0011") else + wb_slaves_i(4).rty when(s_slv_sel = "0100") else + wb_slaves_i(5).rty when(s_slv_sel = "0101") else + wb_slaves_i(6).rty when(s_slv_sel = "0110") else + wb_slaves_i(7).rty when(s_slv_sel = "0111") else + wb_slaves_i(8).rty when(s_slv_sel = "1000") else + wb_slaves_i(9).rty when(s_slv_sel = "1001") else + wb_slaves_i(10).rty when(s_slv_sel = "1010") else + wb_slaves_i(11).rty when(s_slv_sel = "1011") else + wb_slaves_i(12).rty when(s_slv_sel = "1100") else + wb_slaves_i(13).rty when(s_slv_sel = "1101") else + wb_slaves_i(14).rty when(s_slv_sel = "1110") else + wb_slaves_i(15).rty when(s_slv_sel = "1111") else '0'; end behaviour; diff --git a/modules/wishbone/wb_conmax/wb_conmax_rf.vhd b/modules/wishbone/wb_conmax/wb_conmax_rf.vhd index 430b17e0..c26843c6 100644 --- a/modules/wishbone/wb_conmax/wb_conmax_rf.vhd +++ b/modules/wishbone/wb_conmax/wb_conmax_rf.vhd @@ -6,7 +6,7 @@ -- Author : Grzegorz Daniluk -- Company : Elproma -- Created : 2011-02-12 --- Last update: 2010-02-16 +-- Last update: 2011-09-12 -- Platform : FPGA-generics -- Standard : VHDL ------------------------------------------------------------------------------- @@ -37,24 +37,29 @@ use ieee.numeric_std.all; library work; use work.wbconmax_pkg.all; +use work.wishbone_pkg.all; + entity wb_conmax_rf is generic( - g_rf_addr : integer range 0 to 15 := 15 --0xF - ); + g_rf_addr : integer range 0 to 15 := 15; --0xF + g_adr_width : integer; + g_sel_width : integer; + g_dat_width : integer); + port( clk_i : in std_logic; rst_i : in std_logic; --Internal WB interface - int_wb_i : in t_wb_i; - int_wb_o : out t_wb_o; + int_wb_i : in t_wishbone_slave_in; + int_wb_o : out t_wishbone_slave_out; --External WB interface - ext_wb_i : in t_wb_o; - ext_wb_o : out t_wb_i; + ext_wb_i : in t_wishbone_master_in; + ext_wb_o : out t_wishbone_master_out; --Configuration regs - conf_o : out t_rf_conf + conf_o : out t_conmax_rf_conf ); end wb_conmax_rf; @@ -65,14 +70,14 @@ architecture behaviour of wb_conmax_rf is signal s_rf_ack : std_logic; signal s_rf_we : std_logic; - signal s_conf : t_rf_conf; + signal s_conf : t_conmax_rf_conf; signal s_rf_addr : std_logic_vector(3 downto 0); begin --Register File select logic s_rf_addr <= std_logic_vector(to_unsigned(g_rf_addr, 4)); - s_rf_sel <= int_wb_i.cyc and int_wb_i.stb when(int_wb_i.addr(c_aw-5 downto c_aw-8) = s_rf_addr ) + s_rf_sel <= int_wb_i.cyc and int_wb_i.stb when(int_wb_i.adr(g_adr_width-5 downto g_adr_width-8) = s_rf_addr ) else '0'; @@ -94,22 +99,22 @@ begin s_conf <= (others=> (others=>'0')); elsif(s_rf_we='1') then - if (int_wb_i.addr(5 downto 2)=x"0") then s_conf(0) <= int_wb_i.data(15 downto 0); - elsif(int_wb_i.addr(5 downto 2)=x"1") then s_conf(1) <= int_wb_i.data(15 downto 0); - elsif(int_wb_i.addr(5 downto 2)=x"2") then s_conf(2) <= int_wb_i.data(15 downto 0); - elsif(int_wb_i.addr(5 downto 2)=x"3") then s_conf(3) <= int_wb_i.data(15 downto 0); - elsif(int_wb_i.addr(5 downto 2)=x"4") then s_conf(4) <= int_wb_i.data(15 downto 0); - elsif(int_wb_i.addr(5 downto 2)=x"5") then s_conf(5) <= int_wb_i.data(15 downto 0); - elsif(int_wb_i.addr(5 downto 2)=x"6") then s_conf(6) <= int_wb_i.data(15 downto 0); - elsif(int_wb_i.addr(5 downto 2)=x"7") then s_conf(7) <= int_wb_i.data(15 downto 0); - elsif(int_wb_i.addr(5 downto 2)=x"8") then s_conf(8) <= int_wb_i.data(15 downto 0); - elsif(int_wb_i.addr(5 downto 2)=x"9") then s_conf(9) <= int_wb_i.data(15 downto 0); - elsif(int_wb_i.addr(5 downto 2)=x"a") then s_conf(10) <= int_wb_i.data(15 downto 0); - elsif(int_wb_i.addr(5 downto 2)=x"b") then s_conf(11) <= int_wb_i.data(15 downto 0); - elsif(int_wb_i.addr(5 downto 2)=x"c") then s_conf(12) <= int_wb_i.data(15 downto 0); - elsif(int_wb_i.addr(5 downto 2)=x"d") then s_conf(13) <= int_wb_i.data(15 downto 0); - elsif(int_wb_i.addr(5 downto 2)=x"e") then s_conf(14) <= int_wb_i.data(15 downto 0); - elsif(int_wb_i.addr(5 downto 2)=x"f") then s_conf(15) <= int_wb_i.data(15 downto 0); + if (int_wb_i.adr(5 downto 2)=x"0") then s_conf(0) <= int_wb_i.dat(15 downto 0); + elsif(int_wb_i.adr(5 downto 2)=x"1") then s_conf(1) <= int_wb_i.dat(15 downto 0); + elsif(int_wb_i.adr(5 downto 2)=x"2") then s_conf(2) <= int_wb_i.dat(15 downto 0); + elsif(int_wb_i.adr(5 downto 2)=x"3") then s_conf(3) <= int_wb_i.dat(15 downto 0); + elsif(int_wb_i.adr(5 downto 2)=x"4") then s_conf(4) <= int_wb_i.dat(15 downto 0); + elsif(int_wb_i.adr(5 downto 2)=x"5") then s_conf(5) <= int_wb_i.dat(15 downto 0); + elsif(int_wb_i.adr(5 downto 2)=x"6") then s_conf(6) <= int_wb_i.dat(15 downto 0); + elsif(int_wb_i.adr(5 downto 2)=x"7") then s_conf(7) <= int_wb_i.dat(15 downto 0); + elsif(int_wb_i.adr(5 downto 2)=x"8") then s_conf(8) <= int_wb_i.dat(15 downto 0); + elsif(int_wb_i.adr(5 downto 2)=x"9") then s_conf(9) <= int_wb_i.dat(15 downto 0); + elsif(int_wb_i.adr(5 downto 2)=x"a") then s_conf(10) <= int_wb_i.dat(15 downto 0); + elsif(int_wb_i.adr(5 downto 2)=x"b") then s_conf(11) <= int_wb_i.dat(15 downto 0); + elsif(int_wb_i.adr(5 downto 2)=x"c") then s_conf(12) <= int_wb_i.dat(15 downto 0); + elsif(int_wb_i.adr(5 downto 2)=x"d") then s_conf(13) <= int_wb_i.dat(15 downto 0); + elsif(int_wb_i.adr(5 downto 2)=x"e") then s_conf(14) <= int_wb_i.dat(15 downto 0); + elsif(int_wb_i.adr(5 downto 2)=x"f") then s_conf(15) <= int_wb_i.dat(15 downto 0); end if; end if; @@ -125,22 +130,22 @@ begin s_rf_dout <= x"0000"; else - if ( int_wb_i.addr(5 downto 2)=x"0" ) then s_rf_dout <= s_conf(0); - elsif( int_wb_i.addr(5 downto 2)=x"1" ) then s_rf_dout <= s_conf(1); - elsif( int_wb_i.addr(5 downto 2)=x"2" ) then s_rf_dout <= s_conf(2); - elsif( int_wb_i.addr(5 downto 2)=x"3" ) then s_rf_dout <= s_conf(3); - elsif( int_wb_i.addr(5 downto 2)=x"4" ) then s_rf_dout <= s_conf(4); - elsif( int_wb_i.addr(5 downto 2)=x"5" ) then s_rf_dout <= s_conf(5); - elsif( int_wb_i.addr(5 downto 2)=x"6" ) then s_rf_dout <= s_conf(6); - elsif( int_wb_i.addr(5 downto 2)=x"7" ) then s_rf_dout <= s_conf(7); - elsif( int_wb_i.addr(5 downto 2)=x"8" ) then s_rf_dout <= s_conf(8); - elsif( int_wb_i.addr(5 downto 2)=x"9" ) then s_rf_dout <= s_conf(9); - elsif( int_wb_i.addr(5 downto 2)=x"A" ) then s_rf_dout <= s_conf(10); - elsif( int_wb_i.addr(5 downto 2)=x"B" ) then s_rf_dout <= s_conf(11); - elsif( int_wb_i.addr(5 downto 2)=x"C" ) then s_rf_dout <= s_conf(12); - elsif( int_wb_i.addr(5 downto 2)=x"D" ) then s_rf_dout <= s_conf(13); - elsif( int_wb_i.addr(5 downto 2)=x"E" ) then s_rf_dout <= s_conf(14); - elsif( int_wb_i.addr(5 downto 2)=x"F" ) then s_rf_dout <= s_conf(15); + if ( int_wb_i.adr(5 downto 2)=x"0" ) then s_rf_dout <= s_conf(0); + elsif( int_wb_i.adr(5 downto 2)=x"1" ) then s_rf_dout <= s_conf(1); + elsif( int_wb_i.adr(5 downto 2)=x"2" ) then s_rf_dout <= s_conf(2); + elsif( int_wb_i.adr(5 downto 2)=x"3" ) then s_rf_dout <= s_conf(3); + elsif( int_wb_i.adr(5 downto 2)=x"4" ) then s_rf_dout <= s_conf(4); + elsif( int_wb_i.adr(5 downto 2)=x"5" ) then s_rf_dout <= s_conf(5); + elsif( int_wb_i.adr(5 downto 2)=x"6" ) then s_rf_dout <= s_conf(6); + elsif( int_wb_i.adr(5 downto 2)=x"7" ) then s_rf_dout <= s_conf(7); + elsif( int_wb_i.adr(5 downto 2)=x"8" ) then s_rf_dout <= s_conf(8); + elsif( int_wb_i.adr(5 downto 2)=x"9" ) then s_rf_dout <= s_conf(9); + elsif( int_wb_i.adr(5 downto 2)=x"A" ) then s_rf_dout <= s_conf(10); + elsif( int_wb_i.adr(5 downto 2)=x"B" ) then s_rf_dout <= s_conf(11); + elsif( int_wb_i.adr(5 downto 2)=x"C" ) then s_rf_dout <= s_conf(12); + elsif( int_wb_i.adr(5 downto 2)=x"D" ) then s_rf_dout <= s_conf(13); + elsif( int_wb_i.adr(5 downto 2)=x"E" ) then s_rf_dout <= s_conf(14); + elsif( int_wb_i.adr(5 downto 2)=x"F" ) then s_rf_dout <= s_conf(15); end if; end if; @@ -149,15 +154,15 @@ begin --Register File bypass logic - ext_wb_o.addr <= int_wb_i.addr; + ext_wb_o.adr <= int_wb_i.adr; ext_wb_o.sel <= int_wb_i.sel; - ext_wb_o.data <= int_wb_i.data; + ext_wb_o.dat <= int_wb_i.dat; ext_wb_o.cyc <= int_wb_i.cyc when(s_rf_sel='0') else '0'; ext_wb_o.stb <= int_wb_i.stb; ext_wb_o.we <= int_wb_i.we; - int_wb_o.data <= ( (c_dw-1 downto 16 => '0') & s_rf_dout ) when(s_rf_sel='1') - else ext_wb_i.data; + int_wb_o.dat <= ( (g_dat_width-1 downto 16 => '0') & s_rf_dout ) when(s_rf_sel='1') + else ext_wb_i.dat; int_wb_o.ack <= s_rf_ack when(s_rf_sel='1') else ext_wb_i.ack; int_wb_o.err <= '0' when(s_rf_sel='1') else ext_wb_i.err; int_wb_o.rty <= '0' when(s_rf_sel='1') else ext_wb_i.rty; diff --git a/modules/wishbone/wb_conmax/wb_conmax_slave_if.vhd b/modules/wishbone/wb_conmax/wb_conmax_slave_if.vhd index 945f85ae..34e07487 100644 --- a/modules/wishbone/wb_conmax/wb_conmax_slave_if.vhd +++ b/modules/wishbone/wb_conmax/wb_conmax_slave_if.vhd @@ -6,7 +6,7 @@ -- Author : Grzegorz Daniluk -- Company : Elproma -- Created : 2011-02-12 --- Last update: 2010-02-16 +-- Last update: 2011-09-12 -- Platform : FPGA-generics -- Standard : VHDL ------------------------------------------------------------------------------- @@ -34,24 +34,25 @@ use ieee.numeric_std.all; library work; use work.wbconmax_pkg.all; +use work.wishbone_pkg.all; entity wb_conmax_slave_if is generic( g_pri_sel : integer := 2 - ); + ); port( - clk_i : in std_logic; - rst_i : in std_logic; - conf_i : in std_logic_vector(15 downto 0); + clk_i : in std_logic; + rst_i : in std_logic; + conf_i : in std_logic_vector(15 downto 0); --Slave interface - wb_slave_i : in t_wb_o; - wb_slave_o : out t_wb_i; + wb_slave_i : in t_wishbone_master_in; + wb_slave_o : out t_wishbone_master_out; --Master (0 to 7) interfaces - wb_masters_i : in t_conmax_masters_i; - wb_masters_o : out t_conmax_masters_o - ); + wb_masters_i : in t_wishbone_slave_in_array(0 to 7); + wb_masters_o : out t_wishbone_slave_out_array(0 to 7) + ); end wb_conmax_slave_if; architecture bahaviour of wb_conmax_slave_if is @@ -60,45 +61,45 @@ architecture bahaviour of wb_conmax_slave_if is port( clk_i : in std_logic; rst_i : in std_logic; - - req_i : in std_logic_vector(7 downto 0); + + req_i : in std_logic_vector(7 downto 0); gnt_o : out std_logic_vector(2 downto 0); - - next_i : in std_logic - ); + + next_i : in std_logic + ); end component; component wb_conmax_msel is generic( g_pri_sel : integer := 0 - ); + ); port( clk_i : in std_logic; rst_i : in std_logic; - - conf_i : in std_logic_vector(15 downto 0); - req_i : in std_logic_vector(7 downto 0); - next_i : in std_logic; - - sel : out std_logic_vector(2 downto 0) - ); + + conf_i : in std_logic_vector(15 downto 0); + req_i : in std_logic_vector(7 downto 0); + next_i : in std_logic; + + sel : out std_logic_vector(2 downto 0) + ); end component; - signal s_wb_cyc_o : std_logic; + signal s_wb_cyc_o : std_logic; signal s_msel_simple, s_msel_pe, s_msel : std_logic_vector(2 downto 0); - signal s_next : std_logic; - signal s_mcyc : std_logic_vector(7 downto 0); - signal s_arb_req_i : std_logic_vector(7 downto 0); + signal s_next : std_logic; + signal s_mcyc : std_logic_vector(7 downto 0); + signal s_arb_req_i : std_logic_vector(7 downto 0); begin - wb_slave_o.cyc <= s_wb_cyc_o; + wb_slave_o.cyc <= s_wb_cyc_o; process(clk_i) begin - if(clk_i'event and clk_i='1') then + if(clk_i'event and clk_i = '1') then s_next <= not(s_wb_cyc_o); end if; end process; @@ -107,120 +108,120 @@ begin wb_masters_i(4).cyc & wb_masters_i(3).cyc & wb_masters_i(2).cyc & wb_masters_i(1).cyc & wb_masters_i(0).cyc; --Prioritizing Arbiter - ARB: wb_conmax_arb + ARB : wb_conmax_arb port map( clk_i => clk_i, rst_i => rst_i, - - req_i => s_arb_req_i, - gnt_o => s_msel_simple, - next_i=> '0' --no round robin - ); - - MSEL: wb_conmax_msel + + req_i => s_arb_req_i, + gnt_o => s_msel_simple, + next_i => '0' --no round robin + ); + + MSEL : wb_conmax_msel generic map( g_pri_sel => g_pri_sel - ) + ) port map( clk_i => clk_i, rst_i => rst_i, - + conf_i => conf_i, req_i => s_arb_req_i, next_i => s_next, sel => s_msel_pe - ); - - G1: if(g_pri_sel=0) generate - s_msel <= s_msel_simple; - end generate; - G2: if(g_pri_sel/=0) generate - s_msel <= s_msel_pe; - end generate; - - - ------------------------------------- - --Address & Data Pass - wb_slave_o.addr <= wb_masters_i(0).addr when(s_msel="000") else - wb_masters_i(1).addr when(s_msel="001") else - wb_masters_i(2).addr when(s_msel="010") else - wb_masters_i(3).addr when(s_msel="011") else - wb_masters_i(4).addr when(s_msel="100") else - wb_masters_i(5).addr when(s_msel="101") else - wb_masters_i(6).addr when(s_msel="110") else - wb_masters_i(7).addr when(s_msel="111") else - (others=>'0'); - - wb_slave_o.sel <= wb_masters_i(0).sel when(s_msel="000") else - wb_masters_i(1).sel when(s_msel="001") else - wb_masters_i(2).sel when(s_msel="010") else - wb_masters_i(3).sel when(s_msel="011") else - wb_masters_i(4).sel when(s_msel="100") else - wb_masters_i(5).sel when(s_msel="101") else - wb_masters_i(6).sel when(s_msel="110") else - wb_masters_i(7).sel when(s_msel="111") else - (others=>'0'); - - wb_slave_o.data <= wb_masters_i(0).data when(s_msel="000") else - wb_masters_i(1).data when(s_msel="001") else - wb_masters_i(2).data when(s_msel="010") else - wb_masters_i(3).data when(s_msel="011") else - wb_masters_i(4).data when(s_msel="100") else - wb_masters_i(5).data when(s_msel="101") else - wb_masters_i(6).data when(s_msel="110") else - wb_masters_i(7).data when(s_msel="111") else - (others=>'0'); + ); + + G1 : if(g_pri_sel = 0) generate + s_msel <= s_msel_simple; + end generate; + G2 : if(g_pri_sel /= 0) generate + s_msel <= s_msel_pe; + end generate; + + + ------------------------------------- + --Address & Data Pass + wb_slave_o.adr <= wb_masters_i(0).adr when(s_msel = "000") else + wb_masters_i(1).adr when(s_msel = "001") else + wb_masters_i(2).adr when(s_msel = "010") else + wb_masters_i(3).adr when(s_msel = "011") else + wb_masters_i(4).adr when(s_msel = "100") else + wb_masters_i(5).adr when(s_msel = "101") else + wb_masters_i(6).adr when(s_msel = "110") else + wb_masters_i(7).adr when(s_msel = "111") else + (others => '0'); + + wb_slave_o.sel <= wb_masters_i(0).sel when(s_msel = "000") else + wb_masters_i(1).sel when(s_msel = "001") else + wb_masters_i(2).sel when(s_msel = "010") else + wb_masters_i(3).sel when(s_msel = "011") else + wb_masters_i(4).sel when(s_msel = "100") else + wb_masters_i(5).sel when(s_msel = "101") else + wb_masters_i(6).sel when(s_msel = "110") else + wb_masters_i(7).sel when(s_msel = "111") else + (others => '0'); + + wb_slave_o.dat <= wb_masters_i(0).dat when(s_msel = "000") else + wb_masters_i(1).dat when(s_msel = "001") else + wb_masters_i(2).dat when(s_msel = "010") else + wb_masters_i(3).dat when(s_msel = "011") else + wb_masters_i(4).dat when(s_msel = "100") else + wb_masters_i(5).dat when(s_msel = "101") else + wb_masters_i(6).dat when(s_msel = "110") else + wb_masters_i(7).dat when(s_msel = "111") else + (others => '0'); - G_OUT: for I in 0 to 7 generate - wb_masters_o(I).data <= wb_slave_i.data; - wb_masters_o(I).ack <= wb_slave_i.ack when(s_msel= std_logic_vector( - to_unsigned(I, 3)) ) else '0'; - wb_masters_o(I).err <= wb_slave_i.err when(s_msel= std_logic_vector( - to_unsigned(I, 3)) ) else '0'; - wb_masters_o(I).rty <= wb_slave_i.rty when(s_msel= std_logic_vector( - to_unsigned(I, 3)) ) else '0'; - end generate; - - ------------------------------------ - --Control Signal Pass - wb_slave_o.we <= wb_masters_i(0).we when(s_msel="000") else - wb_masters_i(1).we when(s_msel="001") else - wb_masters_i(2).we when(s_msel="010") else - wb_masters_i(3).we when(s_msel="011") else - wb_masters_i(4).we when(s_msel="100") else - wb_masters_i(5).we when(s_msel="101") else - wb_masters_i(6).we when(s_msel="110") else - wb_masters_i(7).we when(s_msel="111") else - '0'; - - process(clk_i) - begin - if(clk_i'event and clk_i='1') then - s_mcyc(7 downto 0) <= wb_masters_i(7).cyc & wb_masters_i(6).cyc & - wb_masters_i(5).cyc & wb_masters_i(4).cyc & wb_masters_i(3).cyc & - wb_masters_i(2).cyc & wb_masters_i(1).cyc & wb_masters_i(0).cyc; - - end if; - end process; - - s_wb_cyc_o <= wb_masters_i(0).cyc and s_mcyc(0) when(s_msel="000") else - wb_masters_i(1).cyc and s_mcyc(1) when(s_msel="001") else - wb_masters_i(2).cyc and s_mcyc(2) when(s_msel="010") else - wb_masters_i(3).cyc and s_mcyc(3) when(s_msel="011") else - wb_masters_i(4).cyc and s_mcyc(4) when(s_msel="100") else - wb_masters_i(5).cyc and s_mcyc(5) when(s_msel="101") else - wb_masters_i(6).cyc and s_mcyc(6) when(s_msel="110") else - wb_masters_i(7).cyc and s_mcyc(7) when(s_msel="111") else - '0'; - - wb_slave_o.stb <= wb_masters_i(0).stb when(s_msel="000") else - wb_masters_i(1).stb when(s_msel="001") else - wb_masters_i(2).stb when(s_msel="010") else - wb_masters_i(3).stb when(s_msel="011") else - wb_masters_i(4).stb when(s_msel="100") else - wb_masters_i(5).stb when(s_msel="101") else - wb_masters_i(6).stb when(s_msel="110") else - wb_masters_i(7).stb when(s_msel="111") else - '0'; + G_OUT : for I in 0 to 7 generate + wb_masters_o(I).dat <= wb_slave_i.dat; + wb_masters_o(I).ack <= wb_slave_i.ack when(s_msel = std_logic_vector( + to_unsigned(I, 3)) ) else '0'; + wb_masters_o(I).err <= wb_slave_i.err when(s_msel = std_logic_vector( + to_unsigned(I, 3)) ) else '0'; + wb_masters_o(I).rty <= wb_slave_i.rty when(s_msel = std_logic_vector( + to_unsigned(I, 3)) ) else '0'; + end generate; + + ------------------------------------ + --Control Signal Pass + wb_slave_o.we <= wb_masters_i(0).we when(s_msel = "000") else + wb_masters_i(1).we when(s_msel = "001") else + wb_masters_i(2).we when(s_msel = "010") else + wb_masters_i(3).we when(s_msel = "011") else + wb_masters_i(4).we when(s_msel = "100") else + wb_masters_i(5).we when(s_msel = "101") else + wb_masters_i(6).we when(s_msel = "110") else + wb_masters_i(7).we when(s_msel = "111") else + '0'; + + process(clk_i) + begin + if(clk_i'event and clk_i = '1') then + s_mcyc(7 downto 0) <= wb_masters_i(7).cyc & wb_masters_i(6).cyc & + wb_masters_i(5).cyc & wb_masters_i(4).cyc & wb_masters_i(3).cyc & + wb_masters_i(2).cyc & wb_masters_i(1).cyc & wb_masters_i(0).cyc; + + end if; + end process; + + s_wb_cyc_o <= wb_masters_i(0).cyc and s_mcyc(0) when(s_msel = "000") else + wb_masters_i(1).cyc and s_mcyc(1) when(s_msel = "001") else + wb_masters_i(2).cyc and s_mcyc(2) when(s_msel = "010") else + wb_masters_i(3).cyc and s_mcyc(3) when(s_msel = "011") else + wb_masters_i(4).cyc and s_mcyc(4) when(s_msel = "100") else + wb_masters_i(5).cyc and s_mcyc(5) when(s_msel = "101") else + wb_masters_i(6).cyc and s_mcyc(6) when(s_msel = "110") else + wb_masters_i(7).cyc and s_mcyc(7) when(s_msel = "111") else + '0'; + + wb_slave_o.stb <= wb_masters_i(0).stb when(s_msel = "000") else + wb_masters_i(1).stb when(s_msel = "001") else + wb_masters_i(2).stb when(s_msel = "010") else + wb_masters_i(3).stb when(s_msel = "011") else + wb_masters_i(4).stb when(s_msel = "100") else + wb_masters_i(5).stb when(s_msel = "101") else + wb_masters_i(6).stb when(s_msel = "110") else + wb_masters_i(7).stb when(s_msel = "111") else + '0'; end bahaviour; diff --git a/modules/wishbone/wb_conmax/wb_conmax_top.vhd b/modules/wishbone/wb_conmax/wb_conmax_top.vhd index 377485eb..78c21e5d 100644 --- a/modules/wishbone/wb_conmax/wb_conmax_top.vhd +++ b/modules/wishbone/wb_conmax/wb_conmax_top.vhd @@ -6,7 +6,7 @@ -- Author : Grzegorz Daniluk -- Company : Elproma -- Created : 2011-02-12 --- Last update: 2010-02-16 +-- Last update: 2011-09-14 -- Platform : FPGA-generics -- Standard : VHDL ------------------------------------------------------------------------------- @@ -106,8 +106,9 @@ architecture struct of wb_conmax_top is end component; - signal intwb_s15_i : t_wb_o; - signal intwb_s15_o : t_wb_i; + signal intwb_s15_i : t_wishbone_master_in; + signal intwb_s15_o : t_wishbone_master_out; + --M0Sx signal m0_slaves_i : t_conmax_slaves_i; diff --git a/modules/wishbone/wb_conmax/wbconmax_pkg.vhd b/modules/wishbone/wb_conmax/wbconmax_pkg.vhd index a3497ce2..c1d90b3c 100644 --- a/modules/wishbone/wb_conmax/wbconmax_pkg.vhd +++ b/modules/wishbone/wb_conmax/wbconmax_pkg.vhd @@ -6,7 +6,7 @@ -- Author : Grzegorz Daniluk -- Company : Elproma -- Created : 2011-02-16 --- Last update: 2010-02-16 +-- Last update: 2011-09-12 -- Platform : FPGA-generics -- Standard : VHDL ------------------------------------------------------------------------------- @@ -26,38 +26,9 @@ use ieee.std_logic_1164.all; package wbconmax_pkg is - type t_rf_conf is array(0 to 15) of std_logic_vector(15 downto 0); + type t_conmax_rf_conf is array(0 to 15) of std_logic_vector(15 downto 0); + type t_conmax_pri_sel is array(0 to 15) of integer range 0 to 3; - constant c_dw : integer := 32; --data width - constant c_aw : integer := 18; --address width = max 14b (for dpram) + 4b - --for wb_intercom (Mst selects Slave) - constant c_sw : integer := 4; -- c_dw/8 - - --g_pri_selx := 0 (1 priority level), 1 (2 pri levels) or 2 (4 pri levels). - type t_pri_sels is array(0 to 15) of integer range 0 to 3; - constant g_pri_sel : t_pri_sels := (2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2); - - --as in original WB conmax spec and implementation, those are - --inputs fed by WB Master from outside - type t_wb_i is record - data : std_logic_vector(c_dw-1 downto 0); - addr : std_logic_vector(c_aw-1 downto 0); - sel : std_logic_vector(c_sw-1 downto 0); - we : std_logic; - cyc : std_logic; - stb : std_logic; - end record; - - type t_wb_o is record - data : std_logic_vector(c_dw-1 downto 0); - ack : std_logic; - err : std_logic; - rty : std_logic; - end record; - - type t_conmax_masters_i is array(0 to 7) of t_wb_i; - type t_conmax_masters_o is array(0 to 7) of t_wb_o; - type t_conmax_slaves_i is array(0 to 15) of t_wb_o; - type t_conmax_slaves_o is array(0 to 15) of t_wb_i; + constant c_conmax_default_pri_sel : t_conmax_pri_sel := (2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2); end wbconmax_pkg; diff --git a/modules/wishbone/wb_conmax/xwb_conmax.vhd b/modules/wishbone/wb_conmax/xwb_conmax.vhd new file mode 100644 index 00000000..fec1e80b --- /dev/null +++ b/modules/wishbone/wb_conmax/xwb_conmax.vhd @@ -0,0 +1,242 @@ +library ieee; +use ieee.std_logic_1164.all; + +use work.wishbone_pkg.all; +use work.wbconmax_pkg.all; + +entity xwb_conmax is + + generic ( + g_rf_addr : integer := 15; + g_num_slaves : integer; + g_num_masters : integer; + g_adr_width : integer; + g_sel_width : integer; + g_dat_width : integer; + g_priority_sel : t_conmax_pri_sel := c_conmax_default_pri_sel); + + port( + clk_sys_i : in std_logic; + rst_n_i : in std_logic; + + slave_i : in t_wishbone_slave_in_array(0 to g_num_slaves-1); + slave_o : out t_wishbone_slave_out_array(0 to g_num_slaves-1); + + master_i : in t_wishbone_master_in_array(0 to g_num_masters-1); + master_o : out t_wishbone_master_out_array(0 to g_num_masters-1) + ); +end xwb_conmax; + +architecture rtl of xwb_conmax is + + component wb_conmax_master_if + generic ( + g_adr_width : integer; + g_sel_width : integer; + g_dat_width : integer); + port ( + clk_i : in std_logic; + rst_i : in std_logic; + wb_master_i : in t_wishbone_slave_in; + wb_master_o : out t_wishbone_slave_out; + wb_slaves_i : in t_wishbone_master_in_array(0 to 15); + wb_slaves_o : out t_wishbone_master_out_array(0 to 15)); + end component; + + component wb_conmax_slave_if + generic ( + g_pri_sel : integer); + port ( + clk_i : in std_logic; + rst_i : in std_logic; + conf_i : in std_logic_vector(15 downto 0); + wb_slave_i : in t_wishbone_master_in; + wb_slave_o : out t_wishbone_master_out; + wb_masters_i : in t_wishbone_slave_in_array(0 to 7); + wb_masters_o : out t_wishbone_slave_out_array(0 to 7)); + end component; + + + component wb_conmax_rf + generic ( + g_rf_addr : integer range 0 to 15; + g_adr_width : integer; + g_sel_width : integer; + g_dat_width : integer); + port ( + clk_i : in std_logic; + rst_i : in std_logic; + int_wb_i : in t_wishbone_slave_in; + int_wb_o : out t_wishbone_slave_out; + ext_wb_i : in t_wishbone_master_in; + ext_wb_o : out t_wishbone_master_out; + conf_o : out t_conmax_rf_conf); + end component; + + signal intwb_s15_i : t_wishbone_master_in; + signal intwb_s15_o : t_wishbone_master_out; + + type t_conmax_slave_mux_in_array is array(integer range <>) of t_wishbone_master_in_array(0 to 15); + + type t_conmax_slave_mux_out_array is array(integer range <>) of t_wishbone_master_out_array(0 to 15); + + --M0Sx + signal m_slaves_in : t_conmax_slave_mux_in_array(0 to 7); + signal m_slaves_out : t_conmax_slave_mux_out_array(0 to 7); + + + signal s_conf : t_conmax_rf_conf; + + signal s15_wb_masters_i : t_wishbone_slave_in_array(0 to 7); + signal s15_wb_masters_o : t_wishbone_slave_out_array(0 to 7); + + signal rst : std_logic; + + signal slave_i_int : t_wishbone_slave_in_array(0 to 7); + signal slave_o_int : t_wishbone_slave_out_array(0 to 7); + signal master_i_int : t_wishbone_master_in_array(0 to 15); + signal master_o_int : t_wishbone_master_out_array(0 to 15); + +begin -- rtl + + rst <= not rst_n_i; + + + gen_real_masters : for i in 0 to g_num_slaves-1 generate + slave_i_int(i) <= slave_i(i); + slave_o(i) <= slave_o_int(i); + end generate gen_real_masters; + + gen_dummy_masters : for i in g_num_slaves to 7 generate + slave_i_int(i).cyc <= '0'; + slave_i_int(i).stb <= '0'; + slave_i_int(i).we <= '0'; + slave_i_int(i).adr <= (others => '0'); + slave_i_int(i).dat <= (others => '0'); + end generate gen_dummy_masters; + + gen_master_ifs : for i in 0 to 7 generate + U_Master_IF : wb_conmax_master_if + generic map ( + g_adr_width => g_adr_width, + g_sel_width => g_sel_width, + g_dat_width => g_dat_width) + port map( + clk_i => clk_sys_i, + rst_i => rst, + + --Master interface + wb_master_i => slave_i_int(i), + wb_master_o => slave_o_int(i), + --Slaves(0 to 15) interface + wb_slaves_i => m_slaves_in(i), + wb_slaves_o => m_slaves_out(i) + ); + end generate gen_master_ifs; + + gen_slave_ifs : for i in 0 to 14 generate + U_Slave_IF : wb_conmax_slave_if + generic map( + g_pri_sel => g_priority_sel(i) + ) + port map( + clk_i => clk_sys_i, + rst_i => rst, + conf_i => s_conf(i), + + --Slave interface + wb_slave_i => master_i_int(I), + wb_slave_o => master_o_int(I), + + --Interfaces to masters + wb_masters_i(0) => m_slaves_out(0)(I), + wb_masters_i(1) => m_slaves_out(1)(I), + wb_masters_i(2) => m_slaves_out(2)(I), + wb_masters_i(3) => m_slaves_out(3)(I), + wb_masters_i(4) => m_slaves_out(4)(I), + wb_masters_i(5) => m_slaves_out(5)(I), + wb_masters_i(6) => m_slaves_out(6)(I), + wb_masters_i(7) => m_slaves_out(7)(I), + + wb_masters_o(0) => m_slaves_in(0)(i), + wb_masters_o(1) => m_slaves_in(1)(I), + wb_masters_o(2) => m_slaves_in(2)(I), + wb_masters_o(3) => m_slaves_in(3)(I), + wb_masters_o(4) => m_slaves_in(4)(I), + wb_masters_o(5) => m_slaves_in(5)(I), + wb_masters_o(6) => m_slaves_in(6)(I), + wb_masters_o(7) => m_slaves_in(7)(I) + ); + + end generate gen_slave_ifs; + + s15_wb_masters_i(0) <= m_slaves_out(0)(15); + s15_wb_masters_i(1) <= m_slaves_out(1)(15); + s15_wb_masters_i(2) <= m_slaves_out(2)(15); + s15_wb_masters_i(3) <= m_slaves_out(3)(15); + s15_wb_masters_i(4) <= m_slaves_out(4)(15); + s15_wb_masters_i(5) <= m_slaves_out(5)(15); + s15_wb_masters_i(6) <= m_slaves_out(6)(15); + s15_wb_masters_i(7) <= m_slaves_out(7)(15); + + m_slaves_in(0)(15) <= s15_wb_masters_o(0); + m_slaves_in(1)(15) <= s15_wb_masters_o(1); + m_slaves_in(2)(15) <= s15_wb_masters_o(2); + m_slaves_in(3)(15) <= s15_wb_masters_o(3); + m_slaves_in(4)(15) <= s15_wb_masters_o(4); + m_slaves_in(5)(15) <= s15_wb_masters_o(5); + m_slaves_in(6)(15) <= s15_wb_masters_o(6); + m_slaves_in(7)(15) <= s15_wb_masters_o(7); + + U_Slave15 : wb_conmax_slave_if + generic map( + g_pri_sel => g_priority_sel(15) + ) + port map( + clk_i => clk_sys_i, + rst_i => rst, + conf_i => s_conf(15), + + --Slave interface + wb_slave_i => intwb_s15_i, + wb_slave_o => intwb_s15_o, + + --Interfaces to masters + wb_masters_i => s15_wb_masters_i, + wb_masters_o => s15_wb_masters_o + ); + + U_Reg_File : wb_conmax_rf + generic map( + g_rf_addr => g_rf_addr, + g_adr_width => g_adr_width, + g_sel_width => g_sel_width, + g_dat_width => g_dat_width + ) + port map( + clk_i => clk_sys_i, + rst_i => rst, + + int_wb_i => intwb_s15_o, + int_wb_o => intwb_s15_i, + ext_wb_i => master_i_int(15), + ext_wb_o => master_o_int(15), + + conf_o => s_conf + ); + + + gen_slaves_ports : for i in 0 to g_num_masters-1 generate + master_o(i) <= master_o_int(i); + master_i_int(i) <= master_i(i); + end generate gen_slaves_ports; + + gen_unused_slave_ports : for i in g_num_masters to 15 generate + master_i_int(i).ack <= '0'; + master_i_int(i).err <= '0'; + master_i_int(i).rty <= '0'; + end generate gen_unused_slave_ports; + + +end rtl; + -- GitLab