]> jspc29.x-matter.uni-frankfurt.de Git - soda.git/commitdiff
Merge branch 'master' of jspc29.x-matter.uni-frankfurt.de:soda
authorPeter Lemmens <p.j.j.lemmens@rug.nl>
Mon, 2 Feb 2015 16:10:25 +0000 (17:10 +0100)
committerPeter Lemmens <p.j.j.lemmens@rug.nl>
Mon, 2 Feb 2015 16:10:25 +0000 (17:10 +0100)
Conflicts:
code/med_ecp3_sfp_4_sync_down.vhd
code/soda_components.vhd

1  2 
code/med_ecp3_sfp_4_sync_down.vhd
code/med_ecp3_sfp_sync_up.vhd
code/soda_components.vhd

index 9a24e7139d97f50e7c3a4760503f25112ba2ce67,49471b391447b696fcb3ccbed3ba29d6c5e1b2d1..892309aa3cfdf59f06fe56fd62abee774f439946
 ---4 channel Media interface for Lattice ECP3 using PCS at 2GHz\r
 -\r
 -LIBRARY IEEE;\r
 -use IEEE.std_logic_1164.ALL;\r
 -use IEEE.numeric_std.all;\r
 -use IEEE.std_logic_unsigned.ALL;\r
 -\r
 -library work;\r
 -use work.trb_net_std.all;\r
 -use work.trb_net_components.all;\r
 -use work.med_sync_define.all;\r
 -use work.soda_components.all;\r
 -\r
 -entity med_ecp3_sfp_4_sync_down is\r
 -      generic(        SERDES_NUM : integer range 0 to 3 := 0;\r
 -                              IS_SYNC_SLAVE   : integer := c_NO);   -- hub downlink is NO slave\r
 -      port(\r
 -              OSC_CLK                                 : in  std_logic; -- 200 MHz reference clock\r
 -              TX_DATACLK                              : in  std_logic; -- 200 MHz data clock\r
 -              SYSCLK                                  : in  std_logic; -- 100 MHz main clock net, synchronous to OSC clock\r
 -              RESET                                           : in  std_logic; -- synchronous reset\r
 -              CLEAR                                           : in  std_logic; -- asynchronous reset\r
 -              ---------------------------------------------------------------------------------------------------------------------------------------------------------\r
 -              LINK_DISABLE_IN         : in  std_logic;        -- downlinks must behave as slaves to uplink connection. Downlinks are released once unlink is established.\r
 -              ---------------------------------------------------------------------------------------------------------------------------------------------------------\r
 -              --Internal Connection TX\r
 -              MED_DATA_IN                             : in  t_HUB_WORD;       -- std_logic_vector(4*c_DATA_WIDTH-1 downto 0);\r
 -              MED_PACKET_NUM_IN               : in    t_HUB_NUM;      --std_logic_vector(4*c_NUM_WIDTH-1 downto 0);\r
 -              MED_DATAREADY_IN                : in  std_logic_vector(3 downto 0);\r
 -              MED_READ_OUT                    : out std_logic_vector(3 downto 0) := (others => '0');\r
 -              --Internal Connection RX\r
 -              MED_DATA_OUT                    : out  t_HUB_WORD;      -- std_logic_vector(4*c_DATA_WIDTH-1 downto 0)  := (others => '0');\r
 -              MED_PACKET_NUM_OUT      : out  t_HUB_NUM;       -- std_logic_vector(4*c_NUM_WIDTH-1 downto 0)   := (others => '0');\r
 -              MED_DATAREADY_OUT               : out std_logic_vector(3 downto 0)                                              := (others => '0');\r
 -              MED_READ_IN                             : in  std_logic_vector(3 downto 0);\r
 -              RX_HALF_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0');  --100 MHz\r
 -              RX_FULL_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0');  --200 MHz\r
 -              TX_HALF_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0');  --100 MHz\r
 -              TX_FULL_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0');  --200 MHz\r
 -\r
 -              --Sync operation\r
 -              RX_DLM                                  : out   t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');\r
 -              RX_DLM_WORD                             : out   t_HUB_BYTE;     --std_logic_vector(4*8 - 1 downto 0)    := (others => '0');\r
 -              TX_DLM                                  : in    t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');\r
 -              TX_DLM_WORD                             : in    t_HUB_BYTE;     --std_logic_vector(4*8 - 1 downto 0)    := (others => '0');\r
 -              TX_DLM_PREVIEW_IN               : in    t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');     --PL!\r
 -              LINK_PHASE_OUT                  : out   t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');     --PL!\r
 -\r
 -              --SFP Connection \r
 -              SD_RXD_P_IN                             : in    t_HUB_BIT;      --std_logic_vector(3 downto 0);\r
 -              SD_RXD_N_IN                             : in    t_HUB_BIT;      --std_logic_vector(3 downto 0);\r
 -              SD_TXD_P_OUT                    : out   t_HUB_BIT;      --std_logic_vector(3 downto 0);\r
 -              SD_TXD_N_OUT                    : out   t_HUB_BIT;      --std_logic_vector(3 downto 0);\r
 -              SD_REFCLK_P_IN                  : in    t_HUB_BIT;      --std_logic;  --not used\r
 -              SD_REFCLK_N_IN                  : in    t_HUB_BIT;      --std_logic;  --not used\r
 -              SD_PRSNT_N_IN                   : in    t_HUB_BIT;      --std_logic;  -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)\r
 -              SD_LOS_IN                               : in    t_HUB_BIT;      --std_logic;  -- SFP Loss Of Signal ('0' = OK, '1' = no signal)\r
 -              SD_TXDIS_OUT                    : out   t_HUB_BIT;      --std_logic := '0'; -- SFP disable\r
 -              --Control Interface\r
 -              SCI_DATA_IN                             : in  std_logic_vector(7 downto 0) := (others => '0');\r
 -              SCI_DATA_OUT                    : out std_logic_vector(7 downto 0) := (others => '0');\r
 -              SCI_ADDR                                        : in  std_logic_vector(8 downto 0) := (others => '0');\r
 -              SCI_READ                                        : in  std_logic := '0';\r
 -              SCI_WRITE                               : in  std_logic := '0';\r
 -              SCI_ACK                                 : out std_logic := '0';\r
 -              SCI_NACK                                        : out std_logic := '0';\r
 -              -- Status and control port\r
 -              STAT_OP                                 : out   t_HUB_WORD;     --std_logic_vector (15 downto 0);\r
 -              CTRL_OP                                 : in    t_HUB_WORD;     --std_logic_vector (15 downto 0) := (others => '0');\r
 -              STAT_DEBUG                              : out std_logic_vector (63 downto 0);\r
 -              CTRL_DEBUG                              : in  std_logic_vector (63 downto 0) := (others => '0')\r
 -      );\r
 -end entity;\r
 -\r
 -\r
 -architecture med_ecp3_sfp_4_sync_down_arch of med_ecp3_sfp_4_sync_down is\r
 -\r
 -  -- Placer Directives\r
 -  attribute HGROUP : string;\r
 -  -- for whole architecture\r
 -  attribute HGROUP of med_ecp3_sfp_4_sync_down_arch : architecture  is "media_downlink_group";\r
 -  attribute syn_sharing : string;\r
 -  attribute syn_sharing of med_ecp3_sfp_4_sync_down_arch : architecture is "off";\r
 +--4 channel Media interface for Lattice ECP3 using PCS at 2GHz
 +
 +LIBRARY IEEE;
 +use IEEE.std_logic_1164.ALL;
 +use IEEE.numeric_std.all;
 +use IEEE.std_logic_unsigned.ALL;
 +
 +library work;
 +use work.trb_net_std.all;
 +use work.trb_net_components.all;
 +use work.med_sync_define.all;
 +use work.soda_components.all;
 +
 +entity med_ecp3_sfp_4_sync_down is
 +      generic(        SERDES_NUM : integer range 0 to 3 := 0;
 +                              IS_SYNC_SLAVE   : integer := c_NO);   -- hub downlink is NO slave
 +      port(
 +              OSC_CLK                                 : in  std_logic; -- 200 MHz reference clock
 +              TX_DATACLK                              : in  std_logic; -- 200 MHz data clock
 +              SYSCLK                                  : in  std_logic; -- 100 MHz main clock net, synchronous to OSC clock
-               RESET                                           : in  std_logic; -- synchronous reet
++              RESET                                           : in  std_logic; -- synchronous reset
 +              CLEAR                                           : in  std_logic; -- asynchronous reset
 +              ---------------------------------------------------------------------------------------------------------------------------------------------------------
 +              LINK_DISABLE_IN         : in  std_logic;        -- downlinks must behave as slaves to uplink connection. Downlinks are released once unlink is established.
 +              ---------------------------------------------------------------------------------------------------------------------------------------------------------
 +              --Internal Connection TX
 +              MED_DATA_IN                             : in  t_HUB_WORD;       -- std_logic_vector(4*c_DATA_WIDTH-1 downto 0);
 +              MED_PACKET_NUM_IN               : in    t_HUB_NUM;      --std_logic_vector(4*c_NUM_WIDTH-1 downto 0);
 +              MED_DATAREADY_IN                : in  std_logic_vector(3 downto 0);
 +              MED_READ_OUT                    : out std_logic_vector(3 downto 0) := (others => '0');
 +              --Internal Connection RX
 +              MED_DATA_OUT                    : out  t_HUB_WORD;      -- std_logic_vector(4*c_DATA_WIDTH-1 downto 0)  := (others => '0');
 +              MED_PACKET_NUM_OUT      : out  t_HUB_NUM;       -- std_logic_vector(4*c_NUM_WIDTH-1 downto 0)   := (others => '0');
 +              MED_DATAREADY_OUT               : out std_logic_vector(3 downto 0)                                              := (others => '0');
 +              MED_READ_IN                             : in  std_logic_vector(3 downto 0);
 +              RX_HALF_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0');  --100 MHz
 +              RX_FULL_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0');  --200 MHz
 +              TX_HALF_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0');  --100 MHz
 +              TX_FULL_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0');  --200 MHz
 +
 +              --Sync operation
 +              RX_DLM                                  : out   t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');
 +              RX_DLM_WORD                             : out   t_HUB_BYTE;     --std_logic_vector(4*8 - 1 downto 0)    := (others => '0');
 +              TX_DLM                                  : in    t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');
 +              TX_DLM_WORD                             : in    t_HUB_BYTE;     --std_logic_vector(4*8 - 1 downto 0)    := (others => '0');
 +              TX_DLM_PREVIEW_IN               : in    t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');     --PL!
 +              LINK_PHASE_OUT                  : out   t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');     --PL!
 +
 +              --SFP Connection 
 +              SD_RXD_P_IN                             : in    t_HUB_BIT;      --std_logic_vector(3 downto 0);
 +              SD_RXD_N_IN                             : in    t_HUB_BIT;      --std_logic_vector(3 downto 0);
 +              SD_TXD_P_OUT                    : out   t_HUB_BIT;      --std_logic_vector(3 downto 0);
 +              SD_TXD_N_OUT                    : out   t_HUB_BIT;      --std_logic_vector(3 downto 0);
 +              SD_REFCLK_P_IN                  : in    t_HUB_BIT;      --std_logic;  --not used
 +              SD_REFCLK_N_IN                  : in    t_HUB_BIT;      --std_logic;  --not used
 +              SD_PRSNT_N_IN                   : in    t_HUB_BIT;      --std_logic;  -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)
 +              SD_LOS_IN                               : in    t_HUB_BIT;      --std_logic;  -- SFP Loss Of Signal ('0' = OK, '1' = no signal)
 +              SD_TXDIS_OUT                    : out   t_HUB_BIT;      --std_logic := '0'; -- SFP disable
 +              --Control Interface
 +              SCI_DATA_IN                             : in  std_logic_vector(7 downto 0) := (others => '0');
 +              SCI_DATA_OUT                    : out std_logic_vector(7 downto 0) := (others => '0');
 +              SCI_ADDR                                        : in  std_logic_vector(8 downto 0) := (others => '0');
 +              SCI_READ                                        : in  std_logic := '0';
 +              SCI_WRITE                               : in  std_logic := '0';
 +              SCI_ACK                                 : out std_logic := '0';
 +              SCI_NACK                                        : out std_logic := '0';
 +              -- Status and control port
 +--            STAT_OP                                 : out   t_HUB_WORD;     --std_logic_vector (15 downto 0);
 +--            CTRL_OP                                 : in    t_HUB_WORD;     --std_logic_vector (15 downto 0) := (others => '0');
 +              STAT_OP                                 : out   std_logic_vector (63 downto 0);
 +              CTRL_OP                                 : in    std_logic_vector (63 downto 0) := (others => '0');
 +              STAT_DEBUG                              : out std_logic_vector (63 downto 0);
 +              CTRL_DEBUG                              : in  std_logic_vector (63 downto 0) := (others => '0')
 +      );
 +end entity;
 +
 +
 +architecture med_ecp3_sfp_4_sync_down_arch of med_ecp3_sfp_4_sync_down is
 +
 +  -- Placer Directives
 +  attribute HGROUP : string;
 +  -- for whole architecture
 +  attribute HGROUP of med_ecp3_sfp_4_sync_down_arch : architecture  is "media_downlink_group";
 +  attribute syn_sharing : string;
 +  attribute syn_sharing of med_ecp3_sfp_4_sync_down_arch : architecture is "off";
