-LIBRARY IEEE;\r
-USE IEEE.std_logic_1164.ALL;\r
-USE IEEE.std_logic_ARITH.ALL;\r
-USE IEEE.std_logic_UNSIGNED.ALL;\r
-\r
-use work.trb_net_std.all;\r
-\r
-\r
-entity trb_net16_hub_base is\r
- generic{\r
- --media interfaces\r
- MII_NUMBER : integer range 2 to 16 := 2;\r
- MII_INIT_DEPTH : bit_vector(MII_NUMBER*2**(MUX_WIDTH-1)*4-1 downto 0) := x"66110000";\r
- MII_REPLY_DEPTH : bit_vector(MII_NUMBER*2**(MUX_WIDTH-1)*4-1 downto 0) := x"66110000";\r
- -- settings for apis\r
- API_NUMBER : integer range 0 to 16 := 1;\r
- API_CHANNELS : bit_vector(API_NUMBER*4-1 downto 0) := x"3";\r
- --channel, each api is connected to\r
- API_TYPE : bit_vector(API_NUMBER*4-1 downto 0) := x"1";\r
- API_INIT_DEPTH : bit_vector(API_NUMBER*4-1 downto 0) := x"1";\r
- API_REPLY_DEPTH : bit_vector(API_NUMBER*4-1 downto 0) := x"1";\r
- API_FIFO_TO_INT_DEPTH : bit_vector(API_NUMBER*4-1 downto 0) := x"1";\r
- API_FIFO_TO_APL_DEPTH : bit_vector(API_NUMBER*4-1 downto 0) := x"1";\r
- --trigger reading interfaces\r
- TRG_NUMBER : integer range 0 to 16 := 2;\r
- TRG_CHANNELS : bit_vector(API_NUMBER*4-1 downto 0) := x"10";\r
- --general settings\r
- MUX_SECURE_MODE : integer range 0 to 1 := 0;\r
- MUX_WIDTH : integer range 1 to 5 := 3;\r
- MUX_CTRL_CHANNEL : integer range 0 to 2**(MUX_WIDTH-1)-1 := 3;\r
- DATA_WIDTH : integer range 16 to 16 := 16;\r
- NUM_WIDTH : integer range 2 to 2 := 2\r
- }\r
- port {\r
- CLK : in std_logic;\r
- RESET : in std_logic;\r
- CLK_EN : in std_logic;\r
- \r
- --Media interfacces\r
- --each port is one bit bigger than actually necessary to avoid error messages\r
- MED_DATAREADY_OUT : out std_logic_vector (MII_NUMBER downto 0);\r
- MED_DATA_OUT : out std_logic_vector (MII_NUMBER*DATA_WIDTH downto 0);\r
- MED_PACKET_NUM_OUT: out std_logic_vector (MII_NUMBER*NUM_WIDTH downto 0);\r
- MED_READ_IN : in std_logic_vector (MII_NUMBER downto 0);\r
- MED_DATAREADY_IN : in std_logic_vector (MII_NUMBER downto 0);\r
- MED_DATA_IN : in std_logic_vector (MII_NUMBER*DATA_WIDTH downto 0);\r
- MED_PACKET_NUM_IN : in std_logic_vector (MII_NUMBER*NUM_WIDTH downto 0);\r
- MED_READ_OUT : out std_logic_vector (MII_NUMBER downto 0); -- buffer reads a word from media\r
- MED_ERROR_IN : in std_logic_vector (MII_NUMBER*3 downto 0);\r
- --API: interfaces\r
- APL_DATA_IN : in std_logic_vector (APL_NUMBER*DATA_WIDTH downto 0);\r
- APL_PACKET_NUM_IN : in std_logic_vector (APL_NUMBER*NUM_WIDTH downto 0);\r
- APL_WRITE_IN : in std_logic_vector (APL_NUMBER downto 0);\r
- APL_FIFO_FULL_OUT : out std_logic_vector (APL_NUMBER downto 0);\r
- APL_SHORT_TRANSFER_IN : in std_logic_vector (APL_NUMBER downto 0);\r
- APL_DTYPE_IN : in std_logic_vector (APL_NUMBER*4 downto 0);\r
- APL_ERROR_PATTERN_IN : in std_logic_vector (APL_NUMBER*32 downto 0);\r
- APL_SEND_IN : in std_logic_vector (APL_NUMBER downto 0);\r
- APL_TARGET_ADDRESS_IN : in std_logic_vector (APL_NUMBER*16 downto 0);\r
- APL_DATA_OUT : out std_logic_vector (APL_NUMBER*16 downto 0);\r
- APL_PACKET_NUM_OUT: out std_logic_vector (APL_NUMBER*NUM_WIDTH downto 0);\r
- APL_TYP_OUT : out std_logic_vector (APL_NUMBER*3 downto 0);\r
- APL_DATAREADY_OUT : out std_logic_vector (APL_NUMBER downto 0);\r
- APL_READ_IN : in std_logic_vector (APL_NUMBER downto 0);\r
- APL_RUN_OUT : out std_logic_vector (APL_NUMBER downto 0);\r
- APL_MY_ADDRESS_IN : in std_logic_vector (APL_NUMBRT*16 downto 0);\r
- APL_SEQNR_OUT : out std_logic_vector (APL_NUMBER*8 downto 0);\r
- --TRG interfaces\r
- TRG_GOT_TRIGGER_OUT : out std_logic_vector (TRG_NUMBER downto 0);\r
- TRG_ERROR_PATTERN_OUT : out std_logic_vector (TRG_NUMBER*32 downto 0);\r
- TRG_DTYPE_OUT : out std_logic_vector (TRG_NUMBER*4 downto 0);\r
- TRG_SEQNR_OUT : out std_logic_vector (TRG_NUMBER*8 downto 0);\r
- TRG_ERROR_PATTERN_IN : in std_logic_vector (TRG_NUMBER*32 downto 0);\r
- TRG_RELEASE_IN : in std_logic_vector (TRG_NUMBER downto 0);\r
- --Status ports (for debugging)\r
- HUB_CHANNEL_STAT : out std_logic_vector (2**(MUX_WIDTH-1)*16 downto 0);\r
- HUB_GEN_STAT : out std_logic_vector (31 downto 0);\r
- MPLEX_CTRL : out std_logic_vector (MII_NUMBER*32-1 downto 0);\r
- \r
- }\r
-end entity;\r
-\r
-architecture trb_net16_hub_base_arch of trb_net16_hub_base is\r
-\r
- signal m_DATAREADY_OUT : std_logic_vector (MII_NUMBER*2**MUX_WIDTH-1 downto 0);\r
- signal m_DATA_OUT : std_logic_vector (MII_NUMBER*DATA_WIDTH*2**MUX_WIDTH-1 downto 0);\r
- signal m_PACKET_NUM_OUT: std_logic_vector (MII_NUMBER*NUM_WIDTH*2**MUX_WIDTH-1 downto 0);\r
- signal m_READ_IN : std_logic_vector (MII_NUMBER*2**MUX_WIDTH-1 downto 0);\r
- signal m_DATAREADY_IN : std_logic_vector (MII_NUMBER*2**MUX_WIDTH-1 downto 0);\r
- signal m_DATA_IN : std_logic_vector (MII_NUMBER*DATA_WIDTH*2**MUX_WIDTH-1 downto 0);\r
- signal m_PACKET_NUM_IN : std_logic_vector (MII_NUMBER*NUM_WIDTH*2**MUX_WIDTH-1 downto 0);\r
- signal m_READ_OUT : std_logic_vector (MII_NUMBER*2**MUX_WIDTH-1 downto 0);\r
-\r
- signal hub_to_buf_INIT_DATAREADY: std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER-1 downto 0);\r
- signal hub_to_buf_INIT_DATA : std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER*DATA_WIDTH-1 downto 0);\r
- signal hub_to_buf_INIT_PACKET_NUM:std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER*NUM_WIDTH-1 downto 0);\r
- signal hub_to_buf_INIT_READ : std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER-1 downto 0);\r
-\r
- signal buf_to_hub_INIT_DATAREADY: std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER-1 downto 0);\r
- signal buf_to_hub_INIT_DATA : std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER*DATA_WIDTH-1 downto 0);\r
- signal buf_to_hub_INIT_PACKET_NUM:std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER*NUM_WIDTH-1 downto 0);\r
- signal buf_to_hub_INIT_READ : std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER-1 downto 0);\r
-\r
- signal hub_to_buf_REPLY_DATAREADY: std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER-1 downto 0);\r
- signal hub_to_buf_REPLY_DATA : std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER*DATA_WIDTH-1 downto 0);\r
- signal hub_to_buf_REPLY_PACKET_NUM:std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER*NUM_WIDTH-1 downto 0);\r
- signal hub_to_buf_REPLY_READ : std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER-1 downto 0);\r
-\r
- signal buf_to_hub_REPLY_DATAREADY: std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER-1 downto 0);\r
- signal buf_to_hub_REPLY_DATA : std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER*DATA_WIDTH-1 downto 0);\r
- signal buf_to_hub_REPLY_PACKET_NUM:std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER*NUM_WIDTH-1 downto 0);\r
- signal buf_to_hub_REPLY_READ : std_logic_vector (2**(MUX_WIDTH-1)*MII_NUMBER-1 downto 0); \r
- \r
- component trb_net16_base_hub_logic is\r
- generic (\r
- --media interfaces\r
- POINT_NUMBER : integer range 2 to 16 := 2;\r
- INIT_DEPTH : bit_vector(POINT_NUMBER*8-1 downto 0) := x"1111";\r
- REPLY_DEPTH : bit_vector(POINT_NUMBER*8-1 downto 0) := x"1111";\r
- --general settings\r
- DATA_WIDTH : integer range 16 to 16 := 16;\r
- NUM_WIDTH : integer range 2 to 2 := 2\r
- );\r
- port (\r
- CLK : in std_logic;\r
- RESET : in std_logic;\r
- CLK_EN : in std_logic;\r
- INIT_DATAREADY_IN : in std_logic_vector (POINT_NUMBER downto 0);\r
- INIT_DATA_IN : in std_logic_vector (DATA_WIDTH*POINT_NUMBER downto 0);\r
- INIT_PACKET_NUM_IN : in std_logic_vector (NUM_WIDTH*POINT_NUMBER downto 0);\r
- INIT_READ_OUT : out std_logic_vector (POINT_NUMBER downto 0);\r
- INIT_DATAREADY_OUT : out std_logic_vector (POINT_NUMBER downto 0);\r
- INIT_DATA_OUT : out std_logic_vector (DATA_WIDTH*POINT_NUMBER downto 0);\r
- INIT_PACKET_NUM_OUT : out std_logic_vector (NUM_WIDTH*POINT_NUMBER downto 0);\r
- INIT_READ_IN : in std_logic_vector (POINT_NUMBER downto 0);\r
- REPLY_HEADER_OUT : out std_logic_vector (POINT_NUMBER downto 0);\r
- REPLY_DATAREADY_IN : in std_logic_vector (POINT_NUMBER downto 0);\r
- REPLY_DATA_IN : in std_logic_vector (DATA_WIDTH*POINT_NUMBER downto 0);\r
- REPLY_PACKET_NUM_IN : in std_logic_vector (NUM_WIDTH*POINT_NUMBER downto 0);\r
- REPLY_READ_OUT : out std_logic_vector (POINT_NUMBER downto 0);\r
- REPLY_DATAREADY_OUT : out std_logic_vector (POINT_NUMBER downto 0);\r
- REPLY_DATA_OUT : out std_logic_vector (DATA_WIDTH*POINT_NUMBER downto 0);\r
- REPLY_PACKET_NUM_OUT : out std_logic_vector (NUM_WIDTH*POINT_NUMBER downto 0);\r
- REPLY_READ_IN : in std_logic_vector (POINT_NUMBER downto 0);\r
- STAT_CHANNEL : out std_logic_vector (15 downto 0);\r
- STAT_GEN : out std_logic_vector (31 downto 0);\r
- CTRL_CHANNEL : in std_logic_vector (31 downto 0);\r
- CTRL_GEN : in std_logic_vector (31 downto 0) \r
- );\r
-end component;\r
-\r
- \r
- component trb_net16_io_multiplexer is\r
- generic (\r
- DATA_WIDTH : integer := 16;\r
- NUM_WIDTH : integer := 2;\r
- MUX_WIDTH : integer range 1 to 5 := 3;\r
- MUX_SECURE_MODE : integer range 0 to 1 := 0\r
- );\r
- port(\r
- -- Misc\r
- CLK : in std_logic;\r
- RESET : in std_logic;\r
- CLK_EN : in std_logic;\r
- -- Media direction port\r
- MED_DATAREADY_IN: in std_logic;\r
- MED_DATA_IN: in std_logic_vector (DATA_WIDTH-1 downto 0);\r
- MED_PACKET_NUM_IN: in std_logic_vector (NUM_WIDTH-1 downto 0);\r
- MED_READ_OUT: out std_logic;\r
- MED_DATAREADY_OUT: out std_logic;\r
- MED_DATA_OUT: out std_logic_vector (DATA_WIDTH-1 downto 0);\r
- MED_PACKET_NUM_OUT:out std_logic_vector (NUM_WIDTH-1 downto 0);\r
- MED_READ_IN: in std_logic;\r
- -- Internal direction port\r
- INT_DATAREADY_OUT: out std_logic_vector (2**MUX_WIDTH-1 downto 0);\r
- INT_DATA_OUT: out std_logic_vector ((DATA_WIDTH)*(2**MUX_WIDTH)-1 downto 0);\r
- INT_PACKET_NUM_OUT:out std_logic_vector (2*(2**MUX_WIDTH)-1 downto 0);\r
- INT_READ_IN: in std_logic_vector (2**MUX_WIDTH-1 downto 0);\r
- INT_DATAREADY_IN: in std_logic_vector (2**MUX_WIDTH-1 downto 0);\r
- INT_DATA_IN: in std_logic_vector ((DATA_WIDTH)*(2**MUX_WIDTH)-1 downto 0);\r
- INT_PACKET_NUM_IN: in std_logic_vector (2*(2**MUX_WIDTH)-1 downto 0);\r
- INT_READ_OUT: out std_logic_vector (2**MUX_WIDTH-1 downto 0);\r
- -- Status and control port\r
- CTRL: in std_logic_vector (31 downto 0);\r
- STAT: out std_logic_vector (31 downto 0)\r
- );\r
- end component;\r
-\r
- component trb_net16_iobuf is\r
- generic (\r
- INIT_DEPTH : integer := 1;\r
- REPLY_DEPTH : integer := 1\r
- );\r
- port(\r
- -- Misc\r
- CLK : in std_logic; \r
- RESET : in std_logic; \r
- CLK_EN : in std_logic;\r
- -- Media direction port\r
- MED_INIT_DATAREADY_OUT: out std_logic; --Data word ready to be read out\r
- MED_INIT_DATA_OUT: out std_logic_vector (15 downto 0); -- Data word\r
- MED_INIT_PACKET_NUM_OUT:out std_logic_vector (1 downto 0);\r
- MED_INIT_READ_IN: in std_logic; -- Media is reading\r
- MED_INIT_DATAREADY_IN: in std_logic; -- Data word is offered by the Media\r
- MED_INIT_DATA_IN: in std_logic_vector (15 downto 0); -- Data word\r
- MED_INIT_PACKET_NUM_IN: in std_logic_vector (1 downto 0);\r
- MED_INIT_READ_OUT: out std_logic; -- buffer reads a word from media\r
- MED_INIT_ERROR_IN: in std_logic_vector (2 downto 0); -- Status bits\r
- MED_REPLY_DATAREADY_OUT: out std_logic; --Data word ready to be read out\r
- MED_REPLY_DATA_OUT: out std_logic_vector (15 downto 0); -- Data word\r
- MED_REPLY_PACKET_NUM_OUT:out std_logic_vector (1 downto 0);\r
- MED_REPLY_READ_IN: in std_logic; -- Media is reading\r
- MED_REPLY_DATAREADY_IN: in std_logic; -- Data word is offered by the Media\r
- MED_REPLY_DATA_IN: in std_logic_vector (15 downto 0); -- Data word\r
- MED_REPLY_PACKET_NUM_IN: in std_logic_vector (1 downto 0);\r
- MED_REPLY_READ_OUT: out std_logic; -- buffer reads a word from media\r
- MED_REPLY_ERROR_IN: in std_logic_vector (2 downto 0); -- Status bits\r
- -- Internal direction port\r
- INT_INIT_DATAREADY_OUT: out std_logic;\r
- INT_INIT_DATA_OUT: out std_logic_vector (15 downto 0); -- Data word\r
- INT_INIT_PACKET_NUM_OUT:out std_logic_vector (1 downto 0);\r
- INT_INIT_READ_IN: in std_logic;\r
- INT_INIT_DATAREADY_IN: in std_logic;\r
- INT_INIT_DATA_IN: in std_logic_vector (15 downto 0); -- Data word\r
- INT_INIT_PACKET_NUM_IN: in std_logic_vector (1 downto 0);\r
- INT_INIT_READ_OUT: out std_logic;\r
- INT_REPLY_HEADER_IN: in std_logic;\r
- INT_REPLY_DATAREADY_OUT: out std_logic;\r
- INT_REPLY_DATA_OUT: out std_logic_vector (15 downto 0); -- Data word\r
- INT_REPLY_PACKET_NUM_OUT:out std_logic_vector (1 downto 0);\r
- INT_REPLY_READ_IN: in std_logic;\r
- INT_REPLY_DATAREADY_IN: in std_logic;\r
- INT_REPLY_DATA_IN: in std_logic_vector (15 downto 0); -- Data word\r
- INT_REPLY_PACKET_NUM_IN: in std_logic_vector (1 downto 0);\r
- INT_REPLY_READ_OUT: out std_logic;\r
- -- Status and control port\r
- STAT_GEN: out std_logic_vector (31 downto 0); -- General Status\r
- STAT_LOCKED: out std_logic_vector (31 downto 0); -- Status of the handshake and buffer control\r
- STAT_INIT_BUFFER: out std_logic_vector (31 downto 0); -- Status of the handshake and buffer control\r
- STAT_REPLY_BUFFER: out std_logic_vector (31 downto 0); -- General Status\r
- CTRL_GEN: in std_logic_vector (31 downto 0);\r
- CTRL_LOCKED: in std_logic_vector (31 downto 0);\r
- STAT_CTRL_INIT_BUFFER: in std_logic_vector (31 downto 0);\r
- STAT_CTRL_REPLY_BUFFER: in std_logic_vector (31 downto 0)\r
- );\r
- end component;\r
- \r
- \r
- component trb_net16_base_api is\r
- generic (\r
- API_TYPE : integer := API_TYPE;\r
- FIFO_TO_INT_DEPTH : integer := 1;\r
- FIFO_TO_APL_DEPTH : integer := 1;\r
- FIFO_TERM_BUFFER_DEPTH : integer := 0);\r
- port(\r
- -- Misc\r
- CLK : in std_logic;\r
- RESET : in std_logic;\r
- CLK_EN : in std_logic;\r
- -- APL Transmitter port\r
- APL_DATA_IN : in std_logic_vector (15 downto 0); -- Data word "application to network"\r
- APL_PACKET_NUM_IN : in std_logic_vector (1 downto 0);\r
- APL_WRITE_IN : in std_logic; -- Data word is valid and should be transmitted\r
- APL_FIFO_FULL_OUT : out std_logic; -- Stop transfer, the fifo is full\r
- APL_SHORT_TRANSFER_IN : in std_logic; --\r
- APL_DTYPE_IN : in std_logic_vector (3 downto 0); -- see NewTriggerBusNetworkDescr\r
- APL_ERROR_PATTERN_IN : in std_logic_vector (31 downto 0); -- see NewTriggerBusNetworkDescr\r
- APL_SEND_IN : in std_logic; -- Release sending of the data\r
- APL_TARGET_ADDRESS_IN : in std_logic_vector (15 downto 0); -- Address of\r
- -- Receiver port\r
- APL_DATA_OUT : out std_logic_vector (15 downto 0); -- Data word "network to application"\r
- APL_PACKET_NUM_OUT : out std_logic_vector (1 downto 0);\r
- APL_TYP_OUT : out std_logic_vector (2 downto 0); -- Which kind of data word: DAT, HDR or TRM\r
- APL_DATAREADY_OUT : out std_logic; -- Data word is valid and might be read out\r
- APL_READ_IN : in std_logic; -- Read data word\r
- -- APL Control port\r
- APL_RUN_OUT : out std_logic; -- Data transfer is running\r
- APL_MY_ADDRESS_IN : in std_logic_vector (15 downto 0); -- My own address (temporary solution!!!)\r
- APL_SEQNR_OUT : out std_logic_vector (7 downto 0);\r
- -- Internal direction port\r
- INT_MASTER_DATAREADY_OUT : out std_logic;\r
- INT_MASTER_DATA_OUT : out std_logic_vector (15 downto 0); -- Data word\r
- INT_MASTER_PACKET_NUM_OUT : out std_logic_vector (1 downto 0);\r
- INT_MASTER_READ_IN : in std_logic;\r
- INT_MASTER_DATAREADY_IN : in std_logic;\r
- INT_MASTER_DATA_IN : in std_logic_vector (15 downto 0); -- Data word\r
- INT_MASTER_PACKET_NUM_IN : in std_logic_vector (1 downto 0);\r
- INT_MASTER_READ_OUT : out std_logic;\r
- INT_SLAVE_HEADER_IN : in std_logic; -- Concentrator kindly asks to resend the last HDR\r
- INT_SLAVE_DATAREADY_OUT : out std_logic;\r
- INT_SLAVE_DATA_OUT : out std_logic_vector (15 downto 0); -- Data word\r
- INT_SLAVE_PACKET_NUM_OUT : out std_logic_vector (1 downto 0);\r
- INT_SLAVE_READ_IN : in std_logic;\r
- INT_SLAVE_DATAREADY_IN : in std_logic;\r
- INT_SLAVE_DATA_IN : in std_logic_vector (15 downto 0); -- Data word\r
- INT_SLAVE_PACKET_NUM_IN : in std_logic_vector (1 downto 0);\r
- INT_SLAVE_READ_OUT : out std_logic;\r
- -- Status and control port\r
- STAT_FIFO_TO_INT : out std_logic_vector(31 downto 0);\r
- STAT_FIFO_TO_APL : out std_logic_vector(31 downto 0)\r
- );\r
- end component;\r
- \r
- \r
- \r
-begin\r
-\r
---generate multiplexers\r
- gen_muxes: for i in 0 to MII_NUMBER-1 generate\r
- MPLEX: trb_net16_io_multiplexer\r
- generic map (\r
- DATA_WIDTH => DATA_WIDTH,\r
- NUM_WIDTH => NUM_WIDTH,\r
- MUX_WIDTH => MUX_WIDTH,\r
- MUX_SECURE_MODE => MUX_SECURE_MODE\r
- )\r
- port map (\r
- CLK => CLK,\r
- RESET => RESET,\r
- CLK_EN => CLK_EN,\r
- MED_DATAREADY_IN => MED_DATAREADY_IN(i*2+1 downto i*2),\r
- MED_DATA_IN => MED_DATA_IN((i+1)*DATA_WIDTH*2-1 downto i*DATA_WIDTH*2),\r
- MED_PACKET_NUM_IN => MED_PACKET_NUM_IN((i+1)*NUM_WIDTH*2-1 downto i*NUM_WIDTH*2),\r
- MED_READ_OUT => MED_READ_OUT(i*2+1 downto i*2),\r
- MED_DATAREADY_OUT => MED_DATAREADY_OUT(i*2+1 downto i*2),\r
- MED_DATA_OUT => MED_DATA_OUT((i+1)*DATA_WIDTH*2-1 downto i*DATA_WIDTH*2),\r
- MED_PACKET_NUM_OUT => MED_PACKET_NUM_OUT((i+1)*NUM_WIDTH*2-1 downto i*NUM_WIDTH*2),\r
- MED_READ_IN => MED_READ_IN(i*2+1 downto i*2),\r
- INT_DATAREADY_OUT => m_DATAREADY_IN(i*2+1 downto i*2),\r
- INT_DATA_OUT => m_DATA_IN((i+1)*DATA_WIDTH*2-1 downto i*DATA_WIDTH*2),\r
- INT_PACKET_NUM_OUT => m_PACKET_NUM_IN((i+1)*NUM_WIDTH*2-1 downto i*NUM_WIDTH*2),\r
- INT_READ_IN => m_READ_OUT(i*2+1 downto i*2),\r
- INT_DATAREADY_IN => m_DATAREADY_OUT(i*2+1 downto i*2),\r
- INT_DATA_IN => m_DATA_OUT((i+1)*DATA_WIDTH*2-1 downto i*DATA_WIDTH*2),\r
- INT_PACKET_NUM_IN => m_PACKET_NUM_OUT((i+1)*NUM_WIDTH*2-1 downto i*NUM_WIDTH*2),\r
- INT_READ_OUT => m_READ_IN(i*2+1 downto i*2),\r
- CTRL => MPLEX_CTRL((i+1)*32-1) downto i*32)\r
- );\r
- end generate;\r
-\r
---generate IOBufs for MII\r
- gen_iobufs: for i in 0 to 2**(MUX_WIDTH-1)*MII_NUMBER-1 generate\r
- IOBUF: trb_net16_iobuf\r
- generic map (\r
- INIT_DEPTH => to_integer(MII_INIT_DEPTH((i+1)*4-1 downto i)),\r
- REPLY_DEPTH => to_integer(MII_REPLY_DEPTH((i+1)*4-1 downto i))\r
- )\r
- port map (\r
- -- Misc\r
- CLK => CLK ,\r
- RESET => RESET,\r
- CLK_EN => CLK_EN,\r
- -- Media direction port\r
- MED_INIT_DATAREADY_OUT => m_DATAREADY_OUT(i*2),\r
- MED_INIT_DATA_OUT => m_DATA_OUT((i+1)*DATA_WIDTH*2-1 downto i*DATA_WIDTH*2),\r
- MED_INIT_PACKET_NUM_OUT => m_PACKET_NUM_OUT((i+1)*NUM_WIDTH*2-1 downto i*NUM_WIDTH*2),\r
- MED_INIT_READ_IN => m_READ_IN(i*2),\r
- \r
- MED_INIT_DATAREADY_IN => m_DATAREADY_IN(i*2),\r
- MED_INIT_DATA_IN => m_DATA_�N((i+1)*DATA_WIDTH*2-1 downto i*DATA_WIDTH*2),\r
- MED_INIT_PACKET_NUM_IN => m_PACKET_NUM_IN((i+1)*NUM_WIDTH*2-1 downto i*NUM_WIDTH*2),\r
- MED_INIT_READ_OUT => m_READ_OUT(i*2),\r
- MED_INIT_ERROR_IN => m_ERROR_IN((i+1)*3-1 downto i*3),\r
-\r
- MED_REPLY_DATAREADY_OUT => m_DATAREADY_OUT(i*2+1),\r
- MED_REPLY_DATA_OUT => m_DATA_OUT((i+2)*DATA_WIDTH*2-1 downto (i+1)*DATA_WIDTH*2),\r
- MED_REPLY_PACKET_NUM_OUT=> m_PACKET_NUM_OUT((i+2)*NUM_WIDTH*2-1 downto (i+1)*NUM_WIDTH*2),\r
- MED_REPLY_READ_IN => m_READ_IN(i*2+1),\r
- \r
- MED_REPLY_DATAREADY_IN => m_DATAREADY_OUT(i*2+1),\r
- MED_REPLY_DATA_IN => m_DATA_OUT((i+2)*DATA_WIDTH*2-1 downto (i+1)*DATA_WIDTH*2),\r
- MED_REPLY_PACKET_NUM_IN => m_PACKET_NUM_OUT((i+2)*NUM_WIDTH*2-1 downto (i+1)*NUM_WIDTH*2),\r
- MED_REPLY_READ_OUT => m_READ_IN(i*2+1),\r
- MED_REPLY_ERROR_IN => m_ERROR_IN((i+1)*3-1 downto i*3),\r
- \r
- -- Internal direction port\r
-\r
- INT_INIT_DATAREADY_OUT => buf_to_hub_INIT_DATAREADY(i),\r
- INT_INIT_DATA_OUT => buf_to_hub_INIT_DATA((i+1)*DATA_WIDTH-1 downto i*DATA_WIDTH),\r
- INT_INIT_PACKET_NUM_OUT=> buf_to_hub_INIT_PACKET_NUM((i+1)*NUM_WIDTH-1 downto i*NUM_WIDTH),\r
- INT_INIT_READ_IN => buf_to_hub_INIT_READ(i),\r
-\r
- INT_INIT_DATAREADY_IN => hub_to_buf_INIT_DATAREADY(i),\r
- INT_INIT_DATA_IN => hub_to_buf_INIT_DATA((i+1)*DATA_WIDTH-1 downto i*DATA_WIDTH),\r
- INT_INIT_PACKET_NUM_IN => hub_to_buf_INIT_PACKET_NUM((i+1)*NUM_WIDTH-1 downto i*NUM_WIDTH),\r
- INT_INIT_READ_OUT => hub_to_buf_INIT_READ(i),\r
- \r
- INT_REPLY_HEADER_IN => buf_to_hub_REPLY_SEND_HEADER(i),\r
- INT_REPLY_DATAREADY_OUT => buf_to_hub_REPLY_DATAREADY(i),\r
- INT_REPLY_DATA_OUT => buf_to_hub_REPLY_DATA((i+1)*DATA_WIDTH-1 downto i*DATA_WIDTH),\r
- INT_REPLY_PACKET_NUM_OUT=> buf_to_hub_REPLY_PACKET_NUM((i+1)*NUM_WIDTH-1 downto i*NUM_WIDTH),\r
- INT_REPLY_READ_IN => buf_to_hub_REPLY_READ(i),\r
-\r
- INT_REPLY_DATAREADY_IN => hub_to_buf_REPLY_DATAREADY(i),\r
- INT_REPLY_DATA_IN => hub_to_buf_REPLY_DATA((i+1)*DATA_WIDTH-1 downto i*DATA_WIDTH),\r
- INT_REPLY_PACKET_NUM_IN => hub_to_buf_REPLY_PACKET_NUM((i+1)*NUM_WIDTH-1 downto i*NUM_WIDTH),\r
- INT_REPLY_READ_OUT => hub_to_buf_REPLY_READ(i),\r
-\r
- -- Status and control port\r
- STAT_GEN => IOBUF_STAT_GEN((i+1)*32 downto i*32),\r
- STAT_LOCKED => IOBUF_STAT_LOCKED((i+1)*32 downto i*32),\r
- STAT_INIT_BUFFER => IOBUF_buf_STAT_INIT_BUFFER((i+1)*32 downto i*32),\r
- STAT_REPLY_BUFFER => IOBUF_STAT_REPLY_BUFFER((i+1)*32 downto i*32),\r
- CTRL_GEN => IOBUF_CTRL_GEN((i+1)*32 downto i*32),\r
- CTRL_LOCKED => IOBUF_CTRL_LOCKED((i+1)*32 downto i*32),\r
- STAT_CTRL_INIT_BUFFER => IOBUF_STAT_CTRL_INIT_BUFFER((i+1)*32 downto i*32),\r
- STAT_CTRL_REPLY_BUFFER => IOBUF_STAT_CTRL_REPLY_BUFFER((i+1)*32 downto i*32)\r
- );\r
- end generate;\r
- \r
- gen_hub_logic: for i in 0 to 2**(MUX_WIDTH-1)-1 generate\r
- HUBLOGIC : trb_net16_base_hub_logic\r
- generic map{\r
- --media interfaces\r
- POINT_NUMBER => MII_NUMBER,\r
- INIT_DEPTH => MII_INIT_DEPTH((i+1)*4 downto i*4),\r
- REPLY_DEPTH => MII_REPLY_DEPTH((i+1)*4 downto i*4),\r
- --general settings\r
- DATA_WIDTH => DATA_WIDTH,\r
- NUM_WIDTH => NUM_WIDTH\r
- )\r
- port map(\r
- CLK => CLK,\r
- RESET => RESET,\r
- CLK_EN => CLK_EN,\r
- INIT_DATAREADY_IN => buf_to_hub_INIT_DATAREADY(i),\r
- INIT_DATA_IN => buf_to_hub_INIT_DATA((i+1)*DATA_WIDTH-1 downto i*DATA_WIDTH),\r
- INIT_PACKET_NUM_IN => buf_to_hub_INIT_PACKET_NUM((i+1)*NUM_WIDTH-1 downto i*NUM_WIDTH),\r
- INIT_READ_OUT => buf_to_hub_INIT_READ(i),\r
- INIT_DATAREADY_OUT => buf_to_hub_INIT_DATAREADY(i),\r
- INIT_DATA_OUT => hub_to_buf_INIT_DATA((i+1)*DATA_WIDTH-1 downto i*DATA_WIDTH),\r
- INIT_PACKET_NUM_OUT => hub_to_buf_INIT_PACKET_NUM((i+1)*NUM_WIDTH-1 downto i*NUM_WIDTH),\r
- INIT_READ_IN => hub_to_buf_INIT_READ(i),\r
- REPLY_HEADER_OUT => hub_to_buf_REPLY_HEADER_OUT(i),\r
- REPLY_DATAREADY_IN => buf_to_hub_REPLY_DATAREADY(i),\r
- REPLY_DATA_IN => buf_to_hub_REPLY_DATA((i+1)*DATA_WIDTH-1 downto i*DATA_WIDTH),\r
- REPLY_PACKET_NUM_IN => buf_to_hub_REPLY_PACKET_NUM((i+1)*NUM_WIDTH-1 downto i*NUM_WIDTH),\r
- REPLY_READ_OUT => buf_to_hub_REPLY_READ(i),\r
- REPLY_DATAREADY_OUT => hub_to_buf_REPLY_DATAREADY(i),\r
- REPLY_DATA_OUT => hub_to_buf_REPLY_DATA((i+1)*DATA_WIDTH-1 downto i*DATA_WIDTH),\r
- REPLY_PACKET_NUM_OUT => hub_to_buf_REPLY_PACKET_NUM((i+1)*NUM_WIDTH-1 downto i*NUM_WIDTH),\r
- REPLY_READ_IN => hub_to_buf_REPLY_READ(i),\r
- STAT_INTERFACE => HUB_STAT_CHANNEL((i+1)*32-1 downto i*32),\r
- STAT_GEN => HUB_STAT_GEN((i+1)*32-1 downto i*32),\r
- CTRL_INTERFACE => HUB_CTRL_CHANNEL((i+1)*32-1 downto i*32),\r
- CTRL_GEN => HUB_CTRL_GEN((i+1)*32-1 downto i*32)\r
- )\r
- end generate;\r
- \r
-end architecture;\r
+LIBRARY IEEE;
+USE IEEE.std_logic_1164.ALL;
+USE IEEE.std_logic_ARITH.ALL;
+USE IEEE.std_logic_UNSIGNED.ALL;
+USE IEEE.numeric_std.ALL;
+
+use work.trb_net_std.all;
+
+
+entity trb_net16_hub_base is
+ generic (
+ --general settings
+ MUX_SECURE_MODE : integer range 0 to 1 := 0;
+ MUX_WIDTH : integer range 1 to 5 := 3;
+ MUX_CTRL_CHANNEL : integer range 0 to 2**(MUX_WIDTH-1)-1 := 3;
+ DATA_WIDTH : integer range 16 to 16 := 16;
+ NUM_WIDTH : integer range 2 to 2 := 2;
+ --media interfaces
+ MII_NUMBER : integer range 2 to 16 := 2;
+ MII_INIT_DEPTH : bit_vector(MII_NUMBER*2**(MUX_WIDTH-1)*4-1 downto 0) := x"66110000";
+ MII_REPLY_DEPTH : bit_vector(MII_NUMBER*2**(MUX_WIDTH-1)*4-1 downto 0) := x"66110000";
+ -- settings for apis
+ API_NUMBER : integer range 0 to 16 := 1;
+ API_CHANNELS : bit_vector(API_NUMBER*4-1 downto 0) := x"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";
+ --trigger reading interfaces
+ TRG_NUMBER : integer range 0 to 16 := 2;
+ TRG_CHANNELS : bit_vector(API_NUMBER*4-1 downto 0) := x"10"
+ );
+ port (
+ CLK : in std_logic;
+ RESET : in std_logic;
+ CLK_EN : in std_logic;
+
+ --Media interfacces
+ --each port is one bit bigger than actually necessary to avoid error messages
+ MED_DATAREADY_OUT : out std_logic_vector (MII_NUMBER downto 0);
+ MED_DATA_OUT : out std_logic_vector (MII_NUMBER*DATA_WIDTH downto 0);
+ MED_PACKET_NUM_OUT: out std_logic_vector (MII_NUMBER*NUM_WIDTH downto 0);
+ MED_READ_IN : in std_logic_vector (MII_NUMBER downto 0);
+ MED_DATAREADY_IN : in std_logic_vector (MII_NUMBER downto 0);
+ MED_DATA_IN : in std_logic_vector (MII_NUMBER*DATA_WIDTH downto 0);
+ MED_PACKET_NUM_IN : in std_logic_vector (MII_NUMBER*NUM_WIDTH downto 0);
+ MED_READ_OUT : out std_logic_vector (MII_NUMBER downto 0); -- buffer reads a word from media
+ MED_ERROR_IN : in std_logic_vector (MII_NUMBER*3 downto 0);
+ --API: interfaces
+ APL_DATA_IN : in std_logic_vector (API_NUMBER*DATA_WIDTH downto 0);
+ APL_PACKET_NUM_IN : in std_logic_vector (API_NUMBER*NUM_WIDTH downto 0);
+ APL_WRITE_IN : in std_logic_vector (API_NUMBER downto 0);
+ APL_FIFO_FULL_OUT : out std_logic_vector (API_NUMBER downto 0);
+ APL_SHORT_TRANSFER_IN : in std_logic_vector (API_NUMBER downto 0);
+ APL_DTYPE_IN : in std_logic_vector (API_NUMBER*4 downto 0);
+ APL_ERROR_PATTERN_IN : in std_logic_vector (API_NUMBER*32 downto 0);
+ APL_SEND_IN : in std_logic_vector (API_NUMBER downto 0);
+ APL_TARGET_ADDRESS_IN : in std_logic_vector (API_NUMBER*16 downto 0);
+ APL_DATA_OUT : out std_logic_vector (API_NUMBER*16 downto 0);
+ APL_PACKET_NUM_OUT: out std_logic_vector (API_NUMBER*NUM_WIDTH downto 0);
+ APL_TYP_OUT : out std_logic_vector (API_NUMBER*3 downto 0);
+ APL_DATAREADY_OUT : out std_logic_vector (API_NUMBER downto 0);
+ APL_READ_IN : in std_logic_vector (API_NUMBER downto 0);
+ APL_RUN_OUT : out std_logic_vector (API_NUMBER downto 0);
+ APL_MY_ADDRESS_IN : in std_logic_vector (API_NUMBER*16 downto 0);
+ APL_SEQNR_OUT : out std_logic_vector (API_NUMBER*8 downto 0);
+ --TRG interfaces
+ TRG_GOT_TRIGGER_OUT : out std_logic_vector (TRG_NUMBER downto 0);
+ TRG_ERROR_PATTERN_OUT : out std_logic_vector (TRG_NUMBER*32 downto 0);
+ TRG_DTYPE_OUT : out std_logic_vector (TRG_NUMBER*4 downto 0);
+ TRG_SEQNR_OUT : out std_logic_vector (TRG_NUMBER*8 downto 0);
+ 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_GEN : in std_logic_vector (31 downto 0);
+ MPLEX_CTRL : in std_logic_vector (2**(MUX_WIDTH-1)*32-1 downto 0);
+ MPLEX_STAT : out std_logic_vector (2**(MUX_WIDTH-1)*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)
+ );
+end entity;
+
+architecture trb_net16_hub_base_arch of trb_net16_hub_base is
+
+ 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)*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)*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);
+
+ component trb_net16_hub_logic is
+ generic (
+ --media interfaces
+ POINT_NUMBER : integer range 2 to 16 := 2;
+ INIT_DEPTH : bit_vector(POINT_NUMBER*8-1 downto 0) := x"1111";
+ REPLY_DEPTH : bit_vector(POINT_NUMBER*8-1 downto 0) := x"1111";
+ --general settings
+ DATA_WIDTH : integer range 16 to 16 := 16;
+ NUM_WIDTH : integer range 2 to 2 := 2
+ );
+ port (
+ CLK : in std_logic;
+ RESET : in std_logic;
+ CLK_EN : in std_logic;
+ INIT_DATAREADY_IN : in std_logic_vector (POINT_NUMBER-1 downto 0);
+ INIT_DATA_IN : in std_logic_vector (DATA_WIDTH*POINT_NUMBER-1 downto 0);
+ INIT_PACKET_NUM_IN : in std_logic_vector (NUM_WIDTH*POINT_NUMBER-1 downto 0);
+ INIT_READ_OUT : out std_logic_vector (POINT_NUMBER-1 downto 0);
+ INIT_DATAREADY_OUT : out std_logic_vector (POINT_NUMBER-1 downto 0);
+ INIT_DATA_OUT : out std_logic_vector (DATA_WIDTH*POINT_NUMBER-1 downto 0);
+ INIT_PACKET_NUM_OUT : out std_logic_vector (NUM_WIDTH*POINT_NUMBER-1 downto 0);
+ INIT_READ_IN : in std_logic_vector (POINT_NUMBER-1 downto 0);
+ REPLY_HEADER_OUT : out std_logic_vector (POINT_NUMBER-1 downto 0);
+ REPLY_DATAREADY_IN : in std_logic_vector (POINT_NUMBER-1 downto 0);
+ REPLY_DATA_IN : in std_logic_vector (DATA_WIDTH*POINT_NUMBER-1 downto 0);
+ REPLY_PACKET_NUM_IN : in std_logic_vector (NUM_WIDTH*POINT_NUMBER-1 downto 0);
+ REPLY_READ_OUT : out std_logic_vector (POINT_NUMBER-1 downto 0);
+ REPLY_DATAREADY_OUT : out std_logic_vector (POINT_NUMBER-1 downto 0);
+ REPLY_DATA_OUT : out std_logic_vector (DATA_WIDTH*POINT_NUMBER-1 downto 0);
+ REPLY_PACKET_NUM_OUT : out std_logic_vector (NUM_WIDTH*POINT_NUMBER-1 downto 0);
+ REPLY_READ_IN : in std_logic_vector (POINT_NUMBER-1 downto 0);
+ STAT : out std_logic_vector (31 downto 0);
+ CTRL : in std_logic_vector (31 downto 0)
+ );
+end component;
+
+
+ component trb_net16_io_multiplexer is
+ generic (
+ DATA_WIDTH : integer := 16;
+ NUM_WIDTH : integer := 2;
+ MUX_WIDTH : integer range 1 to 5 := 3;
+ MUX_SECURE_MODE : integer range 0 to 1 := 0
+ );
+ port(
+ -- Misc
+ CLK : in std_logic;
+ RESET : in std_logic;
+ CLK_EN : in std_logic;
+ -- Media direction port
+ MED_DATAREADY_IN: in std_logic;
+ MED_DATA_IN: in std_logic_vector (DATA_WIDTH-1 downto 0);
+ MED_PACKET_NUM_IN: in std_logic_vector (NUM_WIDTH-1 downto 0);
+ MED_READ_OUT: out std_logic;
+ MED_DATAREADY_OUT: out std_logic;
+ MED_DATA_OUT: out std_logic_vector (DATA_WIDTH-1 downto 0);
+ MED_PACKET_NUM_OUT:out std_logic_vector (NUM_WIDTH-1 downto 0);
+ MED_READ_IN: in std_logic;
+ -- Internal direction port
+ INT_DATAREADY_OUT: out std_logic_vector (2**MUX_WIDTH-1 downto 0);
+ INT_DATA_OUT: out std_logic_vector ((DATA_WIDTH)*(2**MUX_WIDTH)-1 downto 0);
+ INT_PACKET_NUM_OUT:out std_logic_vector (2*(2**MUX_WIDTH)-1 downto 0);
+ INT_READ_IN: in std_logic_vector (2**MUX_WIDTH-1 downto 0);
+ INT_DATAREADY_IN: in std_logic_vector (2**MUX_WIDTH-1 downto 0);
+ INT_DATA_IN: in std_logic_vector ((DATA_WIDTH)*(2**MUX_WIDTH)-1 downto 0);
+ INT_PACKET_NUM_IN: in std_logic_vector (2*(2**MUX_WIDTH)-1 downto 0);
+ INT_READ_OUT: out std_logic_vector (2**MUX_WIDTH-1 downto 0);
+ -- Status and control port
+ CTRL: in std_logic_vector (31 downto 0);
+ STAT: out std_logic_vector (31 downto 0)
+ );
+ end component;
+
+ component trb_net16_iobuf is
+ generic (
+ INIT_DEPTH : integer := 1;
+ REPLY_DEPTH : integer := 1
+ );
+ port(
+ -- Misc
+ CLK : in std_logic;
+ RESET : in std_logic;
+ CLK_EN : in std_logic;
+ -- Media direction port
+ MED_INIT_DATAREADY_OUT: out std_logic; --Data word ready to be read out
+ MED_INIT_DATA_OUT: out std_logic_vector (15 downto 0); -- Data word
+ MED_INIT_PACKET_NUM_OUT:out std_logic_vector (1 downto 0);
+ MED_INIT_READ_IN: in std_logic; -- Media is reading
+ MED_INIT_DATAREADY_IN: in std_logic; -- Data word is offered by the Media
+ MED_INIT_DATA_IN: in std_logic_vector (15 downto 0); -- Data word
+ MED_INIT_PACKET_NUM_IN: in std_logic_vector (1 downto 0);
+ MED_INIT_READ_OUT: out std_logic; -- buffer reads a word from media
+ MED_INIT_ERROR_IN: in std_logic_vector (2 downto 0); -- Status bits
+ MED_REPLY_DATAREADY_OUT: out std_logic; --Data word ready to be read out
+ MED_REPLY_DATA_OUT: out std_logic_vector (15 downto 0); -- Data word
+ MED_REPLY_PACKET_NUM_OUT:out std_logic_vector (1 downto 0);
+ MED_REPLY_READ_IN: in std_logic; -- Media is reading
+ MED_REPLY_DATAREADY_IN: in std_logic; -- Data word is offered by the Media
+ MED_REPLY_DATA_IN: in std_logic_vector (15 downto 0); -- Data word
+ MED_REPLY_PACKET_NUM_IN: in std_logic_vector (1 downto 0);
+ MED_REPLY_READ_OUT: out std_logic; -- buffer reads a word from media
+ MED_REPLY_ERROR_IN: in std_logic_vector (2 downto 0); -- Status bits
+ -- Internal direction port
+ INT_INIT_DATAREADY_OUT: out std_logic;
+ INT_INIT_DATA_OUT: out std_logic_vector (15 downto 0); -- Data word
+ INT_INIT_PACKET_NUM_OUT:out std_logic_vector (1 downto 0);
+ INT_INIT_READ_IN: in std_logic;
+ INT_INIT_DATAREADY_IN: in std_logic;
+ INT_INIT_DATA_IN: in std_logic_vector (15 downto 0); -- Data word
+ INT_INIT_PACKET_NUM_IN: in std_logic_vector (1 downto 0);
+ INT_INIT_READ_OUT: out std_logic;
+ INT_REPLY_HEADER_IN: in std_logic;
+ INT_REPLY_DATAREADY_OUT: out std_logic;
+ INT_REPLY_DATA_OUT: out std_logic_vector (15 downto 0); -- Data word
+ INT_REPLY_PACKET_NUM_OUT:out std_logic_vector (1 downto 0);
+ INT_REPLY_READ_IN: in std_logic;
+ INT_REPLY_DATAREADY_IN: in std_logic;
+ INT_REPLY_DATA_IN: in std_logic_vector (15 downto 0); -- Data word
+ INT_REPLY_PACKET_NUM_IN: in std_logic_vector (1 downto 0);
+ INT_REPLY_READ_OUT: out std_logic;
+ -- Status and control port
+ STAT_GEN: out std_logic_vector (31 downto 0); -- General Status
+ STAT_LOCKED: out std_logic_vector (31 downto 0); -- Status of the handshake and buffer control
+ STAT_INIT_BUFFER: out std_logic_vector (31 downto 0); -- Status of the handshake and buffer control
+ STAT_REPLY_BUFFER: out std_logic_vector (31 downto 0); -- General Status
+ CTRL_GEN: in std_logic_vector (31 downto 0);
+ CTRL_LOCKED: in std_logic_vector (31 downto 0);
+ STAT_CTRL_INIT_BUFFER: in std_logic_vector (31 downto 0);
+ STAT_CTRL_REPLY_BUFFER: in std_logic_vector (31 downto 0)
+ );
+ end component;
+
+
+ component trb_net16_base_api is
+ generic (
+ API_TYPE : integer := 1;
+ FIFO_TO_INT_DEPTH : integer := 1;
+ FIFO_TO_APL_DEPTH : integer := 1;
+ FIFO_TERM_BUFFER_DEPTH : integer := 0);
+ port(
+ -- Misc
+ CLK : in std_logic;
+ RESET : in std_logic;
+ CLK_EN : in std_logic;
+ -- APL Transmitter port
+ APL_DATA_IN : in std_logic_vector (15 downto 0); -- Data word "application to network"
+ APL_PACKET_NUM_IN : in std_logic_vector (1 downto 0);
+ APL_WRITE_IN : in std_logic; -- Data word is valid and should be transmitted
+ APL_FIFO_FULL_OUT : out std_logic; -- Stop transfer, the fifo is full
+ APL_SHORT_TRANSFER_IN : in std_logic; --
+ APL_DTYPE_IN : in std_logic_vector (3 downto 0); -- see NewTriggerBusNetworkDescr
+ APL_ERROR_PATTERN_IN : in std_logic_vector (31 downto 0); -- see NewTriggerBusNetworkDescr
+ APL_SEND_IN : in std_logic; -- Release sending of the data
+ APL_TARGET_ADDRESS_IN : in std_logic_vector (15 downto 0); -- Address of
+ -- Receiver port
+ APL_DATA_OUT : out std_logic_vector (15 downto 0); -- Data word "network to application"
+ APL_PACKET_NUM_OUT : out std_logic_vector (1 downto 0);
+ APL_TYP_OUT : out std_logic_vector (2 downto 0); -- Which kind of data word: DAT, HDR or TRM
+ APL_DATAREADY_OUT : out std_logic; -- Data word is valid and might be read out
+ APL_READ_IN : in std_logic; -- Read data word
+ -- APL Control port
+ APL_RUN_OUT : out std_logic; -- Data transfer is running
+ APL_MY_ADDRESS_IN : in std_logic_vector (15 downto 0); -- My own address (temporary solution!!!)
+ APL_SEQNR_OUT : out std_logic_vector (7 downto 0);
+ -- Internal direction port
+ INT_MASTER_DATAREADY_OUT : out std_logic;
+ INT_MASTER_DATA_OUT : out std_logic_vector (15 downto 0); -- Data word
+ INT_MASTER_PACKET_NUM_OUT : out std_logic_vector (1 downto 0);
+ INT_MASTER_READ_IN : in std_logic;
+ INT_MASTER_DATAREADY_IN : in std_logic;
+ INT_MASTER_DATA_IN : in std_logic_vector (15 downto 0); -- Data word
+ INT_MASTER_PACKET_NUM_IN : in std_logic_vector (1 downto 0);
+ INT_MASTER_READ_OUT : out std_logic;
+ INT_SLAVE_HEADER_IN : in std_logic; -- Concentrator kindly asks to resend the last HDR
+ INT_SLAVE_DATAREADY_OUT : out std_logic;
+ INT_SLAVE_DATA_OUT : out std_logic_vector (15 downto 0); -- Data word
+ INT_SLAVE_PACKET_NUM_OUT : out std_logic_vector (1 downto 0);
+ INT_SLAVE_READ_IN : in std_logic;
+ INT_SLAVE_DATAREADY_IN : in std_logic;
+ INT_SLAVE_DATA_IN : in std_logic_vector (15 downto 0); -- Data word
+ INT_SLAVE_PACKET_NUM_IN : in std_logic_vector (1 downto 0);
+ INT_SLAVE_READ_OUT : out std_logic;
+ -- Status and control port
+ STAT_FIFO_TO_INT : out std_logic_vector(31 downto 0);
+ STAT_FIFO_TO_APL : out std_logic_vector(31 downto 0)
+ );
+ end component;
+
+
+
+begin
+
+--generate multiplexers
+ gen_muxes: for i in 0 to MII_NUMBER-1 generate
+ MPLEX: trb_net16_io_multiplexer
+ generic map (
+ DATA_WIDTH => DATA_WIDTH,
+ NUM_WIDTH => NUM_WIDTH,
+ MUX_WIDTH => MUX_WIDTH,
+ MUX_SECURE_MODE => MUX_SECURE_MODE
+ )
+ port map (
+ CLK => CLK,
+ RESET => RESET,
+ CLK_EN => CLK_EN,
+ MED_DATAREADY_IN => MED_DATAREADY_IN(i),
+ MED_DATA_IN => MED_DATA_IN((i+1)*DATA_WIDTH-1 downto i*DATA_WIDTH),
+ MED_PACKET_NUM_IN => MED_PACKET_NUM_IN((i+1)*NUM_WIDTH-1 downto i*NUM_WIDTH),
+ MED_READ_OUT => MED_READ_OUT(i),
+ MED_DATAREADY_OUT => MED_DATAREADY_OUT(i),
+ MED_DATA_OUT => MED_DATA_OUT((i+1)*DATA_WIDTH-1 downto i*DATA_WIDTH),
+ MED_PACKET_NUM_OUT => MED_PACKET_NUM_OUT((i+1)*NUM_WIDTH-1 downto i*NUM_WIDTH),
+ MED_READ_IN => MED_READ_IN(i),
+ INT_DATAREADY_OUT => m_DATAREADY_IN((i+1)*2**MUX_WIDTH-1 downto i*2**MUX_WIDTH),
+ INT_DATA_OUT => m_DATA_IN((i+1)*DATA_WIDTH*2**MUX_WIDTH-1 downto i*DATA_WIDTH*2**MUX_WIDTH),
+ INT_PACKET_NUM_OUT => m_PACKET_NUM_IN((i+1)*NUM_WIDTH*2**MUX_WIDTH-1 downto i*NUM_WIDTH*2**MUX_WIDTH),
+ INT_READ_IN => m_READ_OUT((i+1)*2**MUX_WIDTH-1 downto i*2**MUX_WIDTH),
+ INT_DATAREADY_IN => m_DATAREADY_OUT((i+1)*2**MUX_WIDTH-1 downto i*2**MUX_WIDTH),
+ INT_DATA_IN => m_DATA_OUT((i+1)*DATA_WIDTH*2**MUX_WIDTH-1 downto i*DATA_WIDTH*2**MUX_WIDTH),
+ INT_PACKET_NUM_IN => m_PACKET_NUM_OUT((i+1)*NUM_WIDTH*2**MUX_WIDTH-1 downto i*NUM_WIDTH*2**MUX_WIDTH),
+ INT_READ_OUT => m_READ_IN((i+1)*2**MUX_WIDTH-1 downto i*2**MUX_WIDTH),
+ CTRL => MPLEX_CTRL((i+1)*32-1 downto i*32),
+ STAT => MPLEX_STAT((i+1)*32-1 downto i*32)
+ );
+ end generate;
+
+--generate IOBufs for MII
+ gen_iobufs: for i in 0 to 2**(MUX_WIDTH-1)*MII_NUMBER-1 generate
+ IOBUF: trb_net16_iobuf
+ generic map (
+ INIT_DEPTH => conv_integer(to_stdlogicvector(MII_INIT_DEPTH((i+1)*4-1 downto i*4))),
+ REPLY_DEPTH => conv_integer(to_stdlogicvector(MII_REPLY_DEPTH((i+1)*4-1 downto i*4)))
+ )
+ port map (
+ -- Misc
+ CLK => CLK ,
+ RESET => RESET,
+ CLK_EN => CLK_EN,
+ -- Media direction port
+ MED_INIT_DATAREADY_OUT => m_DATAREADY_OUT(i*2),
+ MED_INIT_DATA_OUT => m_DATA_OUT((i*2+1)*DATA_WIDTH-1 downto i*2*DATA_WIDTH),
+ MED_INIT_PACKET_NUM_OUT => m_PACKET_NUM_OUT((i*2+1)*NUM_WIDTH-1 downto i*2*NUM_WIDTH),
+ MED_INIT_READ_IN => m_READ_IN(i*2),
+
+ MED_INIT_DATAREADY_IN => m_DATAREADY_IN(i*2),
+ MED_INIT_DATA_IN => m_DATA_IN((i*2+1)*DATA_WIDTH-1 downto i*2*DATA_WIDTH),
+ MED_INIT_PACKET_NUM_IN => m_PACKET_NUM_IN((i*2+1)*NUM_WIDTH-1 downto i*2*NUM_WIDTH),
+ MED_INIT_READ_OUT => m_READ_OUT(i*2),
+ MED_INIT_ERROR_IN => m_ERROR_IN((i+1)*3-1 downto i*3),
+
+ MED_REPLY_DATAREADY_OUT => m_DATAREADY_OUT(i*2+1),
+ MED_REPLY_DATA_OUT => m_DATA_OUT((i*2+2)*DATA_WIDTH-1 downto (i*2+1)*DATA_WIDTH),
+ MED_REPLY_PACKET_NUM_OUT=> m_PACKET_NUM_OUT((i*2+2)*NUM_WIDTH-1 downto (i*2+1)*NUM_WIDTH),
+ MED_REPLY_READ_IN => m_READ_IN(i*2+1),
+
+ MED_REPLY_DATAREADY_IN => m_DATAREADY_IN(i*2+1),
+ MED_REPLY_DATA_IN => m_DATA_IN((i*2+2)*DATA_WIDTH-1 downto (i*2+1)*DATA_WIDTH),
+ MED_REPLY_PACKET_NUM_IN => m_PACKET_NUM_IN((i*2+2)*NUM_WIDTH-1 downto (i*2+1)*NUM_WIDTH),
+ MED_REPLY_READ_OUT => m_READ_OUT(i*2+1),
+ MED_REPLY_ERROR_IN => m_ERROR_IN((i+1)*3-1 downto i*3),
+
+ -- Internal direction port
+
+ INT_INIT_DATAREADY_OUT => buf_to_hub_INIT_DATAREADY(i),
+ INT_INIT_DATA_OUT => buf_to_hub_INIT_DATA((i+1)*DATA_WIDTH-1 downto i*DATA_WIDTH),
+ INT_INIT_PACKET_NUM_OUT=> buf_to_hub_INIT_PACKET_NUM((i+1)*NUM_WIDTH-1 downto i*NUM_WIDTH),
+ INT_INIT_READ_IN => buf_to_hub_INIT_READ(i),
+
+ INT_INIT_DATAREADY_IN => hub_to_buf_INIT_DATAREADY(i),
+ INT_INIT_DATA_IN => hub_to_buf_INIT_DATA((i+1)*DATA_WIDTH-1 downto i*DATA_WIDTH),
+ INT_INIT_PACKET_NUM_IN => hub_to_buf_INIT_PACKET_NUM((i+1)*NUM_WIDTH-1 downto i*NUM_WIDTH),
+ INT_INIT_READ_OUT => hub_to_buf_INIT_READ(i),
+
+ INT_REPLY_HEADER_IN => buf_to_hub_REPLY_SEND_HEADER(i),
+ INT_REPLY_DATAREADY_OUT => buf_to_hub_REPLY_DATAREADY(i),
+ INT_REPLY_DATA_OUT => buf_to_hub_REPLY_DATA((i+1)*DATA_WIDTH-1 downto i*DATA_WIDTH),
+ INT_REPLY_PACKET_NUM_OUT=> buf_to_hub_REPLY_PACKET_NUM((i+1)*NUM_WIDTH-1 downto i*NUM_WIDTH),
+ INT_REPLY_READ_IN => buf_to_hub_REPLY_READ(i),
+
+ INT_REPLY_DATAREADY_IN => hub_to_buf_REPLY_DATAREADY(i),
+ INT_REPLY_DATA_IN => hub_to_buf_REPLY_DATA((i+1)*DATA_WIDTH-1 downto i*DATA_WIDTH),
+ INT_REPLY_PACKET_NUM_IN => hub_to_buf_REPLY_PACKET_NUM((i+1)*NUM_WIDTH-1 downto i*NUM_WIDTH),
+ INT_REPLY_READ_OUT => hub_to_buf_REPLY_READ(i),
+
+ -- Status and control port
+ STAT_GEN => IOBUF_STAT_GEN((i+1)*32-1 downto i*32),
+ STAT_LOCKED => IOBUF_STAT_LOCKED((i+1)*32-1 downto i*32),
+ STAT_INIT_BUFFER => IOBUF_STAT_INIT_BUFFER((i+1)*32-1 downto i*32),
+ STAT_REPLY_BUFFER => IOBUF_STAT_REPLY_BUFFER((i+1)*32-1 downto i*32),
+ CTRL_GEN => IOBUF_CTRL_GEN((i+1)*32-1 downto i*32),
+ CTRL_LOCKED => IOBUF_CTRL_LOCKED((i+1)*32-1 downto i*32),
+ STAT_CTRL_INIT_BUFFER => IOBUF_STAT_CTRL_INIT_BUFFER((i+1)*32-1 downto i*32),
+ STAT_CTRL_REPLY_BUFFER => IOBUF_STAT_CTRL_REPLY_BUFFER((i+1)*32-1 downto i*32)
+ );
+ end generate;
+
+ gen_hub_logic: for i in 0 to 2**(MUX_WIDTH-1)-1 generate
+ HUBLOGIC : trb_net16_hub_logic
+ generic map (
+ --media interfaces
+ POINT_NUMBER => MII_NUMBER,
+ INIT_DEPTH => MII_INIT_DEPTH((i+1)*4 downto i*4),
+ REPLY_DEPTH => MII_REPLY_DEPTH((i+1)*4 downto i*4),
+ --general settings
+ DATA_WIDTH => DATA_WIDTH,
+ NUM_WIDTH => NUM_WIDTH
+ )
+ port map(
+ 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*MII_NUMBER),
+ STAT => HUB_STAT_CHANNEL((i+1)*32-1 downto i*32),
+ CTRL => HUB_CTRL_CHANNEL((i+1)*32-1 downto i*32)
+ );
+ end generate;
+
+end architecture;