--We use an ECP3
constant FPGA_TYPE : integer := 3; --3: ECP3, 5: ECP5
+-- Link speed
+ constant LINK_SPEED : integer := 200; -- 125: 1.25Gbps, 200: 2.00Gbps
+
--Gbe included?
constant INCLUDE_GBE : integer := c_NO;
# locate the PCS blocks
-LOCATE COMP "THE_MEDIA_INT_MIXED/THE_SERDES/PCSD_INST" SITE "PCSB" ;
-LOCATE COMP "THE_MEDIA_4_DOWN/THE_SERDES/PCSD_INST" SITE "PCSA" ;
+LOCATE COMP "THE_MEDIA_INT_MIXED/gen_SERDES.THE_SERDES/PCSD_INST" SITE "PCSB" ;
+LOCATE COMP "THE_MEDIA_4_DOWN/gen_SERDES.THE_SERDES/PCSD_INST" SITE "PCSA" ;
LOCATE COMP "gen_GBE.GBE/physical_impl_gen.physical/impl_gen.gbe_serdes/PCSD_INST" SITE "PCSD";
# locate the media interfaces inside fabric
LOCATE UGROUP "THE_MEDIA_4_DOWN/media_interface_group" REGION "MEDIA_RIGHT" ;
# read from SCI can be delayed due to long read strobe
-MULTICYCLE FROM ASIC THE_MEDIA_INT_MIXED/THE_SERDES/PCSD_INST PIN SCIRDATA* 15 ns;
+MULTICYCLE FROM ASIC THE_MEDIA_INT_MIXED/gen_SERDES.THE_SERDES/PCSD_INST PIN SCIRDATA* 15 ns;
# write strobe can be delayed due to A/D being stable after access
-MULTICYCLE TO ASIC THE_MEDIA_INT_MIXED/THE_SERDES/PCSD_INST PIN SCIWSTN 15 ns;
+MULTICYCLE TO ASIC THE_MEDIA_INT_MIXED/gen.SERDES.THE_SERDES/PCSD_INST PIN SCIWSTN 15 ns;
# read from SCI can be delayed due to long read strobe
-MULTICYCLE FROM ASIC THE_MEDIA_4_DOWN/THE_SERDES/PCSD_INST PIN SCIRDATA* 15 ns;
+MULTICYCLE FROM ASIC THE_MEDIA_4_DOWN/gen_SERDES.THE_SERDES/PCSD_INST PIN SCIRDATA* 15 ns;
# write strobe can be delayed due to A/D being stable after access
-MULTICYCLE TO ASIC THE_MEDIA_4_DOWN/THE_SERDES/PCSD_INST PIN SCIWSTN 15 ns;
+MULTICYCLE TO ASIC THE_MEDIA_4_DOWN/gen_SERDES.THE_SERDES/PCSD_INST PIN SCIWSTN 15 ns;
add_file -vhdl -lib work "../../trbnet/media_interfaces/sync/sci_reader_RS.vhd"
add_file -vhdl -lib work "../../trbnet/media_interfaces/sync/med_sync_control_RS.vhd"
-#add_file -vhdl -lib work "../../trbnet/media_interfaces/ecp3_sfp/serdes_sync_all_RS.vhd"
-#add_file -vhdl -lib work "../../trbnet/media_interfaces/med_ecp3_sfp_sync_all_RS.vhd"
-
+add_file -vhdl -lib work "../../trbnet/media_interfaces/med_ecp3_sfp_sync_all_RS.vhd"
add_file -vhdl -lib work "../../trbnet/media_interfaces/ecp3_sfp/serdes_sync_all_125M_RS.vhd"
-add_file -vhdl -lib work "../../trbnet/media_interfaces/med_ecp3_sfp_sync_all_125M_RS.vhd"
+add_file -vhdl -lib work "../../trbnet/media_interfaces/ecp3_sfp/serdes_sync_all_200M_RS.vhd"
#TrbNet Endpoint
add_file -vhdl -lib work "../../trbnet/trb_net16_term_buf.vhd"
signal send_rst_word_i : std_logic_vector(7 downto 0);
signal send_dlm_word_i : std_logic_vector(7 downto 0);
- signal init_quad : std_logic;
+ signal init_quad : std_logic;
+ signal link_clock : std_logic;
begin
-- Clock & Reset Handling
---------------------------------------------------------------------------
THE_CLOCK_RESET : entity work.clock_reset_handler
- port map(
+ port map(-- Link speed
INT_CLK_IN => CLK_CORE_PCLK,
EXT_CLK_IN => CLK_EXT_PLL_LEFT,
NET_CLK_FULL_IN => med2int(4).clk_full,
);
init_quad <= not GSR_N;
-
+
+ -- select link speed, wrong values are catched in media interface
+ link_clock <= CLK_SUPPL_PCLK when (LINK_SPEED = 125) else
+ clk_full_osc when (LINK_SPEED = 200) else
+ '0';
+
---------------------------------------------------------------------------
-- PCBSB: TrbNet Uplink
---------------------------------------------------------------------------
-THE_MEDIA_INT_MIXED : entity work.med_ecp3_sfp_sync_all_125M_RS
+THE_MEDIA_INT_MIXED : entity work.med_ecp3_sfp_sync_all_RS
generic map(
IS_MODE => (c_IS_UNUSED, c_IS_UNUSED, c_IS_UNUSED, c_IS_SLAVE)
)
port map(
-- Clocks and reset
- CLK_REF_FULL => CLK_SUPPL_PCLK,
+ CLK_REF_FULL => link_clock,
SYSCLK => clk_sys,
RESET => reset_i,
CLEAR => init_quad,
WORD_SYNC_OUT => word_sync_i,
MASTER_CLK_IN => master_clk_i,
MASTER_CLK_OUT => master_clk_i,
- QUAD_RST_IN => '0',
LINK_TX_NULL_IN => global_reset_i,
LINK_RX_NULL_OUT => global_reset_i,
TX_PLL_LOL_OUT => tx_pll_lol_qd_b_i,
THE_MAIN_TX_RST: main_tx_reset_RS
port map (
CLEAR => init_quad,
- CLK_REF => CLK_SUPPL_PCLK,
+ CLK_REF => link_clock,
TX_PLL_LOL_QD_A_IN => tx_pll_lol_qd_a_i,
TX_PLL_LOL_QD_B_IN => tx_pll_lol_qd_b_i,
TX_PLL_LOL_QD_C_IN => '0',
---------------------------------------------------------------------------
-- PCSA: TrbNet Downlink
---------------------------------------------------------------------------
-THE_MEDIA_4_DOWN : entity work.med_ecp3_sfp_sync_all_125M_RS
+THE_MEDIA_4_DOWN : entity work.med_ecp3_sfp_sync_all_RS
generic map(
IS_MODE => (c_IS_MASTER, c_IS_MASTER, c_IS_MASTER, c_IS_MASTER)
)
port map(
-- Clocks and reset
- CLK_REF_FULL => CLK_SUPPL_PCLK,
+ CLK_REF_FULL => link_clock,
SYSCLK => clk_sys,
RESET => reset_i,
CLEAR => init_quad,
WORD_SYNC_OUT => open,
MASTER_CLK_IN => master_clk_i,
MASTER_CLK_OUT => open,
- QUAD_RST_IN => '0',
LINK_TX_NULL_IN => global_reset_i,
LINK_RX_NULL_OUT => open,
TX_PLL_LOL_OUT => tx_pll_lol_qd_a_i,
use work.trb3_components.all;
use work.config.all;
--- REMARK: USE_RXCLOCK doesnt't make sense here, can be removed
-- REMARK: USE_EXTERNAL_CLOCK seems to be mandatory, can be simplified
entity clock_reset_handler is
BUS_RX : in CTRLBUS_RX; -- NOT USED
BUS_TX : out CTRLBUS_TX; -- NOT USED
- RESET_OUT : out std_logic;
- CLEAR_OUT : out std_logic;
- GSR_OUT : out std_logic;
+ RESET_OUT : out std_logic; -- active high
+ CLEAR_OUT : out std_logic; -- active high
+ GSR_OUT : out std_logic; -- active low
FULL_CLK_OUT : out std_logic; -- 200/240 MHz for FPGA fabric
SYS_CLK_OUT : out std_logic; -- 100/120 MHz for FPGA fabric
LED_RED_OUT(1) <= clock_select;
LED_GREEN_OUT(1) <= '0';
-GSR_OUT <= not pll_int_lock or clear_n_i; -- keeps everything in reset until a valid FPGA fabric clock is available
-
----------------------------------------------------------------------------
--- if RX clock is used, just forward what is provided, adjust internal as reference
----------------------------------------------------------------------------
-gen_recov_clock : if USE_RXCLOCK = c_YES generate
--- clk_selected_full <= NET_CLK_FULL_IN;
--- clk_selected_half <= NET_CLK_HALF_IN;
---
--- timer <= (others => '1');
---
--- gen_200rec : if USE_120_MHZ = c_NO generate
--- THE_INT_PLL : entity work.pll_in240_out200
--- port map(
--- CLK => INT_CLK_IN,
--- CLKOP => clk_int_full,
--- CLKOK => clk_int_half,
--- LOCK => pll_int_lock
--- );
--- clk_selected_ref <= clk_int_full;
--- end generate;
---
--- gen_240rec : if USE_120_MHZ = c_YES generate
--- clk_selected_ref <= INT_CLK_IN;
--- pll_int_lock <= '1';
--- end generate;
-end generate;
+GSR_OUT <= pll_int_lock and clear_n_i; -- keeps everything in reset until a valid FPGA fabric clock is available
---------------------------------------------------------------------------
-- No recovered clock
-- FPGA type
constant FPGA_TYPE : integer := 3; --3: ECP3, 5: ECP5
+-- Link speed
+ constant LINK_SPEED : integer := 200; -- 125: 1.25Gbps, 200: 2.00Gbps
+
--design options: backplane or front SFP, with or without GBE
- constant USE_BACKPLANE : integer := c_NO; --c_YES doesn't work
- constant USE_ADDON : integer := c_NO;
- constant USE_RJADAPT : integer := c_NO; --!!! Change pin-out file!
- constant INCLUDE_GBE : integer := c_YES; --c_NO doesn't work
+ constant USE_BACKPLANE : integer := c_NO; --c_YES doesn't work
+ constant USE_ADDON : integer := c_NO;
+ constant USE_RJADAPT : integer := c_NO; --!!! Change pin-out file!
+ constant INCLUDE_GBE : integer := c_YES; --c_NO doesn't work
--Runs with 120 MHz instead of 100 MHz
constant USE_120_MHZ : integer := c_NO;
constant CLOCK_FAST_SELECT : integer := c_YES; --fast clock select (135us) or slow (280ms)?
--Use sync mode, RX clock for all parts of the FPGA
- constant USE_RXCLOCK : integer := c_NO;
+ constant USE_RXCLOCK : integer := c_NO; -- DEPRECIATED
--Address settings
constant INIT_ADDRESS : std_logic_vector := x"F3C0";
# locate the PCS blocks
-LOCATE COMP "gen_PCSB.THE_MEDIA_PCSB/THE_SERDES/PCSD_INST" SITE "PCSB";
+LOCATE COMP "gen_PCSB.THE_MEDIA_PCSB/gen_SERDES.THE_SERDES/PCSD_INST" SITE "PCSB";
LOCATE COMP "GBE/physical_impl_gen.physical/impl_gen.gbe_serdes/PCSD_INST" SITE "PCSD";
# locate the media interfaces inside fabric
LOCATE UGROUP "gen_PCSB.THE_MEDIA_PCSB/media_interface_group" REGION "MEDIA_LEFT";
# read from SCI can be delayed due to long read strobe
-MULTICYCLE FROM ASIC gen_PCSB.THE_MEDIA_PCSB/THE_SERDES/PCSD_INST PIN SCIRDATA* 15 ns;
+MULTICYCLE FROM ASIC gen_PCSB.THE_MEDIA_PCSB/gen_SERDES.THE_SERDES/PCSD_INST PIN SCIRDATA* 15 ns;
# write strobe can be delayed due to A/D being stable after access
-MULTICYCLE TO ASIC gen_PCSB.THE_MEDIA_PCSB/THE_SERDES/PCSD_INST PIN SCIWSTN 15 ns;
+MULTICYCLE TO ASIC gen_PCSB.THE_MEDIA_PCSB/gen_SERDES.THE_SERDES/PCSD_INST PIN SCIWSTN 15 ns;
###################################################################################################################
###################################################################################################################
add_file -vhdl -lib work "../../trbnet/media_interfaces/sync/sci_reader_RS.vhd"
add_file -vhdl -lib work "../../trbnet/media_interfaces/sync/med_sync_control_RS.vhd"
-#add_file -vhdl -lib work "../../trbnet/media_interfaces/ecp3_sfp/serdes_sync_all_RS.vhd"
-#add_file -vhdl -lib work "../../trbnet/media_interfaces/med_ecp3_sfp_sync_all_RS.vhd"
-
+add_file -vhdl -lib work "../../trbnet/media_interfaces/med_ecp3_sfp_sync_all_RS.vhd"
add_file -vhdl -lib work "../../trbnet/media_interfaces/ecp3_sfp/serdes_sync_all_125M_RS.vhd"
-add_file -vhdl -lib work "../../trbnet/media_interfaces/med_ecp3_sfp_sync_all_125M_RS.vhd"
+add_file -vhdl -lib work "../../trbnet/media_interfaces/ecp3_sfp/serdes_sync_all_200M_RS.vhd"
#TrbNet Endpoint
add_file -vhdl -lib work "../../trbnet/trb_net16_term_buf.vhd"
signal slave_active_fake : std_logic;
signal send_reset_i : std_logic;
- signal init_quad : std_logic;
-
+ signal init_quad : std_logic;
+ signal link_clock : std_logic;
+
begin
THE_TIME_COUNTER_PROC: process( clk_full_osc )
init_quad <= not GSR_N;
+ -- select link speed, wrong values are catched in media interface
+ link_clock <= CLK_SUPPL_PCLK when (LINK_SPEED = 125) else
+ clk_full_osc when (LINK_SPEED = 200) else
+ '0';
+
-- Reset by GbE: a minimum delay of 1us is kept before the reset
-- pulse is injected into the reset handler.
PROC_MAKE_RESET : process
-- PCSB: Downlink without backplane is SFP
---------------------------------------------------------------------------
gen_PCSB : if USE_BACKPLANE = c_NO and USE_ADDON = c_NO generate
- THE_MEDIA_PCSB : entity med_ecp3_sfp_sync_all_125M_RS
+ THE_MEDIA_PCSB : entity med_ecp3_sfp_sync_all_RS
generic map(
IS_MODE => (c_IS_UNUSED, c_IS_UNUSED, c_IS_UNUSED, c_IS_MASTER)
)
port map(
-- Clocks and reset
- CLK_REF_FULL => CLK_SUPPL_PCLK,
+ CLK_REF_FULL => link_clock,
SYSCLK => clk_sys,
CLEAR => init_quad,
RESET => reset_i,
WORD_SYNC_OUT => word_sync_i,
MASTER_CLK_IN => master_clk_i,
MASTER_CLK_OUT => open,
- QUAD_RST_IN => '0',
LINK_TX_NULL_IN => send_reset_i,
LINK_RX_NULL_OUT => open,
TX_PLL_LOL_OUT => tx_pll_lol_qd_b_i,
DEBUG_OUT => debug_i
);
- master_clk_i <= CLK_SUPPL_PCLK;
+ master_clk_i <= link_clock;
THE_MAIN_TX_RST: main_tx_reset_RS
port map (
CLEAR => init_quad,
- CLK_REF => CLK_SUPPL_PCLK,
+ CLK_REF => link_clock,
TX_PLL_LOL_QD_A_IN => '0',
TX_PLL_LOL_QD_B_IN => tx_pll_lol_qd_b_i,
TX_PLL_LOL_QD_C_IN => '0',
-- just for testing
enable_dlm_i <= test_reg(31);
+ tx_dlm_i <= dlm_send_qq;
+ send_dlm_word_i <= std_logic_vector(dlm_tag_ctr);
send_rst_i <= test_reg(30);
- destroy_link_i <= test_reg(24);
- send_dlm_word_i <= std_logic_vector(dlm_tag_ctr); --test_reg(15 downto 8);
send_rst_word_i <= test_reg(15 downto 8);
- wap_requested_i <= test_reg(3 downto 0);
+ destroy_link_i <= test_reg(24); -- ONLY FOR TESTING
+ wap_requested_i <= test_reg(3 downto 0); -- ONLY FOR TESTING
- tx_dlm_i <= dlm_send_qq;
-
-- LED feedback
LED_WHITE(1) <= not std_logic(dlm_tag_ctr(7));
LED_WHITE(0) <= not send_rst_word_i(0);
+ -- DO NOT MESS WITH TIMING HERE!
-- DLM timing generator
THE_DLM_SEND_PROC: process( master_clk_i )
begin
constant INCLUDE_GBE : integer := c_NO;
--We want an ECP3
- constant FPGA_TYPE : integer := 3; --3: ECP3, 5: ECP5
+ constant FPGA_TYPE : integer := 3; --3: ECP3, 5: ECP5
+
+-- Link speed
+ constant LINK_SPEED : integer := 125; -- 125: 1.25Gbps, 200: 2.00Gbps
--Runs with 120 MHz instead of 100 MHz
constant USE_120_MHZ : integer := c_NO;
constant CLOCK_FAST_SELECT : integer := c_NO; --fast clock select (135us) or slow (280ms)?
--Use sync mode, RX clock for all parts of the FPGA
- constant USE_RXCLOCK : integer := c_NO;
+ constant USE_RXCLOCK : integer := c_NO; -- DEPRECIATED
--Address settings
constant INIT_ADDRESS : std_logic_vector := x"F3CD";
# locate the PCS blocks
-LOCATE COMP "gen_PCSA.THE_MEDIA_PCSA/THE_SERDES/PCSD_INST" SITE "PCSA";
-LOCATE COMP "gen_PCSB_BKPL.THE_MEDIA_4_PCSB/THE_SERDES/PCSD_INST" SITE "PCSB";
-LOCATE COMP "gen_PCSB_noBKPL.THE_MEDIA_4_PCSB/THE_SERDES/PCSD_INST" SITE "PCSB";
-LOCATE COMP "THE_MEDIA_4_PCSC/THE_SERDES/PCSD_INST" SITE "PCSC";
-LOCATE COMP "gen_PCSD.THE_MEDIA_4_PCSD/THE_SERDES/PCSD_INST" SITE "PCSD";
+LOCATE COMP "gen_PCSA.THE_MEDIA_PCSA/gen_SERDES.THE_SERDES/PCSD_INST" SITE "PCSA";
+LOCATE COMP "gen_PCSB_BKPL.THE_MEDIA_4_PCSB/gen_SERDES.THE_SERDES/PCSD_INST" SITE "PCSB";
+LOCATE COMP "gen_PCSB_noBKPL.THE_MEDIA_4_PCSB/gen_SERDES.THE_SERDES/PCSD_INST" SITE "PCSB";
+LOCATE COMP "THE_MEDIA_4_PCSC/THE_SERDES/gen_SERDES.PCSD_INST" SITE "PCSC";
+LOCATE COMP "gen_PCSD.THE_MEDIA_4_PCSD/gen_SERDES.THE_SERDES/PCSD_INST" SITE "PCSD";
LOCATE COMP "gen_GBE.GBE/physical_impl_gen.physical/impl_gen.gbe_serdes/PCSD_INST" SITE "PCSD";
# locate the media interfaces inside fabric
# read from SCI can be delayed due to long read strobe
# write strobe can be delayed due to A/D being stable after access
-MULTICYCLE FROM ASIC gen_PCSA.THE_MEDIA_PCSA/THE_SERDES/PCSD_INST PIN SCIRDATA* 15 ns;
-MULTICYCLE TO ASIC gen_PCSA.THE_MEDIA_PCSA/THE_SERDES/PCSD_INST PIN SCIWSTN 15 ns;
-MULTICYCLE FROM ASIC gen_PCSB_BKPL.THE_MEDIA_4_PCSB/THE_SERDES/PCSD_INST PIN SCIRDATA* 15 ns;
-MULTICYCLE TO ASIC gen_PCSB_BKPL.THE_MEDIA_4_PCSB/THE_SERDES/PCSD_INST PIN SCIWSTN 15 ns;
-MULTICYCLE FROM ASIC gen_PCSB_noBKPL.THE_MEDIA_4_PCSB/THE_SERDES/PCSD_INST PIN SCIRDATA* 15 ns;
-MULTICYCLE TO ASIC gen_PCSB_noBKPL.THE_MEDIA_4_PCSB/THE_SERDES/PCSD_INST PIN SCIWSTN 15 ns;
-MULTICYCLE FROM ASIC THE_MEDIA_4_PCSC/THE_SERDES/PCSD_INST PIN SCIRDATA* 15 ns;
-MULTICYCLE TO ASIC THE_MEDIA_4_PCSC/THE_SERDES/PCSD_INST PIN SCIWSTN 15 ns;
-MULTICYCLE FROM ASIC gen_PCSD.THE_MEDIA_4_PCSD/THE_SERDES/PCSD_INST PIN SCIRDATA* 15 ns;
-MULTICYCLE TO ASIC gen_PCSD.THE_MEDIA_4_PCSD/THE_SERDES/PCSD_INST PIN SCIWSTN 15 ns;
-
-
-# SCI write signal problem...
-#BLOCK NET gen_PCSB.THE_MEDIA_PCSB/sci_write_i;
-#BLOCK INTERCLOCKDOMAIN PATHS;
+MULTICYCLE FROM ASIC gen_PCSA.THE_MEDIA_PCSA/gen_SERDES.THE_SERDES/PCSD_INST PIN SCIRDATA* 15 ns;
+MULTICYCLE TO ASIC gen_PCSA.THE_MEDIA_PCSA/gen_SERDES.THE_SERDES/PCSD_INST PIN SCIWSTN 15 ns;
+MULTICYCLE FROM ASIC gen_PCSB_BKPL.THE_MEDIA_4_PCSB/gen_SERDES.THE_SERDES/PCSD_INST PIN SCIRDATA* 15 ns;
+MULTICYCLE TO ASIC gen_PCSB_BKPL.THE_MEDIA_4_PCSB/gen_SERDES.THE_SERDES/PCSD_INST PIN SCIWSTN 15 ns;
+MULTICYCLE FROM ASIC gen_PCSB_noBKPL.THE_MEDIA_4_PCSB/gen_SERDES.THE_SERDES/PCSD_INST PIN SCIRDATA* 15 ns;
+MULTICYCLE TO ASIC gen_PCSB_noBKPL.THE_MEDIA_4_PCSB/gen_SERDES.THE_SERDES/PCSD_INST PIN SCIWSTN 15 ns;
+MULTICYCLE FROM ASIC THE_MEDIA_4_PCSC/THE_SERDES/gen_SERDES.PCSD_INST PIN SCIRDATA* 15 ns;
+MULTICYCLE TO ASIC THE_MEDIA_4_PCSC/THE_SERDES/gen_SERDES.PCSD_INST PIN SCIWSTN 15 ns;
+MULTICYCLE FROM ASIC gen_PCSD.THE_MEDIA_4_PCSD/gen_SERDES.THE_SERDES/PCSD_INST PIN SCIRDATA* 15 ns;
+MULTICYCLE TO ASIC gen_PCSD.THE_MEDIA_4_PCSD/gen_SERDES.THE_SERDES/PCSD_INST PIN SCIWSTN 15 ns;
################################
add_file -vhdl -lib work "../../trbnet/media_interfaces/sync/sci_reader_RS.vhd"
add_file -vhdl -lib work "../../trbnet/media_interfaces/sync/med_sync_control_RS.vhd"
-#add_file -vhdl -lib work "../../trbnet/media_interfaces/ecp3_sfp/serdes_sync_all_RS.vhd"
-#add_file -vhdl -lib work "../../trbnet/media_interfaces/med_ecp3_sfp_sync_all_RS.vhd"
-
+add_file -vhdl -lib work "../../trbnet/media_interfaces/med_ecp3_sfp_sync_all_RS.vhd"
add_file -vhdl -lib work "../../trbnet/media_interfaces/ecp3_sfp/serdes_sync_all_125M_RS.vhd"
-add_file -vhdl -lib work "../../trbnet/media_interfaces/med_ecp3_sfp_sync_all_125M_RS.vhd"
+add_file -vhdl -lib work "../../trbnet/media_interfaces/ecp3_sfp/serdes_sync_all_200M_RS.vhd"
#TrbNet Endpoint
add_file -vhdl -lib work "../../trbnet/trb_net16_term_buf.vhd"
signal send_rst_word_i : std_logic_vector(7 downto 0);
signal send_dlm_word_i : std_logic_vector(7 downto 0);
- signal init_quad : std_logic;
+ signal init_quad : std_logic;
+ signal link_clock : std_logic;
begin
---------------------------------------------------------------------------
);
init_quad <= not GSR_N;
-
+
+ -- select link speed, wrong values are catched in media interface
+ link_clock <= CLK_SUPPL_PCLK when (LINK_SPEED = 125) else
+ clk_full_osc when (LINK_SPEED = 200) else
+ '0';
+
---------------------------------------------------------------------------
-- PCSA: Uplink when backplane is used
---------------------------------------------------------------------------
gen_PCSA : if USE_BACKPLANE = c_YES generate
- THE_MEDIA_PCSA : entity work.med_ecp3_sfp_sync_all_125M_RS
+ THE_MEDIA_PCSA : entity work.med_ecp3_sfp_sync_all_RS
generic map(
IS_MODE => (c_IS_SLAVE, c_IS_UNUSED, c_IS_UNUSED, c_IS_UNUSED)
)
WORD_SYNC_OUT => word_sync_i,
MASTER_CLK_IN => master_clk_i,
MASTER_CLK_OUT => master_clk_i,
- QUAD_RST_IN => '0',
LINK_TX_NULL_IN => global_reset_i,
LINK_RX_NULL_OUT => global_reset_i,
TX_PLL_LOL_OUT => tx_pll_lol_qd_a_i,
-- PCSB: TrbNet downlinks (backplane)
---------------------------------------------------------------------------
gen_PCSB_BKPL : if USE_BACKPLANE = c_YES generate
- THE_MEDIA_4_PCSB : entity work.med_ecp3_sfp_sync_all_125M_RS
+ THE_MEDIA_4_PCSB : entity work.med_ecp3_sfp_sync_all_RS
generic map(
IS_MODE => (c_IS_MASTER, c_IS_MASTER, c_IS_MASTER, c_IS_MASTER)
)
port map(
-- Clocks and reset
- CLK_REF_FULL => CLK_SUPPL_PCLK,
+ CLK_REF_FULL => link_clock,
SYSCLK => clk_sys,
RESET => reset_i,
CLEAR => init_quad,
WORD_SYNC_OUT => open,
MASTER_CLK_IN => master_clk_i,
MASTER_CLK_OUT => open,
- QUAD_RST_IN => '0',
LINK_TX_NULL_IN => global_reset_i,
LINK_RX_NULL_OUT => open,
TX_PLL_LOL_OUT => tx_pll_lol_qd_b_i,
-- PCSB: TrbNet one uplink and three downlinks (no backplane)
---------------------------------------------------------------------------
gen_PCSB_noBKPL : if USE_BACKPLANE = c_NO generate
- THE_MEDIA_4_PCSB : entity work.med_ecp3_sfp_sync_all_125M_RS
+ THE_MEDIA_4_PCSB : entity work.med_ecp3_sfp_sync_all_RS
generic map(
IS_MODE => (c_IS_MASTER, c_IS_MASTER, c_IS_MASTER, c_IS_SLAVE)
)
port map(
-- Clocks and reset
- CLK_REF_FULL => CLK_SUPPL_PCLK,
+ CLK_REF_FULL => link_clock,
SYSCLK => clk_sys,
RESET => reset_i,
CLEAR => init_quad,
WORD_SYNC_OUT => word_sync_i,
MASTER_CLK_IN => master_clk_i,
MASTER_CLK_OUT => master_clk_i,
- QUAD_RST_IN => '0',
LINK_TX_NULL_IN => global_reset_i,
LINK_RX_NULL_OUT => global_reset_i,
TX_PLL_LOL_OUT => tx_pll_lol_qd_b_i,
THE_MAIN_TX_RST: main_tx_reset_RS
port map (
CLEAR => init_quad,
- CLK_REF => CLK_SUPPL_PCLK,
+ CLK_REF => link_clock,
TX_PLL_LOL_QD_A_IN => tx_pll_lol_qd_a_i,
TX_PLL_LOL_QD_B_IN => tx_pll_lol_qd_b_i,
TX_PLL_LOL_QD_C_IN => tx_pll_lol_qd_c_i,
---------------------------------------------------------------------------
-- PCSC: 4 downlinks
---------------------------------------------------------------------------
- THE_MEDIA_4_PCSC : entity work.med_ecp3_sfp_sync_all_125M_RS
+ THE_MEDIA_4_PCSC : entity work.med_ecp3_sfp_sync_all_RS
generic map(
IS_MODE => (c_IS_MASTER, c_IS_MASTER, c_IS_MASTER, c_IS_MASTER)
)
port map(
-- Clocks and reset
- CLK_REF_FULL => CLK_SUPPL_PCLK,
+ CLK_REF_FULL => link_clock,
SYSCLK => clk_sys,
RESET => reset_i,
CLEAR => init_quad,
WORD_SYNC_OUT => open,
MASTER_CLK_IN => master_clk_i,
MASTER_CLK_OUT => open,
- QUAD_RST_IN => '0',
LINK_TX_NULL_IN => global_reset_i,
LINK_RX_NULL_OUT => open,
TX_PLL_LOL_OUT => tx_pll_lol_qd_c_i,
-- PCSD: 2 downlinks (no GbE)
---------------------------------------------------------------------------
gen_PCSD : if INCLUDE_GBE = c_NO generate
- THE_MEDIA_4_PCSD : entity work.med_ecp3_sfp_sync_all_125M_RS
+ THE_MEDIA_4_PCSD : entity work.med_ecp3_sfp_sync_all_RS
generic map(
IS_MODE => (c_IS_MASTER, c_IS_MASTER, c_IS_UNUSED, c_IS_UNUSED)
)
port map(
-- Clocks and reset
- CLK_REF_FULL => CLK_SUPPL_PCLK,
+ CLK_REF_FULL => link_clock,
SYSCLK => clk_sys,
RESET => reset_i,
CLEAR => init_quad,
WORD_SYNC_OUT => open,
MASTER_CLK_IN => master_clk_i,
MASTER_CLK_OUT => open,
- QUAD_RST_IN => '0',
LINK_TX_NULL_IN => global_reset_i,
LINK_RX_NULL_OUT => open,
TX_PLL_LOL_OUT => tx_pll_lol_qd_d_i,
--Begin of design configuration
------------------------------------------------------------------------------
+-- FPGA type
constant FPGA_TYPE : integer := 3; --3: ECP3, 5: ECP5
-
- constant USE_RETRANSMISSION : integer := c_NO;
+
+-- Link speed
+ constant LINK_SPEED : integer := 200; -- 125: 1.25Gbps, 200: 2.00Gbps
--pinout to be used - don't forget to change config_compile.pl as well
-- 0: 32 Pin AddOn
# locate the PCS blocks
-LOCATE COMP "THE_MEDIA_INTERFACE/THE_SERDES/PCSD_INST" SITE "PCSB";
+LOCATE COMP "THE_MEDIA_INTERFACE/gen_SERDES.THE_SERDES/PCSD_INST" SITE "PCSB";
# locate the media interfaces inside fabric
REGION "MEDIA_LEFT" "R102C17D" 13 75; # LEFT is for PCSD/PCSB
# read from SCI can be delayed due to long read strobe
# write strobe can be delayed due to A/D being stable after access
-MULTICYCLE FROM ASIC THE_MEDIA_INTERFACE/THE_SERDES/PCSD_INST PIN SCIRDATA* 15 ns;
-MULTICYCLE TO ASIC THE_MEDIA_INTERFACE/THE_SERDES/PCSD_INST PIN SCIWSTN 15 ns;
+MULTICYCLE FROM ASIC THE_MEDIA_INTERFACE/gen_SERDES.THE_SERDES/PCSD_INST PIN SCIRDATA* 15 ns;
+MULTICYCLE TO ASIC THE_MEDIA_INTERFACE/gen_SERDES.THE_SERDES/PCSD_INST PIN SCIWSTN 15 ns;
add_file -vhdl -lib work "../../trbnet/media_interfaces/sync/sci_reader_RS.vhd"
add_file -vhdl -lib work "../../trbnet/media_interfaces/sync/med_sync_control_RS.vhd"
-#add_file -vhdl -lib work "../../trbnet/media_interfaces/ecp3_sfp/serdes_sync_all_RS.vhd"
-#add_file -vhdl -lib work "../../trbnet/media_interfaces/med_ecp3_sfp_sync_all_RS.vhd"
-
+add_file -vhdl -lib work "../../trbnet/media_interfaces/med_ecp3_sfp_sync_all_RS.vhd"
add_file -vhdl -lib work "../../trbnet/media_interfaces/ecp3_sfp/serdes_sync_all_125M_RS.vhd"
-add_file -vhdl -lib work "../../trbnet/media_interfaces/med_ecp3_sfp_sync_all_125M_RS.vhd"
+add_file -vhdl -lib work "../../trbnet/media_interfaces/ecp3_sfp/serdes_sync_all_200M_RS.vhd"
#TrbNet Endpoint
add_file -vhdl -lib work "../../trbnet/trb_net16_term_buf.vhd"
attribute syn_keep of bustc_rx : signal is true;
attribute syn_preserve of bustc_rx : signal is true;
- signal tx_pll_lol_qd_b_i : std_logic;
- signal sync_tx_quad_i : std_logic;
- signal tx_clk_avail_i : std_logic;
- signal link_tx_ready_i : std_logic;
- signal tx_pcs_rst_i : std_logic;
- signal debug_i : std_logic_vector(31 downto 0);
- signal rx_dlm_i : std_logic;
- signal word_sync_i : std_logic;
- signal master_clk_i : std_logic;
-
- signal tx_reset_state : std_logic_vector(3 downto 0);
- signal global_reset_i : std_logic;
-
- signal send_rst_i : std_logic;
- signal send_rst_word_i : std_logic_vector(7 downto 0);
- signal send_dlm_word_i : std_logic_vector(7 downto 0);
-
- signal init_quad : std_logic;
-
+ signal tx_pll_lol_qd_b_i : std_logic;
+ signal sync_tx_quad_i : std_logic;
+ signal tx_clk_avail_i : std_logic;
+ signal link_tx_ready_i : std_logic;
+ signal tx_pcs_rst_i : std_logic;
+ signal debug_i : std_logic_vector(31 downto 0);
+ signal rx_dlm_i : std_logic;
+ signal word_sync_i : std_logic;
+ signal master_clk_i : std_logic;
+
+ signal tx_reset_state : std_logic_vector(3 downto 0);
+ signal global_reset_i : std_logic;
+
+ signal send_rst_i : std_logic;
+ signal send_rst_word_i : std_logic_vector(7 downto 0);
+ signal send_dlm_word_i : std_logic_vector(7 downto 0);
+
+ signal init_quad : std_logic;
+ signal link_clock : std_logic;
+
begin
---------------------------------------------------------------------------
);
init_quad <= not GSR_N;
-
+
+ -- select link speed, wrong values are catched in media interface
+ link_clock <= CLK_SUPPL_PCLK when (LINK_SPEED = 125) else
+ clk_full_osc when (LINK_SPEED = 200) else
+ '0';
+
gen_cal125 : if (USE_CALIBRATION_200MHZ = c_NO) generate
pll_calibration : entity work.pll_in125_out33
port map (
---------------------------------------------------------------------------
-- TrbNet Uplink
---------------------------------------------------------------------------
- THE_MEDIA_INTERFACE : entity med_ecp3_sfp_sync_all_125M_RS
+ THE_MEDIA_INTERFACE : entity med_ecp3_sfp_sync_all_RS
generic map(
IS_MODE => (c_IS_UNUSED, c_IS_UNUSED, c_IS_UNUSED, c_IS_SLAVE)
)
port map(
-- Clocks and reset
- CLK_REF_FULL => CLK_SUPPL_PCLK,
+ CLK_REF_FULL => link_clock,
SYSCLK => clk_sys,
CLEAR => init_quad,
RESET => reset_i,
WORD_SYNC_OUT => word_sync_i,
MASTER_CLK_IN => master_clk_i,
MASTER_CLK_OUT => master_clk_i,
- QUAD_RST_IN => '0',
LINK_TX_NULL_IN => global_reset_i,
LINK_RX_NULL_OUT => global_reset_i,
TX_PLL_LOL_OUT => tx_pll_lol_qd_b_i,
THE_MAIN_TX_RST: main_tx_reset_RS
port map (
CLEAR => init_quad,
- CLK_REF => CLK_SUPPL_PCLK,
+ CLK_REF => link_clock,
TX_PLL_LOL_QD_A_IN => '0',
TX_PLL_LOL_QD_B_IN => tx_pll_lol_qd_b_i,
TX_PLL_LOL_QD_C_IN => '0',