+   attribute syn_hier     : string;\r
+   attribute syn_hier of med_ecp3_sfp_4_sync_down_arch : architecture is "hard";\r
 -\r
 -signal clk_200_osc                                            : std_logic;\r
 -signal clk_200_txdata                                 : std_logic;\r
 -signal clk_200_rxdn                                           : std_logic_vector(3 downto 0);\r
 -signal clk_200_i                                                      : std_logic_vector(3 downto 0);\r
 -signal rx_full_clk                                            : std_logic_vector(3 downto 0);\r
 -signal rx_half_clk                                            : std_logic_vector(3 downto 0); \r
 -signal tx_full_clk                                            : std_logic_vector(3 downto 0);\r
 -signal tx_half_clk                                            : std_logic_vector(3 downto 0);\r
 -\r
 -signal tx_data                                                                : t_HUB_BYTE;   --std_logic_vector(4*8-1 downto 0);\r
 -signal tx_k                                                                   : std_logic_vector(3 downto 0);\r
 -signal rx_data                                                                : t_HUB_BYTE;   --std_logic_vector(4*8-1 downto 0);\r
 -signal rx_k                                                                   : t_HUB_BIT;    --std_logic_vector(3 downto 0);\r
 -signal rx_error                                                       : t_HUB_BIT;    --std_logic_vector(3 downto 0);\r
 -\r
 -signal rst_n                                                          : t_HUB_BIT;\r
 -signal rst                                                                    : t_HUB_BIT;            -- PL!\r
 -signal rx_serdes_rst                                          : t_HUB_BIT;\r
 -signal tx_serdes_rst                                          : std_logic; \r
 -signal tx_pcs_rst                                                     : t_HUB_BIT; \r
 -signal rx_pcs_rst                                                     : t_HUB_BIT; \r
 -signal rst_qd                                                         : t_HUB_BIT; \r
 -signal rst_down_quad                                          : std_logic; \r
 -signal serdes_rst_qd                                          : t_HUB_BIT; \r
 -signal serdes_rst_down_quad                   : std_logic;    -- combined serdes reset for whole quad\r
 -signal sd_los_i                                                       : t_HUB_BIT;    --PL!\r
 -\r
 -signal rx_los_low                                                     : t_HUB_BIT; \r
 -signal lsm_status                                                     : t_HUB_BIT; \r
 -signal rx_cdr_lol                                                     : t_HUB_BIT; \r
 -signal tx_pll_lol                                                     : t_HUB_BIT; \r
 -signal tx_pll_lol_quad                                        : std_logic;    -- combined Loss-Of-Lock for whole quad\r
 -\r
 -signal sci_ch_i                                                       : std_logic_vector(3 downto 0);\r
 -signal sci_qd_i                                                       : std_logic;\r
 -signal sci_reg_i                                                      : std_logic;\r
 -signal sci_addr_i                                                     : std_logic_vector(8 downto 0);\r
 -signal sci_data_in_i                                          : std_logic_vector(7 downto 0);\r
 -signal sci_data_out_i                                 : std_logic_vector(7 downto 0);\r
 -signal sci_read_i                                                     : std_logic;\r
 -signal sci_write_i                                            : std_logic;\r
 -signal sci_write_shift_i                              : std_logic_vector(2 downto 0);\r
 -signal sci_read_shift_i                                       : std_logic_vector(2 downto 0);\r
 -\r
 -signal wa_position                                            : t_HUB_NIBL    := (others => (others => '1')); --std_logic_vector(15 downto 0) := x"FFFF";\r
 -signal wa_position_rx                                 : t_HUB_NIBL    := (others => (others => '1')); --std_logic_vector(15 downto 0) := x"FFFF";\r
 -signal tx_allow                                                       : t_HUB_BIT;    --std_logic_vector(3 downto 0);\r
 -signal rx_allow                                                       : t_HUB_BIT;    --std_logic_vector(3 downto 0);\r
 -signal tx_allow_q                                                     : t_HUB_BIT;    --std_logic_vector(3 downto 0);\r
 -signal rx_allow_q                                                     : t_HUB_BIT;    --std_logic_vector(3 downto 0);\r
 -signal link_phase_S                                           : t_HUB_BIT;    --std_logic_vector(3 downto 0); --PL!\r
 -signal request_retr_i                                 : t_HUB_BIT;    --std_logic_vector(3 downto 0);\r
 -signal start_retr_i                                           : t_HUB_BIT;    --std_logic_vector(3 downto 0);\r
 -signal request_retr_position_i                : t_HUB_BYTE;   --std_logic_vector(7 downto 0);\r
 -signal start_retr_position_i                  : t_HUB_BYTE;   --std_logic_vector(7 downto 0);\r
 -signal send_link_reset_i                              : t_HUB_BIT;    --std_logic_vector(3 downto 0);\r
 -signal make_link_reset_i                              : t_HUB_BIT;    --std_logic_vector(3 downto 0);\r
 -signal got_link_ready_i                                       : t_HUB_BIT;    --std_logic_vector(3 downto 0);\r
 -signal internal_make_link_reset_out   : t_HUB_BIT;    --std_logic_vector(3 downto 0);\r
 -\r
 -signal start_timer                                            : t_HUB_TIMER19 := (others => (others => '0')); --unsigned(18 downto 0)                         := (others => '0');\r
 -signal watchdog_timer                                 : t_HUB_TIMER21 := (others => (others => '0')); --unsigned(20 downto 0)                         := (others => '0');\r
 -signal watchdog_trigger                                       : t_HUB_BIT                     := (others => '0');                                     --std_logic_vector(3 downto 0)  := (others => '0');\r
 -\r
 -signal rx_fsm_state                                           : t_HUB_NIBL;   --std_logic_vector(3 downto 0);\r
 -signal tx_fsm_state                                           : t_HUB_NIBL;   --std_logic_vector(3 downto 0);\r
 -\r
 -signal stat_rx_control_i                              : t_HUB_LWORD;  --std_logic_vector(31 downto 0);\r
 -signal stat_tx_control_i                              : t_HUB_LWORD;  --std_logic_vector(31 downto 0);\r
 -signal debug_rx_control_i                             : t_HUB_LWORD;  --std_logic_vector(31 downto 0);\r
 -signal debug_tx_control_i                             : t_HUB_LWORD;  --std_logic_vector(31 downto 0);\r
 -signal debug_reg                                                      : std_logic_vector(63 downto 0);\r
 -\r
 -type sci_ctrl is (IDLE, SCTRL, SCTRL_WAIT, SCTRL_WAIT2, SCTRL_FINISH, GET_WA, GET_WA_WAIT, GET_WA_WAIT2, GET_WA_FINISH);\r
 -signal sci_state                                                      : sci_ctrl;\r
 -signal sci_timer                                                      : t_HUB_TIMER13 := (others => (others => '0')); --unsigned(12 downto 0)                         := (others => '0');\r
 -\r
 -begin\r
 -\r
 -\r
 ---SD_TXDIS_OUT <= not (rx_allow_q or not IS_SLAVE);   --slave only switches on when RX is ready\r
 -\r
 -clk_200_osc                   <= OSC_CLK;                     -- This external clock is oscillator/pll generated !!!\r
 -clk_200_txdata                <= TX_DATACLK;          -- This external clock is the rx_full of the uplink !!!\r
 -\r
 -\r
 -gen_clocks    : for i in 0 to 3 generate\r
 -\r
 -      rst(i)                                  <=              (CLEAR or sd_los_i(i) or internal_make_link_reset_out(i) or watchdog_trigger(i));\r
 -      rst_n(i)                                        <=              not(CLEAR or sd_los_i(i) or internal_make_link_reset_out(i) or watchdog_trigger(i));\r
 -\r
 -      RX_HALF_CLK_OUT(i)      <= rx_half_clk(i);\r
 -      RX_FULL_CLK_OUT(i)      <= rx_full_clk(i);\r
 -      TX_HALF_CLK_OUT(i)      <= tx_half_clk(i);\r
 -      TX_FULL_CLK_OUT(i)      <= tx_full_clk(i);\r
 -\r
 ---    gen_slave_clock : if IS_SYNC_SLAVE = c_YES generate             -- NO WAY IN HELL !! this downlink is a master\r
 ---            clk_200_i(i)                    <= rx_full_clk(i);\r
 ---    end generate;\r
 -\r
 ---    gen_master_clock : if IS_SYNC_SLAVE = c_NO generate\r
 ---    clk_200_i(i)            <= clk_200_txdata;\r
 ---    clk_200_rxdn(i) <= rx_full_clk(i);      -- These clocks are the rx_full of the DOWNLINKs !!!\r
 ---    end generate;\r
 -end generate;\r
 -\r
 --------------------------------------------------  \r
 --- Serdes\r
 -------------------------------------------------- \r
 -THE_SERDES : entity work.serdes_4_sync_downstream\r
 -      port map(\r
 -      --      CHANNEL0 --     \r
 -              hdinp_ch0                               => SD_RXD_P_IN(0),\r
 -              hdinn_ch0                               => SD_RXD_N_IN(0),\r
 -              hdoutp_ch0                              => SD_TXD_P_OUT(0),\r
 -              hdoutn_ch0                              => SD_TXD_N_OUT(0),\r
 -              rxiclk_ch0                              => clk_200_txdata,      --clk_200_i(0),\r
 -              sci_sel_ch0                             => sci_ch_i(0),\r
 -              txiclk_ch0                              => clk_200_txdata,\r
 -              rx_full_clk_ch0         => rx_full_clk(0),\r
 -              rx_half_clk_ch0         => rx_half_clk(0),\r
 -              tx_full_clk_ch0         => tx_full_clk(0),\r
 -              tx_half_clk_ch0         => tx_half_clk(0),\r
 -              fpga_rxrefclk_ch0               => clk_200_osc,\r
 -              txdata_ch0                              => tx_data(0),\r
 -              tx_k_ch0                                        => tx_k(0),\r
 -              tx_force_disp_ch0               => '0',\r
 -              tx_disp_sel_ch0         => '0',\r
 -              rxdata_ch0                              => rx_data(0),\r
 -              rx_k_ch0                                        => rx_k(0),\r
 -              rx_disp_err_ch0         => open,\r
 -              rx_cv_err_ch0                   => rx_error(0),\r
 -              rx_serdes_rst_ch0_c  => rx_serdes_rst(0),\r
 -              sb_felb_ch0_c                   => '0',\r
 -              sb_felb_rst_ch0_c               => '0',\r
 -              tx_pcs_rst_ch0_c                => tx_pcs_rst(0),\r
 -              tx_pwrup_ch0_c                  => '1',\r
 -              rx_pcs_rst_ch0_c                => rx_pcs_rst(0),\r
 -              rx_pwrup_ch0_c                  => '1',\r
 -              rx_los_low_ch0_s                => rx_los_low(0),\r
 -              lsm_status_ch0_s                => lsm_status(0),\r
 -              rx_cdr_lol_ch0_s                => rx_cdr_lol(0),\r
 -              tx_div2_mode_ch0_c      => '0',\r
 -              rx_div2_mode_ch0_c      => '0',\r
 -      --      CHANNEL1 --     \r
 -              hdinp_ch1                               => SD_RXD_P_IN(1),\r
 -              hdinn_ch1                               => SD_RXD_N_IN(1),\r
 -              hdoutp_ch1                              => SD_TXD_P_OUT(1),\r
 -              hdoutn_ch1                              => SD_TXD_N_OUT(1),\r
 -              rxiclk_ch1                              => clk_200_txdata,      --clk_200_i(1),\r
 -              sci_sel_ch1                             => sci_ch_i(1),\r
 -              txiclk_ch1                              => clk_200_txdata,\r
 -              rx_full_clk_ch1         => rx_full_clk(1),\r
 -              rx_half_clk_ch1         => rx_half_clk(1),\r
 -              tx_full_clk_ch1         => tx_full_clk(1),\r
 -              tx_half_clk_ch1         => tx_half_clk(1),\r
 -              fpga_rxrefclk_ch1               => clk_200_osc,\r
 -              txdata_ch1                              => tx_data(1),\r
 -              tx_k_ch1                                        => tx_k(1),\r
 -              tx_force_disp_ch1               => '0',\r
 -              tx_disp_sel_ch1         => '0',\r
 -              rxdata_ch1                              => rx_data(1),\r
 -              rx_k_ch1                                        => rx_k(1),\r
 -              rx_disp_err_ch1         => open,\r
 -              rx_cv_err_ch1                   => rx_error(1),\r
 -              rx_serdes_rst_ch1_c  => rx_serdes_rst(1),\r
 -              sb_felb_ch1_c                   => '0',\r
 -              sb_felb_rst_ch1_c               => '0',\r
 -              tx_pcs_rst_ch1_c                => tx_pcs_rst(1),\r
 -              tx_pwrup_ch1_c                  => '1',\r
 -              rx_pcs_rst_ch1_c                => rx_pcs_rst(1),\r
 -              rx_pwrup_ch1_c                  => '1',\r
 -              rx_los_low_ch1_s                => rx_los_low(1),\r
 -              lsm_status_ch1_s                => lsm_status(1),\r
 -              rx_cdr_lol_ch1_s                => rx_cdr_lol(1),\r
 -              tx_div2_mode_ch1_c      => '0',\r
 -              rx_div2_mode_ch1_c      => '0',\r
 -      --      CHANNEL2 --     \r
 -              hdinp_ch2                               => SD_RXD_P_IN(2),\r
 -              hdinn_ch2                               => SD_RXD_N_IN(2),\r
 -              hdoutp_ch2                              => SD_TXD_P_OUT(2),\r
 -              hdoutn_ch2                              => SD_TXD_N_OUT(2),\r
 -              rxiclk_ch2                              => clk_200_txdata,      --clk_200_i(2),\r
 -              sci_sel_ch2                             => sci_ch_i(2),\r
 -              txiclk_ch2                              => clk_200_txdata,\r
 -              rx_full_clk_ch2         => rx_full_clk(2),\r
 -              rx_half_clk_ch2         => rx_half_clk(2),\r
 -              tx_full_clk_ch2         => tx_full_clk(2),\r
 -              tx_half_clk_ch2         => tx_half_clk(2),\r
 -              fpga_rxrefclk_ch2               => clk_200_osc,\r
 -              txdata_ch2                              => tx_data(2),\r
 -              tx_k_ch2                                        => tx_k(2),\r
 -              tx_force_disp_ch2               => '0',\r
 -              tx_disp_sel_ch2         => '0',\r
 -              rxdata_ch2                              => rx_data(2),\r
 -              rx_k_ch2                                        => rx_k(2),\r
 -              rx_disp_err_ch2         => open,\r
 -              rx_cv_err_ch2                   => rx_error(2),\r
 -              rx_serdes_rst_ch2_c  => rx_serdes_rst(2),\r
 -              sb_felb_ch2_c                   => '0',\r
 -              sb_felb_rst_ch2_c               => '0',\r
 -              tx_pcs_rst_ch2_c                => tx_pcs_rst(2),\r
 -              tx_pwrup_ch2_c                  => '1',\r
 -              rx_pcs_rst_ch2_c                => rx_pcs_rst(2),\r
 -              rx_pwrup_ch2_c                  => '1',\r
 -              rx_los_low_ch2_s                => rx_los_low(2),\r
 -              lsm_status_ch2_s                => lsm_status(2),\r
 -              rx_cdr_lol_ch2_s                => rx_cdr_lol(2),\r
 -              tx_div2_mode_ch2_c      => '0',\r
 -              rx_div2_mode_ch2_c      => '0',\r
 -      --      CHANNEL3 --     \r
 -              hdinp_ch3                               => SD_RXD_P_IN(3),\r
 -              hdinn_ch3                               => SD_RXD_N_IN(3),\r
 -              hdoutp_ch3                              => SD_TXD_P_OUT(3),\r
 -              hdoutn_ch3                              => SD_TXD_N_OUT(3),\r
 -              rxiclk_ch3                              => clk_200_txdata,      --clk_200_i(3),\r
 -              sci_sel_ch3                             => sci_ch_i(3),\r
 -              txiclk_ch3                              => clk_200_txdata,\r
 -              rx_full_clk_ch3         => rx_full_clk(3),\r
 -              rx_half_clk_ch3         => rx_half_clk(3),\r
 -              tx_full_clk_ch3         => tx_full_clk(3),\r
 -              tx_half_clk_ch3         => tx_half_clk(3),\r
 -              fpga_rxrefclk_ch3               => clk_200_osc,\r
 -              txdata_ch3                              => tx_data(3),\r
 -              tx_k_ch3                                        => tx_k(3),\r
 -              tx_force_disp_ch3               => '0',\r
 -              tx_disp_sel_ch3         => '0',\r
 -              rxdata_ch3                              => rx_data(3),\r
 -              rx_k_ch3                                        => rx_k(3),\r
 -              rx_disp_err_ch3         => open,\r
 -              rx_cv_err_ch3                   => rx_error(3),\r
 -              rx_serdes_rst_ch3_c  => rx_serdes_rst(3),\r
 -              sb_felb_ch3_c                   => '0',\r
 -              sb_felb_rst_ch3_c               => '0',\r
 -              tx_pcs_rst_ch3_c                => tx_pcs_rst(3),\r
 -              tx_pwrup_ch3_c                  => '1',\r
 -              rx_pcs_rst_ch3_c                => rx_pcs_rst(3),\r
 -              rx_pwrup_ch3_c                  => '1',\r
 -              rx_los_low_ch3_s                => rx_los_low(3),\r
 -              lsm_status_ch3_s                => lsm_status(3),\r
 -              rx_cdr_lol_ch3_s                => rx_cdr_lol(3),\r
 -              tx_div2_mode_ch3_c      => '0',\r
 -              rx_div2_mode_ch3_c      => '0',\r
 -      --      COMMON --       \r
 -              sci_wrdata                              => sci_data_in_i,\r
 -              sci_rddata                              => sci_data_out_i,\r
 -              sci_addr                                        => sci_addr_i(5 downto 0),\r
 -              sci_sel_quad                    => sci_qd_i,\r
 -              sci_rd                                  => sci_read_i,\r
 -              sci_wrn                                 => sci_write_i,\r
 -\r
 -              fpga_txrefclk                   => clk_200_txdata,\r
 -              tx_serdes_rst_c         => '0', --tx_serdes_rst(0),     -- resets tx_pll        PL 1906\r
 -              tx_pll_lol_qd_s         => tx_pll_lol_quad,\r
 -              tx_sync_qd_c                    => '0',                 -- unused; signal to synchronise channels/serdesses for multi-channel protocols\r
 -              rst_qd_c                                        => rst_down_quad,\r
 -              serdes_rst_qd_c         => serdes_rst_down_quad\r
 -      );\r
 -\r
 --------------------------\r
 --- combined quad reset --\r
 --------------------------\r
 ---rst_down_quad                               <= '1' when (rst_qd(0)='1' or rst_qd(1)='1' or rst_qd(2)='1' or rst_qd(3)='1') else '0';\r
 -rst_down_quad                         <= RESET;       -- PL: 18/06/14\r
 ---serdes_rst_down_quad                <= '1' when (serdes_rst_qd(0)='1' or serdes_rst_qd(1)='1' or serdes_rst_qd(2)='1' or serdes_rst_qd(3)='1') else '0';\r
 -serdes_rst_down_quad          <= '0';         -- PL: 23/06/14\r
 -\r
 -generated_logic       : for i in 0 to 3 generate\r
 -\r
 -      SD_TXDIS_OUT(i)                 <= LINK_DISABLE_IN;     --not (rx_allow_q(i) or not IS_SLAVE);   --slave only switches on when RX is ready\r
 -\r
 -      tx_pll_lol(i)                   <= tx_pll_lol_quad;\r
 -      \r
 -      ------------------------------------------------- \r
 -      -- Reset FSM & Link states\r
 -      ------------------------------------------------- \r
 -      THE_RX_FSM : rx_reset_fsm\r
 -      port map(\r
 -              RST_N                                           => rst_n(i),\r
 -              RX_REFCLK                               => rx_full_clk(i),      \r
 -              TX_PLL_LOL_QD_S         => tx_pll_lol(i),\r
 -              RX_SERDES_RST_CH_C      => rx_serdes_rst(i),\r
 -              RX_CDR_LOL_CH_S         => rx_cdr_lol(i),\r
 -              RX_LOS_LOW_CH_S         => rx_los_low(i),\r
 -              RX_PCS_RST_CH_C         => rx_pcs_rst(i),\r
 -              WA_POSITION                             => wa_position_rx(i),\r
 -              STATE_OUT                               => rx_fsm_state(i)\r
 -      );\r
 -\r
 -      THE_TX_FSM : tx_reset_fsm\r
 -      port map(\r
 -              RST_N                                           => rst_n(i),\r
 -              TX_REFCLK                               => clk_200_txdata,\r
 -              TX_PLL_LOL_QD_S         => tx_pll_lol(i),\r
 -              RST_QD_C                                        => rst_qd(i),\r
 -              TX_PCS_RST_CH_C         => tx_pcs_rst(i),\r
 -              STATE_OUT                               => tx_fsm_state(i)\r
 -      );\r
 -      \r
 -\r
 -      -- Master does not do bit-locking    \r
 -      wa_position_rx(i) <= wa_position(i) when (IS_SYNC_SLAVE = c_YES) else x"0";\r
 -\r
 -      \r
 -      PROC_ALLOW : process(clk_200_txdata)    --clk_200_i(i))\r
 -      begin\r
 -              if rising_edge(clk_200_txdata) then     -- clk_200_txdata ??\r
 -                      if rx_fsm_state(i) = x"6" and (IS_SYNC_SLAVE = c_YES or start_timer(i)(start_timer'left) = '1') then\r
 -                              rx_allow(i) <= '1';\r
 -                              tx_allow(i) <= '1';\r
 -                      else\r
 -                              rx_allow(i) <= '0';\r
 -                              tx_allow(i) <= '1';\r
 -                      end if;\r
 -              end if;\r
 -      end process;\r
 -\r
 -      rx_allow_q(i) <= rx_allow(i) when rising_edge(SYSCLK);\r
 -      tx_allow_q(i) <= tx_allow(i) when rising_edge(SYSCLK);\r
 -\r
 -\r
 -      PROC_START_TIMER : process(clk_200_txdata)      --clk_200_i(i))\r
 -      begin\r
 -              if rising_edge(clk_200_txdata) then\r
 -                      if got_link_ready_i(i) = '1' then\r
 -                              watchdog_timer(i)       <= (others => '0');\r
 -                                      if start_timer(i)(start_timer'left) = '0' then\r
 -                                              start_timer(i) <= start_timer(i) + 1;\r
 ---                                            start_timer(i)(start_timer'left downto 0) <= start_timer(i)(start_timer'left downto 0) + 1;\r
 -                                      end if;  \r
 -                      else\r
 -                              start_timer(i) <= (others => '0');\r
 -                              if ((watchdog_timer(i)(watchdog_timer(i)'left) = '1') and (watchdog_timer(i)(watchdog_timer(i)'left - 1) = '1')) then\r
 -                                      watchdog_trigger(i)     <= '1';\r
 -                              else \r
 -                                      watchdog_trigger(i)     <= '0';\r
 -                              end if;\r
 -                              if watchdog_trigger(i) = '0' then\r
 -                                      watchdog_timer(i)               <= watchdog_timer(i) + 1;\r
 -                              else \r
 -                                      watchdog_timer(i)               <= (others => '0');\r
 -                              end if;\r
 -                      end if;\r
 -              end if;\r
 -      end process;\r
 -      ------------------------------------------------- \r
 -      -- TX Data\r
 -      -------------------------------------------------         \r
 -      THE_TX : soda_tx_control\r
 -      port map(\r
 -              CLK_200                                         => clk_200_txdata,      --tx_full_clk(i),       --clk_200_i(i),\r
 -              CLK_100                                         => SYSCLK,\r
 -              RESET_IN                                                => rst(i),              --CLEAR, PL!\r
 -\r
 -              TX_DATA_IN                                      => MED_DATA_IN(i),\r
 -              TX_PACKET_NUMBER_IN             => MED_PACKET_NUM_IN(i),\r
 -              TX_WRITE_IN                                     => MED_DATAREADY_IN(i),\r
 -              TX_READ_OUT                                     => MED_READ_OUT(i),\r
 -\r
 -              TX_DATA_OUT                                     => tx_data(i),\r
 -              TX_K_OUT                                                => tx_k(i),\r
 -\r
 -              REQUEST_RETRANSMIT_IN   => request_retr_i(i),             --TODO\r
 -              REQUEST_POSITION_IN             => request_retr_position_i(i),    --TODO\r
 -\r
 -              START_RETRANSMIT_IN             => start_retr_i(i),               --TODO\r
 -              START_POSITION_IN                       => request_retr_position_i(i),    --TODO\r
 -\r
 -              TX_DLM_PREVIEW_IN                       =>      TX_DLM_PREVIEW_IN(i),\r
 -              SEND_DLM                                                => TX_DLM(i),\r
 -              SEND_DLM_WORD                           => TX_DLM_WORD(i),\r
 -\r
 -              SEND_LINK_RESET_IN              => CTRL_OP(i)(15),      --CTRL_OP(i)(15),\r
 -              TX_ALLOW_IN                                     => tx_allow(i),\r
 -              RX_ALLOW_IN                                     => rx_allow(i),\r
 -              LINK_PHASE_OUT                          =>      link_phase_S(i),                --PL!\r
 -\r
 -              DEBUG_OUT                                       => debug_tx_control_i(i),\r
 -              STAT_REG_OUT                            => stat_tx_control_i(i)\r
 -      );  \r
 -\r
 -      LINK_PHASE_OUT(i)               <= link_phase_S(i);             --PL!\r
 -      -------------------------------------------------      \r
 -      -- RX Data\r
 -      -------------------------------------------------             \r
 -      THE_RX_CONTROL : rx_control\r
 -      port map(\r
 -              CLK_200                        => clk_200_txdata,       --clk_200_i(i), --PL!\r
 -              CLK_100                        => SYSCLK,\r
 -              RESET_IN                       => rst(i),               --CLEAR, PL!\r
 -\r
 -              RX_DATA_OUT                    => MED_DATA_OUT(i),\r
 -              RX_PACKET_NUMBER_OUT           => MED_PACKET_NUM_OUT(i),\r
 -              RX_WRITE_OUT                   => MED_DATAREADY_OUT(i),\r
 -              RX_READ_IN                     => MED_READ_IN(i),\r
 -\r
 -              RX_DATA_IN                     => rx_data(i),\r
 -              RX_K_IN                        => rx_k(i),\r
 -\r
 -              REQUEST_RETRANSMIT_OUT         => request_retr_i(i),\r
 -              REQUEST_POSITION_OUT           => request_retr_position_i(i),\r
 -\r
 -              START_RETRANSMIT_OUT           => start_retr_i(i),\r
 -              START_POSITION_OUT             => start_retr_position_i(i),\r
 -\r
 -              --send_dlm: 200 MHz, 1 clock strobe, data valid until next DLM\r
 -              RX_DLM                         => RX_DLM(i),\r
 -              RX_DLM_WORD                    => RX_DLM_WORD(i),\r
 -\r
 -              SEND_LINK_RESET_OUT            => send_link_reset_i(i),\r
 -              MAKE_RESET_OUT                 => make_link_reset_i(i),\r
 -              RX_ALLOW_IN                    => rx_allow(i),\r
 -              GOT_LINK_READY                 => got_link_ready_i(i),\r
 -\r
 -              DEBUG_OUT                      => debug_rx_control_i(i),\r
 -              STAT_REG_OUT                   => stat_rx_control_i(i)\r
 -      );   \r
 -\r
 -      internal_make_link_reset_out(i) <= make_link_reset_i(i) when (IS_SYNC_SLAVE=c_YES) else '0';\r
 +
 +signal clk_200_osc                                            : std_logic;
 +signal clk_200_txdata                                 : std_logic;
 +signal clk_200_rxdn                                           : std_logic_vector(3 downto 0);
 +signal clk_200_i                                                      : std_logic_vector(3 downto 0);
 +signal rx_full_clk                                            : std_logic_vector(3 downto 0);
 +signal rx_half_clk                                            : std_logic_vector(3 downto 0); 
 +signal tx_full_clk                                            : std_logic_vector(3 downto 0);
 +signal tx_half_clk                                            : std_logic_vector(3 downto 0);
 +
 +signal tx_data                                                                : t_HUB_BYTE;   --std_logic_vector(4*8-1 downto 0);
 +signal tx_k                                                                   : std_logic_vector(3 downto 0);
 +signal rx_data                                                                : t_HUB_BYTE;   --std_logic_vector(4*8-1 downto 0);
 +signal rx_k                                                                   : t_HUB_BIT;    --std_logic_vector(3 downto 0);
 +signal rx_error                                                       : t_HUB_BIT;    --std_logic_vector(3 downto 0);
 +
 +signal rst_n                                                          : t_HUB_BIT;
 +signal rst                                                                    : t_HUB_BIT;            -- PL!
 +signal rx_serdes_rst                                          : t_HUB_BIT;
 +signal tx_serdes_rst                                          : std_logic; 
 +signal tx_pcs_rst                                                     : t_HUB_BIT; 
 +signal rx_pcs_rst                                                     : t_HUB_BIT; 
 +signal rst_qd                                                         : t_HUB_BIT; 
 +signal rst_down_quad                                          : std_logic; 
 +signal serdes_rst_qd                                          : t_HUB_BIT; 
 +signal serdes_rst_down_quad                   : std_logic;    -- combined serdes reset for whole quad
 +signal sd_los_i                                                       : t_HUB_BIT;    --PL!
 +
 +signal rx_los_low                                                     : t_HUB_BIT; 
 +signal lsm_status                                                     : t_HUB_BIT; 
 +signal rx_cdr_lol                                                     : t_HUB_BIT; 
 +signal tx_pll_lol                                                     : t_HUB_BIT; 
 +signal tx_pll_lol_quad                                        : std_logic;    -- combined Loss-Of-Lock for whole quad
 +
 +signal sci_ch_i                                                       : std_logic_vector(3 downto 0);
 +signal sci_qd_i                                                       : std_logic;
 +signal sci_reg_i                                                      : std_logic;
 +signal sci_addr_i                                                     : std_logic_vector(8 downto 0);
 +signal sci_data_in_i                                          : std_logic_vector(7 downto 0);
 +signal sci_data_out_i                                 : std_logic_vector(7 downto 0);
 +signal sci_read_i                                                     : std_logic;
 +signal sci_write_i                                            : std_logic;
 +signal sci_write_shift_i                              : std_logic_vector(2 downto 0);
 +signal sci_read_shift_i                                       : std_logic_vector(2 downto 0);
 +
 +signal wa_position                                            : t_HUB_NIBL    := (others => (others => '1')); --std_logic_vector(15 downto 0) := x"FFFF";
 +signal wa_position_rx                                 : t_HUB_NIBL    := (others => (others => '1')); --std_logic_vector(15 downto 0) := x"FFFF";
 +signal tx_allow                                                       : t_HUB_BIT;    --std_logic_vector(3 downto 0);
 +signal rx_allow                                                       : t_HUB_BIT;    --std_logic_vector(3 downto 0);
 +signal tx_allow_q                                                     : t_HUB_BIT;    --std_logic_vector(3 downto 0);
 +signal rx_allow_q                                                     : t_HUB_BIT;    --std_logic_vector(3 downto 0);
 +signal link_phase_S                                           : t_HUB_BIT;    --std_logic_vector(3 downto 0); --PL!
 +signal request_retr_i                                 : t_HUB_BIT;    --std_logic_vector(3 downto 0);
 +signal start_retr_i                                           : t_HUB_BIT;    --std_logic_vector(3 downto 0);
 +signal request_retr_position_i                : t_HUB_BYTE;   --std_logic_vector(7 downto 0);
 +signal start_retr_position_i                  : t_HUB_BYTE;   --std_logic_vector(7 downto 0);
 +signal send_link_reset_i                              : t_HUB_BIT;    --std_logic_vector(3 downto 0);
 +signal make_link_reset_i                              : t_HUB_BIT;    --std_logic_vector(3 downto 0);
 +signal got_link_ready_i                                       : t_HUB_BIT;    --std_logic_vector(3 downto 0);
 +signal internal_make_link_reset_out   : t_HUB_BIT;    --std_logic_vector(3 downto 0);
 +
 +signal start_timer                                            : t_HUB_TIMER19 := (others => (others => '0')); --unsigned(18 downto 0)                         := (others => '0');
 +signal watchdog_timer                                 : t_HUB_TIMER21 := (others => (others => '0')); --unsigned(20 downto 0)                         := (others => '0');
 +signal watchdog_trigger                                       : t_HUB_BIT                     := (others => '0');                                     --std_logic_vector(3 downto 0)  := (others => '0');
 +
 +signal rx_fsm_state                                           : t_HUB_NIBL;   --std_logic_vector(3 downto 0);
 +signal tx_fsm_state                                           : t_HUB_NIBL;   --std_logic_vector(3 downto 0);
 +
 +signal stat_rx_control_i                              : t_HUB_LWORD;  --std_logic_vector(31 downto 0);
 +signal stat_tx_control_i                              : t_HUB_LWORD;  --std_logic_vector(31 downto 0);
 +signal debug_rx_control_i                             : t_HUB_LWORD;  --std_logic_vector(31 downto 0);
 +signal debug_tx_control_i                             : t_HUB_LWORD;  --std_logic_vector(31 downto 0);
 +signal debug_reg                                                      : std_logic_vector(63 downto 0);
 +
 +type sci_ctrl is (IDLE, SCTRL, SCTRL_WAIT, SCTRL_WAIT2, SCTRL_FINISH, GET_WA, GET_WA_WAIT, GET_WA_WAIT2, GET_WA_FINISH);
 +signal sci_state                                                      : sci_ctrl;
 +signal sci_timer                                                      : t_HUB_TIMER13 := (others => (others => '0')); --unsigned(12 downto 0)                         := (others => '0');
 +\r
 +-- fix signal names for constraining
 +attribute syn_preserve                : boolean;
 +attribute syn_keep                    : boolean;
 +attribute syn_useioff         : boolean;
 +
 +attribute syn_useioff of sd_los_i                             : signal is false;              -- do not use an IOFF for this signal
 +\r
 +attribute syn_preserve        of sci_ch_i                             : signal is true;
 +attribute syn_keep            of sci_ch_i                             : signal is true;
 +attribute syn_preserve        of sci_qd_i                             : signal is true;
 +attribute syn_keep            of sci_qd_i                             : signal is true;
 +attribute syn_preserve        of sci_reg_i                    : signal is true;
 +attribute syn_keep            of sci_reg_i                    : signal is true;
 +attribute syn_preserve        of sci_addr_i                   : signal is true;
 +attribute syn_keep            of sci_addr_i                   : signal is true;
 +attribute syn_preserve        of sci_data_in_i                : signal is true;
 +attribute syn_keep            of sci_data_in_i                : signal is true;
 +attribute syn_preserve        of sci_data_out_i               : signal is true;
 +attribute syn_keep            of sci_data_out_i               : signal is true;
 +attribute syn_preserve        of sci_read_i                   : signal is true;
 +attribute syn_keep            of sci_read_i                   : signal is true;
 +attribute syn_preserve        of sci_write_i                  : signal is true;
 +attribute syn_keep            of sci_write_i                  : signal is true;
 +attribute syn_preserve        of sci_write_shift_i    : signal is true;
 +attribute syn_keep            of sci_write_shift_i    : signal is true;
 +attribute syn_preserve        of      sci_read_shift_i        : signal is true;
 +attribute syn_keep            of sci_read_shift_i     : signal is true;
 +
 +begin
 +
 +
 +--SD_TXDIS_OUT <= not (rx_allow_q or not IS_SLAVE);   --slave only switches on when RX is ready
 +
 +clk_200_osc                   <= OSC_CLK;                     -- This external clock is oscillator/pll generated !!!
 +clk_200_txdata                <= TX_DATACLK;          -- This external clock is the rx_full of the uplink !!!
 +
 +
 +gen_clocks    : for i in 0 to 3 generate
 +
 +      rst(i)                                  <=              (CLEAR or sd_los_i(i) or internal_make_link_reset_out(i) or watchdog_trigger(i));
 +      rst_n(i)                                        <=              not(CLEAR or sd_los_i(i) or internal_make_link_reset_out(i) or watchdog_trigger(i));
 +
 +      RX_HALF_CLK_OUT(i)      <= rx_half_clk(i);
 +      RX_FULL_CLK_OUT(i)      <= rx_full_clk(i);
 +      TX_HALF_CLK_OUT(i)      <= tx_half_clk(i);
 +      TX_FULL_CLK_OUT(i)      <= tx_full_clk(i);
 +
 +--    gen_slave_clock : if IS_SYNC_SLAVE = c_YES generate             -- NO WAY IN HELL !! this downlink is a master
 +--            clk_200_i(i)                    <= rx_full_clk(i);
 +--    end generate;
 +
 +--    gen_master_clock : if IS_SYNC_SLAVE = c_NO generate
 +--    clk_200_i(i)            <= clk_200_txdata;
 +--    clk_200_rxdn(i) <= rx_full_clk(i);      -- These clocks are the rx_full of the DOWNLINKs !!!
 +--    end generate;
 +end generate;
 +
 +-------------------------------------------------  
 +-- Serdes
 +------------------------------------------------- 
 +THE_SERDES : entity work.serdes_4_sync_downstream
 +      port map(
 +      --      CHANNEL0 --     
 +              hdinp_ch0                               => SD_RXD_P_IN(0),
 +              hdinn_ch0                               => SD_RXD_N_IN(0),
 +              hdoutp_ch0                              => SD_TXD_P_OUT(0),
 +              hdoutn_ch0                              => SD_TXD_N_OUT(0),
 +              rxiclk_ch0                              => clk_200_txdata,      --clk_200_i(0),
 +              sci_sel_ch0                             => sci_ch_i(0),
 +              txiclk_ch0                              => clk_200_txdata,
 +              rx_full_clk_ch0         => rx_full_clk(0),
 +              rx_half_clk_ch0         => rx_half_clk(0),
 +              tx_full_clk_ch0         => tx_full_clk(0),
 +              tx_half_clk_ch0         => tx_half_clk(0),
 +              fpga_rxrefclk_ch0               => clk_200_osc,
 +              txdata_ch0                              => tx_data(0),
 +              tx_k_ch0                                        => tx_k(0),
 +              tx_force_disp_ch0               => '0',
 +              tx_disp_sel_ch0         => '0',
 +              rxdata_ch0                              => rx_data(0),
 +              rx_k_ch0                                        => rx_k(0),
 +              rx_disp_err_ch0         => open,
 +              rx_cv_err_ch0                   => rx_error(0),
 +              rx_serdes_rst_ch0_c  => rx_serdes_rst(0),
 +              sb_felb_ch0_c                   => '0',
 +              sb_felb_rst_ch0_c               => '0',
 +              tx_pcs_rst_ch0_c                => tx_pcs_rst(0),
 +              tx_pwrup_ch0_c                  => '1',
 +              rx_pcs_rst_ch0_c                => rx_pcs_rst(0),
 +              rx_pwrup_ch0_c                  => '1',
 +              rx_los_low_ch0_s                => rx_los_low(0),
 +              lsm_status_ch0_s                => lsm_status(0),
 +              rx_cdr_lol_ch0_s                => rx_cdr_lol(0),
 +              tx_div2_mode_ch0_c      => '0',
 +              rx_div2_mode_ch0_c      => '0',
 +      --      CHANNEL1 --     
 +              hdinp_ch1                               => SD_RXD_P_IN(1),
 +              hdinn_ch1                               => SD_RXD_N_IN(1),
 +              hdoutp_ch1                              => SD_TXD_P_OUT(1),
 +              hdoutn_ch1                              => SD_TXD_N_OUT(1),
 +              rxiclk_ch1                              => clk_200_txdata,      --clk_200_i(1),
 +              sci_sel_ch1                             => sci_ch_i(1),
 +              txiclk_ch1                              => clk_200_txdata,
 +              rx_full_clk_ch1         => rx_full_clk(1),
 +              rx_half_clk_ch1         => rx_half_clk(1),
 +              tx_full_clk_ch1         => tx_full_clk(1),
 +              tx_half_clk_ch1         => tx_half_clk(1),
 +              fpga_rxrefclk_ch1               => clk_200_osc,
 +              txdata_ch1                              => tx_data(1),
 +              tx_k_ch1                                        => tx_k(1),
 +              tx_force_disp_ch1               => '0',
 +              tx_disp_sel_ch1         => '0',
 +              rxdata_ch1                              => rx_data(1),
 +              rx_k_ch1                                        => rx_k(1),
 +              rx_disp_err_ch1         => open,
 +              rx_cv_err_ch1                   => rx_error(1),
 +              rx_serdes_rst_ch1_c  => rx_serdes_rst(1),
 +              sb_felb_ch1_c                   => '0',
 +              sb_felb_rst_ch1_c               => '0',
 +              tx_pcs_rst_ch1_c                => tx_pcs_rst(1),
 +              tx_pwrup_ch1_c                  => '1',
 +              rx_pcs_rst_ch1_c                => rx_pcs_rst(1),
 +              rx_pwrup_ch1_c                  => '1',
 +              rx_los_low_ch1_s                => rx_los_low(1),
 +              lsm_status_ch1_s                => lsm_status(1),
 +              rx_cdr_lol_ch1_s                => rx_cdr_lol(1),
 +              tx_div2_mode_ch1_c      => '0',
 +              rx_div2_mode_ch1_c      => '0',
 +      --      CHANNEL2 --     
 +              hdinp_ch2                               => SD_RXD_P_IN(2),
 +              hdinn_ch2                               => SD_RXD_N_IN(2),
 +              hdoutp_ch2                              => SD_TXD_P_OUT(2),
 +              hdoutn_ch2                              => SD_TXD_N_OUT(2),
 +              rxiclk_ch2                              => clk_200_txdata,      --clk_200_i(2),
 +              sci_sel_ch2                             => sci_ch_i(2),
 +              txiclk_ch2                              => clk_200_txdata,
 +              rx_full_clk_ch2         => rx_full_clk(2),
 +              rx_half_clk_ch2         => rx_half_clk(2),
 +              tx_full_clk_ch2         => tx_full_clk(2),
 +              tx_half_clk_ch2         => tx_half_clk(2),
 +              fpga_rxrefclk_ch2               => clk_200_osc,
 +              txdata_ch2                              => tx_data(2),
 +              tx_k_ch2                                        => tx_k(2),
 +              tx_force_disp_ch2               => '0',
 +              tx_disp_sel_ch2         => '0',
 +              rxdata_ch2                              => rx_data(2),
 +              rx_k_ch2                                        => rx_k(2),
 +              rx_disp_err_ch2         => open,
 +              rx_cv_err_ch2                   => rx_error(2),
 +              rx_serdes_rst_ch2_c  => rx_serdes_rst(2),
 +              sb_felb_ch2_c                   => '0',
 +              sb_felb_rst_ch2_c               => '0',
 +              tx_pcs_rst_ch2_c                => tx_pcs_rst(2),
 +              tx_pwrup_ch2_c                  => '1',
 +              rx_pcs_rst_ch2_c                => rx_pcs_rst(2),
 +              rx_pwrup_ch2_c                  => '1',
 +              rx_los_low_ch2_s                => rx_los_low(2),
 +              lsm_status_ch2_s                => lsm_status(2),
 +              rx_cdr_lol_ch2_s                => rx_cdr_lol(2),
 +              tx_div2_mode_ch2_c      => '0',
 +              rx_div2_mode_ch2_c      => '0',
 +      --      CHANNEL3 --     
 +              hdinp_ch3                               => SD_RXD_P_IN(3),
 +              hdinn_ch3                               => SD_RXD_N_IN(3),
 +              hdoutp_ch3                              => SD_TXD_P_OUT(3),
 +              hdoutn_ch3                              => SD_TXD_N_OUT(3),
 +              rxiclk_ch3                              => clk_200_txdata,      --clk_200_i(3),
 +              sci_sel_ch3                             => sci_ch_i(3),
 +              txiclk_ch3                              => clk_200_txdata,
 +              rx_full_clk_ch3         => rx_full_clk(3),
 +              rx_half_clk_ch3         => rx_half_clk(3),
 +              tx_full_clk_ch3         => tx_full_clk(3),
 +              tx_half_clk_ch3         => tx_half_clk(3),
 +              fpga_rxrefclk_ch3               => clk_200_osc,
 +              txdata_ch3                              => tx_data(3),
 +              tx_k_ch3                                        => tx_k(3),
 +              tx_force_disp_ch3               => '0',
 +              tx_disp_sel_ch3         => '0',
 +              rxdata_ch3                              => rx_data(3),
 +              rx_k_ch3                                        => rx_k(3),
 +              rx_disp_err_ch3         => open,
 +              rx_cv_err_ch3                   => rx_error(3),
 +              rx_serdes_rst_ch3_c  => rx_serdes_rst(3),
 +              sb_felb_ch3_c                   => '0',
 +              sb_felb_rst_ch3_c               => '0',
 +              tx_pcs_rst_ch3_c                => tx_pcs_rst(3),
 +              tx_pwrup_ch3_c                  => '1',
 +              rx_pcs_rst_ch3_c                => rx_pcs_rst(3),
 +              rx_pwrup_ch3_c                  => '1',
 +              rx_los_low_ch3_s                => rx_los_low(3),
 +              lsm_status_ch3_s                => lsm_status(3),
 +              rx_cdr_lol_ch3_s                => rx_cdr_lol(3),
 +              tx_div2_mode_ch3_c      => '0',
 +              rx_div2_mode_ch3_c      => '0',
 +      --      COMMON --       
 +              sci_wrdata                              => sci_data_in_i,
 +              sci_rddata                              => sci_data_out_i,
 +              sci_addr                                        => sci_addr_i(5 downto 0),
 +              sci_sel_quad                    => sci_qd_i,
 +              sci_rd                                  => sci_read_i,
 +              sci_wrn                                 => sci_write_i,
 +
 +              fpga_txrefclk                   => clk_200_txdata,
 +              tx_serdes_rst_c         => '0', --tx_serdes_rst(0),     -- resets tx_pll        PL 1906
 +              tx_pll_lol_qd_s         => tx_pll_lol_quad,
 +              tx_sync_qd_c                    => '0',                 -- unused; signal to synchronise channels/serdesses for multi-channel protocols
 +              rst_qd_c                                        => rst_down_quad,
 +              serdes_rst_qd_c         => serdes_rst_down_quad
 +      );
 +
 +-------------------------
 +-- combined quad reset --
 +-------------------------
 +--rst_down_quad                               <= '1' when (rst_qd(0)='1' or rst_qd(1)='1' or rst_qd(2)='1' or rst_qd(3)='1') else '0';
 +rst_down_quad                         <= RESET;       -- PL: 18/06/14
 +--serdes_rst_down_quad                <= '1' when (serdes_rst_qd(0)='1' or serdes_rst_qd(1)='1' or serdes_rst_qd(2)='1' or serdes_rst_qd(3)='1') else '0';
 +serdes_rst_down_quad          <= '0';         -- PL: 23/06/14
 +
 +generated_logic       : for i in 0 to 3 generate
 +
 +      SD_TXDIS_OUT(i)                 <= LINK_DISABLE_IN;     --not (rx_allow_q(i) or not IS_SLAVE);   --slave only switches on when RX is ready
 +
 +      tx_pll_lol(i)                   <= tx_pll_lol_quad;
 +      
 +      ------------------------------------------------- 
 +      -- Reset FSM & Link states
 +      ------------------------------------------------- 
 +      THE_RX_FSM : rx_reset_fsm
 +      port map(
 +              RST_N                                           => rst_n(i),
 +              RX_REFCLK                               => rx_full_clk(i),      
 +              TX_PLL_LOL_QD_S         => tx_pll_lol(i),
 +              RX_SERDES_RST_CH_C      => rx_serdes_rst(i),
 +              RX_CDR_LOL_CH_S         => rx_cdr_lol(i),
 +              RX_LOS_LOW_CH_S         => rx_los_low(i),
 +              RX_PCS_RST_CH_C         => rx_pcs_rst(i),
 +              WA_POSITION                             => wa_position_rx(i),
 +              STATE_OUT                               => rx_fsm_state(i)
 +      );
 +
 +      THE_TX_FSM : tx_reset_fsm
 +      port map(
 +              RST_N                                           => rst_n(i),
 +              TX_REFCLK                               => clk_200_txdata,
 +              TX_PLL_LOL_QD_S         => tx_pll_lol(i),
 +              RST_QD_C                                        => rst_qd(i),
 +              TX_PCS_RST_CH_C         => tx_pcs_rst(i),
 +              STATE_OUT                               => tx_fsm_state(i)
 +      );
 +      
 +
 +      -- Master does not do bit-locking    
 +      wa_position_rx(i) <= wa_position(i) when (IS_SYNC_SLAVE = c_YES) else x"0";
 +
 +      
 +      PROC_ALLOW : process(clk_200_txdata)    --clk_200_i(i))
 +      begin
 +              if rising_edge(clk_200_txdata) then     -- clk_200_txdata ??
 +                      if rx_fsm_state(i) = x"6" and (IS_SYNC_SLAVE = c_YES or start_timer(i)(start_timer'left) = '1') then
 +                              rx_allow(i) <= '1';
 +                              tx_allow(i) <= '1';
 +                      else
 +                              rx_allow(i) <= '0';
 +                              tx_allow(i) <= '1';
 +                      end if;
 +              end if;
 +      end process;
 +
 +      rx_allow_q(i) <= rx_allow(i) when rising_edge(SYSCLK);
 +      tx_allow_q(i) <= tx_allow(i) when rising_edge(SYSCLK);
 +
 +
 +      PROC_START_TIMER : process(clk_200_txdata)      --clk_200_i(i))
 +      begin
 +              if rising_edge(clk_200_txdata) then
 +                      if got_link_ready_i(i) = '1' then
 +                              watchdog_timer(i)       <= (others => '0');
 +                                      if start_timer(i)(start_timer'left) = '0' then
 +                                              start_timer(i) <= start_timer(i) + 1;
 +--                                            start_timer(i)(start_timer'left downto 0) <= start_timer(i)(start_timer'left downto 0) + 1;
 +                                      end if;  
 +                      else
 +                              start_timer(i) <= (others => '0');
 +                              if ((watchdog_timer(i)(watchdog_timer(i)'left) = '1') and (watchdog_timer(i)(watchdog_timer(i)'left - 1) = '1')) then
 +                                      watchdog_trigger(i)     <= '1';
 +                              else 
 +                                      watchdog_trigger(i)     <= '0';
 +                              end if;
 +                              if watchdog_trigger(i) = '0' then
 +                                      watchdog_timer(i)               <= watchdog_timer(i) + 1;
 +                              else 
 +                                      watchdog_timer(i)               <= (others => '0');
 +                              end if;
 +                      end if;
 +              end if;
 +      end process;
 +      ------------------------------------------------- 
 +      -- TX Data
 +      -------------------------------------------------         
 +      THE_TX : soda_tx_control
 +      port map(
 +              CLK_200                                         => clk_200_txdata,      --tx_full_clk(i),       --clk_200_i(i),
 +              CLK_100                                         => SYSCLK,
 +              RESET_IN                                                => rst(i),              --CLEAR, PL!
 +
 +              TX_DATA_IN                                      => MED_DATA_IN(i),
 +              TX_PACKET_NUMBER_IN             => MED_PACKET_NUM_IN(i),
 +              TX_WRITE_IN                                     => MED_DATAREADY_IN(i),
 +              TX_READ_OUT                                     => MED_READ_OUT(i),
 +
 +              TX_DATA_OUT                                     => tx_data(i),
 +              TX_K_OUT                                                => tx_k(i),
 +
 +              REQUEST_RETRANSMIT_IN   => request_retr_i(i),             --TODO
 +              REQUEST_POSITION_IN             => request_retr_position_i(i),    --TODO
 +
 +              START_RETRANSMIT_IN             => start_retr_i(i),               --TODO
 +              START_POSITION_IN                       => request_retr_position_i(i),    --TODO
 +
 +              TX_DLM_PREVIEW_IN                       =>      TX_DLM_PREVIEW_IN(i),
 +              SEND_DLM                                                => TX_DLM(i),
 +              SEND_DLM_WORD                           => TX_DLM_WORD(i),
 +
 +              SEND_LINK_RESET_IN              => CTRL_OP(i*16 + 15),  --CTRL_OP(i)(15),
 +              TX_ALLOW_IN                                     => tx_allow(i),
 +              RX_ALLOW_IN                                     => rx_allow(i),
 +              LINK_PHASE_OUT                          =>      link_phase_S(i),                --PL!
 +
 +              DEBUG_OUT                                       => debug_tx_control_i(i),
 +              STAT_REG_OUT                            => stat_tx_control_i(i)
 +      );  
 +
 +      LINK_PHASE_OUT(i)               <= link_phase_S(i);             --PL!
 +      -------------------------------------------------      
 +      -- RX Data
 +      -------------------------------------------------             
 +      THE_RX_CONTROL : rx_control
 +      port map(
 +              CLK_200                        => clk_200_txdata,       --clk_200_i(i), --PL!
 +              CLK_100                        => SYSCLK,
 +              RESET_IN                       => rst(i),               --CLEAR, PL!
 +
 +              RX_DATA_OUT                    => MED_DATA_OUT(i),
 +              RX_PACKET_NUMBER_OUT           => MED_PACKET_NUM_OUT(i),
 +              RX_WRITE_OUT                   => MED_DATAREADY_OUT(i),
 +              RX_READ_IN                     => MED_READ_IN(i),
 +
 +              RX_DATA_IN                     => rx_data(i),
 +              RX_K_IN                        => rx_k(i),
 +
 +              REQUEST_RETRANSMIT_OUT         => request_retr_i(i),
 +              REQUEST_POSITION_OUT           => request_retr_position_i(i),
 +
 +              START_RETRANSMIT_OUT           => start_retr_i(i),
 +              START_POSITION_OUT             => start_retr_position_i(i),
 +
 +              --send_dlm: 200 MHz, 1 clock strobe, data valid until next DLM
 +              RX_DLM                         => RX_DLM(i),
 +              RX_DLM_WORD                    => RX_DLM_WORD(i),
 +
 +              SEND_LINK_RESET_OUT            => send_link_reset_i(i),
 +              MAKE_RESET_OUT                 => make_link_reset_i(i),
 +              RX_ALLOW_IN                    => rx_allow(i),
 +              GOT_LINK_READY                 => got_link_ready_i(i),
 +
 +              DEBUG_OUT                      => debug_rx_control_i(i),
 +              STAT_REG_OUT                   => stat_rx_control_i(i)
 +      );   
 +
 +      internal_make_link_reset_out(i) <= make_link_reset_i(i) when (IS_SYNC_SLAVE=c_YES) else '0';
-       sd_los_i(i)                                                             <= SD_LOS_IN(i)                 when rising_edge(SYSCLK); --PL! 200115
-       
+       sd_los_i(i)                                                             <= SD_LOS_IN(i)                 when rising_edge(clk_200_txdata);\r
\r
 -end generate;    \r
 -    \r
 --------------------------------------------------      \r
 --- SCI\r
 --------------------------------------------------      \r
 ---gives access to serdes config port from slow control and reads word alignment every ~ 40 us\r
 -PROC_SCI_CTRL: process \r
 -variable cnt : integer range 0 to 4 := 0;\r
 -begin\r
 +end generate;    
 +    
 +-------------------------------------------------      
 +-- SCI
 +-------------------------------------------------      
 +--gives access to serdes config port from slow control and reads word alignment every ~ 40 us
 +PROC_SCI_CTRL: process 
 +variable cnt : integer range 0 to 4 := 0;
 +begin
  wait until rising_edge(SYSCLK);\r
 -      SCI_ACK <= '0';\r
 -      case sci_state is\r
 -      when IDLE =>\r
 -              sci_ch_i        <= x"0";\r
 -              sci_qd_i        <= '0';\r
 -              sci_reg_i       <= '0';\r
 -              sci_read_i      <= '0';\r
 -              sci_write_i     <= '0';\r
 -              sci_timer(0)    <= sci_timer(0) + 1;\r
 -              sci_timer(1)    <= sci_timer(1) + 1;\r
 -              sci_timer(2)    <= sci_timer(2) + 1;\r
 -              sci_timer(3)    <= sci_timer(3) + 1;\r
 -              if SCI_READ = '1' or SCI_WRITE = '1' then\r
 -                      sci_ch_i(0)   <= not SCI_ADDR(6) and not SCI_ADDR(7) and not SCI_ADDR(8);\r
 -                      sci_ch_i(1)   <=     SCI_ADDR(6) and not SCI_ADDR(7) and not SCI_ADDR(8);\r
 -                      sci_ch_i(2)   <= not SCI_ADDR(6) and     SCI_ADDR(7) and not SCI_ADDR(8);\r
 -                      sci_ch_i(3)   <=     SCI_ADDR(6) and     SCI_ADDR(7) and not SCI_ADDR(8);\r
 -                      sci_qd_i      <= not SCI_ADDR(6) and not SCI_ADDR(7) and     SCI_ADDR(8);\r
 -                      sci_reg_i     <=     SCI_ADDR(6) and not SCI_ADDR(7) and     SCI_ADDR(8);\r
 -                      sci_addr_i    <= SCI_ADDR;\r
 -                      sci_data_in_i <= SCI_DATA_IN;\r
 -                      sci_read_i    <= SCI_READ  and not (SCI_ADDR(6) and not SCI_ADDR(7) and     SCI_ADDR(8));\r
 -                      sci_write_i   <= SCI_WRITE and not (SCI_ADDR(6) and not SCI_ADDR(7) and     SCI_ADDR(8));\r
 -                      sci_state     <= SCTRL;\r
 -              else\r
 -                      if sci_timer(0)(sci_timer'left) = '1' then\r
 -                              sci_timer(0)     <= (others => '0');\r
 -                              sci_state     <= GET_WA;\r
 -                      end if;\r
 -                      if sci_timer(1)(sci_timer'left) = '1' then\r
 -                              sci_timer(1)     <= (others => '0');\r
 -                              sci_state     <= GET_WA;\r
 -                      end if;\r
 -                      if sci_timer(2)(sci_timer'left) = '1' then\r
 -                              sci_timer(2)     <= (others => '0');\r
 -                              sci_state     <= GET_WA;\r
 -                      end if;\r
 -                      if sci_timer(3)(sci_timer'left) = '1' then\r
 -                              sci_timer(3)     <= (others => '0');\r
 -                              sci_state     <= GET_WA;\r
 -                      end if;\r
 -              end if;      \r
 -when SCTRL =>\r
 -      if sci_reg_i = '1' then\r
 -              SCI_DATA_OUT  <= debug_reg(8*(to_integer(unsigned(SCI_ADDR(3 downto 0))))+7 downto 8*(to_integer(unsigned(SCI_ADDR(3 downto 0)))));\r
 -              SCI_ACK       <= '1';\r
 -              sci_write_i   <= '0';\r
 -              sci_read_i    <= '0';\r
 -              sci_state     <= IDLE;\r
 -      else\r
 -              sci_state     <= SCTRL_WAIT;\r
 -      end if;\r
 -when SCTRL_WAIT   =>\r
 -      sci_state       <= SCTRL_WAIT2;\r
 -when SCTRL_WAIT2  =>\r
 -      sci_state       <= SCTRL_FINISH;\r
 -when SCTRL_FINISH =>\r
 -      SCI_DATA_OUT    <= sci_data_out_i;\r
 -      SCI_ACK         <= '1';\r
 -      sci_write_i     <= '0';\r
 -      sci_read_i      <= '0';\r
 -      sci_state       <= IDLE;\r
 -\r
 -when GET_WA =>\r
 -      if cnt = 4 then\r
 -              cnt           := 0;\r
 -              sci_state     <= IDLE;\r
 -      else\r
 -              sci_state     <= GET_WA_WAIT;\r
 -              sci_addr_i    <= '0' & x"22";\r
 -              sci_ch_i      <= x"0";\r
 -              sci_ch_i(cnt) <= '1';\r
 -              sci_read_i    <= '1';\r
 -      end if;\r
 -when GET_WA_WAIT  =>\r
 -      sci_state       <= GET_WA_WAIT2;\r
 -when GET_WA_WAIT2 =>\r
 -      sci_state       <= GET_WA_FINISH;\r
 -when GET_WA_FINISH =>\r
 ---            wa_position(cnt*4+3 downto cnt*4) <= sci_data_out_i(3 downto 0);\r
 -      wa_position(cnt) <= sci_data_out_i(3 downto 0);\r
 -      sci_state       <= GET_WA;    \r
 -      cnt             := cnt + 1;\r
 -end case;\r
 -\r
 -if (SCI_READ = '1' or SCI_WRITE = '1') and sci_state /= IDLE then\r
 -      SCI_NACK <= '1';\r
 -else\r
 -      SCI_NACK <= '0';\r
 -end if;\r
 -\r
 -end process;\r
 -\r
 -\r
 ---    -------------------------------------------------      \r
 ---    -- Debug Registers\r
 ---    -------------------------------------------------            \r
 ---    debug_reg(3 downto 0)   <= rx_fsm_state;\r
 ---    debug_reg(4)            <= rx_k;\r
 ---    debug_reg(5)            <= rx_error;\r
 ---    debug_reg(6)            <= rx_los_low;\r
 ---    debug_reg(7)            <= rx_cdr_lol;\r
 ---\r
 ---    debug_reg(8)            <= tx_k;\r
 ---    debug_reg(9)            <= tx_pll_lol;\r
 ---    debug_reg(10)           <= lsm_status;\r
 ---    debug_reg(11)           <= make_link_reset_i;\r
 ---    debug_reg(15 downto 12) <= tx_fsm_state;\r
 ---    -- debug_reg(31 downto 24) <= tx_data; \r
 ---\r
 ---    debug_reg(16)           <= '0';\r
 ---    debug_reg(17)           <= tx_allow;\r
 ---    debug_reg(18)        <= RESET;\r
 ---    debug_reg(19)  <= CLEAR;\r
 ---    debug_reg(31 downto 20) <= debug_rx_control_i(4) & debug_rx_control_i(2 downto 0) & debug_rx_control_i(15 downto 8);\r
 ---\r
 ---    debug_reg(35 downto 32) <= wa_position(3 downto 0);\r
 ---    debug_reg(36)   <= debug_tx_control_i(6);\r
 ---    debug_reg(39 downto 37) <= "000";\r
 ---    debug_reg(63 downto 40) <= debug_rx_control_i(23 downto 0);\r
 -\r
 -                      \r
 -      STAT_DEBUG <= (others => '0');  --debug_reg;\r
 -\r
 -      generated_status        : for i in 0 to 3 generate\r
 +      SCI_ACK <= '0';
 +      case sci_state is
 +      when IDLE =>
 +              sci_ch_i        <= x"0";
 +              sci_qd_i        <= '0';
 +              sci_reg_i       <= '0';
 +              sci_read_i      <= '0';
 +              sci_write_i     <= '0';
 +              sci_timer(0)    <= sci_timer(0) + 1;
 +              sci_timer(1)    <= sci_timer(1) + 1;
 +              sci_timer(2)    <= sci_timer(2) + 1;
 +              sci_timer(3)    <= sci_timer(3) + 1;
 +              if SCI_READ = '1' or SCI_WRITE = '1' then
 +                      sci_ch_i(0)   <= not SCI_ADDR(6) and not SCI_ADDR(7) and not SCI_ADDR(8);
 +                      sci_ch_i(1)   <=     SCI_ADDR(6) and not SCI_ADDR(7) and not SCI_ADDR(8);
 +                      sci_ch_i(2)   <= not SCI_ADDR(6) and     SCI_ADDR(7) and not SCI_ADDR(8);
 +                      sci_ch_i(3)   <=     SCI_ADDR(6) and     SCI_ADDR(7) and not SCI_ADDR(8);
 +                      sci_qd_i      <= not SCI_ADDR(6) and not SCI_ADDR(7) and     SCI_ADDR(8);
 +                      sci_reg_i     <=     SCI_ADDR(6) and not SCI_ADDR(7) and     SCI_ADDR(8);
 +                      sci_addr_i    <= SCI_ADDR;
 +                      sci_data_in_i <= SCI_DATA_IN;
 +                      sci_read_i    <= SCI_READ  and not (SCI_ADDR(6) and not SCI_ADDR(7) and     SCI_ADDR(8));
 +                      sci_write_i   <= SCI_WRITE and not (SCI_ADDR(6) and not SCI_ADDR(7) and     SCI_ADDR(8));
 +                      sci_state     <= SCTRL;
 +              else
 +                      if sci_timer(0)(sci_timer'left) = '1' then
 +                              sci_timer(0)     <= (others => '0');
 +                              sci_state     <= GET_WA;
 +                      end if;
 +                      if sci_timer(1)(sci_timer'left) = '1' then
 +                              sci_timer(1)     <= (others => '0');
 +                              sci_state     <= GET_WA;
 +                      end if;
 +                      if sci_timer(2)(sci_timer'left) = '1' then
 +                              sci_timer(2)     <= (others => '0');
 +                              sci_state     <= GET_WA;
 +                      end if;
 +                      if sci_timer(3)(sci_timer'left) = '1' then
 +                              sci_timer(3)     <= (others => '0');
 +                              sci_state     <= GET_WA;
 +                      end if;
 +              end if;      
 +when SCTRL =>
 +      if sci_reg_i = '1' then
 +              SCI_DATA_OUT  <= debug_reg(8*(to_integer(unsigned(SCI_ADDR(3 downto 0))))+7 downto 8*(to_integer(unsigned(SCI_ADDR(3 downto 0)))));
 +              SCI_ACK       <= '1';
 +              sci_write_i   <= '0';
 +              sci_read_i    <= '0';
 +              sci_state     <= IDLE;
 +      else
 +              sci_state     <= SCTRL_WAIT;
 +      end if;
 +when SCTRL_WAIT   =>
 +      sci_state       <= SCTRL_WAIT2;
 +when SCTRL_WAIT2  =>
 +      sci_state       <= SCTRL_FINISH;
 +when SCTRL_FINISH =>
 +      SCI_DATA_OUT    <= sci_data_out_i;
 +      SCI_ACK         <= '1';
 +      sci_write_i     <= '0';
 +      sci_read_i      <= '0';
 +      sci_state       <= IDLE;
 +
 +when GET_WA =>
 +      if cnt = 4 then
 +              cnt           := 0;
 +              sci_state     <= IDLE;
 +      else
 +              sci_state     <= GET_WA_WAIT;
 +              sci_addr_i    <= '0' & x"22";
 +              sci_ch_i      <= x"0";
 +              sci_ch_i(cnt) <= '1';
 +              sci_read_i    <= '1';
 +      end if;
 +when GET_WA_WAIT  =>
 +      sci_state       <= GET_WA_WAIT2;
 +when GET_WA_WAIT2 =>
 +      sci_state       <= GET_WA_FINISH;
 +when GET_WA_FINISH =>
 +--            wa_position(cnt*4+3 downto cnt*4) <= sci_data_out_i(3 downto 0);
 +      wa_position(cnt) <= sci_data_out_i(3 downto 0);
 +      sci_state       <= GET_WA;    
 +      cnt             := cnt + 1;
 +end case;
 +
 +if (SCI_READ = '1' or SCI_WRITE = '1') and sci_state /= IDLE then
 +      SCI_NACK <= '1';
 +else
 +      SCI_NACK <= '0';
 +end if;
 +
 +end process;
 +
 +
 +--    -------------------------------------------------      
 +--    -- Debug Registers
 +--    -------------------------------------------------            
 +--    debug_reg(3 downto 0)   <= rx_fsm_state;
 +--    debug_reg(4)            <= rx_k;
 +--    debug_reg(5)            <= rx_error;
 +--    debug_reg(6)            <= rx_los_low;
 +--    debug_reg(7)            <= rx_cdr_lol;
 +--
 +--    debug_reg(8)            <= tx_k;
 +--    debug_reg(9)            <= tx_pll_lol;
 +--    debug_reg(10)           <= lsm_status;
 +--    debug_reg(11)           <= make_link_reset_i;
 +--    debug_reg(15 downto 12) <= tx_fsm_state;
 +--    -- debug_reg(31 downto 24) <= tx_data; 
 +--
 +--    debug_reg(16)           <= '0';
 +--    debug_reg(17)           <= tx_allow;
 +--    debug_reg(18)        <= RESET;
 +--    debug_reg(19)  <= CLEAR;
 +--    debug_reg(31 downto 20) <= debug_rx_control_i(4) & debug_rx_control_i(2 downto 0) & debug_rx_control_i(15 downto 8);
 +--
 +--    debug_reg(35 downto 32) <= wa_position(3 downto 0);
 +--    debug_reg(36)   <= debug_tx_control_i(6);
 +--    debug_reg(39 downto 37) <= "000";
 +--    debug_reg(63 downto 40) <= debug_rx_control_i(23 downto 0);
 +
 +                      
 +      STAT_DEBUG <= (others => '0');  --debug_reg;
 +
 +      generated_status        : for i in 0 to 3 generate
-       --      internal_make_link_reset_out(i) <= make_link_reset_i(i) when (IS_SYNC_SLAVE=c_YES) else '0';
-       --      sd_los_i(i)                                                             <= SD_LOS_IN(i)                 when rising_edge(SYSCLK);       -- PL!
-               STAT_OP(i*16 + 15)              <= send_link_reset_i(i) when rising_edge(SYSCLK);
-               STAT_OP(i*16 + 14)              <= '0';
-               STAT_OP(i*16 + 13)              <= internal_make_link_reset_out(i) when rising_edge(SYSCLK); --make trbnet reset
-               STAT_OP(i*16 + 12)              <= '0';
-               STAT_OP(i*16 + 11)              <= '0';
-               STAT_OP(i*16 + 10)              <= rx_allow(i);
-               STAT_OP(i*16 + 9)               <= tx_allow(i);
-               STAT_OP(i*16 + 8)               <= got_link_ready_i(i);
-               STAT_OP(i*16 + 7)               <= send_link_reset_i(i);
-               STAT_OP(i*16 + 6)               <= make_link_reset_i(i);
-               STAT_OP(i*16 + 5)               <= request_retr_i(i);
-               STAT_OP(i*16 + 4)               <= start_retr_i(i);
-               STAT_OP(i*16 + 3 downto i*16) <= x"0" when rx_allow_q(i) = '1' and tx_allow_q(i) = '1' else x"7";
\r--           STAT_OP(i)(15)          <= send_link_reset_i(i) when rising_edge(SYSCLK);
- --            STAT_OP(i)(14)          <= '0';
- --            STAT_OP(i)(13)          <= internal_make_link_reset_out(i) when rising_edge(SYSCLK); --make trbnet reset
- --            STAT_OP(i)(12)          <= '0';
- --            STAT_OP(i)(11)          <= '0';
- --            STAT_OP(i)(10)          <= rx_allow(i);
- --            STAT_OP(i)(9)           <= tx_allow(i);
- --            STAT_OP(i)(8)           <= got_link_ready_i(i);
- --            STAT_OP(i)(7)           <= send_link_reset_i(i);
- --            STAT_OP(i)(6)           <= make_link_reset_i(i);
- --            STAT_OP(i)(5)           <= request_retr_i(i);
- --            STAT_OP(i)(4)           <= start_retr_i(i);
- --            STAT_OP(i)(3 downto 0) <= x"0" when rx_allow_q(i) = '1' and tx_allow_q(i) = '1' else x"7";
+               STAT_OP(i)(15)          <= send_link_reset_i(i) when rising_edge(SYSCLK);\r
+               STAT_OP(i)(14)          <= '0';\r
+               STAT_OP(i)(13)          <= internal_make_link_reset_out(i) when rising_edge(SYSCLK); --make trbnet reset\r
+               STAT_OP(i)(12)          <= '0';\r
+               STAT_OP(i)(11)          <= '0';\r
+               STAT_OP(i)(10)          <= rx_allow(i);\r
+               STAT_OP(i)(9)           <= tx_allow(i);\r
+               STAT_OP(i)(8)           <= got_link_ready_i(i)  when rising_edge(rx_half_clk(i));\r
+               STAT_OP(i)(7)           <= send_link_reset_i(i);\r
+               STAT_OP(i)(6)           <= make_link_reset_i(i);\r
+               STAT_OP(i)(5)           <= request_retr_i(i);\r
+               STAT_OP(i)(4)           <= start_retr_i(i);\r
+               STAT_OP(i)(3 downto 0) <= x"0" when rx_allow_q(i) = '1' and tx_allow_q(i) = '1' else x"7";\r
 -      end generate;\r
 -\r
 -end med_ecp3_sfp_4_sync_down_arch;\r
 +      end generate;
 +
 +end med_ecp3_sfp_4_sync_down_arch;
Simple merge
index 5cb3cc56669531cf4dfa2d0aec980cf558ef0e49,a8daee80ec4965f94fd82d577181b849eb721e98..1df9f14b7938558558ed9b942f8d9445881d4d7d
 -library ieee;\r
 -use ieee.std_logic_1164.all;\r
 -use ieee.numeric_std.all;\r
 -use IEEE.STD_LOGIC_ARITH.ALL;\r
 -\r
 -library work;\r
 -use work.trb_net_std.all;\r
 -use work.trb_net_components.all;\r
 -use work.trb_net16_hub_func.all; \r
 -\r
 -\r
 -package soda_components is\r
 -\r
 -      attribute syn_useioff                                   : boolean;\r
 -      attribute syn_keep                                              : boolean;\r
 -      attribute syn_preserve                                  : boolean;\r
 -\r
 -      constant        c_PHASE_L                                               : std_logic     := '0';                                 -- byt2word allignment of soda\r
 -      constant        c_PHASE_H                                               : std_logic     := '1';                                 -- byt2word allignment of soda\r
 -      constant        c_HUB_CHILDREN                                  : natural range 1 to 4 := 4;            -- number of children per soda-hub\r
 -      constant        cSODA_CLOCK_PERIOD                      : natural range 1 to 20 := 5;           -- soda clock-period in ns\r
 -      constant        cSYS_CLOCK_PERIOD                               : natural range 1 to 20 := 10;          -- soda clock-period in ns\r
 -      constant        cSODA_CYCLE_PERIOD                      : natural range 1 to 50 := 25;          -- cycle-period at which soda transmits, in ns\r
 -      constant        cBURST_PERIOD                                   : natural := 2400;                                              -- particle-beam burst-period in ns\r
 -      constant        cSODA_COMMAND_WINDOS_SIZE       : natural range 1 to 65535      := 5000; -- size of the window in which soda-cmds are allowed after a superburst-pulse in ns\r
 -      constant        cSODA_CALIBRATION_TIMEOUT       : natural range 100 to 5000     := 250;         -- soda clock-period in ns\r
 -\r
 -      constant        cWINDOW_delay                                   : std_logic_vector(7 downto 0)  := conv_std_logic_vector(28, 8);                                                                                                        -- in clock-cycles\r
 -      constant        cCLOCKS_PER_WINDOW                      : std_logic_vector(15 downto 0) := conv_std_logic_vector((cSODA_COMMAND_WINDOS_SIZE / cSODA_CLOCK_PERIOD) - 1, 16);     -- in clock-cycles\r
 -\r
 -      constant c_QUAD_DATA_WIDTH                              : integer := 4*c_DATA_WIDTH;\r
 -      constant c_QUAD_NUM_WIDTH                               : integer := 4*c_NUM_WIDTH;\r
 +library ieee;
 +use ieee.std_logic_1164.all;
 +use ieee.numeric_std.all;
 +use IEEE.STD_LOGIC_ARITH.ALL;
 +
 +library work;
 +use work.trb_net_std.all;
 +use work.trb_net_components.all;
 +use work.trb_net16_hub_func.all; 
 +
 +
 +package soda_components is
 +
 +      attribute syn_useioff                                   : boolean;
 +      attribute syn_keep                                              : boolean;
 +      attribute syn_preserve                                  : boolean;
 +
 +      constant        c_PHASE_L                                               : std_logic     := '0';                                 -- byt2word allignment of soda
 +      constant        c_PHASE_H                                               : std_logic     := '1';                                 -- byt2word allignment of soda
 +      constant        c_HUB_CHILDREN                                  : natural range 1 to 4 := 4;            -- number of children per soda-hub
 +      constant        cSODA_CLOCK_PERIOD                      : natural range 1 to 20 := 5;           -- soda clock-period in ns
 +      constant        cSYS_CLOCK_PERIOD                               : natural range 1 to 20 := 10;          -- soda clock-period in ns
 +      constant        cSODA_CYCLE_PERIOD                      : natural range 1 to 50 := 25;          -- cycle-period at which soda transmits, in ns
 +      constant        cBURST_PERIOD                                   : natural := 2400;                                              -- particle-beam burst-period in ns
 +      constant        cSODA_COMMAND_WINDOS_SIZE       : natural range 1 to 65535      := 5000; -- size of the window in which soda-cmds are allowed after a superburst-pulse in ns
 +      constant        cSODA_CALIBRATION_TIMEOUT       : natural range 100 to 5000     := 250;         -- soda clock-period in ns
 +
 +      constant        cWINDOW_delay                                   : std_logic_vector(7 downto 0)  := conv_std_logic_vector(28, 8);                                                                                                        -- in clock-cycles
 +      constant        cCLOCKS_PER_WINDOW                      : std_logic_vector(15 downto 0) := conv_std_logic_vector((cSODA_COMMAND_WINDOS_SIZE / cSODA_CLOCK_PERIOD) - 1, 16);     -- in clock-cycles
 +
 +      constant c_QUAD_DATA_WIDTH                              : integer := 4*c_DATA_WIDTH;
 +      constant c_QUAD_NUM_WIDTH                               : integer := 4*c_NUM_WIDTH;
-       constant c_QUAD_MUX_WIDTH                               : integer := 3;
+       constant c_QUAD_MUX_WIDTH                               : integer := 3; --!!!\r
 -\r
 -      subtype t_HUB_BIT                               is std_logic_vector(c_HUB_CHILDREN-1 downto 0);\r
 -      type            t_HUB_NUM                               is array(c_HUB_CHILDREN-1 downto 0) of std_logic_vector(c_NUM_WIDTH-1 downto 0);\r
 -      type            t_HUB_NIBL                              is array(c_HUB_CHILDREN-1 downto 0) of std_logic_vector(3 downto 0);\r
 -      type            t_HUB_BYTE                              is array(c_HUB_CHILDREN-1 downto 0) of std_logic_vector(7 downto 0);\r
 -      type            t_HUB_WORD                              is array(c_HUB_CHILDREN-1 downto 0) of std_logic_vector(15 downto 0);\r
 -      type            t_HUB_LWORD                             is array(c_HUB_CHILDREN-1 downto 0) of std_logic_vector(31 downto 0);\r
 -\r
 -      type            t_HUB_TIMER13                   is array(c_HUB_CHILDREN-1 downto 0) of std_logic_vector(12 downto 0);\r
 -      type            t_HUB_TIMER19                   is array(c_HUB_CHILDREN-1 downto 0) of std_logic_vector(18 downto 0);\r
 -      type            t_HUB_TIMER21                   is array(c_HUB_CHILDREN-1 downto 0) of std_logic_vector(20 downto 0);\r
 -\r
 -      type            t_PACKET_TYPE_SENT      is (c_NO_PACKET, c_CMD_PACKET, c_BST_PACKET);\r
 -      type            t_PACKET_TYPE_ARRAY     is array(c_HUB_CHILDREN-1 downto 0) of t_PACKET_TYPE_SENT;\r
 -      \r
 -      subtype t_HUB_BIT_ARRAY         is std_logic_vector(c_HUB_CHILDREN-1 downto 0);\r
 -      type            t_HUB_BYTE_ARRAY                is array(c_HUB_CHILDREN-1 downto 0) of std_logic_vector(7 downto 0);\r
 -      type            t_HUB_WORD_ARRAY                is array(c_HUB_CHILDREN-1 downto 0) of std_logic_vector(15 downto 0);\r
 -      type            t_HUB_LWORD_ARRAY               is array(c_HUB_CHILDREN-1 downto 0) of std_logic_vector(31 downto 0);\r
 -\r
 -      subtype t_QUAD_BIT                              is std_logic_vector(3 downto 0);\r
 -      type            t_QUAD_NIBL                             is array(3 downto 0) of std_logic_vector(3 downto 0);\r
 -      type            t_QUAD_BYTE                             is array(3 downto 0) of std_logic_vector(7 downto 0);\r
 -      type            t_QUAD_9WORD                    is array(3 downto 0) of std_logic_vector(8 downto 0);\r
 -      type            t_QUAD_WORD                             is array(3 downto 0) of std_logic_vector(15 downto 0);\r
 -      type            t_QUAD_LWORD                    is array(3 downto 0) of std_logic_vector(31 downto 0);\r
 -\r
 -      component soda_superburst_generator\r
 -              generic(\r
 -                      BURST_COUNT : integer range 1 to 64 := 16 -- number of bursts to be counted between super-bursts\r
 -              );\r
 -              port(\r
 -                      SODACLK                                                 : in    std_logic; -- fabric clock\r
 -                      RESET                                                           : in    std_logic; -- synchronous reset \r
 -                      --Internal Connection\r
 -                      SODA_BURST_PULSE_IN                     : in    std_logic := '0';       -- \r
 -                      START_OF_SUPERBURST_OUT         : out   std_logic := '0';\r
 -                      SUPER_BURST_NR_OUT                      : out   std_logic_vector(30 downto 0) := (others => '0');\r
 -                      SODA_CMD_WINDOW_OUT             : out   std_logic := '0'\r
 -                      );\r
 -      end component;\r
 -\r
 -      component soda_packet_builder\r
 -              port(\r
 -                      SODACLK                                         : in    std_logic; -- fabric clock\r
 -                      RESET                                                   : in    std_logic; -- synchronous reset\r
 -                      --Internal Connection\r
 -                      LINK_PHASE_IN                           : in    std_logic := '0';\r
 -                      SODA_CYCLE_IN                           : in    std_logic := '0';\r
 -                      SODA_CMD_STROBE_IN              : in    std_logic := '0';       -- \r
 -                      START_OF_SUPERBURST             : in    std_logic := '0';\r
 -                      SUPER_BURST_NR_IN                       : in    std_logic_vector(30 downto 0) := (others => '0');\r
 -                      SODA_CMD_WORD_IN                        : in    std_logic_vector(30 downto 0) := (others => '0');               --REGIO_CTRL_REG in trbnet handler is 32 bit\r
 -                      EXPECTED_REPLY_OUT              : out   std_logic_vector(7 downto 0) := (others => '0');\r
 -                      TIME_CAL_OUT                            : out   std_logic := '0';       -- \r
 -                      TX_DLM_PREVIEW_OUT              : out   std_logic := '0';       -- \r
 -                      TX_DLM_OUT                                      : out   std_logic := '0';       -- \r
 -                      TX_DLM_WORD_OUT                 : out   std_logic_vector(7 downto 0) := (others => '0')\r
 -              );\r
 -      end component;\r
 -\r
 -      component soda_packet_handler\r
 -              port(\r
 -                      SODACLK                                                 : in    std_logic; -- fabric clock\r
 -                      RESET                                                           : in    std_logic; -- synchronous reset\r
 -                      CLEAR                                                           : in    std_logic; -- asynchronous reset\r
 -                      CLK_EN                                                  : in    std_logic;\r
 -                      --Internal Connection\r
 -                      START_OF_SUPERBURST_OUT         : out std_logic := '0';\r
 -                      SUPER_BURST_NR_OUT                      : out std_logic_vector(30 downto 0) := (others => '0');\r
 -                      START_OF_CALIBRATION_OUT        : out std_logic := '0';\r
 -                      SODA_CMD_VALID_OUT                      : out std_logic := '0';\r
 -                      SODA_CMD_WORD_OUT                               : out std_logic_vector(30 downto 0) := (others => '0');\r
 -                      RX_DLM_IN                                               : in std_logic;\r
 -                      RX_DLM_WORD_IN                                  : in    std_logic_vector(7 downto 0) := (others => '0')\r
 -              );\r
 -      end component;\r
 -\r
 -      component soda_d8crc8           -- crc-calculator/checker\r
 -              port( \r
 -                      CLOCK                           : in std_logic; \r
 -                      RESET                           : in std_logic;\r
 -                      SOC_IN                  : in std_logic; \r
 -                      DATA_IN                 : in std_logic_vector(7 downto 0); \r
 -                      DATA_VALID_IN   : in std_logic; \r
 -                      EOC_IN                  : in std_logic; \r
 -                      CRC_OUT                 : out std_logic_vector(7 downto 0); \r
 -                      CRC_VALID_OUT   : out std_logic \r
 -              );\r
 -      end component;\r
 -      \r
 -      component soda_source   -- box containing soda_source components\r
 -              port(\r
 -                      SYSCLK                                  : in    std_logic; -- fabric clock\r
 -                      SODACLK                                 : in    std_logic; -- clock for data to serdes\r
 -                      RESET                                           : in    std_logic; -- synchronous reset\r
 -                      --Internal Connection\r
 -                      SODA_BURST_PULSE_IN     : in    std_logic := '0';       -- \r
 -\r
 -                      RX_DLM_WORD_IN                  : in    std_logic_vector(7 downto 0) := (others => '0');\r
 -                      RX_DLM_IN                               : in std_logic;\r
 -                      TX_DLM_OUT                              : out   std_logic;\r
 -                      TX_DLM_WORD_OUT         : out   std_logic_vector(7 downto 0) := (others => '0');\r
 -                      TX_DLM_PREVIEW_OUT      : out   std_logic       := '0'; --PL!\r
 -                      LINK_PHASE_IN                   : in    std_logic       := '0'; --PL!\r
 -\r
 -\r
 -                      SODA_DATA_IN                    : in    std_logic_vector(31 downto 0) := (others => '0');\r
 -                      SODA_DATA_OUT                   : out   std_logic_vector(31 downto 0) := (others => '0');\r
 -                      SODA_ADDR_IN                    : in    std_logic_vector(3 downto 0) := (others => '0');\r
 -                      SODA_READ_IN                    : in    std_logic := '0';\r
 -                      SODA_WRITE_IN                   : in    std_logic := '0';\r
 -                      SODA_ACK_OUT                    : out   std_logic := '0';\r
 -                      LEDS_OUT                                : out std_logic_vector(3 downto 0)\r
 -                      );\r
 -      end component;\r
 -\r
 -      component soda_4source is\r
 -              port(\r
 -                      SYSCLK                                          : in    std_logic; -- fabric clock\r
 -                      SODACLK                                         : in    std_logic;\r
 -                      RESET                                                   : in    std_logic; -- synchronous reset\r
 -                      CLEAR                                                   : in    std_logic; -- asynchronous reset\r
 -                      CLK_EN                                          : in    std_logic; \r
 -\r
 -                      SODA_BURST_PULSE_IN             : in    std_logic := '0';\r
 -                      SODA_CYCLE_IN                           : in    std_logic := '0';\r
 -              --      MULTIPLE DUPLEX DOWN-LINKS\r
 -                      RX_DLM_IN                                       : in    t_HUB_BIT;\r
 -                      RX_DLM_WORD_IN                          : in    t_HUB_BYTE;\r
 -                      TX_DLM_OUT                                      : out   t_HUB_BIT;\r
 -                      TX_DLM_WORD_OUT                 : out   t_HUB_BYTE;\r
 -                      TX_DLM_PREVIEW_OUT              : out   t_HUB_BIT;      --PL!\r
 -                      LINK_PHASE_IN                           : in    t_HUB_BIT;      --PL!\r
 -\r
 -                      SODA_DATA_IN                            : in    std_logic_vector(31 downto 0)   := (others => '0');\r
 -                      SODA_DATA_OUT                           : out   std_logic_vector(31 downto 0)   := (others => '0');\r
 -                      SODA_ADDR_IN                            : in    std_logic_vector(3 downto 0)    := (others => '0');\r
 -                      SODA_READ_IN                            : in    std_logic := '0';\r
 -                      SODA_WRITE_IN                           : in    std_logic := '0';\r
 -                      SODA_ACK_OUT                            : out   std_logic := '0';\r
 -                      LEDS_OUT                 : out std_logic_vector(3 downto 0);\r
 -                      LINK_DEBUG_IN                           : in    std_logic_vector(31 downto 0)   := (others => '0')\r
 -              );\r
 -      end component;\r
 -\r
 -      component soda_hub\r
 -      port(\r
 -              SYSCLK                                  : in    std_logic; -- fabric clock\r
 -              SODACLK                                 : in    std_logic; -- recovered clock\r
 ---            SODA_OUT_CLK                    : in    t_HUB_BIT; -- transmit clock\r
 -              RESET                                           : in    std_logic; -- synchronous reset\r
 -              CLEAR                                           : in    std_logic; -- asynchronous reset\r
 -              CLK_EN                                  : in    std_logic; \r
 -\r
 -      --      SINGLE DUBPLEX UP-LINK TO THE TOP\r
 -              RXUP_DLM_IN                             : in    std_logic;\r
 -              RXUP_DLM_WORD_IN                : in    std_logic_vector(7 downto 0)    := (others => '0');\r
 -              TXUP_DLM_OUT                    : out   std_logic;\r
 -              TXUP_DLM_WORD_OUT               : out   std_logic_vector(7 downto 0)    := (others => '0');\r
 -              TXUP_DLM_PREVIEW_OUT    : out   std_logic       := '0'; --PL!\r
 -              UPLINK_PHASE_IN         : in    std_logic       := '0'; --PL!\r
 -\r
 -      --      MULTIPLE DUPLEX DOWN-LINKS TO THE BOTTOM\r
 -              RXDN_DLM_IN                             : in    t_HUB_BIT;\r
 -              RXDN_DLM_WORD_IN                : in    t_HUB_BYTE;\r
 -              TXDN_DLM_OUT                    : out   t_HUB_BIT;\r
 -              TXDN_DLM_WORD_OUT               : out   t_HUB_BYTE;\r
 -              TXDN_DLM_PREVIEW_OUT    : out   t_HUB_BIT;      --PL!\r
 -              DNLINK_PHASE_IN         : in    t_HUB_BIT;      --PL!\r
 -\r
 -              SODA_DATA_IN                    : in    std_logic_vector(31 downto 0)   := (others => '0');\r
 -              SODA_DATA_OUT                   : out   std_logic_vector(31 downto 0)   := (others => '0');\r
 -              SODA_ADDR_IN                    : in    std_logic_vector(3 downto 0)    := (others => '0');\r
 -              SODA_READ_IN                    : in    std_logic := '0';\r
 -              SODA_WRITE_IN                   : in    std_logic := '0';\r
 -              SODA_ACK_OUT                    : out   std_logic := '0';\r
 -              LEDS_OUT         : out std_logic_vector(3 downto 0);\r
 -              LINK_DEBUG_IN                   : in    std_logic_vector(31 downto 0)   := (others => '0')\r
 -      );\r
 -      end component;\r
 -\r
 -      component soda_client   -- box containing soda_source components\r
 -              port(\r
 -                      SYSCLK                                  : in    std_logic; -- fabric clock\r
 -                      SODACLK                                 : in    std_logic; -- recovered clock\r
 -                      RESET                                           : in    std_logic; -- synchronous reset\r
 -                      CLEAR                                           : in    std_logic; -- asynchronous reset\r
 -                      CLK_EN                                  : in    std_logic; \r
 -                      --Internal Connection\r
 -                      RX_DLM_WORD_IN                  : in    std_logic_vector(7 downto 0) := (others => '0');\r
 -                      RX_DLM_IN                               : in std_logic;\r
 -                      TX_DLM_OUT                              : out   std_logic;\r
 -                      TX_DLM_WORD_OUT         : out   std_logic_vector(7 downto 0) := (others => '0');\r
 -                      TX_DLM_PREVIEW_OUT      : out   std_logic       := '0'; --PL!\r
 -                      LINK_PHASE_IN                   : in    std_logic       := '0'; --PL!\r
 -\r
 -                      SODA_DATA_IN                    : in    std_logic_vector(31 downto 0) := (others => '0');\r
 -                      SODA_DATA_OUT                   : out   std_logic_vector(31 downto 0) := (others => '0');\r
 -                      SODA_ADDR_IN                    : in    std_logic_vector(3 downto 0) := (others => '0');\r
 -                      SODA_READ_IN                    : in    std_logic := '0';\r
 -                      SODA_WRITE_IN                   : in    std_logic := '0';\r
 -                      SODA_ACK_OUT                    : out   std_logic := '0';\r
 -                      LEDS_OUT         : out std_logic_vector(3 downto 0);\r
 -                      LINK_DEBUG_IN                   : in    std_logic_vector(31 downto 0)   := (others => '0')\r
 -              );\r
 -      end component;\r
 -      \r
 -      component soda_reply_pkt_builder\r
 -              port(\r
 -                      SODACLK                                 : in    std_logic; -- fabric clock\r
 -                      RESET                                           : in    std_logic; -- synchronous reset\r
 -                      CLEAR                                           : in    std_logic; -- asynchronous reset\r
 -                      CLK_EN                                  : in    std_logic;\r
 -                      --Internal Connection\r
 -                      LINK_PHASE_IN                   : in    std_logic := '0';       --_vector(1 downto 0) := (others => '0');\r
 -                      START_OF_SUPERBURST     : in    std_logic := '0';\r
 -                      SUPER_BURST_NR_IN               : in    std_logic_vector(30 downto 0) := (others => '0');\r
 -                      SODA_CMD_STROBE_IN      : in    std_logic := '0';       -- \r
 -                      SODA_CMD_WORD_IN                : in    std_logic_vector(30 downto 0) := (others => '0');               --REGIO_CTRL_REG in trbnet handler is 32 bit\r
 -                      TX_DLM_PREVIEW_OUT      : out   std_logic := '0';\r
 -                      TX_DLM_OUT                              : out   std_logic := '0';       -- \r
 -                      TX_DLM_WORD_OUT         : out   std_logic_vector(7 downto 0) := (others => '0')\r
 -              );\r
 -      end component;\r
 -\r
 -      component soda_reply_handler\r
 -              port(\r
 -                      SODACLK                                         : in    std_logic; -- fabric clock\r
 -                      RESET                                                   : in    std_logic; -- synchronous reset\r
 -                      CLEAR                                                   : in    std_logic; -- asynchronous reset\r
 -                      CLK_EN                                          : in    std_logic;\r
 -                      --Internal Connection\r
 -              --      LAST_PACKET                                     : in    t_PACKET_TYPE_SENT      := c_NO_PACKET;\r
 -                      EXPECTED_REPLY_IN                       : in    std_logic_vector(7 downto 0) := (others => '0');\r
 -                      RX_DLM_IN                                       : in    std_logic       := '0';\r
 -                      RX_DLM_WORD_IN                          : in    std_logic_vector(7 downto 0) := (others => '0');\r
 -                      REPLY_VALID_OUT                 : out std_logic := '0';\r
 -                      REPLY_OK_OUT                            : out std_logic := '0'\r
 -              );\r
 -      end component;\r
 -\r
 -      component soda_calibration_timer\r
 -              port(\r
 -                      SODACLK                                         : in    std_logic; -- fabric clock\r
 -                      RESET                                                   : in    std_logic; -- synchronous reset\r
 -                      CLEAR                                                   : in    std_logic; -- asynchronous reset\r
 -                      CLK_EN                                          : in    std_logic; \r
 -                      --Internal Connection\r
 -                      START_CALIBRATION                       : in    std_logic := '0';\r
 -                      END_CALIBRATION                 : in    std_logic := '0';\r
 -                      VALID_OUT                                       : out   std_logic := '0';       -- \r
 -                      CALIB_TIME_OUT                          : out   std_logic_vector(15 downto 0) := (others => '0');\r
 -                      TIMEOUT_ERROR                           : out std_logic := '0'\r
 -              );\r
 -      end component;\r
 -\r
 -      component spi_flash_and_fpga_reload\r
 -              port(\r
 -                      CLK_IN : in std_logic;\r
 -                      RESET_IN : in std_logic;\r
 -\r
 -                      BUS_ADDR_IN                             : in std_logic_vector(8 downto 0);\r
 -                      BUS_READ_IN                             : in std_logic;\r
 -                      BUS_WRITE_IN                    : in std_logic;\r
 -                      BUS_DATAREADY_OUT               : out std_logic;\r
 -                      BUS_WRITE_ACK_OUT               : out std_logic;\r
 -                      BUS_UNKNOWN_ADDR_OUT    : out std_logic;\r
 -                      BUS_NO_MORE_DATA_OUT    : out std_logic;\r
 -                      BUS_DATA_IN                             : in std_logic_vector(31 downto 0);\r
 -                      BUS_DATA_OUT                    : out std_logic_vector(31 downto 0);\r
 -\r
 -                      DO_REBOOT_IN                    : in std_logic; \r
 -                      PROGRAMN                                        : out std_logic;\r
 -\r
 -                      SPI_CS_OUT                              : out std_logic;\r
 -                      SPI_SCK_OUT                             : out std_logic;\r
 -                      SPI_SDO_OUT                             : out std_logic;\r
 -                      SPI_SDI_IN                              : in std_logic\r
 -              );\r
 -      end component;\r
 -\r
 -      component soda_start_of_burst_faker\r
 -              generic(\r
 -                      CLOCK_PERIOD    : natural range 1 to 20         := 5;           -- clock-period in ns\r
 -                      BURST_PERIOD    : natural range 1       to 2400 := 2400 -- burst-period in ns\r
 -                      );\r
 -              port(\r
 -                      SYSCLK                                  : in    std_logic; -- fabric clock\r
 -                      RESET                                           : in    std_logic; -- synchronous reset\r
 -                      SODA_BURST_PULSE_OUT    : out   std_logic := '0'\r
 -                      );\r
 -      end component;\r
 -\r
 -      component soda_start_of_burst_control is\r
 -              generic(\r
 -                      CLOCK_PERIOD                    : natural range 1 to 25 := cSODA_CLOCK_PERIOD;  -- clock-period in ns\r
 -                      CYCLE_PERIOD                    : natural range 5 to 50 := cSODA_CYCLE_PERIOD;  -- cycle-period in ns\r
 -                      BURST_PERIOD                    : natural                                       := cBURST_PERIOD                        -- burst-period in ns\r
 -                      );\r
 -              port(\r
 -                      SODA_CLK                                        : in    std_logic; -- fabric clock\r
 -                      RESET                                           : in    std_logic; -- synchronous reset\r
 -                      SODA_BURST_PULSE_OUT    : out   std_logic := '0';\r
 -                      SODA_40MHZ_CYCLE_OUT    : out   std_logic := '0'\r
 -                      );\r
 -      end component;\r
 -\r
 -      component posedge_to_pulse\r
 -              port (\r
 -                      IN_CLK                  : in std_logic;\r
 -                      OUT_CLK                 : in std_logic;\r
 -                      CLK_EN                  : in std_logic;\r
 -                      SIGNAL_IN               : in std_logic;\r
 -                      PULSE_OUT               : out std_logic\r
 -              );\r
 -      end component;\r
 -\r
 -      component med_ecp3_sfp_sync_down is\r
 -              generic(\r
 -                      SERDES_NUM                              : integer range 0 to 3 := 0;\r
 -                      IS_SYNC_SLAVE                   : integer := c_NO); --select slave mode\r
 -              port(\r
 -                      OSCCLK                                  : in std_logic; -- _internal_ 200 MHz reference clock\r
 -                      SYSCLK                                  : in std_logic; -- 100 MHz main clock net, synchronous to RX clock\r
 -                      RESET                                           : in std_logic; -- synchronous reset\r
 -                      CLEAR                                           : in std_logic; -- asynchronous reset\r
 -      --              PCSA_REFCLKP                    : in std_logic;                 -- external refclock straight into serdes\r
 -      --              PCSA_REFCLKN                    : in std_logic;                 -- external refclock straight into serdes\r
 -                      --Internal Connection TX\r
 -                      MED_DATA_IN                             : in std_logic_vector(c_DATA_WIDTH-1 downto 0);\r
 -                      MED_PACKET_NUM_IN               : in std_logic_vector(c_NUM_WIDTH-1 downto 0);\r
 -                      MED_DATAREADY_IN                : in std_logic;\r
 -                      MED_READ_OUT                    : out std_logic := '0';\r
 -                      --Internal Connection RX\r
 -                      MED_DATA_OUT                    : out std_logic_vector(c_DATA_WIDTH-1 downto 0) := (others => '0');\r
 -                      MED_PACKET_NUM_OUT      : out std_logic_vector(c_NUM_WIDTH-1 downto 0) := (others => '0');\r
 -                      MED_DATAREADY_OUT               : out std_logic := '0';\r
 -                      MED_READ_IN                             : in std_logic;\r
 -                      RX_HALF_CLK_OUT         : out std_logic := '0'; --received 100 MHz\r
 -                      RX_FULL_CLK_OUT         : out std_logic := '0'; --received 200 MHz\r
 -                      TX_HALF_CLK_OUT         : out std_logic := '0'; --received 100 MHz\r
 -                      TX_FULL_CLK_OUT         : out std_logic := '0'; --received 200 MHz\r
 -\r
 -                      --Sync operation\r
 -                      RX_DLM                                  : out std_logic := '0';\r
 -                      RX_DLM_WORD                             : out std_logic_vector(7 downto 0) := x"00";\r
 -                      TX_DLM                                  : in std_logic := '0';\r
 -                      TX_DLM_WORD                             : in std_logic_vector(7 downto 0) := x"00";\r
 -                      TX_DLM_PREVIEW_IN               : in std_logic := '0'; --PL!\r
 -                      LINK_PHASE_OUT                  : out std_logic := '0'; --PL!\r
 -\r
 -                      --SFP Connection\r
 -                      SD_RXD_P_IN                             : in    std_logic;\r
 -                      SD_RXD_N_IN                             : in    std_logic;\r
 -                      SD_TXD_P_OUT                    : out   std_logic;\r
 -                      SD_TXD_N_OUT                    : out   std_logic;\r
 -                      SD_REFCLK_P_IN                  : in    std_logic; --not used\r
 -                      SD_REFCLK_N_IN                  : in    std_logic; --not used\r
 -                      SD_PRSNT_N_IN                   : in    std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)\r
 -                      SD_LOS_IN                               : in    std_logic; -- SFP Loss Of Signal ('0' = OK, '1' = no signal)\r
 -                      SD_TXDIS_OUT                    : out   std_logic := '0'; -- SFP disable\r
 -                      --Control Interface\r
 -                      SCI_DATA_IN                             : in std_logic_vector(7 downto 0) := (others => '0');\r
 -                      SCI_DATA_OUT                    : out std_logic_vector(7 downto 0) := (others => '0');\r
 -                      SCI_ADDR                                        : in std_logic_vector(8 downto 0) := (others => '0');\r
 -                      SCI_READ                                        : in std_logic := '0';\r
 -                      SCI_WRITE                               : in std_logic := '0';\r
 -                      SCI_ACK                                 : out std_logic := '0';\r
 -                      SCI_NACK                                        : out std_logic := '0';\r
 -                      -- Status and control port\r
 -                      STAT_OP                                 : out std_logic_vector (15 downto 0);\r
 -                      CTRL_OP                                 : in std_logic_vector (15 downto 0) := (others => '0');\r
 -                      STAT_DEBUG                              : out std_logic_vector (63 downto 0);\r
 -                      CTRL_DEBUG                              : in std_logic_vector (63 downto 0) := (others => '0')\r
 -              );\r
 -      end component;\r
 -\r
 -      component med_ecp3_sfp_4_sync_down is\r
 -              generic(        SERDES_NUM : integer range 0 to 3 := 0;\r
 -                                      IS_SYNC_SLAVE : integer := c_NO); --select slave mode\r
 -              port(\r
 -                      OSC_CLK                                 : in std_logic; -- 200 MHz reference clock\r
 -                      TX_DATACLK                              : in std_logic; -- 200 MHz data clock\r
 -                      SYSCLK                                  : in std_logic; -- 100 MHz main clock net, synchronous to OSC clock\r
 -                      RESET                                           : in std_logic; -- synchronous reset\r
 -                      CLEAR                                           : in std_logic; -- asynchronous reset\r
 -                      ---------------------------------------------------------------------------------------------------------------------------------------------------------\r
 -                      LINK_DISABLE_IN         : in std_logic; -- downlinks must behave as slaves to uplink connection. Downlinks are released once unlink is established.\r
 -                      ---------------------------------------------------------------------------------------------------------------------------------------------------------\r
 -                      --Internal Connection TX\r
 -                      MED_DATA_IN                             : in t_HUB_WORD;        --std_logic_vector(c_QUAD_DATA_WIDTH-1 downto 0);\r
 -                      MED_PACKET_NUM_IN               : in    t_HUB_NUM;      --std_logic_vector(c_QUAD_NUM_WIDTH-1 downto 0);\r
 -                      MED_DATAREADY_IN                : in std_logic_vector(3 downto 0);\r
 -                      MED_READ_OUT                    : out std_logic_vector(3 downto 0) := (others => '0');\r
 -                      --Internal Connection RX\r
 -                      MED_DATA_OUT                    : out t_HUB_WORD;       -- std_logic_vector(4*c_DATA_WIDTH-1 downto 0)  := (others => '0');\r
 -                      MED_PACKET_NUM_OUT      : out t_HUB_NUM;        -- std_logic_vector(4*c_NUM_WIDTH-1 downto 0)   := (others => '0');\r
 -                      MED_DATAREADY_OUT               : out std_logic_vector(3 downto 0)                                                      := (others => '0');\r
 -                      MED_READ_IN                             : in std_logic_vector(3 downto 0);\r
 -                      RX_HALF_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --100 MHz\r
 -                      RX_FULL_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --200 MHz\r
 -                      TX_HALF_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --100 MHz\r
 -                      TX_FULL_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --200 MHz\r
 -\r
 -                      --Sync operation\r
 -                      RX_DLM                                  : out t_HUB_BIT;        --std_logic_vector(3 downto 0)                  := (others => '0');\r
 -                      RX_DLM_WORD                             : out   t_HUB_BYTE;     --std_logic_vector(4*8 - 1 downto 0)    := (others => '0');\r
 -                      TX_DLM                                  : in t_HUB_BIT; --std_logic_vector(3 downto 0)                  := (others => '0');\r
 -                      TX_DLM_WORD                             : in    t_HUB_BYTE;     --std_logic_vector(4*8 - 1 downto 0)    := (others => '0');\r
 -                      TX_DLM_PREVIEW_IN               : in    t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');     --PL!\r
 -                      LINK_PHASE_OUT                  : out   t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');     --PL!\r
 -\r
 -                      --SFP Connection\r
 -                      SD_RXD_P_IN                             : in    t_HUB_BIT;      --std_logic;\r
 -                      SD_RXD_N_IN                             : in    t_HUB_BIT;      --std_logic;\r
 -                      SD_TXD_P_OUT                    : out   t_HUB_BIT;      --std_logic;\r
 -                      SD_TXD_N_OUT                    : out   t_HUB_BIT;      --std_logic;\r
 -                      SD_REFCLK_P_IN                  : in    t_HUB_BIT;      --std_logic; --not used\r
 -                      SD_REFCLK_N_IN                  : in    t_HUB_BIT;      --std_logic; --not used\r
 -                      SD_PRSNT_N_IN                   : in    t_HUB_BIT;      --std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)\r
 -                      SD_LOS_IN                               : in    t_HUB_BIT;      --std_logic; -- SFP Loss Of Signal ('0' = OK, '1' = no signal)\r
 -                      SD_TXDIS_OUT                    : out   t_HUB_BIT;      --std_logic := '0'; -- SFP disable\r
 -                      --Control Interface\r
 -                      SCI_DATA_IN                             : in std_logic_vector(7 downto 0) := (others => '0');\r
 -                      SCI_DATA_OUT                    : out std_logic_vector(7 downto 0) := (others => '0');\r
 -                      SCI_ADDR                                        : in std_logic_vector(8 downto 0) := (others => '0');\r
 -                      SCI_READ                                        : in std_logic := '0';\r
 -                      SCI_WRITE                               : in std_logic := '0';\r
 -                      SCI_ACK                                 : out std_logic := '0';\r
 -                      SCI_NACK                                        : out std_logic := '0';\r
 -                      -- Status and control port\r
 -                      STAT_OP                                 : out   t_HUB_WORD;\r
 -                      CTRL_OP                                 : in    t_HUB_WORD;\r
 -                      STAT_DEBUG                              : out std_logic_vector (63 downto 0);\r
 -                      CTRL_DEBUG                              : in std_logic_vector (63 downto 0) := (others => '0')\r
 -              );\r
 -      end component;\r
 -\r
 -      component med_ecp3_sfp_4_sync_down_EP is\r
 -              generic(        SERDES_NUM : integer range 0 to 3 := 0;\r
 -                                      IS_SYNC_SLAVE : integer := c_NO); --select slave mode\r
 -              port(\r
 -                      OSC_CLK                                 : in std_logic; -- 200 MHz reference clock\r
 -                      TX_DATACLK                              : in std_logic; -- 200 MHz data clock\r
 -                      SYSCLK                                  : in std_logic; -- 100 MHz main clock net, synchronous to OSC clock\r
 -                      RESET                                           : in std_logic; -- synchronous reset\r
 -                      CLEAR                                           : in std_logic; -- asynchronous reset\r
 -                      ---------------------------------------------------------------------------------------------------------------------------------------------------------\r
 -                      LINK_DISABLE_IN         : in std_logic; -- downlinks must behave as slaves to uplink connection. Downlinks are released once unlink is established.\r
 -                      ---------------------------------------------------------------------------------------------------------------------------------------------------------\r
 -                      RX_HALF_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --100 MHz\r
 -                      RX_FULL_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --200 MHz\r
 -                      TX_HALF_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --100 MHz\r
 -                      TX_FULL_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --200 MHz\r
 -\r
 -                      --Sync operation\r
 -                      RX_DLM                                  : out t_HUB_BIT;        --std_logic_vector(3 downto 0)                  := (others => '0');\r
 -                      RX_DLM_WORD                             : out   t_HUB_BYTE;     --std_logic_vector(4*8 - 1 downto 0)    := (others => '0');\r
 -                      TX_DLM                                  : in t_HUB_BIT; --std_logic_vector(3 downto 0)                  := (others => '0');\r
 -                      TX_DLM_WORD                             : in    t_HUB_BYTE;     --std_logic_vector(4*8 - 1 downto 0)    := (others => '0');\r
 -                      TX_DLM_PREVIEW_IN               : in    t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');     --PL!\r
 -                      LINK_PHASE_OUT                  : out   t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');     --PL!\r
 -\r
 -                      --SFP Connection\r
 -                      SD_RXD_P_IN                             : in    t_HUB_BIT;      --std_logic;\r
 -                      SD_RXD_N_IN                             : in    t_HUB_BIT;      --std_logic;\r
 -                      SD_TXD_P_OUT                    : out   t_HUB_BIT;      --std_logic;\r
 -                      SD_TXD_N_OUT                    : out   t_HUB_BIT;      --std_logic;\r
 -                      SD_REFCLK_P_IN                  : in    t_HUB_BIT;      --std_logic; --not used\r
 -                      SD_REFCLK_N_IN                  : in    t_HUB_BIT;      --std_logic; --not used\r
 -                      SD_PRSNT_N_IN                   : in    t_HUB_BIT;      --std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)\r
 -                      SD_LOS_IN                               : in    t_HUB_BIT;      --std_logic; -- SFP Loss Of Signal ('0' = OK, '1' = no signal)\r
 -                      SD_TXDIS_OUT                    : out   t_HUB_BIT;      --std_logic := '0'; -- SFP disable\r
 -                      --Control Interface\r
 -                      SCI_DATA_IN                             : in std_logic_vector(7 downto 0) := (others => '0');\r
 -                      SCI_DATA_OUT                    : out std_logic_vector(7 downto 0) := (others => '0');\r
 -                      SCI_ADDR                                        : in std_logic_vector(8 downto 0) := (others => '0');\r
 -                      SCI_READ                                        : in std_logic := '0';\r
 -                      SCI_WRITE                               : in std_logic := '0';\r
 -                      SCI_ACK                                 : out std_logic := '0';\r
 -                      SCI_NACK                                        : out std_logic := '0';\r
 -                      -- Status and control port\r
 ---                    STAT_OP                                 : out   t_HUB_WORD;     --std_logic_vector (15 downto 0);\r
 ---                    CTRL_OP                                 : in    t_HUB_WORD;     --std_logic_vector (15 downto 0) := (others => '0');\r
 -                      STAT_DEBUG                              : out std_logic_vector (63 downto 0);\r
 -                      CTRL_DEBUG                              : in std_logic_vector (63 downto 0) := (others => '0')\r
 -              );\r
 -      end component;\r
 -\r
 -      component med_ecp3_sfp_sync_up is\r
 -              generic(\r
 -                                      SERDES_NUM              : integer range 0 to 3 := 0;\r
 -                                      IS_SYNC_SLAVE   : integer := c_YES --select slave mode\r
 -                      );\r
 -              port(\r
 -                      OSCCLK                                  : in std_logic; -- 200 MHz reference clock\r
 -                      SYSCLK                                  : in std_logic; -- 100 MHz main clock net, synchronous to RX clock\r
 -                      RESET                                           : in std_logic; -- synchronous reset\r
 -                      CLEAR                                           : in std_logic; -- asynchronous reset\r
 -                      --Internal Connection TX\r
 -                      MED_DATA_IN                             : in std_logic_vector(c_DATA_WIDTH-1 downto 0);\r
 -                      MED_PACKET_NUM_IN               : in std_logic_vector(c_NUM_WIDTH-1 downto 0);\r
 -                      MED_DATAREADY_IN                : in std_logic;\r
 -                      MED_READ_OUT                    : out std_logic := '0';\r
 -                      --Internal Connection RX\r
 -                      MED_DATA_OUT                    : out std_logic_vector(c_DATA_WIDTH-1 downto 0) := (others => '0');\r
 -                      MED_PACKET_NUM_OUT      : out std_logic_vector(c_NUM_WIDTH-1 downto 0) := (others => '0');\r
 -                      MED_DATAREADY_OUT               : out std_logic := '0';\r
 -                      MED_READ_IN                             : in std_logic;\r
 -                      RX_HALF_CLK_OUT         : out std_logic := '0'; --received 100 MHz\r
 -                      RX_FULL_CLK_OUT         : out std_logic := '0'; --received 200 MHz\r
 -                      TX_HALF_CLK_OUT         : out std_logic := '0'; --pll 100 MHz\r
 -                      TX_FULL_CLK_OUT         : out std_logic := '0'; --pll 200 MHz\r
 -                      RX_CDR_LOL_OUT                  : out std_logic := '0'; -- CLOCK_DATA RECOVERY LOSS_OF_LOCK     !PL14082014\r
 -                      --Sync operation\r
 -                      RX_DLM                                  : out std_logic := '0';\r
 -                      RX_DLM_WORD                             : out std_logic_vector(7 downto 0) := x"00";\r
 -                      TX_DLM                                  : in std_logic := '0';\r
 -                      TX_DLM_WORD                             : in std_logic_vector(7 downto 0) := x"00";\r
 -                      TX_DLM_PREVIEW_IN               : in std_logic := '0'; --PL!\r
 -                      LINK_PHASE_OUT                  : out   std_logic := '0';       --PL!\r
 -                      LINK_READY_OUT                  : out   std_logic := '0';       --PL!\r
 -\r
 -                      --SFP Connection\r
 -                      SD_RXD_P_IN                             : in std_logic;\r
 -                      SD_RXD_N_IN                             : in std_logic;\r
 -                      SD_TXD_P_OUT                    : out std_logic;\r
 -                      SD_TXD_N_OUT                    : out std_logic;\r
 -                      SD_REFCLK_P_IN                  : in std_logic; --not used\r
 -                      SD_REFCLK_N_IN                  : in std_logic; --not used\r
 -                      SD_PRSNT_N_IN                   : in std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)\r
 -                      SD_LOS_IN                               : in std_logic; -- SFP Loss Of Signal ('0' = OK, '1' = no signal)\r
 -                      SD_TXDIS_OUT                    : out std_logic := '0'; -- SFP disable\r
 -                      --Control Interface\r
 -                      SCI_DATA_IN                             : in std_logic_vector(7 downto 0) := (others => '0');\r
 -                      SCI_DATA_OUT                    : out std_logic_vector(7 downto 0) := (others => '0');\r
 -                      SCI_ADDR                                        : in std_logic_vector(8 downto 0) := (others => '0');\r
 -                      SCI_READ                                        : in std_logic := '0';\r
 -                      SCI_WRITE                               : in std_logic := '0';\r
 -                      SCI_ACK                                 : out std_logic := '0';\r
 -                      SCI_NACK                                        : out std_logic := '0';\r
 -                      -- Status and control port\r
 -                      STAT_OP                                 : out std_logic_vector (15 downto 0);\r
 -                      CTRL_OP                                 : in std_logic_vector (15 downto 0) := (others => '0');\r
 -                      STAT_DEBUG                              : out std_logic_vector (63 downto 0);\r
 -                      CTRL_DEBUG                              : in std_logic_vector (63 downto 0) := (others => '0')\r
 -              );\r
 -      end component;\r
 -\r
 -      component soda_only_ecp3_sfp_sync_up\r
 -              generic(        SERDES_NUM                              : integer range 0 to 3 := 0;\r
 -                                      IS_SYNC_SLAVE                   : integer := c_YES); --select slave mode\r
 -              port(\r
 -                      OSCCLK                                  : in std_logic; -- 200 MHz reference clock\r
 -                      SYSCLK                                  : in std_logic; -- 100 MHz main clock net, synchronous to RX clock\r
 -                      RESET : in std_logic; -- synchronous reset\r
 -                      CLEAR : in std_logic; -- asynchronous reset\r
 -\r
 -                      RX_HALF_CLK_OUT : out std_logic := '0'; --received 100 MHz\r
 -                      RX_FULL_CLK_OUT : out std_logic := '0'; --received 200 MHz\r
 -                      TX_HALF_CLK_OUT : out std_logic := '0'; --received 100 MHz\r
 -                      TX_FULL_CLK_OUT : out std_logic := '0'; --received 200 MHz\r
 -                      RX_CDR_LOL_OUT                  : out std_logic := '0'; -- CLOCK_DATA RECOVERY LOSS_OF_LOCK     !PL14082014\r
 -\r
 -                      --Sync operation\r
 -                      RX_DLM : out std_logic := '0';\r
 -                      RX_DLM_WORD : out std_logic_vector(7 downto 0) := x"00";\r
 -                      TX_DLM : in std_logic := '0';\r
 -                      TX_DLM_WORD : in std_logic_vector(7 downto 0) := x"00";\r
 -                      TX_DLM_PREVIEW_IN               : in std_logic := '0'; --PL!\r
 -                      LINK_PHASE_OUT                  : out   std_logic := '0';       --PL!\r
 -                      LINK_READY_OUT                  : out   std_logic := '0';       --PL!\r
 -\r
 -                      --SFP Connection\r
 -                      SD_RXD_P_IN : in std_logic;\r
 -                      SD_RXD_N_IN : in std_logic;\r
 -                      SD_TXD_P_OUT : out std_logic;\r
 -                      SD_TXD_N_OUT : out std_logic;\r
 -                      SD_REFCLK_P_IN : in std_logic; --not used\r
 -                      SD_REFCLK_N_IN : in std_logic; --not used\r
 -                      SD_PRSNT_N_IN : in std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)\r
 -                      SD_LOS_IN : in std_logic; -- SFP Loss Of Signal ('0' = OK, '1' = no signal)\r
 -                      SD_TXDIS_OUT : out std_logic := '0'; -- SFP disable\r
 -                      --Control Interface\r
 -                      SCI_DATA_IN : in std_logic_vector(7 downto 0) := (others => '0');\r
 -                      SCI_DATA_OUT : out std_logic_vector(7 downto 0) := (others => '0');\r
 -                      SCI_ADDR : in std_logic_vector(8 downto 0) := (others => '0');\r
 -                      SCI_READ : in std_logic := '0';\r
 -                      SCI_WRITE : in std_logic := '0';\r
 -                      SCI_ACK : out std_logic := '0';\r
 -                      SCI_NACK : out std_logic := '0'\r
 -              );\r
 -      end component;\r
 -\r
 -      component med_ecp3_sfp_4_soda is\r
 -              generic(        SERDES_NUM : integer range 0 to 3 := 0;\r
 -                                      IS_SYNC_SLAVE : integer := c_NO); -- hub downlink is NO slave\r
 -              port(\r
 -                      OSC_CLK                                 : in std_logic; -- 200 MHz reference clock\r
 -                      TX_DATACLK                              : in std_logic; -- 200 MHz data clock\r
 -                      SYSCLK                                  : in std_logic; -- 100 MHz main clock net, synchronous to OSC clock\r
 -                      RESET                                           : in std_logic; -- synchronous reset\r
 -                      CLEAR                                           : in std_logic; -- asynchronous reset\r
 -                      ---------------------------------------------------------------------------------------------------------------------------------------------------------\r
 ---                    LINK_DISABLE_IN         : in std_logic; -- downlinks must behave as slaves to uplink connection. Downlinks are released once unlink is established.\r
 -                      ---------------------------------------------------------------------------------------------------------------------------------------------------------\r
 -                      RX_HALF_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --100 MHz\r
 -                      RX_FULL_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --200 MHz\r
 -                      TX_HALF_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --100 MHz\r
 -                      TX_FULL_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --200 MHz\r
 -\r
 -                      --Sync operation\r
 -                      RX_DLM_OUT                                      : out   t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');\r
 -                      RX_DLM_WORD_OUT                         : out   t_HUB_BYTE;     --std_logic_vector(4*8 - 1 downto 0)    := (others => '0');\r
 -                      TX_DLM_IN                                       : in    t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');\r
 -                      TX_DLM_WORD_IN                          : in    t_HUB_BYTE;     --std_logic_vector(4*8 - 1 downto 0)    := (others => '0');\r
 -                      TX_DLM_PREVIEW_IN               : in    t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');     --PL!\r
 -                      LINK_PHASE_OUT                  : out   t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');     --PL!\r
 -\r
 -                      --SFP Connection \r
 -                      SD_RXD_P_IN                             : in    t_HUB_BIT;      --std_logic_vector(3 downto 0);\r
 -                      SD_RXD_N_IN                             : in    t_HUB_BIT;      --std_logic_vector(3 downto 0);\r
 -                      SD_TXD_P_OUT                    : out   t_HUB_BIT;      --std_logic_vector(3 downto 0);\r
 -                      SD_TXD_N_OUT                    : out   t_HUB_BIT;      --std_logic_vector(3 downto 0);\r
 -                      SD_REFCLK_P_IN                  : in    t_HUB_BIT;      --std_logic; --not used\r
 -                      SD_REFCLK_N_IN                  : in    t_HUB_BIT;      --std_logic; --not used\r
 -                      SD_PRSNT_N_IN                   : in    t_HUB_BIT;      --std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)\r
 -                      SD_LOS_IN                               : in    t_HUB_BIT;      --std_logic; -- SFP Loss Of Signal ('0' = OK, '1' = no signal)\r
 -                      SD_TXDIS_OUT                    : out   t_HUB_BIT;      --std_logic := '0'; -- SFP disable\r
 -                      --Control Interface\r
 -                      SCI_DATA_IN                             : in std_logic_vector(7 downto 0) := (others => '0');\r
 -                      SCI_DATA_OUT                    : out std_logic_vector(7 downto 0) := (others => '0');\r
 -                      SCI_ADDR                                        : in std_logic_vector(8 downto 0) := (others => '0');\r
 -                      SCI_READ                                        : in std_logic := '0';\r
 -                      SCI_WRITE                               : in std_logic := '0';\r
 -                      SCI_ACK                                 : out std_logic := '0';\r
 -                      SCI_NACK                                        : out std_logic := '0';\r
 -                      -- Status and control port\r
 ---                    STAT_OP                                 : out   t_HUB_WORD;     --std_logic_vector (15 downto 0);\r
 ---                    CTRL_OP                                 : in    t_HUB_WORD;     --std_logic_vector (15 downto 0) := (others => '0');\r
 -                      STAT_DEBUG                              : out std_logic_vector (63 downto 0);\r
 -                      CTRL_DEBUG                              : in std_logic_vector (63 downto 0) := (others => '0')\r
 -              );\r
 -      end component;\r
 -\r
 -      component Cu_trb_net16_soda_sync_ecp3_sfp\r
 -              port(\r
 -                      OSCCLK                                  : in std_logic; -- 200 MHz reference clock\r
 -                      SYSCLK                                  : in std_logic; -- 100 MHz main clock net, synchronous to RX clock\r
 -                      RESET                                           : in std_logic; -- synchronous reset\r
 -                      CLEAR                                           : in std_logic; -- asynchronous reset\r
 -                      --Internal Connection TX\r
 -                      MED_DATA_IN                             : in std_logic_vector(c_DATA_WIDTH-1 downto 0);\r
 -                      MED_PACKET_NUM_IN               : in std_logic_vector(c_NUM_WIDTH-1 downto 0);\r
 -                      MED_DATAREADY_IN                : in std_logic;\r
 -                      MED_READ_OUT                    : out std_logic := '0';\r
 -                      --Internal Connection RX\r
 -                      MED_DATA_OUT                    : out std_logic_vector(c_DATA_WIDTH-1 downto 0) := (others => '0');\r
 -                      MED_PACKET_NUM_OUT      : out std_logic_vector(c_NUM_WIDTH-1 downto 0) := (others => '0');\r
 -                      MED_DATAREADY_OUT               : out std_logic := '0';\r
 -                      MED_READ_IN                             : in std_logic;\r
 -\r
 -                      --Copper SFP Connection\r
 -                      CU_RXD_P_IN                             : in std_logic;\r
 -                      CU_RXD_N_IN                             : in std_logic;\r
 -                      CU_TXD_P_OUT                    : out std_logic;\r
 -                      CU_TXD_N_OUT                    : out std_logic;\r
 -                      CU_PRSNT_N_IN                   : in std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)\r
 -                      CU_LOS_IN                               : in std_logic; -- SFP Loss Of Signal ('0' = OK, '1' = no signal)\r
 -                      CU_TXDIS_OUT                    : out std_logic := '0'; -- SFP disable\r
 -                      --Fiber/sync SFP Connection\r
 -                      SYNC_RX_HALF_CLK_OUT    : out std_logic := '0'; --received 100 MHz\r
 -                      SYNC_RX_FULL_CLK_OUT    : out std_logic := '0'; --received 200 MHz\r
 -                      SYNC_TX_HALF_CLK_OUT    : out std_logic := '0'; --received 100 MHz\r
 -                      SYNC_TX_FULL_CLK_OUT    : out std_logic := '0'; --received 200 MHz\r
 -                      SYNC_DLM_IN                             : in  std_logic;\r
 -                      SYNC_DLM_WORD_IN                : in  std_logic_vector(7 downto 0);\r
 -                      SYNC_DLM_OUT                    : out  std_logic;\r
 +
 +      subtype t_HUB_BIT                               is std_logic_vector(c_HUB_CHILDREN-1 downto 0);
 +      type            t_HUB_NUM                               is array(c_HUB_CHILDREN-1 downto 0) of std_logic_vector(c_NUM_WIDTH-1 downto 0);
 +      type            t_HUB_NIBL                              is array(c_HUB_CHILDREN-1 downto 0) of std_logic_vector(3 downto 0);
 +      type            t_HUB_BYTE                              is array(c_HUB_CHILDREN-1 downto 0) of std_logic_vector(7 downto 0);
 +      type            t_HUB_WORD                              is array(c_HUB_CHILDREN-1 downto 0) of std_logic_vector(15 downto 0);
 +      type            t_HUB_LWORD                             is array(c_HUB_CHILDREN-1 downto 0) of std_logic_vector(31 downto 0);
 +
 +      type            t_HUB_TIMER13                   is array(c_HUB_CHILDREN-1 downto 0) of std_logic_vector(12 downto 0);
 +      type            t_HUB_TIMER19                   is array(c_HUB_CHILDREN-1 downto 0) of std_logic_vector(18 downto 0);
 +      type            t_HUB_TIMER21                   is array(c_HUB_CHILDREN-1 downto 0) of std_logic_vector(20 downto 0);
 +
 +      type            t_PACKET_TYPE_SENT      is (c_NO_PACKET, c_CMD_PACKET, c_BST_PACKET);
 +      type            t_PACKET_TYPE_ARRAY     is array(c_HUB_CHILDREN-1 downto 0) of t_PACKET_TYPE_SENT;
 +      
 +      subtype t_HUB_BIT_ARRAY         is std_logic_vector(c_HUB_CHILDREN-1 downto 0);
 +      type            t_HUB_BYTE_ARRAY                is array(c_HUB_CHILDREN-1 downto 0) of std_logic_vector(7 downto 0);
 +      type            t_HUB_WORD_ARRAY                is array(c_HUB_CHILDREN-1 downto 0) of std_logic_vector(15 downto 0);
 +      type            t_HUB_LWORD_ARRAY               is array(c_HUB_CHILDREN-1 downto 0) of std_logic_vector(31 downto 0);
 +
 +      subtype t_QUAD_BIT                              is std_logic_vector(3 downto 0);
 +      type            t_QUAD_NIBL                             is array(3 downto 0) of std_logic_vector(3 downto 0);
 +      type            t_QUAD_BYTE                             is array(3 downto 0) of std_logic_vector(7 downto 0);
 +      type            t_QUAD_9WORD                    is array(3 downto 0) of std_logic_vector(8 downto 0);
 +      type            t_QUAD_WORD                             is array(3 downto 0) of std_logic_vector(15 downto 0);
 +      type            t_QUAD_LWORD                    is array(3 downto 0) of std_logic_vector(31 downto 0);
 +
 +      component soda_superburst_generator
 +              generic(
 +                      BURST_COUNT : integer range 1 to 64 := 16 -- number of bursts to be counted between super-bursts
 +              );
 +              port(
 +                      SODACLK                                                 : in    std_logic; -- fabric clock
 +                      RESET                                                           : in    std_logic; -- synchronous reset 
 +                      --Internal Connection
 +                      SODA_BURST_PULSE_IN                     : in    std_logic := '0';       -- 
 +                      START_OF_SUPERBURST_OUT         : out   std_logic := '0';
 +                      SUPER_BURST_NR_OUT                      : out   std_logic_vector(30 downto 0) := (others => '0');
 +                      SODA_CMD_WINDOW_OUT             : out   std_logic := '0'
 +                      );
 +      end component;
 +
 +      component soda_packet_builder
 +              port(
 +                      SODACLK                                         : in    std_logic; -- fabric clock
 +                      RESET                                                   : in    std_logic; -- synchronous reset
 +                      --Internal Connection
 +                      LINK_PHASE_IN                           : in    std_logic := '0';
 +                      SODA_CYCLE_IN                           : in    std_logic := '0';
 +                      SODA_CMD_STROBE_IN              : in    std_logic := '0';       -- 
 +                      START_OF_SUPERBURST             : in    std_logic := '0';
 +                      SUPER_BURST_NR_IN                       : in    std_logic_vector(30 downto 0) := (others => '0');
 +                      SODA_CMD_WORD_IN                        : in    std_logic_vector(30 downto 0) := (others => '0');               --REGIO_CTRL_REG in trbnet handler is 32 bit
 +                      EXPECTED_REPLY_OUT              : out   std_logic_vector(7 downto 0) := (others => '0');
 +                      TIME_CAL_OUT                            : out   std_logic := '0';       -- 
 +                      TX_DLM_PREVIEW_OUT              : out   std_logic := '0';       -- 
 +                      TX_DLM_OUT                                      : out   std_logic := '0';       -- 
 +                      TX_DLM_WORD_OUT                 : out   std_logic_vector(7 downto 0) := (others => '0')
 +              );
 +      end component;
 +
 +      component soda_packet_handler
 +              port(
 +                      SODACLK                                                 : in    std_logic; -- fabric clock
 +                      RESET                                                           : in    std_logic; -- synchronous reset
 +                      CLEAR                                                           : in    std_logic; -- asynchronous reset
 +                      CLK_EN                                                  : in    std_logic;
 +                      --Internal Connection
 +                      START_OF_SUPERBURST_OUT         : out std_logic := '0';
 +                      SUPER_BURST_NR_OUT                      : out std_logic_vector(30 downto 0) := (others => '0');
 +                      START_OF_CALIBRATION_OUT        : out std_logic := '0';
 +                      SODA_CMD_VALID_OUT                      : out std_logic := '0';
 +                      SODA_CMD_WORD_OUT                               : out std_logic_vector(30 downto 0) := (others => '0');
 +                      RX_DLM_IN                                               : in std_logic;
 +                      RX_DLM_WORD_IN                                  : in    std_logic_vector(7 downto 0) := (others => '0')
 +              );
 +      end component;
 +
 +      component soda_d8crc8           -- crc-calculator/checker
 +              port( 
 +                      CLOCK                           : in std_logic; 
 +                      RESET                           : in std_logic;
 +                      SOC_IN                  : in std_logic; 
 +                      DATA_IN                 : in std_logic_vector(7 downto 0); 
 +                      DATA_VALID_IN   : in std_logic; 
 +                      EOC_IN                  : in std_logic; 
 +                      CRC_OUT                 : out std_logic_vector(7 downto 0); 
 +                      CRC_VALID_OUT   : out std_logic 
 +              );
 +      end component;
 +      
 +      component soda_source   -- box containing soda_source components
 +              port(
 +                      SYSCLK                                  : in    std_logic; -- fabric clock
 +                      SODACLK                                 : in    std_logic; -- clock for data to serdes
 +                      RESET                                           : in    std_logic; -- synchronous reset
 +                      --Internal Connection
 +                      SODA_BURST_PULSE_IN     : in    std_logic := '0';       -- 
 +
 +                      RX_DLM_WORD_IN                  : in    std_logic_vector(7 downto 0) := (others => '0');
 +                      RX_DLM_IN                               : in std_logic;
 +                      TX_DLM_OUT                              : out   std_logic;
 +                      TX_DLM_WORD_OUT         : out   std_logic_vector(7 downto 0) := (others => '0');
 +                      TX_DLM_PREVIEW_OUT      : out   std_logic       := '0'; --PL!
 +                      LINK_PHASE_IN                   : in    std_logic       := '0'; --PL!
 +
 +
 +                      SODA_DATA_IN                    : in    std_logic_vector(31 downto 0) := (others => '0');
 +                      SODA_DATA_OUT                   : out   std_logic_vector(31 downto 0) := (others => '0');
 +                      SODA_ADDR_IN                    : in    std_logic_vector(3 downto 0) := (others => '0');
 +                      SODA_READ_IN                    : in    std_logic := '0';
 +                      SODA_WRITE_IN                   : in    std_logic := '0';
 +                      SODA_ACK_OUT                    : out   std_logic := '0';
 +                      LEDS_OUT                                : out std_logic_vector(3 downto 0)
 +                      );
 +      end component;
 +\r
 +      component soda_4source is
 +              port(
 +                      SYSCLK                                          : in    std_logic; -- fabric clock
 +                      SODACLK                                         : in    std_logic;
 +                      RESET                                                   : in    std_logic; -- synchronous reset
 +                      CLEAR                                                   : in    std_logic; -- asynchronous reset
 +                      CLK_EN                                          : in    std_logic; 
 +
 +                      SODA_BURST_PULSE_IN             : in    std_logic := '0';
 +                      SODA_CYCLE_IN                           : in    std_logic := '0';
 +              --      MULTIPLE DUPLEX DOWN-LINKS
 +                      RX_DLM_IN                                       : in    t_HUB_BIT;
 +                      RX_DLM_WORD_IN                          : in    t_HUB_BYTE;
 +                      TX_DLM_OUT                                      : out   t_HUB_BIT;
 +                      TX_DLM_WORD_OUT                 : out   t_HUB_BYTE;
 +                      TX_DLM_PREVIEW_OUT              : out   t_HUB_BIT;      --PL!
 +                      LINK_PHASE_IN                           : in    t_HUB_BIT;      --PL!
 +
 +                      SODA_DATA_IN                            : in    std_logic_vector(31 downto 0)   := (others => '0');
 +                      SODA_DATA_OUT                           : out   std_logic_vector(31 downto 0)   := (others => '0');
 +                      SODA_ADDR_IN                            : in    std_logic_vector(3 downto 0)    := (others => '0');
 +                      SODA_READ_IN                            : in    std_logic := '0';
 +                      SODA_WRITE_IN                           : in    std_logic := '0';
 +                      SODA_ACK_OUT                            : out   std_logic := '0';
 +                      LEDS_OUT                 : out std_logic_vector(3 downto 0);
 +                      LINK_DEBUG_IN                           : in    std_logic_vector(31 downto 0)   := (others => '0')
 +              );
 +      end component;
 +
 +      component soda_hub
 +      port(
 +              SYSCLK                                  : in    std_logic; -- fabric clock
 +              SODACLK                                 : in    std_logic; -- recovered clock
 +--            SODA_OUT_CLK                    : in    t_HUB_BIT; -- transmit clock
 +              RESET                                           : in    std_logic; -- synchronous reset
 +              CLEAR                                           : in    std_logic; -- asynchronous reset
 +              CLK_EN                                  : in    std_logic; 
 +
 +      --      SINGLE DUBPLEX UP-LINK TO THE TOP
 +              RXUP_DLM_IN                             : in    std_logic;
 +              RXUP_DLM_WORD_IN                : in    std_logic_vector(7 downto 0)    := (others => '0');
 +              TXUP_DLM_OUT                    : out   std_logic;
 +              TXUP_DLM_WORD_OUT               : out   std_logic_vector(7 downto 0)    := (others => '0');
 +              TXUP_DLM_PREVIEW_OUT    : out   std_logic       := '0'; --PL!
 +              UPLINK_PHASE_IN         : in    std_logic       := '0'; --PL!
 +
 +      --      MULTIPLE DUPLEX DOWN-LINKS TO THE BOTTOM
 +              RXDN_DLM_IN                             : in    t_HUB_BIT;
 +              RXDN_DLM_WORD_IN                : in    t_HUB_BYTE;
 +              TXDN_DLM_OUT                    : out   t_HUB_BIT;
 +              TXDN_DLM_WORD_OUT               : out   t_HUB_BYTE;
 +              TXDN_DLM_PREVIEW_OUT    : out   t_HUB_BIT;      --PL!
 +              DNLINK_PHASE_IN         : in    t_HUB_BIT;      --PL!
 +
 +              SODA_DATA_IN                    : in    std_logic_vector(31 downto 0)   := (others => '0');
 +              SODA_DATA_OUT                   : out   std_logic_vector(31 downto 0)   := (others => '0');
 +              SODA_ADDR_IN                    : in    std_logic_vector(3 downto 0)    := (others => '0');
 +              SODA_READ_IN                    : in    std_logic := '0';
 +              SODA_WRITE_IN                   : in    std_logic := '0';
 +              SODA_ACK_OUT                    : out   std_logic := '0';
 +              LEDS_OUT         : out std_logic_vector(3 downto 0);
 +              LINK_DEBUG_IN                   : in    std_logic_vector(31 downto 0)   := (others => '0')
 +      );
 +      end component;
 +
 +      component soda_client   -- box containing soda_source components
 +              port(
 +                      SYSCLK                                  : in    std_logic; -- fabric clock
 +                      SODACLK                                 : in    std_logic; -- recovered clock
 +                      RESET                                           : in    std_logic; -- synchronous reset
 +                      CLEAR                                           : in    std_logic; -- asynchronous reset
 +                      CLK_EN                                  : in    std_logic; 
 +                      --Internal Connection
 +                      RX_DLM_WORD_IN                  : in    std_logic_vector(7 downto 0) := (others => '0');
 +                      RX_DLM_IN                               : in std_logic;
 +                      TX_DLM_OUT                              : out   std_logic;
 +                      TX_DLM_WORD_OUT         : out   std_logic_vector(7 downto 0) := (others => '0');
 +                      TX_DLM_PREVIEW_OUT      : out   std_logic       := '0'; --PL!
 +                      LINK_PHASE_IN                   : in    std_logic       := '0'; --PL!
 +
 +                      SODA_DATA_IN                    : in    std_logic_vector(31 downto 0) := (others => '0');
 +                      SODA_DATA_OUT                   : out   std_logic_vector(31 downto 0) := (others => '0');
 +                      SODA_ADDR_IN                    : in    std_logic_vector(3 downto 0) := (others => '0');
 +                      SODA_READ_IN                    : in    std_logic := '0';
 +                      SODA_WRITE_IN                   : in    std_logic := '0';
 +                      SODA_ACK_OUT                    : out   std_logic := '0';
 +                      LEDS_OUT         : out std_logic_vector(3 downto 0);
 +                      LINK_DEBUG_IN                   : in    std_logic_vector(31 downto 0)   := (others => '0')
 +              );
 +      end component;
 +      
 +      component soda_reply_pkt_builder
 +              port(
 +                      SODACLK                                 : in    std_logic; -- fabric clock
 +                      RESET                                           : in    std_logic; -- synchronous reset
 +                      CLEAR                                           : in    std_logic; -- asynchronous reset
 +                      CLK_EN                                  : in    std_logic;
 +                      --Internal Connection
 +                      LINK_PHASE_IN                   : in    std_logic := '0';       --_vector(1 downto 0) := (others => '0');
 +                      START_OF_SUPERBURST     : in    std_logic := '0';
 +                      SUPER_BURST_NR_IN               : in    std_logic_vector(30 downto 0) := (others => '0');
 +                      SODA_CMD_STROBE_IN      : in    std_logic := '0';       -- 
 +                      SODA_CMD_WORD_IN                : in    std_logic_vector(30 downto 0) := (others => '0');               --REGIO_CTRL_REG in trbnet handler is 32 bit
 +                      TX_DLM_PREVIEW_OUT      : out   std_logic := '0';
 +                      TX_DLM_OUT                              : out   std_logic := '0';       -- 
 +                      TX_DLM_WORD_OUT         : out   std_logic_vector(7 downto 0) := (others => '0')
 +              );
 +      end component;
 +
 +      component soda_reply_handler
 +              port(
 +                      SODACLK                                         : in    std_logic; -- fabric clock
 +                      RESET                                                   : in    std_logic; -- synchronous reset
 +                      CLEAR                                                   : in    std_logic; -- asynchronous reset
 +                      CLK_EN                                          : in    std_logic;
 +                      --Internal Connection
 +              --      LAST_PACKET                                     : in    t_PACKET_TYPE_SENT      := c_NO_PACKET;
 +                      EXPECTED_REPLY_IN                       : in    std_logic_vector(7 downto 0) := (others => '0');
 +                      RX_DLM_IN                                       : in    std_logic       := '0';
 +                      RX_DLM_WORD_IN                          : in    std_logic_vector(7 downto 0) := (others => '0');
 +                      REPLY_VALID_OUT                 : out std_logic := '0';
 +                      REPLY_OK_OUT                            : out std_logic := '0'
 +              );
 +      end component;
 +
 +      component soda_calibration_timer
 +              port(
 +                      SODACLK                                         : in    std_logic; -- fabric clock
 +                      RESET                                                   : in    std_logic; -- synchronous reset
 +                      CLEAR                                                   : in    std_logic; -- asynchronous reset
 +                      CLK_EN                                          : in    std_logic; 
 +                      --Internal Connection
 +                      START_CALIBRATION                       : in    std_logic := '0';
 +                      END_CALIBRATION                 : in    std_logic := '0';
 +                      VALID_OUT                                       : out   std_logic := '0';       -- 
 +                      CALIB_TIME_OUT                          : out   std_logic_vector(15 downto 0) := (others => '0');
 +                      TIMEOUT_ERROR                           : out std_logic := '0'
 +              );
 +      end component;
 +
 +      component spi_flash_and_fpga_reload
 +              port(
 +                      CLK_IN : in std_logic;
 +                      RESET_IN : in std_logic;
 +
 +                      BUS_ADDR_IN                             : in std_logic_vector(8 downto 0);
 +                      BUS_READ_IN                             : in std_logic;
 +                      BUS_WRITE_IN                    : in std_logic;
 +                      BUS_DATAREADY_OUT               : out std_logic;
 +                      BUS_WRITE_ACK_OUT               : out std_logic;
 +                      BUS_UNKNOWN_ADDR_OUT    : out std_logic;
 +                      BUS_NO_MORE_DATA_OUT    : out std_logic;
 +                      BUS_DATA_IN                             : in std_logic_vector(31 downto 0);
 +                      BUS_DATA_OUT                    : out std_logic_vector(31 downto 0);
 +
 +                      DO_REBOOT_IN                    : in std_logic; 
 +                      PROGRAMN                                        : out std_logic;
 +
 +                      SPI_CS_OUT                              : out std_logic;
 +                      SPI_SCK_OUT                             : out std_logic;
 +                      SPI_SDO_OUT                             : out std_logic;
 +                      SPI_SDI_IN                              : in std_logic
 +              );
 +      end component;
 +
 +      component soda_start_of_burst_faker
 +              generic(
 +                      CLOCK_PERIOD    : natural range 1 to 20         := 5;           -- clock-period in ns
 +                      BURST_PERIOD    : natural range 1       to 2400 := 2400 -- burst-period in ns
 +                      );
 +              port(
 +                      SYSCLK                                  : in    std_logic; -- fabric clock
 +                      RESET                                           : in    std_logic; -- synchronous reset
 +                      SODA_BURST_PULSE_OUT    : out   std_logic := '0'
 +                      );
 +      end component;
 +\r
 +      component soda_start_of_burst_control is
 +              generic(
 +                      CLOCK_PERIOD                    : natural range 1 to 25 := cSODA_CLOCK_PERIOD;  -- clock-period in ns
 +                      CYCLE_PERIOD                    : natural range 5 to 50 := cSODA_CYCLE_PERIOD;  -- cycle-period in ns
 +                      BURST_PERIOD                    : natural                                       := cBURST_PERIOD                        -- burst-period in ns
 +                      );
 +              port(
 +                      SODA_CLK                                        : in    std_logic; -- fabric clock
 +                      RESET                                           : in    std_logic; -- synchronous reset
 +                      SODA_BURST_PULSE_OUT    : out   std_logic := '0';
 +                      SODA_40MHZ_CYCLE_OUT    : out   std_logic := '0'
 +                      );
 +      end component;
 +\r
 +      component posedge_to_pulse
 +              port (
 +                      IN_CLK                  : in std_logic;
 +                      OUT_CLK                 : in std_logic;
 +                      CLK_EN                  : in std_logic;
 +                      SIGNAL_IN               : in std_logic;
 +                      PULSE_OUT               : out std_logic
 +              );
 +      end component;
 +
 +      component med_ecp3_sfp_sync_down is
 +              generic(
 +                      SERDES_NUM                              : integer range 0 to 3 := 0;
 +                      IS_SYNC_SLAVE                   : integer := c_NO); --select slave mode
 +              port(
 +                      OSCCLK                                  : in std_logic; -- _internal_ 200 MHz reference clock
 +                      SYSCLK                                  : in std_logic; -- 100 MHz main clock net, synchronous to RX clock
 +                      RESET                                           : in std_logic; -- synchronous reset
 +                      CLEAR                                           : in std_logic; -- asynchronous reset
 +      --              PCSA_REFCLKP                    : in std_logic;                 -- external refclock straight into serdes
 +      --              PCSA_REFCLKN                    : in std_logic;                 -- external refclock straight into serdes
 +                      --Internal Connection TX
 +                      MED_DATA_IN                             : in std_logic_vector(c_DATA_WIDTH-1 downto 0);
 +                      MED_PACKET_NUM_IN               : in std_logic_vector(c_NUM_WIDTH-1 downto 0);
 +                      MED_DATAREADY_IN                : in std_logic;
 +                      MED_READ_OUT                    : out std_logic := '0';
 +                      --Internal Connection RX
 +                      MED_DATA_OUT                    : out std_logic_vector(c_DATA_WIDTH-1 downto 0) := (others => '0');
 +                      MED_PACKET_NUM_OUT      : out std_logic_vector(c_NUM_WIDTH-1 downto 0) := (others => '0');
 +                      MED_DATAREADY_OUT               : out std_logic := '0';
 +                      MED_READ_IN                             : in std_logic;
 +                      RX_HALF_CLK_OUT         : out std_logic := '0'; --received 100 MHz
 +                      RX_FULL_CLK_OUT         : out std_logic := '0'; --received 200 MHz
 +                      TX_HALF_CLK_OUT         : out std_logic := '0'; --received 100 MHz
 +                      TX_FULL_CLK_OUT         : out std_logic := '0'; --received 200 MHz
 +
 +                      --Sync operation
 +                      RX_DLM                                  : out std_logic := '0';
 +                      RX_DLM_WORD                             : out std_logic_vector(7 downto 0) := x"00";
 +                      TX_DLM                                  : in std_logic := '0';
 +                      TX_DLM_WORD                             : in std_logic_vector(7 downto 0) := x"00";
 +                      TX_DLM_PREVIEW_IN               : in std_logic := '0'; --PL!
 +                      LINK_PHASE_OUT                  : out std_logic := '0'; --PL!
 +
 +                      --SFP Connection
 +                      SD_RXD_P_IN                             : in    std_logic;
 +                      SD_RXD_N_IN                             : in    std_logic;
 +                      SD_TXD_P_OUT                    : out   std_logic;
 +                      SD_TXD_N_OUT                    : out   std_logic;
 +                      SD_REFCLK_P_IN                  : in    std_logic; --not used
 +                      SD_REFCLK_N_IN                  : in    std_logic; --not used
 +                      SD_PRSNT_N_IN                   : in    std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)
 +                      SD_LOS_IN                               : in    std_logic; -- SFP Loss Of Signal ('0' = OK, '1' = no signal)
 +                      SD_TXDIS_OUT                    : out   std_logic := '0'; -- SFP disable
 +                      --Control Interface
 +                      SCI_DATA_IN                             : in std_logic_vector(7 downto 0) := (others => '0');
 +                      SCI_DATA_OUT                    : out std_logic_vector(7 downto 0) := (others => '0');
 +                      SCI_ADDR                                        : in std_logic_vector(8 downto 0) := (others => '0');
 +                      SCI_READ                                        : in std_logic := '0';
 +                      SCI_WRITE                               : in std_logic := '0';
 +                      SCI_ACK                                 : out std_logic := '0';
 +                      SCI_NACK                                        : out std_logic := '0';
 +                      -- Status and control port
 +                      STAT_OP                                 : out std_logic_vector (15 downto 0);
 +                      CTRL_OP                                 : in std_logic_vector (15 downto 0) := (others => '0');
 +                      STAT_DEBUG                              : out std_logic_vector (63 downto 0);
 +                      CTRL_DEBUG                              : in std_logic_vector (63 downto 0) := (others => '0')
 +              );
 +      end component;
 +
 +      component med_ecp3_sfp_4_sync_down is
 +              generic(        SERDES_NUM : integer range 0 to 3 := 0;
 +                                      IS_SYNC_SLAVE : integer := c_NO); --select slave mode
 +              port(
 +                      OSC_CLK                                 : in std_logic; -- 200 MHz reference clock
 +                      TX_DATACLK                              : in std_logic; -- 200 MHz data clock
 +                      SYSCLK                                  : in std_logic; -- 100 MHz main clock net, synchronous to OSC clock
 +                      RESET                                           : in std_logic; -- synchronous reset
 +                      CLEAR                                           : in std_logic; -- asynchronous reset
 +                      ---------------------------------------------------------------------------------------------------------------------------------------------------------
 +                      LINK_DISABLE_IN         : in std_logic; -- downlinks must behave as slaves to uplink connection. Downlinks are released once unlink is established.
 +                      ---------------------------------------------------------------------------------------------------------------------------------------------------------
 +                      --Internal Connection TX
 +                      MED_DATA_IN                             : in t_HUB_WORD;        --std_logic_vector(c_QUAD_DATA_WIDTH-1 downto 0);
 +                      MED_PACKET_NUM_IN               : in    t_HUB_NUM;      --std_logic_vector(c_QUAD_NUM_WIDTH-1 downto 0);
 +                      MED_DATAREADY_IN                : in std_logic_vector(3 downto 0);
 +                      MED_READ_OUT                    : out std_logic_vector(3 downto 0) := (others => '0');
 +                      --Internal Connection RX
 +                      MED_DATA_OUT                    : out t_HUB_WORD;       -- std_logic_vector(4*c_DATA_WIDTH-1 downto 0)  := (others => '0');
 +                      MED_PACKET_NUM_OUT      : out t_HUB_NUM;        -- std_logic_vector(4*c_NUM_WIDTH-1 downto 0)   := (others => '0');
 +                      MED_DATAREADY_OUT               : out std_logic_vector(3 downto 0)                                                      := (others => '0');
 +                      MED_READ_IN                             : in std_logic_vector(3 downto 0);
 +                      RX_HALF_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --100 MHz
 +                      RX_FULL_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --200 MHz
 +                      TX_HALF_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --100 MHz
 +                      TX_FULL_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --200 MHz
 +
 +                      --Sync operation
 +                      RX_DLM                                  : out t_HUB_BIT;        --std_logic_vector(3 downto 0)                  := (others => '0');
 +                      RX_DLM_WORD                             : out   t_HUB_BYTE;     --std_logic_vector(4*8 - 1 downto 0)    := (others => '0');
 +                      TX_DLM                                  : in t_HUB_BIT; --std_logic_vector(3 downto 0)                  := (others => '0');
 +                      TX_DLM_WORD                             : in    t_HUB_BYTE;     --std_logic_vector(4*8 - 1 downto 0)    := (others => '0');
 +                      TX_DLM_PREVIEW_IN               : in    t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');     --PL!
 +                      LINK_PHASE_OUT                  : out   t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');     --PL!
 +
 +                      --SFP Connection
 +                      SD_RXD_P_IN                             : in    t_HUB_BIT;      --std_logic;
 +                      SD_RXD_N_IN                             : in    t_HUB_BIT;      --std_logic;
 +                      SD_TXD_P_OUT                    : out   t_HUB_BIT;      --std_logic;
 +                      SD_TXD_N_OUT                    : out   t_HUB_BIT;      --std_logic;
 +                      SD_REFCLK_P_IN                  : in    t_HUB_BIT;      --std_logic; --not used
 +                      SD_REFCLK_N_IN                  : in    t_HUB_BIT;      --std_logic; --not used
 +                      SD_PRSNT_N_IN                   : in    t_HUB_BIT;      --std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)
 +                      SD_LOS_IN                               : in    t_HUB_BIT;      --std_logic; -- SFP Loss Of Signal ('0' = OK, '1' = no signal)
 +                      SD_TXDIS_OUT                    : out   t_HUB_BIT;      --std_logic := '0'; -- SFP disable
 +                      --Control Interface
 +                      SCI_DATA_IN                             : in std_logic_vector(7 downto 0) := (others => '0');
 +                      SCI_DATA_OUT                    : out std_logic_vector(7 downto 0) := (others => '0');
 +                      SCI_ADDR                                        : in std_logic_vector(8 downto 0) := (others => '0');
 +                      SCI_READ                                        : in std_logic := '0';
 +                      SCI_WRITE                               : in std_logic := '0';
 +                      SCI_ACK                                 : out std_logic := '0';
 +                      SCI_NACK                                        : out std_logic := '0';
 +                      -- Status and control port
 +                      STAT_OP                                 : out   std_logic_vector (63 downto 0);
 +                      CTRL_OP                                 : in    std_logic_vector (63 downto 0) := (others => '0');
 +                      STAT_DEBUG                              : out std_logic_vector (63 downto 0);
 +                      CTRL_DEBUG                              : in std_logic_vector (63 downto 0) := (others => '0')
 +              );
 +      end component;
 +
-       component soda_only_ecp3_sfp_4_sync_down is
++      component med_ecp3_sfp_4_sync_down_EP is
 +              generic(        SERDES_NUM : integer range 0 to 3 := 0;
 +                                      IS_SYNC_SLAVE : integer := c_NO); --select slave mode
 +              port(
 +                      OSC_CLK                                 : in std_logic; -- 200 MHz reference clock
 +                      TX_DATACLK                              : in std_logic; -- 200 MHz data clock
 +                      SYSCLK                                  : in std_logic; -- 100 MHz main clock net, synchronous to OSC clock
 +                      RESET                                           : in std_logic; -- synchronous reset
 +                      CLEAR                                           : in std_logic; -- asynchronous reset
 +                      ---------------------------------------------------------------------------------------------------------------------------------------------------------
 +                      LINK_DISABLE_IN         : in std_logic; -- downlinks must behave as slaves to uplink connection. Downlinks are released once unlink is established.
 +                      ---------------------------------------------------------------------------------------------------------------------------------------------------------
-                       --Internal Connection TX
 +                      RX_HALF_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --100 MHz
 +                      RX_FULL_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --200 MHz
 +                      TX_HALF_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --100 MHz
 +                      TX_FULL_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --200 MHz
 +
 +                      --Sync operation
 +                      RX_DLM                                  : out t_HUB_BIT;        --std_logic_vector(3 downto 0)                  := (others => '0');
 +                      RX_DLM_WORD                             : out   t_HUB_BYTE;     --std_logic_vector(4*8 - 1 downto 0)    := (others => '0');
 +                      TX_DLM                                  : in t_HUB_BIT; --std_logic_vector(3 downto 0)                  := (others => '0');
 +                      TX_DLM_WORD                             : in    t_HUB_BYTE;     --std_logic_vector(4*8 - 1 downto 0)    := (others => '0');
 +                      TX_DLM_PREVIEW_IN               : in    t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');     --PL!
 +                      LINK_PHASE_OUT                  : out   t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');     --PL!
 +
 +                      --SFP Connection
 +                      SD_RXD_P_IN                             : in    t_HUB_BIT;      --std_logic;
 +                      SD_RXD_N_IN                             : in    t_HUB_BIT;      --std_logic;
 +                      SD_TXD_P_OUT                    : out   t_HUB_BIT;      --std_logic;
 +                      SD_TXD_N_OUT                    : out   t_HUB_BIT;      --std_logic;
 +                      SD_REFCLK_P_IN                  : in    t_HUB_BIT;      --std_logic; --not used
 +                      SD_REFCLK_N_IN                  : in    t_HUB_BIT;      --std_logic; --not used
 +                      SD_PRSNT_N_IN                   : in    t_HUB_BIT;      --std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)
 +                      SD_LOS_IN                               : in    t_HUB_BIT;      --std_logic; -- SFP Loss Of Signal ('0' = OK, '1' = no signal)
 +                      SD_TXDIS_OUT                    : out   t_HUB_BIT;      --std_logic := '0'; -- SFP disable
 +                      --Control Interface
 +                      SCI_DATA_IN                             : in std_logic_vector(7 downto 0) := (others => '0');
 +                      SCI_DATA_OUT                    : out std_logic_vector(7 downto 0) := (others => '0');
 +                      SCI_ADDR                                        : in std_logic_vector(8 downto 0) := (others => '0');
 +                      SCI_READ                                        : in std_logic := '0';
 +                      SCI_WRITE                               : in std_logic := '0';
 +                      SCI_ACK                                 : out std_logic := '0';
 +                      SCI_NACK                                        : out std_logic := '0'
 +              );
 +      end component;
\r
- --component med_ecp3_sfp_4_sync_down_EP is
-               --generic(      SERDES_NUM : integer range 0 to 3 := 0;
-                                       --IS_SYNC_SLAVE : integer := c_NO); --select slave mode
-               --port(
-                       --OSC_CLK                                       : in std_logic; -- 200 MHz reference clock
-                       --TX_DATACLK                            : in std_logic; -- 200 MHz data clock
-                       --SYSCLK                                        : in std_logic; -- 100 MHz main clock net, synchronous to OSC clock
-                       --RESET                                         : in std_logic; -- synchronous reset
-                       --CLEAR                                         : in std_logic; -- asynchronous reset
-                       -----------------------------------------------------------------------------------------------------------------------------------------------------------
-                       --LINK_DISABLE_IN               : in std_logic; -- downlinks must behave as slaves to uplink connection. Downlinks are released once unlink is established.
-                       -----------------------------------------------------------------------------------------------------------------------------------------------------------
-                       --RX_HALF_CLK_OUT               : out std_logic_vector(3 downto 0) := (others => '0'); --100 MHz
-                       --RX_FULL_CLK_OUT               : out std_logic_vector(3 downto 0) := (others => '0'); --200 MHz
-                       --TX_HALF_CLK_OUT               : out std_logic_vector(3 downto 0) := (others => '0'); --100 MHz
-                       --TX_FULL_CLK_OUT               : out std_logic_vector(3 downto 0) := (others => '0'); --200 MHz
-                       ----Sync operation
-                       --RX_DLM                                        : out t_HUB_BIT;        --std_logic_vector(3 downto 0)                  := (others => '0');
-                       --RX_DLM_WORD                           : out   t_HUB_BYTE;     --std_logic_vector(4*8 - 1 downto 0)    := (others => '0');
-                       --TX_DLM                                        : in t_HUB_BIT; --std_logic_vector(3 downto 0)                  := (others => '0');
-                       --TX_DLM_WORD                           : in    t_HUB_BYTE;     --std_logic_vector(4*8 - 1 downto 0)    := (others => '0');
-                       --TX_DLM_PREVIEW_IN             : in    t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');     --PL!
-                       --LINK_PHASE_OUT                        : out   t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');     --PL!
-                       ----SFP Connection
-                       --SD_RXD_P_IN                           : in    t_HUB_BIT;      --std_logic;
-                       --SD_RXD_N_IN                           : in    t_HUB_BIT;      --std_logic;
-                       --SD_TXD_P_OUT                  : out   t_HUB_BIT;      --std_logic;
-                       --SD_TXD_N_OUT                  : out   t_HUB_BIT;      --std_logic;
-                       --SD_REFCLK_P_IN                        : in    t_HUB_BIT;      --std_logic; --not used
-                       --SD_REFCLK_N_IN                        : in    t_HUB_BIT;      --std_logic; --not used
-                       --SD_PRSNT_N_IN                 : in    t_HUB_BIT;      --std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)
-                       --SD_LOS_IN                             : in    t_HUB_BIT;      --std_logic; -- SFP Loss Of Signal ('0' = OK, '1' = no signal)
-                       --SD_TXDIS_OUT                  : out   t_HUB_BIT;      --std_logic := '0'; -- SFP disable
-                       ----Control Interface
-                       --SCI_DATA_IN                           : in std_logic_vector(7 downto 0) := (others => '0');
-                       --SCI_DATA_OUT                  : out std_logic_vector(7 downto 0) := (others => '0');
-                       --SCI_ADDR                                      : in std_logic_vector(8 downto 0) := (others => '0');
-                       --SCI_READ                                      : in std_logic := '0';
-                       --SCI_WRITE                             : in std_logic := '0';
-                       --SCI_ACK                                       : out std_logic := '0';
-                       --SCI_NACK                                      : out std_logic := '0';
-                       ---- Status and control port
- ----                  STAT_OP                                 : out   t_HUB_WORD;     --std_logic_vector (15 downto 0);
- ----                  CTRL_OP                                 : in    t_HUB_WORD;     --std_logic_vector (15 downto 0) := (others => '0');
-                       --STAT_DEBUG                            : out std_logic_vector (63 downto 0);
-                       --CTRL_DEBUG                            : in std_logic_vector (63 downto 0) := (others => '0')
-               --);
-       --end component;
 +
 +      component med_ecp3_sfp_sync_up is
 +              generic(
 +                                      SERDES_NUM              : integer range 0 to 3 := 0;
 +                                      IS_SYNC_SLAVE   : integer := c_YES --select slave mode
 +                      );
 +              port(
 +                      OSCCLK                                  : in std_logic; -- 200 MHz reference clock
 +                      SYSCLK                                  : in std_logic; -- 100 MHz main clock net, synchronous to RX clock
 +                      RESET                                           : in std_logic; -- synchronous reset
 +                      CLEAR                                           : in std_logic; -- asynchronous reset
 +                      --Internal Connection TX
 +                      MED_DATA_IN                             : in std_logic_vector(c_DATA_WIDTH-1 downto 0);
 +                      MED_PACKET_NUM_IN               : in std_logic_vector(c_NUM_WIDTH-1 downto 0);
 +                      MED_DATAREADY_IN                : in std_logic;
 +                      MED_READ_OUT                    : out std_logic := '0';
 +                      --Internal Connection RX
 +                      MED_DATA_OUT                    : out std_logic_vector(c_DATA_WIDTH-1 downto 0) := (others => '0');
 +                      MED_PACKET_NUM_OUT      : out std_logic_vector(c_NUM_WIDTH-1 downto 0) := (others => '0');
 +                      MED_DATAREADY_OUT               : out std_logic := '0';
 +                      MED_READ_IN                             : in std_logic;
 +                      RX_HALF_CLK_OUT         : out std_logic := '0'; --received 100 MHz
 +                      RX_FULL_CLK_OUT         : out std_logic := '0'; --received 200 MHz
 +                      TX_HALF_CLK_OUT         : out std_logic := '0'; --pll 100 MHz
 +                      TX_FULL_CLK_OUT         : out std_logic := '0'; --pll 200 MHz
 +                      RX_CDR_LOL_OUT                  : out std_logic := '0'; -- CLOCK_DATA RECOVERY LOSS_OF_LOCK     !PL14082014
 +                      --Sync operation
 +                      RX_DLM                                  : out std_logic := '0';
 +                      RX_DLM_WORD                             : out std_logic_vector(7 downto 0) := x"00";
 +                      TX_DLM                                  : in std_logic := '0';
 +                      TX_DLM_WORD                             : in std_logic_vector(7 downto 0) := x"00";
 +                      TX_DLM_PREVIEW_IN               : in std_logic := '0'; --PL!
 +                      LINK_PHASE_OUT                  : out   std_logic := '0';       --PL!
 +                      LINK_READY_OUT                  : out   std_logic := '0';       --PL!
 +
 +                      --SFP Connection
 +                      SD_RXD_P_IN                             : in std_logic;
 +                      SD_RXD_N_IN                             : in std_logic;
 +                      SD_TXD_P_OUT                    : out std_logic;
 +                      SD_TXD_N_OUT                    : out std_logic;
 +                      SD_REFCLK_P_IN                  : in std_logic; --not used
 +                      SD_REFCLK_N_IN                  : in std_logic; --not used
 +                      SD_PRSNT_N_IN                   : in std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)
 +                      SD_LOS_IN                               : in std_logic; -- SFP Loss Of Signal ('0' = OK, '1' = no signal)
 +                      SD_TXDIS_OUT                    : out std_logic := '0'; -- SFP disable
 +                      --Control Interface
 +                      SCI_DATA_IN                             : in std_logic_vector(7 downto 0) := (others => '0');
 +                      SCI_DATA_OUT                    : out std_logic_vector(7 downto 0) := (others => '0');
 +                      SCI_ADDR                                        : in std_logic_vector(8 downto 0) := (others => '0');
 +                      SCI_READ                                        : in std_logic := '0';
 +                      SCI_WRITE                               : in std_logic := '0';
 +                      SCI_ACK                                 : out std_logic := '0';
 +                      SCI_NACK                                        : out std_logic := '0';
 +                      -- Status and control port
 +                      STAT_OP                                 : out std_logic_vector (15 downto 0);
 +                      CTRL_OP                                 : in std_logic_vector (15 downto 0) := (others => '0');
 +                      STAT_DEBUG                              : out std_logic_vector (63 downto 0);
 +                      CTRL_DEBUG                              : in std_logic_vector (63 downto 0) := (others => '0')
 +              );
 +      end component;
 +
 +      component soda_only_ecp3_sfp_sync_up
 +              generic(        SERDES_NUM                              : integer range 0 to 3 := 0;
 +                                      IS_SYNC_SLAVE                   : integer := c_YES); --select slave mode
 +              port(
 +                      OSCCLK                                  : in std_logic; -- 200 MHz reference clock
 +                      SYSCLK                                  : in std_logic; -- 100 MHz main clock net, synchronous to RX clock
 +                      RESET : in std_logic; -- synchronous reset
 +                      CLEAR : in std_logic; -- asynchronous reset
 +
 +                      RX_HALF_CLK_OUT : out std_logic := '0'; --received 100 MHz
 +                      RX_FULL_CLK_OUT : out std_logic := '0'; --received 200 MHz
 +                      TX_HALF_CLK_OUT : out std_logic := '0'; --received 100 MHz
 +                      TX_FULL_CLK_OUT : out std_logic := '0'; --received 200 MHz
 +                      RX_CDR_LOL_OUT                  : out std_logic := '0'; -- CLOCK_DATA RECOVERY LOSS_OF_LOCK     !PL14082014
 +
 +                      --Sync operation
 +                      RX_DLM : out std_logic := '0';
 +                      RX_DLM_WORD : out std_logic_vector(7 downto 0) := x"00";
 +                      TX_DLM : in std_logic := '0';
 +                      TX_DLM_WORD : in std_logic_vector(7 downto 0) := x"00";
 +                      TX_DLM_PREVIEW_IN               : in std_logic := '0'; --PL!
 +                      LINK_PHASE_OUT                  : out   std_logic := '0';       --PL!
 +                      LINK_READY_OUT                  : out   std_logic := '0';       --PL!
 +
 +                      --SFP Connection
 +                      SD_RXD_P_IN : in std_logic;
 +                      SD_RXD_N_IN : in std_logic;
 +                      SD_TXD_P_OUT : out std_logic;
 +                      SD_TXD_N_OUT : out std_logic;
 +                      SD_REFCLK_P_IN : in std_logic; --not used
 +                      SD_REFCLK_N_IN : in std_logic; --not used
 +                      SD_PRSNT_N_IN : in std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)
 +                      SD_LOS_IN : in std_logic; -- SFP Loss Of Signal ('0' = OK, '1' = no signal)
 +                      SD_TXDIS_OUT : out std_logic := '0'; -- SFP disable
 +                      --Control Interface
 +                      SCI_DATA_IN : in std_logic_vector(7 downto 0) := (others => '0');
 +                      SCI_DATA_OUT : out std_logic_vector(7 downto 0) := (others => '0');
 +                      SCI_ADDR : in std_logic_vector(8 downto 0) := (others => '0');
 +                      SCI_READ : in std_logic := '0';
 +                      SCI_WRITE : in std_logic := '0';
 +                      SCI_ACK : out std_logic := '0';
 +                      SCI_NACK : out std_logic := '0'
 +              );
 +      end component;
 +\r
 +      component med_ecp3_sfp_4_soda is
 +              generic(        SERDES_NUM : integer range 0 to 3 := 0;
 +                                      IS_SYNC_SLAVE : integer := c_NO); -- hub downlink is NO slave
 +              port(
 +                      OSC_CLK                                 : in std_logic; -- 200 MHz reference clock
 +                      TX_DATACLK                              : in std_logic; -- 200 MHz data clock
 +                      SYSCLK                                  : in std_logic; -- 100 MHz main clock net, synchronous to OSC clock
 +                      RESET                                           : in std_logic; -- synchronous reset
 +                      CLEAR                                           : in std_logic; -- asynchronous reset
 +                      ---------------------------------------------------------------------------------------------------------------------------------------------------------
 +--                    LINK_DISABLE_IN         : in std_logic; -- downlinks must behave as slaves to uplink connection. Downlinks are released once unlink is established.
 +                      ---------------------------------------------------------------------------------------------------------------------------------------------------------
 +                      RX_HALF_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --100 MHz
 +                      RX_FULL_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --200 MHz
 +                      TX_HALF_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --100 MHz
 +                      TX_FULL_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --200 MHz
 +
 +                      --Sync operation
 +                      RX_DLM_OUT                                      : out   t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');
 +                      RX_DLM_WORD_OUT                         : out   t_HUB_BYTE;     --std_logic_vector(4*8 - 1 downto 0)    := (others => '0');
 +                      TX_DLM_IN                                       : in    t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');
 +                      TX_DLM_WORD_IN                          : in    t_HUB_BYTE;     --std_logic_vector(4*8 - 1 downto 0)    := (others => '0');
 +                      TX_DLM_PREVIEW_IN               : in    t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');     --PL!
 +                      LINK_PHASE_OUT                  : out   t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');     --PL!
 +
 +                      --SFP Connection 
 +                      SD_RXD_P_IN                             : in    t_HUB_BIT;      --std_logic_vector(3 downto 0);
 +                      SD_RXD_N_IN                             : in    t_HUB_BIT;      --std_logic_vector(3 downto 0);
 +                      SD_TXD_P_OUT                    : out   t_HUB_BIT;      --std_logic_vector(3 downto 0);
 +                      SD_TXD_N_OUT                    : out   t_HUB_BIT;      --std_logic_vector(3 downto 0);
 +                      SD_REFCLK_P_IN                  : in    t_HUB_BIT;      --std_logic; --not used
 +                      SD_REFCLK_N_IN                  : in    t_HUB_BIT;      --std_logic; --not used
 +                      SD_PRSNT_N_IN                   : in    t_HUB_BIT;      --std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)
 +                      SD_LOS_IN                               : in    t_HUB_BIT;      --std_logic; -- SFP Loss Of Signal ('0' = OK, '1' = no signal)
 +                      SD_TXDIS_OUT                    : out   t_HUB_BIT;      --std_logic := '0'; -- SFP disable
 +                      --Control Interface
 +                      SCI_DATA_IN                             : in std_logic_vector(7 downto 0) := (others => '0');
 +                      SCI_DATA_OUT                    : out std_logic_vector(7 downto 0) := (others => '0');
 +                      SCI_ADDR                                        : in std_logic_vector(8 downto 0) := (others => '0');
 +                      SCI_READ                                        : in std_logic := '0';
 +                      SCI_WRITE                               : in std_logic := '0';
 +                      SCI_ACK                                 : out std_logic := '0';
 +                      SCI_NACK                                        : out std_logic := '0';
 +                      -- Status and control port
 +--                    STAT_OP                                 : out   t_HUB_WORD;     --std_logic_vector (15 downto 0);
 +--                    CTRL_OP                                 : in    t_HUB_WORD;     --std_logic_vector (15 downto 0) := (others => '0');
 +                      STAT_DEBUG                              : out std_logic_vector (63 downto 0);
 +                      CTRL_DEBUG                              : in std_logic_vector (63 downto 0) := (others => '0')
 +              );
 +      end component;
 +\r
 +      component Cu_trb_net16_soda_sync_ecp3_sfp
 +              port(
 +                      OSCCLK                                  : in std_logic; -- 200 MHz reference clock
 +                      SYSCLK                                  : in std_logic; -- 100 MHz main clock net, synchronous to RX clock
 +                      RESET                                           : in std_logic; -- synchronous reset
 +                      CLEAR                                           : in std_logic; -- asynchronous reset
 +                      --Internal Connection TX
 +                      MED_DATA_IN                             : in std_logic_vector(c_DATA_WIDTH-1 downto 0);
 +                      MED_PACKET_NUM_IN               : in std_logic_vector(c_NUM_WIDTH-1 downto 0);
 +                      MED_DATAREADY_IN                : in std_logic;
 +                      MED_READ_OUT                    : out std_logic := '0';
 +                      --Internal Connection RX
 +                      MED_DATA_OUT                    : out std_logic_vector(c_DATA_WIDTH-1 downto 0) := (others => '0');
 +                      MED_PACKET_NUM_OUT      : out std_logic_vector(c_NUM_WIDTH-1 downto 0) := (others => '0');
 +                      MED_DATAREADY_OUT               : out std_logic := '0';
 +                      MED_READ_IN                             : in std_logic;
 +
 +                      --Copper SFP Connection
 +                      CU_RXD_P_IN                             : in std_logic;
 +                      CU_RXD_N_IN                             : in std_logic;
 +                      CU_TXD_P_OUT                    : out std_logic;
 +                      CU_TXD_N_OUT                    : out std_logic;
 +                      CU_PRSNT_N_IN                   : in std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)
 +                      CU_LOS_IN                               : in std_logic; -- SFP Loss Of Signal ('0' = OK, '1' = no signal)
 +                      CU_TXDIS_OUT                    : out std_logic := '0'; -- SFP disable
 +                      --Fiber/sync SFP Connection
 +                      SYNC_RX_HALF_CLK_OUT    : out std_logic := '0'; --received 100 MHz
 +                      SYNC_RX_FULL_CLK_OUT    : out std_logic := '0'; --received 200 MHz
 +                      SYNC_TX_HALF_CLK_OUT    : out std_logic := '0'; --received 100 MHz
 +                      SYNC_TX_FULL_CLK_OUT    : out std_logic := '0'; --received 200 MHz
 +                      SYNC_DLM_IN                             : in  std_logic;
 +                      SYNC_DLM_WORD_IN                : in  std_logic_vector(7 downto 0);
 +                      SYNC_DLM_OUT                    : out  std_logic;
                        SYNC_DLM_WORD_OUT               : out  std_logic_vector(7 downto 0);\r
 -                      SYNC_RXD_P_IN                   : in std_logic;\r
 -                      SYNC_RXD_N_IN                   : in std_logic;\r
 -                      SYNC_TXD_P_OUT                  : out std_logic;\r
 -                      SYNC_TXD_N_OUT                  : out std_logic;\r
 -                      SYNC_PRSNT_N_IN         : in std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)\r
 -                      SYNC_LOS_IN                             : in std_logic; -- SFP Loss Of Signal ('0' = OK, '1' = no signal)\r
 -                      SYNC_TXDIS_OUT                  : out std_logic := '0'; -- SFP disable\r
 -                      --Control Interface\r
 -                      SCI_DATA_IN                             : in std_logic_vector(7 downto 0) := (others => '0');\r
 -                      SCI_DATA_OUT                    : out std_logic_vector(7 downto 0) := (others => '0');\r
 -                      SCI_ADDR                                        : in std_logic_vector(8 downto 0) := (others => '0');\r
 -                      SCI_READ                                        : in std_logic := '0';\r
 -                      SCI_WRITE                               : in std_logic := '0';\r
 -                      SCI_ACK                                 : out std_logic := '0';\r
 -                      SCI_NACK                                        : out std_logic := '0';\r
 -                      -- Status and control port\r
 -                      STAT_OP                                 : out std_logic_vector (15 downto 0);\r
 -                      CTRL_OP                                 : in std_logic_vector (15 downto 0) := (others => '0');\r
 -                      STAT_DEBUG                              : out std_logic_vector (63 downto 0);\r
 -                      CTRL_DEBUG                              : in std_logic_vector (63 downto 0) := (others => '0')\r
 -              );\r
 -      end component;\r
 -\r
 -      component soda_tx_control\r
 -              port(\r
 -                      CLK_200                                                         : in std_logic;\r
 -                      CLK_100                                                         : in std_logic;\r
 -                      RESET_IN                                                                : in std_logic;\r
 -\r
 -                      TX_DATA_IN                                                      : in std_logic_vector(15 downto 0);\r
 -                      TX_PACKET_NUMBER_IN                             : in std_logic_vector(2 downto 0);\r
 -                      TX_WRITE_IN                                                     : in std_logic;\r
 -                      TX_READ_OUT                                                     : out std_logic;\r
 -\r
 -                      TX_DATA_OUT                                                     : out std_logic_vector( 7 downto 0);\r
 -                      TX_K_OUT                                                                : out std_logic;\r
 -\r
 -                      REQUEST_RETRANSMIT_IN                   : in std_logic := '0';\r
 -                      REQUEST_POSITION_IN                             : in std_logic_vector( 7 downto 0) := (others => '0');\r
 -\r
 -                      START_RETRANSMIT_IN                             : in std_logic := '0';\r
 -                      START_POSITION_IN                                       : in std_logic_vector( 7 downto 0) := (others => '0');\r
 -                      --send_dlm: 200 MHz, 1 clock strobe, data valid until next DLM\r
 -                      TX_DLM_PREVIEW_IN                                       : in std_logic := '0';\r
 -                      SEND_DLM                                                                : in std_logic := '0';\r
 -                      SEND_DLM_WORD                                           : in std_logic_vector( 7 downto 0) := (others => '0');\r
 -\r
 -                      SEND_LINK_RESET_IN                              : in std_logic := '0';\r
 -                      TX_ALLOW_IN                                                     : in std_logic := '0';\r
 -                      RX_ALLOW_IN                                                     : in std_logic := '0';\r
 -                      LINK_PHASE_OUT                                          : out std_logic := '0';\r
 -\r
 -                      DEBUG_OUT                                                       : out std_logic_vector(31 downto 0);\r
 -                      STAT_REG_OUT                                            : out std_logic_vector(31 downto 0)\r
 -              );\r
 -              end component;\r
 -\r
 -      component soda_cmd_window_generator\r
 -              generic(                CLOCK_PERIOD                    : natural range 1 to 20 := cSODA_CLOCK_PERIOD;                          -- clock-period in ns\r
 -                                              COMMAND_WINDOS_SIZE     : natural range 1 to 65335 := cSODA_COMMAND_WINDOS_SIZE         -- command window size in ns \r
 -                                      );\r
 -              port(\r
 -                      SODACLK                                         : in    std_logic; -- fabric clock\r
 -                      RESET                                                   : in    std_logic; -- synchronous reset\r
 -                      START_OF_SUPERBURST_IN  : in    std_logic := '0';       -- \r
 -                      SODA_CMD_WINDOW_OUT             : out   std_logic := '0'\r
 -                      );\r
 +                      SYNC_RXD_P_IN                   : in std_logic;
 +                      SYNC_RXD_N_IN                   : in std_logic;
 +                      SYNC_TXD_P_OUT                  : out std_logic;
 +                      SYNC_TXD_N_OUT                  : out std_logic;
 +                      SYNC_PRSNT_N_IN         : in std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)
 +                      SYNC_LOS_IN                             : in std_logic; -- SFP Loss Of Signal ('0' = OK, '1' = no signal)
 +                      SYNC_TXDIS_OUT                  : out std_logic := '0'; -- SFP disable
 +                      --Control Interface
 +                      SCI_DATA_IN                             : in std_logic_vector(7 downto 0) := (others => '0');
 +                      SCI_DATA_OUT                    : out std_logic_vector(7 downto 0) := (others => '0');
 +                      SCI_ADDR                                        : in std_logic_vector(8 downto 0) := (others => '0');
 +                      SCI_READ                                        : in std_logic := '0';
 +                      SCI_WRITE                               : in std_logic := '0';
 +                      SCI_ACK                                 : out std_logic := '0';
 +                      SCI_NACK                                        : out std_logic := '0';
 +                      -- Status and control port
 +                      STAT_OP                                 : out std_logic_vector (15 downto 0);
 +                      CTRL_OP                                 : in std_logic_vector (15 downto 0) := (others => '0');
 +                      STAT_DEBUG                              : out std_logic_vector (63 downto 0);
 +                      CTRL_DEBUG                              : in std_logic_vector (63 downto 0) := (others => '0')
 +              );
        end component;\r
 -\r
 -      component soda_clockscaler is\r
 -              port(\r
 -                      CLK                                             : in    std_logic; -- fabric clock\r
 -                      RESET                                           : in    std_logic; -- synchronous reset\r
 +
 +      component soda_tx_control
 +              port(
 +                      CLK_200                                                         : in std_logic;
 +                      CLK_100                                                         : in std_logic;
 +                      RESET_IN                                                                : in std_logic;
 +
 +                      TX_DATA_IN                                                      : in std_logic_vector(15 downto 0);
 +                      TX_PACKET_NUMBER_IN                             : in std_logic_vector(2 downto 0);
 +                      TX_WRITE_IN                                                     : in std_logic;
 +                      TX_READ_OUT                                                     : out std_logic;
 +
 +                      TX_DATA_OUT                                                     : out std_logic_vector( 7 downto 0);
 +                      TX_K_OUT                                                                : out std_logic;
 +
 +                      REQUEST_RETRANSMIT_IN                   : in std_logic := '0';
 +                      REQUEST_POSITION_IN                             : in std_logic_vector( 7 downto 0) := (others => '0');
 +
 +                      START_RETRANSMIT_IN                             : in std_logic := '0';
 +                      START_POSITION_IN                                       : in std_logic_vector( 7 downto 0) := (others => '0');
 +                      --send_dlm: 200 MHz, 1 clock strobe, data valid until next DLM
 +                      TX_DLM_PREVIEW_IN                                       : in std_logic := '0';
 +                      SEND_DLM                                                                : in std_logic := '0';
 +                      SEND_DLM_WORD                                           : in std_logic_vector( 7 downto 0) := (others => '0');
 +
 +                      SEND_LINK_RESET_IN                              : in std_logic := '0';
 +                      TX_ALLOW_IN                                                     : in std_logic := '0';
 +                      RX_ALLOW_IN                                                     : in std_logic := '0';
 +                      LINK_PHASE_OUT                                          : out std_logic := '0';
 +
 +                      DEBUG_OUT                                                       : out std_logic_vector(31 downto 0);
 +                      STAT_REG_OUT                                            : out std_logic_vector(31 downto 0)
 +              );
 +              end component;
 +
 +      component soda_cmd_window_generator
 +              generic(                CLOCK_PERIOD                    : natural range 1 to 20 := cSODA_CLOCK_PERIOD;                          -- clock-period in ns
 +                                              COMMAND_WINDOS_SIZE     : natural range 1 to 65335 := cSODA_COMMAND_WINDOS_SIZE         -- command window size in ns 
 +                                      );
 +              port(
 +                      SODACLK                                         : in    std_logic; -- fabric clock
 +                      RESET                                                   : in    std_logic; -- synchronous reset
 +                      START_OF_SUPERBURST_IN  : in    std_logic := '0';       -- 
 +                      SODA_CMD_WINDOW_OUT             : out   std_logic := '0'
 +                      );
 +      end component;
 +\r
 +      component soda_clockscaler
 +              port(
 +                      CLK                                             : in    std_logic; -- fabric clock
 +                      RESET                                           : in    std_logic; -- synchronous reset
                        CLOCK_ENABLE_OUT                : out   std_logic := '0';\r
 -                      CLOCK_OUT                               : out   std_logic\r
 -                      );\r
 +                      CLOCK_OUT                               : out   std_logic
 +                      );
        end component;\r
  \r
 -      component DCS\r
 -              -- synthesis translate_off\r
 -              generic\r
 -                      (\r
 -                              DCSMODE : string :=“POS”\r
 -                      );\r
 -              -- synthesis translate_on\r
 -              port (\r
 -                      CLK0                                            : in std_logic ;\r
 -                      CLK1                                            : in std_logic ;\r
 -                      SEL                                             : in std_logic ;\r
 +component DCS\r                generic(DCSMODE : string :="POS");
 +              port (
 +                      CLK0                                            : in std_logic ;
 +                      CLK1                                            : in std_logic ;
 +                      SEL                                             : in std_logic ;
                        DCSOUT                                  : out std_logic\r
 -              );\r
 -      end component;\r
 +              );
 +      end component;
  \r
 -      component dff_re\r
 +      component dff_re
                Port (\r
 -                      rst                                             : in STD_LOGIC;\r
 -                      clk                                             : in STD_LOGIC;\r
 -                      enable                                  : in STD_LOGIC;\r
 -                      d                                                       : in STD_LOGIC_VECTOR;\r
 -                      q                                                       : out STD_LOGIC_VECTOR;\r
 -                      data_valid                              : out   STD_LOGIC\r
 -              );\r
 +                      rst                                             : in STD_LOGIC;
 +                      clk                                             : in STD_LOGIC;
 +                      enable                                  : in STD_LOGIC;
 +                      d                                                       : in STD_LOGIC_VECTOR;
 +                      q                                                       : out STD_LOGIC_VECTOR;
 +                      data_valid                              : out   STD_LOGIC
 +              );
        end component;\r
 -\r
 -end package;\r
 +
