LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
-USE IEEE.std_logic_UNSIGNED.ALL;
USE IEEE.numeric_std.ALL;
+USE IEEE.std_logic_UNSIGNED.ALL;
use work.trb_net_std.all;
+use work.trb_net16_hub_func.all;
entity trb_net16_hub_base is
NUM_WIDTH : integer range 2 to 2 := 2;
--media interfaces
MII_NUMBER : integer range 2 to 16 := 2;
- MII_INIT_DEPTH : std_logic_vector(MII_NUMBER*2**(MUX_WIDTH-1)*4-1 downto 0) := x"66110000";
- MII_REPLY_DEPTH : std_logic_vector(MII_NUMBER*2**(MUX_WIDTH-1)*4-1 downto 0) := x"66110000";
+--each row is one media interface and each column is one channel. starting with 0,0, ending with 15,15
+ MII_INIT_DEPTH : hub_iobuf_config_t := (1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1);
+ MII_REPLY_DEPTH : hub_iobuf_config_t := (1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 6,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 6,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1);
-- settings for apis
API_NUMBER : integer range 0 to 16 := 1;
- API_CHANNELS : bit_vector(API_NUMBER*4-1 downto 0) := x"3";
+ API_CHANNELS : hub_api_config_t := (3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3);
--channel, each api is connected to
- API_TYPE : bit_vector(API_NUMBER*4-1 downto 0) := x"1";
- API_INIT_DEPTH : bit_vector(API_NUMBER*4-1 downto 0) := x"1";
- API_REPLY_DEPTH : bit_vector(API_NUMBER*4-1 downto 0) := x"1";
- API_FIFO_TO_INT_DEPTH : bit_vector(API_NUMBER*4-1 downto 0) := x"1";
- API_FIFO_TO_APL_DEPTH : bit_vector(API_NUMBER*4-1 downto 0) := x"1";
+ API_TYPE : hub_api_config_t := (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+ API_INIT_DEPTH : hub_api_config_t := (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+ API_REPLY_DEPTH : hub_api_config_t := (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+ API_FIFO_TO_INT_DEPTH : hub_api_config_t := (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+ API_FIFO_TO_APL_DEPTH : hub_api_config_t := (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
--trigger reading interfaces
TRG_NUMBER : integer range 0 to 16 := 1;
- TRG_CHANNELS : bit_vector(TRG_NUMBER*4-1 downto 0) := x"0"
+ TRG_CHANNELS : hub_api_config_t := (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
);
port (
CLK : in std_logic;
TRG_ERROR_PATTERN_IN : in std_logic_vector (TRG_NUMBER*32 downto 0);
TRG_RELEASE_IN : in std_logic_vector (TRG_NUMBER downto 0);
--Status ports (for debugging)
- HUB_STAT_CHANNEL : out std_logic_vector (2**(MUX_WIDTH-1)*32-1 downto 0);
- HUB_STAT_GEN : out std_logic_vector (31 downto 0);
- HUB_CTRL_CHANNEL : in std_logic_vector (2**(MUX_WIDTH-1)*32-1 downto 0);
- HUB_CTRL_activepoints : in std_logic_vector (2**(MUX_WIDTH-1)*32-1 downto 0);
- HUB_CTRL_GEN : in std_logic_vector (31 downto 0);
- MPLEX_CTRL : in std_logic_vector (MII_NUMBER*32-1 downto 0);
- MPLEX_STAT : out std_logic_vector (MII_NUMBER*32-1 downto 0);
- IOBUF_STAT_GEN : out std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER*32-1 downto 0);
- IOBUF_STAT_LOCKED : out std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER*32-1 downto 0);
- IOBUF_STAT_INIT_BUFFER : out std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER*32-1 downto 0);
- IOBUF_STAT_REPLY_BUFFER : out std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER*32-1 downto 0);
- IOBUF_CTRL_GEN : in std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER*32-1 downto 0);
- IOBUF_CTRL_LOCKED : in std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER*32-1 downto 0);
- IOBUF_STAT_CTRL_INIT_BUFFER : in std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER*32-1 downto 0);
- IOBUF_STAT_CTRL_REPLY_BUFFER : in std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER*32-1 downto 0)
+ HUB_STAT_CHANNEL : out std_logic_vector (2**(MUX_WIDTH-1)*32-1 downto 0);
+ HUB_STAT_GEN : out std_logic_vector (31 downto 0);
+ HUB_CTRL_CHANNEL : in std_logic_vector (2**(MUX_WIDTH-1)*32-1 downto 0);
+ HUB_CTRL_activepoints : in std_logic_vector (2**(MUX_WIDTH-1)*32-1 downto 0);
+ HUB_CTRL_GEN : in std_logic_vector (31 downto 0);
+ MPLEX_CTRL : in std_logic_vector (MII_NUMBER*32-1 downto 0);
+ MPLEX_STAT : out std_logic_vector (MII_NUMBER*32-1 downto 0);
+ IOBUF_STAT_GEN : out std_logic_vector ((MII_NUMBER*2**(MUX_WIDTH-1) + API_NUMBER + TRG_NUMBER)*32-1 downto 0);
+ IOBUF_STAT_LOCKED : out std_logic_vector ((MII_NUMBER*2**(MUX_WIDTH-1) + API_NUMBER + TRG_NUMBER)*32-1 downto 0);
+ IOBUF_STAT_INIT_BUFFER : out std_logic_vector ((MII_NUMBER*2**(MUX_WIDTH-1) + API_NUMBER + TRG_NUMBER)*32-1 downto 0);
+ IOBUF_STAT_REPLY_BUFFER : out std_logic_vector ((MII_NUMBER*2**(MUX_WIDTH-1) + API_NUMBER + TRG_NUMBER)*32-1 downto 0);
+ IOBUF_CTRL_GEN : in std_logic_vector ((MII_NUMBER*2**(MUX_WIDTH-1) + API_NUMBER + TRG_NUMBER)*32-1 downto 0);
+ IOBUF_CTRL_LOCKED : in std_logic_vector ((MII_NUMBER*2**(MUX_WIDTH-1) + API_NUMBER + TRG_NUMBER)*32-1 downto 0);
+ IOBUF_STAT_CTRL_INIT_BUFFER : in std_logic_vector ((MII_NUMBER*2**(MUX_WIDTH-1) + API_NUMBER + TRG_NUMBER)*32-1 downto 0);
+ IOBUF_STAT_CTRL_REPLY_BUFFER : in std_logic_vector ((MII_NUMBER*2**(MUX_WIDTH-1) + API_NUMBER + TRG_NUMBER)*32-1 downto 0)
);
end entity;
architecture trb_net16_hub_base_arch of trb_net16_hub_base is
+ constant total_point_num : integer := MII_NUMBER*2**(MUX_WIDTH-1) + API_NUMBER + TRG_NUMBER;
+ signal m_DATAREADY_OUT : std_logic_vector (total_point_num*2**MUX_WIDTH-1 downto 0);
+ signal m_DATA_OUT : std_logic_vector (total_point_num*DATA_WIDTH*2**MUX_WIDTH-1 downto 0);
+ signal m_PACKET_NUM_OUT: std_logic_vector (total_point_num*NUM_WIDTH*2**MUX_WIDTH-1 downto 0);
+ signal m_READ_IN : std_logic_vector (total_point_num*2**MUX_WIDTH-1 downto 0);
+ signal m_DATAREADY_IN : std_logic_vector (total_point_num*2**MUX_WIDTH-1 downto 0);
+ signal m_DATA_IN : std_logic_vector (total_point_num*DATA_WIDTH*2**MUX_WIDTH-1 downto 0);
+ signal m_PACKET_NUM_IN : std_logic_vector (total_point_num*NUM_WIDTH*2**MUX_WIDTH-1 downto 0);
+ signal m_READ_OUT : std_logic_vector (total_point_num*2**MUX_WIDTH-1 downto 0);
+ signal m_ERROR_IN : std_logic_vector (total_point_num*3*2**MUX_WIDTH-1 downto 0);
- signal m_DATAREADY_OUT : std_logic_vector (MII_NUMBER*2**MUX_WIDTH-1 downto 0);
- signal m_DATA_OUT : std_logic_vector (MII_NUMBER*DATA_WIDTH*2**MUX_WIDTH-1 downto 0);
- signal m_PACKET_NUM_OUT: std_logic_vector (MII_NUMBER*NUM_WIDTH*2**MUX_WIDTH-1 downto 0);
- signal m_READ_IN : std_logic_vector (MII_NUMBER*2**MUX_WIDTH-1 downto 0);
- signal m_DATAREADY_IN : std_logic_vector (MII_NUMBER*2**MUX_WIDTH-1 downto 0);
- signal m_DATA_IN : std_logic_vector (MII_NUMBER*DATA_WIDTH*2**MUX_WIDTH-1 downto 0);
- signal m_PACKET_NUM_IN : std_logic_vector (MII_NUMBER*NUM_WIDTH*2**MUX_WIDTH-1 downto 0);
- signal m_READ_OUT : std_logic_vector (MII_NUMBER*2**MUX_WIDTH-1 downto 0);
- signal m_ERROR_IN : std_logic_vector (MII_NUMBER*3*2**MUX_WIDTH-1 downto 0);
+ signal hub_to_buf_INIT_DATAREADY: std_logic_vector (2**(MUX_WIDTH-1)*total_point_num-1 downto 0);
+ signal hub_to_buf_INIT_DATA : std_logic_vector (2**(MUX_WIDTH-1)*total_point_num*DATA_WIDTH-1 downto 0);
+ signal hub_to_buf_INIT_PACKET_NUM:std_logic_vector (2**(MUX_WIDTH-1)*total_point_num*NUM_WIDTH-1 downto 0);
+ signal hub_to_buf_INIT_READ : std_logic_vector (2**(MUX_WIDTH-1)*total_point_num-1 downto 0);
- signal hub_to_buf_INIT_DATAREADY: std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER-1 downto 0);
- signal hub_to_buf_INIT_DATA : std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER*DATA_WIDTH-1 downto 0);
- signal hub_to_buf_INIT_PACKET_NUM:std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER*NUM_WIDTH-1 downto 0);
- signal hub_to_buf_INIT_READ : std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER-1 downto 0);
+ signal buf_to_hub_INIT_DATAREADY: std_logic_vector (2**(MUX_WIDTH-1)*total_point_num-1 downto 0);
+ signal buf_to_hub_INIT_DATA : std_logic_vector (2**(MUX_WIDTH-1)*total_point_num*DATA_WIDTH-1 downto 0);
+ signal buf_to_hub_INIT_PACKET_NUM:std_logic_vector (2**(MUX_WIDTH-1)*total_point_num*NUM_WIDTH-1 downto 0);
+ signal buf_to_hub_INIT_READ : std_logic_vector (2**(MUX_WIDTH-1)*total_point_num-1 downto 0);
- signal buf_to_hub_INIT_DATAREADY: std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER-1 downto 0);
- signal buf_to_hub_INIT_DATA : std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER*DATA_WIDTH-1 downto 0);
- signal buf_to_hub_INIT_PACKET_NUM:std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER*NUM_WIDTH-1 downto 0);
- signal buf_to_hub_INIT_READ : std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER-1 downto 0);
-
- signal hub_to_buf_REPLY_DATAREADY: std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER-1 downto 0);
- signal hub_to_buf_REPLY_DATA : std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER*DATA_WIDTH-1 downto 0);
- signal hub_to_buf_REPLY_PACKET_NUM:std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER*NUM_WIDTH-1 downto 0);
- signal hub_to_buf_REPLY_READ : std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER-1 downto 0);
- signal hub_to_buf_REPLY_SEND_HEADER : std_logic_vector(2**(MUX_WIDTH-1)*MII_NUMBER-1 downto 0);
-
- signal buf_to_hub_REPLY_DATAREADY: std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER-1 downto 0);
- signal buf_to_hub_REPLY_DATA : std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER*DATA_WIDTH-1 downto 0);
- signal buf_to_hub_REPLY_PACKET_NUM:std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER*NUM_WIDTH-1 downto 0);
- signal buf_to_hub_REPLY_READ : std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER-1 downto 0);
- signal buf_to_hub_REPLY_SEND_HEADER : std_logic_vector(2**(MUX_WIDTH-1)*MII_NUMBER-1 downto 0);
+ signal hub_to_buf_REPLY_DATAREADY: std_logic_vector (2**(MUX_WIDTH-1)*total_point_num-1 downto 0);
+ signal hub_to_buf_REPLY_DATA : std_logic_vector (2**(MUX_WIDTH-1)*total_point_num*DATA_WIDTH-1 downto 0);
+ signal hub_to_buf_REPLY_PACKET_NUM:std_logic_vector (2**(MUX_WIDTH-1)*total_point_num*NUM_WIDTH-1 downto 0);
+ signal hub_to_buf_REPLY_READ : std_logic_vector (2**(MUX_WIDTH-1)*total_point_num-1 downto 0);
+ signal hub_to_buf_REPLY_SEND_HEADER : std_logic_vector(2**(MUX_WIDTH-1)*total_point_num-1 downto 0);
+ signal buf_to_hub_REPLY_DATAREADY: std_logic_vector (2**(MUX_WIDTH-1)*total_point_num-1 downto 0);
+ signal buf_to_hub_REPLY_DATA : std_logic_vector (2**(MUX_WIDTH-1)*total_point_num*DATA_WIDTH-1 downto 0);
+ signal buf_to_hub_REPLY_PACKET_NUM:std_logic_vector (2**(MUX_WIDTH-1)*total_point_num*NUM_WIDTH-1 downto 0);
+ signal buf_to_hub_REPLY_READ : std_logic_vector (2**(MUX_WIDTH-1)*total_point_num-1 downto 0);
+ signal buf_to_hub_REPLY_SEND_HEADER : std_logic_vector(2**(MUX_WIDTH-1)*total_point_num-1 downto 0);
+
+ signal HUB_INIT_DATAREADY_OUT : std_logic_vector (2**(MUX_WIDTH-1)*total_point_num-1 downto 0);
+ signal HUB_INIT_DATA_OUT : std_logic_vector (2**(MUX_WIDTH-1)*total_point_num*DATA_WIDTH-1 downto 0);
+ signal HUB_INIT_PACKET_NUM_OUT : std_logic_vector (2**(MUX_WIDTH-1)*total_point_num*NUM_WIDTH-1 downto 0);
+ signal HUB_INIT_READ_IN : std_logic_vector (2**(MUX_WIDTH-1)*total_point_num-1 downto 0);
+ signal HUB_INIT_DATAREADY_IN : std_logic_vector (2**(MUX_WIDTH-1)*total_point_num-1 downto 0);
+ signal HUB_INIT_DATA_IN : std_logic_vector (2**(MUX_WIDTH-1)*total_point_num*DATA_WIDTH-1 downto 0);
+ signal HUB_INIT_PACKET_NUM_IN : std_logic_vector (2**(MUX_WIDTH-1)*total_point_num*NUM_WIDTH-1 downto 0);
+ signal HUB_INIT_READ_OUT : std_logic_vector (2**(MUX_WIDTH-1)*total_point_num-1 downto 0);
+ signal HUB_REPLY_DATAREADY_OUT : std_logic_vector (2**(MUX_WIDTH-1)*total_point_num-1 downto 0);
+ signal HUB_REPLY_DATA_OUT : std_logic_vector (2**(MUX_WIDTH-1)*total_point_num*DATA_WIDTH-1 downto 0);
+ signal HUB_REPLY_PACKET_NUM_OUT : std_logic_vector (2**(MUX_WIDTH-1)*total_point_num*NUM_WIDTH-1 downto 0);
+ signal HUB_REPLY_READ_IN : std_logic_vector (2**(MUX_WIDTH-1)*total_point_num-1 downto 0);
+ signal HUB_REPLY_DATAREADY_IN : std_logic_vector (2**(MUX_WIDTH-1)*total_point_num-1 downto 0);
+ signal HUB_REPLY_DATA_IN : std_logic_vector (2**(MUX_WIDTH-1)*total_point_num*DATA_WIDTH-1 downto 0);
+ signal HUB_REPLY_PACKET_NUM_IN : std_logic_vector (2**(MUX_WIDTH-1)*total_point_num*NUM_WIDTH-1 downto 0);
+ signal HUB_REPLY_READ_OUT : std_logic_vector (2**(MUX_WIDTH-1)*total_point_num-1 downto 0);
+ signal HUB_REPLY_SEND_HEADER_OUT : std_logic_vector (2**(MUX_WIDTH-1)*total_point_num-1 downto 0);
+
component trb_net16_hub_logic is
generic (
--media interfaces
end generate;
--generate IOBufs for MII
- gen_iobufs: for i in 0 to 2**(MUX_WIDTH-1)*MII_NUMBER-1 generate
+ gen_iobufs: for i in 0 to total_point_num-1 generate
IOBUF: trb_net16_iobuf
generic map (
- INIT_DEPTH => 1, --conv_integer(MII_INIT_DEPTH((i+1)*4-1 downto i*4)),
- REPLY_DEPTH => 1 --conv_integer(MII_REPLY_DEPTH((i+1)*4-1 downto i*4))
+ INIT_DEPTH => calc_depth(i,MII_INIT_DEPTH, API_INIT_DEPTH, MII_NUMBER, API_NUMBER, MUX_WIDTH),
+ REPLY_DEPTH => calc_depth(i,MII_REPLY_DEPTH, API_REPLY_DEPTH, MII_NUMBER, API_NUMBER, MUX_WIDTH)
)
port map (
-- Misc
STAT_CTRL_REPLY_BUFFER => IOBUF_STAT_CTRL_REPLY_BUFFER((i+1)*32-1 downto i*32)
);
end generate;
+
+--rearrange vectors for hub logic
+ gen_rearrange : for CHANNEL in 0 to 2**(MUX_WIDTH-1)-1 generate
+ constant api_num : integer := calc_special_number(CHANNEL, API_NUMBER, API_CHANNELS);
+ constant trg_num : integer := calc_special_number(CHANNEL, TRG_NUMBER, TRG_CHANNELS);
+ constant first_point_num : integer := calc_first_point_number(MII_NUMBER, CHANNEL, API_NUMBER, API_CHANNELS, TRG_NUMBER, TRG_CHANNELS);
+ begin
+ gen_hublogicsignals1 : for mii in 0 to MII_NUMBER-1 generate
+ constant buf_to_hub_num : integer := mii*2**(MUX_WIDTH-1)+CHANNEL;
+ constant hublogic_num : integer := first_point_num + mii;
+ begin
+ HUB_INIT_DATAREADY_IN (hublogic_num)
+ <= buf_to_hub_INIT_DATAREADY(buf_to_hub_num);
+ HUB_INIT_DATA_IN ((hublogic_num+1)*16-1 downto hublogic_num*16)
+ <= buf_to_hub_INIT_DATA((buf_to_hub_num+1)*16-1 downto buf_to_hub_num*16);
+ HUB_INIT_PACKET_NUM_IN ((hublogic_num+1)*2-1 downto hublogic_num*2)
+ <= buf_to_hub_INIT_PACKET_NUM((buf_to_hub_num+1)*2-1 downto buf_to_hub_num*2);
+ buf_to_hub_INIT_READ(buf_to_hub_num)
+ <= HUB_INIT_READ_OUT(hublogic_num);
+
+ hub_to_buf_INIT_DATAREADY(buf_to_hub_num)
+ <= HUB_INIT_DATAREADY_OUT(hublogic_num);
+ hub_to_buf_INIT_DATA((buf_to_hub_num+1)*16-1 downto buf_to_hub_num*16)
+ <= HUB_INIT_DATA_OUT((hublogic_num+1)*16-1 downto hublogic_num*16);
+ hub_to_buf_INIT_PACKET_NUM((buf_to_hub_num+1)*2-1 downto buf_to_hub_num*2)
+ <= HUB_INIT_PACKET_NUM_OUT((hublogic_num+1)*2-1 downto hublogic_num*2);
+ HUB_INIT_READ_IN (hublogic_num)
+ <= hub_to_buf_INIT_READ(buf_to_hub_num);
+
+ HUB_REPLY_DATAREADY_IN (hublogic_num)
+ <= buf_to_hub_REPLY_DATAREADY(buf_to_hub_num);
+ HUB_REPLY_DATA_IN ((hublogic_num+1)*16-1 downto hublogic_num*16)
+ <= buf_to_hub_REPLY_DATA((buf_to_hub_num+1)*16-1 downto buf_to_hub_num*16);
+ HUB_REPLY_PACKET_NUM_IN ((hublogic_num+1)*2-1 downto hublogic_num*2)
+ <= buf_to_hub_REPLY_PACKET_NUM((buf_to_hub_num+1)*2-1 downto buf_to_hub_num*2);
+ buf_to_hub_REPLY_READ(buf_to_hub_num)
+ <= HUB_REPLY_READ_OUT(hublogic_num);
+
+ hub_to_buf_REPLY_DATAREADY(buf_to_hub_num)
+ <= HUB_REPLY_DATAREADY_OUT(hublogic_num);
+ hub_to_buf_REPLY_DATA((buf_to_hub_num+1)*16-1 downto buf_to_hub_num*16)
+ <= HUB_REPLY_DATA_OUT((hublogic_num+1)*16-1 downto hublogic_num*16);
+ hub_to_buf_REPLY_PACKET_NUM((buf_to_hub_num+1)*2-1 downto buf_to_hub_num*2)
+ <= HUB_REPLY_PACKET_NUM_OUT((hublogic_num+1)*2-1 downto hublogic_num*2);
+ HUB_REPLY_READ_IN (hublogic_num)
+ <= hub_to_buf_REPLY_READ(buf_to_hub_num);
+ end generate;
+
+ gen_hublogicsignals2 : for api in 0 to api_num-1 generate
+ constant hublogic_num : integer := first_point_num + 2**(MUX_WIDTH-1) + calc_special_number(CHANNEL, api, API_CHANNELS);
+ constant buf_to_hub_num : integer := 2**(MUX_WIDTH-1)*MII_NUMBER + calc_special_number(CHANNEL, api, API_CHANNELS);
+ begin
+ h1: if API_CHANNELS(api) = CHANNEL generate
+ HUB_INIT_DATAREADY_IN (hublogic_num)
+ <= buf_to_hub_INIT_DATAREADY(buf_to_hub_num);
+ HUB_INIT_DATA_IN ((hublogic_num+1)*16-1 downto hublogic_num*16)
+ <= buf_to_hub_INIT_DATA((buf_to_hub_num+1)*16-1 downto buf_to_hub_num*16);
+ HUB_INIT_PACKET_NUM_IN ((hublogic_num+1)*2-1 downto hublogic_num*2)
+ <= buf_to_hub_INIT_PACKET_NUM((buf_to_hub_num+1)*2-1 downto buf_to_hub_num*2);
+ buf_to_hub_INIT_READ(buf_to_hub_num)
+ <= HUB_INIT_READ_OUT(hublogic_num);
+
+ hub_to_buf_INIT_DATAREADY(buf_to_hub_num)
+ <= HUB_INIT_DATAREADY_OUT(hublogic_num);
+ hub_to_buf_INIT_DATA((buf_to_hub_num+1)*16-1 downto buf_to_hub_num*16)
+ <= HUB_INIT_DATA_OUT((hublogic_num+1)*16-1 downto hublogic_num*16);
+ hub_to_buf_INIT_PACKET_NUM((buf_to_hub_num+1)*2-1 downto buf_to_hub_num*2)
+ <= HUB_INIT_PACKET_NUM_OUT((hublogic_num+1)*2-1 downto hublogic_num*2);
+ HUB_INIT_READ_IN (hublogic_num)
+ <= hub_to_buf_INIT_READ(buf_to_hub_num);
+ HUB_REPLY_DATAREADY_IN (hublogic_num)
+ <= buf_to_hub_REPLY_DATAREADY(buf_to_hub_num);
+ HUB_REPLY_DATA_IN ((hublogic_num+1)*16-1 downto hublogic_num*16)
+ <= buf_to_hub_REPLY_DATA((buf_to_hub_num+1)*16-1 downto buf_to_hub_num*16);
+ HUB_REPLY_PACKET_NUM_IN ((hublogic_num+1)*2-1 downto hublogic_num*2)
+ <= buf_to_hub_REPLY_PACKET_NUM((buf_to_hub_num+1)*2-1 downto buf_to_hub_num*2);
+ buf_to_hub_REPLY_READ(buf_to_hub_num)
+ <= HUB_REPLY_READ_OUT(hublogic_num);
+
+ hub_to_buf_REPLY_DATAREADY(buf_to_hub_num)
+ <= HUB_REPLY_DATAREADY_OUT(hublogic_num);
+ hub_to_buf_REPLY_DATA((buf_to_hub_num+1)*16-1 downto buf_to_hub_num*16)
+ <= HUB_REPLY_DATA_OUT((hublogic_num+1)*16-1 downto hublogic_num*16);
+ hub_to_buf_REPLY_PACKET_NUM((buf_to_hub_num+1)*2-1 downto buf_to_hub_num*2)
+ <= HUB_REPLY_PACKET_NUM_OUT((hublogic_num+1)*2-1 downto hublogic_num*2);
+ HUB_REPLY_READ_IN (hublogic_num)
+ <= hub_to_buf_REPLY_READ(buf_to_hub_num);
+ end generate;
+ end generate;
+ g3: if trg_num /= 0 generate
+ gen_hublogicsignals3 : for trg in 0 to trg_num-1 generate
+ constant hublogic_num : integer := first_point_num + 2**(MUX_WIDTH-1) + api_num + calc_special_number(CHANNEL, trg, TRG_CHANNELS);
+ constant buf_to_hub_num : integer := 2**(MUX_WIDTH-1)*MII_NUMBER + api_num + calc_special_number(CHANNEL, trg, TRG_CHANNELS);
+ begin
+ h1: if TRG_CHANNELS(trg) = CHANNEL generate
+ HUB_INIT_DATAREADY_IN (hublogic_num)
+ <= buf_to_hub_INIT_DATAREADY(buf_to_hub_num);
+ HUB_INIT_DATA_IN ((hublogic_num+1)*16-1 downto hublogic_num*16)
+ <= buf_to_hub_INIT_DATA((buf_to_hub_num+1)*16-1 downto buf_to_hub_num*16);
+ HUB_INIT_PACKET_NUM_IN ((hublogic_num+1)*2-1 downto hublogic_num*2)
+ <= buf_to_hub_INIT_PACKET_NUM((buf_to_hub_num+1)*2-1 downto buf_to_hub_num*2);
+ buf_to_hub_INIT_READ(buf_to_hub_num)
+ <= HUB_INIT_READ_OUT(hublogic_num);
+
+ hub_to_buf_INIT_DATAREADY(buf_to_hub_num)
+ <= HUB_INIT_DATAREADY_OUT(hublogic_num);
+ hub_to_buf_INIT_DATA((buf_to_hub_num+1)*16-1 downto buf_to_hub_num*16)
+ <= HUB_INIT_DATA_OUT((hublogic_num+1)*16-1 downto hublogic_num*16);
+ hub_to_buf_INIT_PACKET_NUM((buf_to_hub_num+1)*2-1 downto buf_to_hub_num*2)
+ <= HUB_INIT_PACKET_NUM_OUT((hublogic_num+1)*2-1 downto hublogic_num*2);
+ HUB_INIT_READ_IN (hublogic_num)
+ <= hub_to_buf_INIT_READ(buf_to_hub_num);
+
+ HUB_REPLY_DATAREADY_IN (hublogic_num)
+ <= buf_to_hub_REPLY_DATAREADY(buf_to_hub_num);
+ HUB_REPLY_DATA_IN ((hublogic_num+1)*16-1 downto hublogic_num*16)
+ <= buf_to_hub_REPLY_DATA((buf_to_hub_num+1)*16-1 downto buf_to_hub_num*16);
+ HUB_REPLY_PACKET_NUM_IN ((hublogic_num+1)*2-1 downto hublogic_num*2)
+ <= buf_to_hub_REPLY_PACKET_NUM((buf_to_hub_num+1)*2-1 downto buf_to_hub_num*2);
+ buf_to_hub_REPLY_READ(buf_to_hub_num)
+ <= HUB_REPLY_READ_OUT(hublogic_num);
+
+ hub_to_buf_REPLY_DATAREADY(buf_to_hub_num)
+ <= HUB_REPLY_DATAREADY_OUT(hublogic_num);
+ hub_to_buf_REPLY_DATA((buf_to_hub_num+1)*16-1 downto buf_to_hub_num*16)
+ <= HUB_REPLY_DATA_OUT((hublogic_num+1)*16-1 downto hublogic_num*16);
+ hub_to_buf_REPLY_PACKET_NUM((buf_to_hub_num+1)*2-1 downto buf_to_hub_num*2)
+ <= HUB_REPLY_PACKET_NUM_OUT((hublogic_num+1)*2-1 downto hublogic_num*2);
+ HUB_REPLY_READ_IN (hublogic_num)
+ <= hub_to_buf_REPLY_READ(buf_to_hub_num);
+ end generate;
+ end generate;
+ end generate;
+ end generate;
+
+--generate hub logic
gen_hub_logic: for i in 0 to 2**(MUX_WIDTH-1)-1 generate
+ constant point_num : integer := calc_point_number (MII_NUMBER, i, API_NUMBER, API_CHANNELS, TRG_NUMBER, TRG_CHANNELS);
+ constant first_point_num : integer := calc_first_point_number(MII_NUMBER, i, API_NUMBER, API_CHANNELS, TRG_NUMBER, TRG_CHANNELS);
+ constant next_point_num : integer := first_point_num + point_num;
+ begin
HUBLOGIC : trb_net16_hub_logic
generic map (
--media interfaces
- POINT_NUMBER => MII_NUMBER,
+ POINT_NUMBER => point_num,
--general settings
DATA_WIDTH => DATA_WIDTH,
NUM_WIDTH => NUM_WIDTH
CLK => CLK,
RESET => RESET,
CLK_EN => CLK_EN,
- INIT_DATAREADY_IN => buf_to_hub_INIT_DATAREADY((i+1)*MII_NUMBER-1 downto i*MII_NUMBER),
- INIT_DATA_IN => buf_to_hub_INIT_DATA((i+1)*DATA_WIDTH*MII_NUMBER-1 downto i*DATA_WIDTH*MII_NUMBER),
- INIT_PACKET_NUM_IN => buf_to_hub_INIT_PACKET_NUM((i+1)*NUM_WIDTH*MII_NUMBER-1 downto i*NUM_WIDTH*MII_NUMBER),
- INIT_READ_OUT => buf_to_hub_INIT_READ((i+1)*MII_NUMBER-1 downto i*MII_NUMBER),
- INIT_DATAREADY_OUT => hub_to_buf_INIT_DATAREADY((i+1)*MII_NUMBER-1 downto i*MII_NUMBER),
- INIT_DATA_OUT => hub_to_buf_INIT_DATA((i+1)*DATA_WIDTH*MII_NUMBER-1 downto i*DATA_WIDTH*MII_NUMBER),
- INIT_PACKET_NUM_OUT => hub_to_buf_INIT_PACKET_NUM((i+1)*NUM_WIDTH*MII_NUMBER-1 downto i*NUM_WIDTH*MII_NUMBER),
- INIT_READ_IN => hub_to_buf_INIT_READ((i+1)*MII_NUMBER-1 downto i*MII_NUMBER),
- REPLY_HEADER_OUT => hub_to_buf_REPLY_SEND_HEADER((i+1)*MII_NUMBER-1 downto i*MII_NUMBER),
- REPLY_DATAREADY_IN => buf_to_hub_REPLY_DATAREADY((i+1)*MII_NUMBER-1 downto i*MII_NUMBER),
- REPLY_DATA_IN => buf_to_hub_REPLY_DATA((i+1)*DATA_WIDTH*MII_NUMBER-1 downto i*DATA_WIDTH*MII_NUMBER),
- REPLY_PACKET_NUM_IN => buf_to_hub_REPLY_PACKET_NUM((i+1)*NUM_WIDTH*MII_NUMBER-1 downto i*NUM_WIDTH*MII_NUMBER),
- REPLY_READ_OUT => buf_to_hub_REPLY_READ((i+1)*MII_NUMBER-1 downto i*MII_NUMBER),
- REPLY_DATAREADY_OUT => hub_to_buf_REPLY_DATAREADY((i+1)*MII_NUMBER-1 downto i*MII_NUMBER),
- REPLY_DATA_OUT => hub_to_buf_REPLY_DATA((i+1)*DATA_WIDTH*MII_NUMBER-1 downto i*DATA_WIDTH*MII_NUMBER),
- REPLY_PACKET_NUM_OUT => hub_to_buf_REPLY_PACKET_NUM((i+1)*NUM_WIDTH*MII_NUMBER-1 downto i*NUM_WIDTH*MII_NUMBER),
- REPLY_READ_IN => hub_to_buf_REPLY_READ((i+1)*MII_NUMBER-1 downto i*MII_NUMBER),
- STAT => HUB_STAT_CHANNEL((i+1)*32-1 downto i*32),
- CTRL => HUB_CTRL_CHANNEL((i+1)*32-1 downto i*32),
- CTRL_activepoints => HUB_CTRL_activepoints((i+1)*32-1 downto i*32)
+ INIT_DATAREADY_IN => HUB_INIT_DATAREADY_IN(next_point_num-1 downto first_point_num),
+ INIT_DATA_IN => HUB_INIT_DATA_IN(next_point_num*DATA_WIDTH-1 downto first_point_num*DATA_WIDTH),
+ INIT_PACKET_NUM_IN => HUB_INIT_PACKET_NUM_IN(next_point_num*NUM_WIDTH-1 downto first_point_num*NUM_WIDTH),
+ INIT_READ_OUT => HUB_INIT_READ_OUT(next_point_num-1 downto first_point_num),
+ INIT_DATAREADY_OUT => HUB_INIT_DATAREADY_OUT(next_point_num-1 downto first_point_num),
+ INIT_DATA_OUT => HUB_INIT_DATA_OUT(next_point_num*DATA_WIDTH-1 downto first_point_num*DATA_WIDTH),
+ INIT_PACKET_NUM_OUT => HUB_INIT_PACKET_NUM_OUT(next_point_num*NUM_WIDTH-1 downto first_point_num*NUM_WIDTH),
+ INIT_READ_IN => HUB_INIT_READ_IN(next_point_num-1 downto first_point_num),
+ REPLY_HEADER_OUT => HUB_REPLY_SEND_HEADER_OUT(next_point_num-1 downto first_point_num),
+ REPLY_DATAREADY_IN => HUB_REPLY_DATAREADY_IN(next_point_num-1 downto first_point_num),
+ REPLY_DATA_IN => HUB_REPLY_DATA_IN(next_point_num*DATA_WIDTH-1 downto first_point_num*DATA_WIDTH),
+ REPLY_PACKET_NUM_IN => HUB_REPLY_PACKET_NUM_IN(next_point_num*NUM_WIDTH-1 downto first_point_num*NUM_WIDTH),
+ REPLY_READ_OUT => HUB_REPLY_READ_OUT(next_point_num-1 downto first_point_num),
+ REPLY_DATAREADY_OUT => HUB_REPLY_DATAREADY_OUT(next_point_num-1 downto first_point_num),
+ REPLY_DATA_OUT => HUB_REPLY_DATA_OUT(next_point_num*DATA_WIDTH-1 downto first_point_num*DATA_WIDTH),
+ REPLY_PACKET_NUM_OUT => HUB_REPLY_PACKET_NUM_OUT(next_point_num*NUM_WIDTH-1 downto first_point_num*NUM_WIDTH),
+ REPLY_READ_IN => HUB_REPLY_READ_IN(next_point_num-1 downto first_point_num),
+ STAT => HUB_STAT_CHANNEL((i+1)*32-1 downto i*32),
+ CTRL => HUB_CTRL_CHANNEL((i+1)*32-1 downto i*32),
+ CTRL_activepoints => HUB_CTRL_activepoints((i+1)*32-1 downto i*32)
);
end generate;