++      component soda_only_ecp3_sfp_4_sync_down is
++              generic(        SERDES_NUM : integer range 0 to 3 := 0;
++                                      IS_SYNC_SLAVE : integer := c_NO); --select slave mode
++              port(
++                      OSC_CLK                                 : in std_logic; -- 200 MHz reference clock
++                      TX_DATACLK                              : in std_logic; -- 200 MHz data clock
++                      SYSCLK                                  : in std_logic; -- 100 MHz main clock net, synchronous to OSC clock
++                      RESET                                           : in std_logic; -- synchronous reset
++                      CLEAR                                           : in std_logic; -- asynchronous reset
++                      ---------------------------------------------------------------------------------------------------------------------------------------------------------
++                      LINK_DISABLE_IN         : in std_logic; -- downlinks must behave as slaves to uplink connection. Downlinks are released once unlink is established.
++                      ---------------------------------------------------------------------------------------------------------------------------------------------------------
++                      RX_HALF_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --100 MHz
++                      RX_FULL_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --200 MHz
++                      TX_HALF_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --100 MHz
++                      TX_FULL_CLK_OUT         : out std_logic_vector(3 downto 0) := (others => '0'); --200 MHz
++
++                      --Sync operation
++                      RX_DLM                                  : out t_HUB_BIT;        --std_logic_vector(3 downto 0)                  := (others => '0');
++                      RX_DLM_WORD                             : out   t_HUB_BYTE;     --std_logic_vector(4*8 - 1 downto 0)    := (others => '0');
++                      TX_DLM                                  : in t_HUB_BIT; --std_logic_vector(3 downto 0)                  := (others => '0');
++                      TX_DLM_WORD                             : in    t_HUB_BYTE;     --std_logic_vector(4*8 - 1 downto 0)    := (others => '0');
++                      TX_DLM_PREVIEW_IN               : in    t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');     --PL!
++                      LINK_PHASE_OUT                  : out   t_HUB_BIT;      --std_logic_vector(3 downto 0)                  := (others => '0');     --PL!
++
++                      --SFP Connection
++                      SD_RXD_P_IN                             : in    t_HUB_BIT;      --std_logic;
++                      SD_RXD_N_IN                             : in    t_HUB_BIT;      --std_logic;
++                      SD_TXD_P_OUT                    : out   t_HUB_BIT;      --std_logic;
++                      SD_TXD_N_OUT                    : out   t_HUB_BIT;      --std_logic;
++                      SD_REFCLK_P_IN                  : in    t_HUB_BIT;      --std_logic; --not used
++                      SD_REFCLK_N_IN                  : in    t_HUB_BIT;      --std_logic; --not used
++                      SD_PRSNT_N_IN                   : in    t_HUB_BIT;      --std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)
++                      SD_LOS_IN                               : in    t_HUB_BIT;      --std_logic; -- SFP Loss Of Signal ('0' = OK, '1' = no signal)
++                      SD_TXDIS_OUT                    : out   t_HUB_BIT;      --std_logic := '0'; -- SFP disable
++                      --Control Interface
++                      SCI_DATA_IN                             : in std_logic_vector(7 downto 0) := (others => '0');
++                      SCI_DATA_OUT                    : out std_logic_vector(7 downto 0) := (others => '0');
++                      SCI_ADDR                                        : in std_logic_vector(8 downto 0) := (others => '0');
++                      SCI_READ                                        : in std_logic := '0';
++                      SCI_WRITE                               : in std_logic := '0';
++                      SCI_ACK                                 : out std_logic := '0';
++                      SCI_NACK                                        : out std_logic := '0'
++              );
++      end component;
++
 +end package;