diff --git a/hdl/top/svec/Manifest.py b/hdl/top/svec/Manifest.py index ba02fd2dc14f410b35f7ff4782d5d52e9e513c52..1fa9c3806df7ba2e5eff4b88dcae8b7fb46631d5 100644 --- a/hdl/top/svec/Manifest.py +++ b/hdl/top/svec/Manifest.py @@ -8,7 +8,13 @@ modules = { "local" : [ "../../rtl/", "../../ip_cores/vme64x-core", "../../ip_cores/general-cores", - "../../ip_cores/wr-cores" - ] + "../../ip_cores/wr-cores", + "../../ip_cores/wr-cores/board/svec" + ], + "git" : [ + "git://ohwr.org/hdl-core-lib/general-cores.git", + "git://ohwr.org/hdl-core-lib/vme64x-core.git", + "git://ohwr.org/hdl-core-lib/etherbone-core.git", + ], } diff --git a/hdl/top/svec/wr_svec_tdc.ucf b/hdl/top/svec/wr_svec_tdc.ucf index f2531767928106adbcd99ca54be297dea189cb64..f77c1a047b74133d5c48ffb5c12452331c99fa29 100644 --- a/hdl/top/svec/wr_svec_tdc.ucf +++ b/hdl/top/svec/wr_svec_tdc.ucf @@ -600,7 +600,7 @@ NET "sfp_rxp_i" LOC = D22; NET "sfp_rxn_i" LOC = C22; NET "sfp_los_i" LOC = W25; -NET "sfp_mod_def0_b" LOC = Y26; +NET "sfp_mod_def0_i" LOC = Y26; NET "sfp_mod_def1_b" LOC = Y27; NET "sfp_mod_def2_b" LOC = AA24; #NET "sfp_rate_select_o" LOC = W24; @@ -608,7 +608,7 @@ NET "sfp_tx_disable_o" LOC = AA25; NET "sfp_tx_fault_i" LOC = AA27; NET "sfp_los_i" IOSTANDARD = LVCMOS33; -NET "sfp_mod_def0_b" IOSTANDARD = LVCMOS33; +NET "sfp_mod_def0_i" IOSTANDARD = LVCMOS33; NET "sfp_mod_def1_b" IOSTANDARD = LVCMOS33; NET "sfp_mod_def2_b" IOSTANDARD = LVCMOS33; #NET "sfp_rate_select_o" IOSTANDARD = "LVCMOS33"; @@ -649,7 +649,7 @@ NET "por_n_i" IOSTANDARD = LVCMOS33; NET "clk_20m_vcxo_i" TNM_NET = "clk_20m_vcxo_i"; # 62.5MHz Xilinx PLL clock/reset -NET "clk_62m5_sys" TNM_NET = "clk_62m5_sys"; +NET "clk_sys_62m5" TNM_NET = "clk_sys_62m5"; # 125MHz PLL ref NET "clk_125m_pllref_n_i" LOC = AB30; @@ -681,24 +681,23 @@ NET "tdc2_125m_clk_n_i" TNM_NET = "tdc2_125m_clk_n_i"; TIMESPEC TS_tdc2_tdc_125m_clk_n_i = PERIOD "tdc2_125m_clk_n_i" 8 ns HIGH 50 %; # TS_IGNORE - -TIMESPEC ts_ignore_xclock1 = FROM "clk_62m5_sys" TO "tdc2_125m_clk" 20ns DATAPATHONLY; -TIMESPEC ts_ignore_xclock1 = FROM "clk_62m5_sys" TO "tdc2_125m_clk" 20 ns DATAPATHONLY; -TIMESPEC ts_ignore_xclock2 = FROM "tdc2_125m_clk" TO "clk_62m5_sys" 20ns DATAPATHONLY; -TIMESPEC ts_ignore_xclock2 = FROM "tdc2_125m_clk" TO "clk_62m5_sys" 20 ns DATAPATHONLY; -TIMESPEC ts_ignore_xclock3 = FROM "clk_62m5_sys" TO "tdc2_125m_clk" 20ns DATAPATHONLY; -TIMESPEC ts_ignore_xclock3 = FROM "clk_62m5_sys" TO "tdc2_125m_clk" 20 ns DATAPATHONLY; -TIMESPEC ts_ignore_xclock4 = FROM "tdc2_125m_clk" TO "clk_62m5_sys" 20ns DATAPATHONLY; - -TIMESPEC ts_ignore_xclock4 = FROM "clk_20m_vcxo_i" TO "clk_62m5_sys" 200ns DATAPATHONLY; -TIMESPEC ts_ignore_xclock4 = FROM "clk_62m5_sys" TO "clk_20m_vcxo_i" 200ns DATAPATHONLY; -TIMESPEC ts_ignore_xclock4 = FROM "clk_62m5_sys" TO "clk_20m_vcxo_i" 200 ns DATAPATHONLY; -#Created by Constraints Editor (xc6slx150t-fgg900-3) - 2015/03/31 -NET "gen_with_wr_phy.U_GTP/ch1_gtp_clkout_int<1>" TNM_NET = gen_with_wr_phy.U_GTP/ch1_gtp_clkout_int<1>; -TIMESPEC TS_gen_with_wr_phy_U_GTP_ch1_gtp_clkout_int_1_ = PERIOD "gen_with_wr_phy.U_GTP/ch1_gtp_clkout_int<1>" 8 ns HIGH 50 %; +TIMESPEC ts_ignore_xclock1 = FROM "clk_sys_62m5" TO "tdc2_125m_clk" 20ns DATAPATHONLY; +TIMESPEC ts_ignore_xclock1 = FROM "clk_sys_62m5" TO "tdc2_125m_clk" 20 ns DATAPATHONLY; +TIMESPEC ts_ignore_xclock2 = FROM "tdc2_125m_clk" TO "clk_sys_62m5" 20ns DATAPATHONLY; +TIMESPEC ts_ignore_xclock2 = FROM "tdc2_125m_clk" TO "clk_sys_62m5" 20 ns DATAPATHONLY; +TIMESPEC ts_ignore_xclock3 = FROM "clk_sys_62m5" TO "tdc2_125m_clk" 20ns DATAPATHONLY; +TIMESPEC ts_ignore_xclock3 = FROM "clk_sys_62m5" TO "tdc2_125m_clk" 20 ns DATAPATHONLY; +TIMESPEC ts_ignore_xclock4 = FROM "tdc2_125m_clk" TO "clk_sys_62m5" 20ns DATAPATHONLY; + +TIMESPEC ts_ignore_xclock4 = FROM "clk_20m_vcxo_i" TO "clk_sys_62m5" 200ns DATAPATHONLY; +TIMESPEC ts_ignore_xclock4 = FROM "clk_sys_62m5" TO "clk_20m_vcxo_i" 200ns DATAPATHONLY; +TIMESPEC ts_ignore_xclock4 = FROM "clk_sys_62m5" TO "clk_20m_vcxo_i" 200 ns DATAPATHONLY; +#TIMESPEC TS_gen_with_wr_phy_U_GTP_ch1_gtp_clkout_int_1_ = PERIOD "gen_with_wr_phy.U_GTP/ch1_gtp_clkout_int<1>" 8 ns HIGH 50 %; +#Created by Constraints Editor (xc6slx150t-fgg900-3) - 2017/12/06 +NET "cmp_xwrc_board_svec/cmp_xwrc_platform/gen_phy_spartan6.cmp_gtp/ch1_gtp_clkout_int<1>" TNM_NET = cmp_xwrc_board_svec/cmp_xwrc_platform/gen_phy_spartan6.cmp_gtp/ch1_gtp_clkout_int<1>; +TIMESPEC TS_cmp_xwrc_board_svec_cmp_xwrc_platform_gen_phy_spartan6_cmp_gtp_ch1_gtp_clkout_int_1_ = PERIOD "cmp_xwrc_board_svec/cmp_xwrc_platform/gen_phy_spartan6.cmp_gtp/ch1_gtp_clkout_int<1>" 8 ns HIGH 50%; # PlanAhead Generated miscellaneous constraints - NET "tdc1_address_o[3]" SLEW = FAST; NET "tdc1_address_o[2]" SLEW = FAST; NET "tdc1_address_o[1]" SLEW = FAST; @@ -768,3 +767,9 @@ INST "*/U_SOFTPLL/U_Wrapped_Softpll/gen_feedback_dmtds*/clk_in" TNM = skew_limit INST "*/U_SOFTPLL/U_Wrapped_Softpll/gen_ref_dmtds*/clk_in" TNM = skew_limit; TIMESPEC TS_skew_limit = FROM "skew_limit" TO "FFS" 1 ns DATAPATHONLY; + +# Force PPS output to always be placed as IOB register +INST "cmp_xwrc_board_svec/cmp_board_common/cmp_xwr_core/wrpc/pps_gen/wrapped_ppsgen/pps_out_o" IOB = FORCE; +# External async reset +NET "por_n_i" TIG; +NET "vme_rst_n_i" TIG; diff --git a/hdl/top/svec/wr_svec_tdc.vhd b/hdl/top/svec/wr_svec_tdc.vhd index a2f4ea318268bdbb91cfceb6bdfb4bcb69cadf23..ff02bd6870baa4e6eee1da1b09fc10108feeaa6f 100644 --- a/hdl/top/svec/wr_svec_tdc.vhd +++ b/hdl/top/svec/wr_svec_tdc.vhd @@ -87,6 +87,7 @@ -- | -- Authors Gonzalo Penacoba (Gonzalo.Penacoba@cern.ch) | -- Evangelia Gousiou (Evangelia.Gousiou@cern.ch) | +-- Grzegorz Daniluk (Grzegorz.Daniluk@cern.ch) -- Date 05/2014 | -- Version v2 | -- Depends on | @@ -95,6 +96,7 @@ -- Last changes | -- 08/2013 v1 EG design for SVEC; two cores; synchronizer between vme and the cores | -- 05/2014 v2 EG added White Rabbit | +-- 12/2017 v7 GD Top file reorganized to benefit from WRPC Board wrapper. --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- @@ -119,10 +121,9 @@ use IEEE.numeric_std.all; use work.tdc_core_pkg.all; use work.gencores_pkg.all; use work.wishbone_pkg.all; -use work.wrcore_pkg.all; -use work.wr_fabric_pkg.all; -use work.wr_xilinx_pkg.all; use work.vme64x_pkg.all; +use work.wr_board_pkg.all; +use work.wr_svec_pkg.all; library UNISIM; use UNISIM.vcomponents.all; @@ -152,7 +153,7 @@ entity wr_svec_tdc is sfp_txn_o : out std_logic; sfp_rxp_i : in std_logic := '0'; sfp_rxn_i : in std_logic := '1'; - sfp_mod_def0_b : in std_logic; -- SFP detect pin + sfp_mod_def0_i : in std_logic; -- SFP detect pin sfp_mod_def1_b : inout std_logic; -- SFP scl sfp_mod_def2_b : inout std_logic; -- SFP sda sfp_rate_select_b : inout std_logic := '0'; @@ -412,36 +413,24 @@ architecture rtl of wr_svec_tdc is -- Signals -- --------------------------------------------------------------------------------------------------- + signal areset_n : std_logic; + -- Clocks - -- CLOCK DOMAIN: 20 MHz VCXO clock on SVEC carrier board: clk_20m_vcxo_i - signal clk_20m_vcxo_buf, clk_20m_vcxo : std_logic; -- CLOCK DOMAIN: 62.5 MHz system clock derived from clk_20m_vcxo_i by a Xilinx PLL: clk_62m5_sys - signal clk_62m5_sys, pllout_clk_sys : std_logic; - signal pllout_clk_sys_fb, sys_locked : std_logic; + signal clk_sys_62m5 : std_logic; -- CLOCK DOMAIN: 125 MHz clock from PLL on TDC1: tdc1_125m_clk - signal tdc1_125m_clk : std_logic; + signal tdc1_125m_clk : std_logic; signal tdc1_send_dac_word_p : std_logic; signal tdc1_dac_word : std_logic_vector(23 downto 0); -- CLOCK DOMAIN: 125 MHz clock from PLL on TDC2: tdc2_125m_clk signal tdc2_125m_clk : std_logic; signal tdc2_send_dac_word_p : std_logic; signal tdc2_dac_word : std_logic_vector(23 downto 0); - -- WHITE RABBIT CLOCKS: - signal pllout_clk_dmtd, pllout_clk_fb_dmtd : std_logic; - signal pllout_clk_fb_pllref : std_logic; - signal clk_125m_pllref, clk_125m_gtp : std_logic; - signal clk_dmtd : std_logic; - - attribute buffer_type : string; --" {bufgdll | ibufg | bufgp | ibuf | bufr | none}"; - attribute buffer_type of clk_125m_pllref : signal is "BUFG"; --------------------------------------------------------------------------------------------------- -- Resets - -- asynchronous reset from the FPGA inputs VME_RST_n_i and por_n_i - signal por_rst_n_a : std_logic; - signal powerup_rst_cnt : unsigned(7 downto 0) := "00000000"; -- system reset, synched with 62.5 MHz clock,driven by the VME reset and power-up reset pins. - signal rst_n_sys : std_logic; + signal rst_sys_62m5_n : std_logic; -- reset input to the clks_rsts_manager units of the two TDC cores; -- this reset initiates the configuration of the mezzanines PLL signal tdc1_soft_rst_n : std_logic; -- driven by carrier CSR reserved bit 0 @@ -462,21 +451,12 @@ architecture rtl of wr_svec_tdc is --------------------------------------------------------------------------------------------------- -- White Rabbit signals to TDC mezzanine signal tm_link_up, tm_time_valid : std_logic; - signal tm_utc : std_logic_vector(39 downto 0); + signal tm_tai : std_logic_vector(39 downto 0); signal tm_cycles : std_logic_vector(27 downto 0); signal tm_clk_aux_lock_en, tm_clk_aux_locked: std_logic_vector(1 downto 0); -- White Rabbit signals to clks_rsts_manager signal tm_dac_value : std_logic_vector(23 downto 0); signal tm_dac_wr_p : std_logic_vector(1 downto 0); - -- White Rabbit PHY - signal phy_tx_data, phy_rx_data : std_logic_vector(7 downto 0); - signal phy_tx_k, phy_rx_k : std_logic_vector(0 downto 0); - signal phy_tx_enc_err, phy_rx_rbclk,phy_tx_disparity : std_logic; - signal phy_rx_enc_err, phy_rst, phy_loopen : std_logic; - signal phy_rx_bitslide : std_logic_vector(3 downto 0); - -- White Rabbit serial DAC - signal dac_hpll_load_p1, dac_dpll_load_p1 : std_logic; - signal dac_hpll_data, dac_dpll_data : std_logic_vector(15 downto 0); -- White Rabbit to mezzanine EEPROM signal wrc_scl_out, wrc_scl_in : std_logic; signal wrc_sda_out, wrc_sda_in : std_logic; @@ -484,7 +464,7 @@ architecture rtl of wr_svec_tdc is signal sfp_scl_out, sfp_scl_in : std_logic; signal sfp_sda_out, sfp_sda_in : std_logic; -- White Rabbit Carrier 1-Wire - signal wrc_owr_en, wrc_owr_in : std_logic_vector(1 downto 0); + signal wrc_owr_oe, wrc_owr_data : std_logic; --------------------------------------------------------------------------------------------------- -- Crossbar @@ -494,6 +474,7 @@ architecture rtl of wr_svec_tdc is -- WISHBONE to crossbar slave port signal cnx_slave_out : t_wishbone_slave_out_array (c_NUM_WB_SLAVES-1 downto 0); signal cnx_slave_in : t_wishbone_slave_in_array (c_NUM_WB_SLAVES-1 downto 0); + signal vme_wb_out : t_wishbone_master_out; signal vme_wb_in : t_wishbone_master_in; --------------------------------------------------------------------------------------------------- @@ -508,339 +489,21 @@ architecture rtl of wr_svec_tdc is signal tdc2_scl_oen, tdc2_scl_in : std_logic; signal tdc2_sda_oen, tdc2_sda_in : std_logic; - signal carrier_owr_en, carrier_owr_i : std_logic_vector(c_FMC_ONEWIRE_NB - 1 downto 0); -- LEDs signal led_state : std_logic_vector(15 downto 0); signal tdc1_ef, tdc2_ef, led_tdc1_ef : std_logic; signal led_tdc2_ef, led_vme_access : std_logic; - signal wrabbit_led_red, wrabbit_led_green : std_logic; + signal wr_led_act, wr_led_link : std_logic; --================================================================================================= -- architecture begin --================================================================================================= begin ---------------------------------------------------------------------------------------------------- --- 62.5 MHz system clock -- ---------------------------------------------------------------------------------------------------- - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - svec_clk_ibuf : IBUFG - port map - (I => clk_20m_vcxo_i, - O => clk_20m_vcxo_buf); - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - cmp_sys_clk_pll : PLL_BASE - generic map - (BANDWIDTH => "OPTIMIZED", - CLK_FEEDBACK => "CLKFBOUT", - COMPENSATION => "INTERNAL", - DIVCLK_DIVIDE => 1, - CLKFBOUT_MULT => 8, -- 125 MHz x 8 = 1 GHz - CLKFBOUT_PHASE => 0.000, - CLKOUT0_DIVIDE => 16, -- 62.5 MHz - CLKOUT0_PHASE => 0.000, - CLKOUT0_DUTY_CYCLE => 0.500, - CLKOUT1_DIVIDE => 16, -- 125 MHz, not used - CLKOUT1_PHASE => 0.000, - CLKOUT1_DUTY_CYCLE => 0.500, - CLKOUT2_DIVIDE => 16, - CLKOUT2_PHASE => 0.000, - CLKOUT2_DUTY_CYCLE => 0.500, - CLKIN_PERIOD => 8.0, - REF_JITTER => 0.016) - port map - (CLKFBOUT => pllout_clk_sys_fb, - CLKOUT0 => pllout_clk_sys, - CLKOUT1 => open, - CLKOUT2 => open, - CLKOUT3 => open, - CLKOUT4 => open, - CLKOUT5 => open, - LOCKED => sys_locked, - RST => '0', - CLKFBIN => pllout_clk_sys_fb, - CLKIN => clk_125m_pllref); - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - cmp_clk_sys_buf : BUFG - port map - (O => clk_62m5_sys, - I => pllout_clk_sys); - - ---------------------------------------------------------------------------------------------------- --- 62.5 MHz Reset -- ---------------------------------------------------------------------------------------------------- --- SVEC power-up reset in the clk_62m5_sys domain: rst_n_sys is asserted asynchronously upon VME --- reset or SVEC AFPGA power-on reset. If none of these signals is asserted at startup, the process --- waits for the system clock PLL to lock + additional 256 clk_62m5_sys cycles before de-asserting --- the reset. - - p_powerup_reset : process(clk_62m5_sys, por_rst_n_a) - begin - if(por_rst_n_a = '0') then - rst_n_sys <= '0'; - elsif rising_edge(clk_62m5_sys) then - if sys_locked = '1' then - if(powerup_rst_cnt = "11111111") then - rst_n_sys <= '1'; - else - rst_n_sys <= '0'; - powerup_rst_cnt <= powerup_rst_cnt + 1; - end if; - else - rst_n_sys <= '0'; - powerup_rst_cnt <= "00000000"; - end if; - end if; - end process; - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - por_rst_n_a <= VME_RST_n_i and por_n_i; - - - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - tdc1_soft_rst_n <= carrier_info_fmc_rst(0) and rst_n_sys; - tdc2_soft_rst_n <= carrier_info_fmc_rst(1) and rst_n_sys; - - ---------------------------------------------------------------------------------------------------- --- 62.5 MHz DMTD clock -- ---------------------------------------------------------------------------------------------------- - - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - cmp_dmtd_clk_pll : PLL_BASE - generic map - (BANDWIDTH => "OPTIMIZED", - CLK_FEEDBACK => "CLKFBOUT", - COMPENSATION => "INTERNAL", - DIVCLK_DIVIDE => 1, - CLKFBOUT_MULT => 50, - CLKFBOUT_PHASE => 0.000, - CLKOUT0_DIVIDE => 16, -- 62.5 MHz - CLKOUT0_PHASE => 0.000, - CLKOUT0_DUTY_CYCLE => 0.500, - CLKOUT1_DIVIDE => 16, -- not used - CLKOUT1_PHASE => 0.000, - CLKOUT1_DUTY_CYCLE => 0.500, - CLKOUT2_DIVIDE => 8, - CLKOUT2_PHASE => 0.000, - CLKOUT2_DUTY_CYCLE => 0.500, - CLKIN_PERIOD => 50.0, - REF_JITTER => 0.016) - port map - (CLKFBOUT => pllout_clk_fb_dmtd, - CLKOUT0 => pllout_clk_dmtd, - CLKOUT1 => open, - CLKOUT2 => open, - CLKOUT3 => open, - CLKOUT4 => open, - CLKOUT5 => open, - LOCKED => open, - RST => '0', - CLKFBIN => pllout_clk_fb_dmtd, - CLKIN => clk_20m_vcxo_buf); - - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - cmp_clk_dmtd_buf : BUFG - port map - (O => clk_dmtd, - I => pllout_clk_dmtd); - - ---------------------------------------------------------------------------------------------------- --- 125 MHz clk for White Rabbit core -- ---------------------------------------------------------------------------------------------------- - - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - U_Buf_CLK_PLL : IBUFGDS - generic map - (DIFF_TERM => true, - IBUF_LOW_PWR => true) -- Low power (TRUE) vs. performance (FALSE) setting for referenced - port map - (O => clk_125m_pllref, -- Buffer output - I => clk_125m_pllref_p_i, -- Diff_p buffer input (connect directly to top-level port) - IB => clk_125m_pllref_n_i); -- Diff_n buffer input (connect directly to top-level port) - - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - U_Buf_CLK_GTP : IBUFDS - generic map - (DIFF_TERM => true, - IBUF_LOW_PWR => false) - port map - (O => clk_125m_gtp, - I => clk_125m_gtp_p_i, - IB => clk_125m_gtp_n_i); - - ---------------------------------------------------------------------------------------------------- --- White Rabbit Core + PHY -- ---------------------------------------------------------------------------------------------------- - - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - U_WR_CORE : xwr_core - generic map - (g_simulation => f_bool2int(g_simulation), - g_phys_uart => true, - g_virtual_uart => true, - g_with_external_clock_input => false, - g_board_name => "SVEC", - g_aux_clks => 2, - g_ep_rxbuf_size => 1024, - g_dpram_initf => "../../ip_cores/wr-cores/bin/wrpc/wrc_phy8.bram", - g_dpram_size => 131072/4, - g_interface_mode => PIPELINED, - g_address_granularity => BYTE, - g_softpll_enable_debugger => false, - g_pcs_16bit => false, - g_records_for_phy => false) - port map - (clk_sys_i => clk_62m5_sys, - clk_dmtd_i => clk_dmtd, - clk_ref_i => clk_125m_pllref, - clk_aux_i(0) => tdc1_125m_clk, - clk_aux_i(1) => tdc2_125m_clk, - rst_n_i => rst_n_sys, - -- DAC - dac_hpll_load_p1_o => dac_hpll_load_p1, - dac_hpll_data_o => dac_hpll_data, - dac_dpll_load_p1_o => dac_dpll_load_p1, - dac_dpll_data_o => dac_dpll_data, - -- PHY - phy_ref_clk_i => clk_125m_pllref, - phy_tx_data_o => phy_tx_data, - phy_tx_k_o => phy_tx_k, - phy_tx_disparity_i => phy_tx_disparity, - phy_tx_enc_err_i => phy_tx_enc_err, - phy_rx_data_i => phy_rx_data, - phy_rx_rbclk_i => phy_rx_rbclk, - phy_rx_k_i => phy_rx_k, - phy_rx_enc_err_i => phy_rx_enc_err, - phy_rx_bitslide_i => phy_rx_bitslide, - phy_rst_o => phy_rst, - phy_loopen_o => phy_loopen, - -- SPEC LEDs - led_act_o => wrabbit_led_red, - led_link_o => wrabbit_led_green, - -- SFP - scl_o => wrc_scl_out, - scl_i => wrc_scl_in, - sda_o => wrc_sda_out, - sda_i => wrc_sda_in, - sfp_scl_o => sfp_scl_out, - sfp_scl_i => sfp_scl_in, - sfp_sda_o => sfp_sda_out, - sfp_sda_i => sfp_sda_in, - sfp_det_i => sfp_mod_def0_b, - - uart_rxd_i => uart_rxd_i, - uart_txd_o => uart_txd_o, - -- 1-wire - owr_en_o => wrc_owr_en, - owr_i => wrc_owr_in, - -- WISHBONE - slave_i => cnx_master_out(c_SLAVE_WRCORE), - slave_o => cnx_master_in(c_SLAVE_WRCORE), - -- Timimg info for TDC core - tm_link_up_o => tm_link_up, - tm_dac_value_o => tm_dac_value, - tm_dac_wr_o => tm_dac_wr_p, - tm_clk_aux_lock_en_i => tm_clk_aux_lock_en, - tm_clk_aux_locked_o => tm_clk_aux_locked, - tm_time_valid_o => tm_time_valid, - tm_tai_o => tm_utc, - tm_cycles_o => tm_cycles, - -- SPI Flash - spi_sclk_o => spi_sclk_o, - spi_ncs_o => spi_ncs_o, - spi_mosi_o => spi_mosi_o, - spi_miso_i => spi_miso_i, - -- not used - btn1_i => '0', - btn2_i => '0', - pps_p_o => fp_gpio1_o, - -- aux reset - rst_aux_n_o => open); - - gen_with_wr_phy: if g_with_wr_phy generate - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - U_GTP : wr_gtp_phy_spartan6 - generic map - (g_simulation => 0, - g_enable_ch0 => 0, - g_enable_ch1 => 1) - port map - (gtp_clk_i => clk_125m_gtp, - ch0_ref_clk_i => clk_125m_pllref, - ch0_tx_data_i => x"00", - ch0_tx_k_i => '0', - ch0_tx_disparity_o => open, - ch0_tx_enc_err_o => open, - ch0_rx_rbclk_o => open, - ch0_rx_data_o => open, - ch0_rx_k_o => open, - ch0_rx_enc_err_o => open, - ch0_rx_bitslide_o => open, - ch0_rst_i => '1', - ch0_loopen_i => '0', - ch1_ref_clk_i => clk_125m_pllref, - ch1_tx_data_i => phy_tx_data, - ch1_tx_k_i => phy_tx_k(0), - ch1_tx_disparity_o => phy_tx_disparity, - ch1_tx_enc_err_o => phy_tx_enc_err, - ch1_rx_data_o => phy_rx_data, - ch1_rx_rbclk_o => phy_rx_rbclk, - ch1_rx_k_o => phy_rx_k(0), - ch1_rx_enc_err_o => phy_rx_enc_err, - ch1_rx_bitslide_o => phy_rx_bitslide, - ch1_rst_i => phy_rst, - ch1_loopen_i => '0', -- phy_loopen, - pad_txn0_o => open, - pad_txp0_o => open, - pad_rxn0_i => '0', - pad_rxp0_i => '0', - pad_txn1_o => sfp_txn_o, - pad_txp1_o => sfp_txp_o, - pad_rxn1_i => sfp_rxn_i, - pad_rxp1_i => sfp_rxp_i); - - end generate gen_with_wr_phy; - - --- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - U_DAC_Helper : spec_serial_dac - generic map - (g_num_data_bits => 16, - g_num_extra_bits => 8, - g_num_cs_select => 1) - port map - (clk_i => clk_62m5_sys, - rst_n_i => rst_n_sys, - value_i => dac_hpll_data, - cs_sel_i => "1", - load_i => dac_hpll_load_p1, - sclk_divsel_i => "010", - dac_cs_n_o(0) => pll20dac_sync_n_o, - dac_sclk_o => pll20dac_sclk_o, - dac_sdata_o => pll20dac_din_o, - xdone_o => open); - - U_DAC_Main : spec_serial_dac - generic map - (g_num_data_bits => 16, - g_num_extra_bits => 8, - g_num_cs_select => 1) - port map - (clk_i => clk_62m5_sys, - rst_n_i => rst_n_sys, - value_i => dac_dpll_data, - cs_sel_i => "1", - load_i => dac_dpll_load_p1, - sclk_divsel_i => "010", - dac_cs_n_o(0) => pll25dac_sync_n_o, - dac_sclk_o => pll25dac_sclk_o, - dac_sdata_o => pll25dac_din_o, - xdone_o => open); - + areset_n <= vme_rst_n_i and por_n_i; + tdc1_soft_rst_n <= carrier_info_fmc_rst(0) and rst_sys_62m5_n; + tdc2_soft_rst_n <= carrier_info_fmc_rst(1) and rst_sys_62m5_n; -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- Tristates for mezzanine EEPROM @@ -848,21 +511,81 @@ begin tdc2_scl_b <= '0' when (tdc2_scl_oen = '0') else 'Z'; tdc2_sda_b <= '0' when (tdc2_sda_oen = '0') else 'Z'; +--------------------------------------------------------------------------------------------------- +-- SVEC Board Wrapper -- +--------------------------------------------------------------------------------------------------- + cmp_xwrc_board_svec : xwrc_board_svec + generic map ( + g_simulation => f_bool2int(g_simulation), + g_with_external_clock_input => FALSE, + g_dpram_initf => "../../ip_cores/wr-cores/bin/wrpc/wrc_phy8.bram", + g_fabric_iface => plain, + g_aux_clks => 2) + port map ( + clk_20m_vcxo_i => clk_20m_vcxo_i, + clk_125m_pllref_p_i => clk_125m_pllref_p_i, + clk_125m_pllref_n_i => clk_125m_pllref_n_i, + clk_125m_gtp_n_i => clk_125m_gtp_n_i, + clk_125m_gtp_p_i => clk_125m_gtp_p_i, + clk_aux_i(0) => tdc1_125m_clk, + clk_aux_i(1) => tdc2_125m_clk, + areset_n_i => areset_n, + clk_sys_62m5_o => clk_sys_62m5, + rst_sys_62m5_n_o => rst_sys_62m5_n, + pll20dac_din_o => pll20dac_din_o, + pll20dac_sclk_o => pll20dac_sclk_o, + pll20dac_sync_n_o => pll20dac_sync_n_o, + pll25dac_din_o => pll25dac_din_o, + pll25dac_sclk_o => pll25dac_sclk_o, + pll25dac_sync_n_o => pll25dac_sync_n_o, + sfp_txp_o => sfp_txp_o, + sfp_txn_o => sfp_txn_o, + sfp_rxp_i => sfp_rxp_i, + sfp_rxn_i => sfp_rxn_i, + sfp_det_i => sfp_mod_def0_i, + sfp_sda_i => sfp_sda_in, + sfp_sda_o => sfp_sda_out, + sfp_scl_i => sfp_scl_in, + sfp_scl_o => sfp_scl_out, + sfp_rate_select_o => sfp_rate_select_b, + sfp_tx_fault_i => sfp_tx_fault_i, + sfp_tx_disable_o => sfp_tx_disable_o, + sfp_los_i => sfp_los_i, + eeprom_sda_i => wrc_sda_in, + eeprom_sda_o => wrc_sda_out, + eeprom_scl_i => wrc_scl_in, + eeprom_scl_o => wrc_scl_out, + onewire_i => wrc_owr_data, + onewire_oen_o => wrc_owr_oe, + uart_rxd_i => uart_rxd_i, + uart_txd_o => uart_txd_o, + spi_sclk_o => spi_sclk_o, + spi_ncs_o => spi_ncs_o, + spi_mosi_o => spi_mosi_o, + spi_miso_i => spi_miso_i, + wb_slave_o => cnx_master_in(c_SLAVE_WRCORE), + wb_slave_i => cnx_master_out(c_SLAVE_WRCORE), + tm_link_up_o => tm_link_up, + tm_dac_value_o => tm_dac_value, + tm_dac_wr_o => tm_dac_wr_p, + tm_clk_aux_lock_en_i=> tm_clk_aux_lock_en, + tm_clk_aux_locked_o => tm_clk_aux_locked, + tm_time_valid_o => tm_time_valid, + tm_tai_o => tm_tai, + tm_cycles_o => tm_cycles, + pps_p_o => fp_gpio1_o, + + led_link_o => wr_led_link, + led_act_o => wr_led_act); - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- Tristates for SFP EEPROM - sfp_mod_def1_b <= '0' when sfp_scl_out = '0' else 'Z'; - sfp_mod_def2_b <= '0' when sfp_sda_out = '0' else 'Z'; - sfp_scl_in <= sfp_mod_def1_b; - sfp_sda_in <= sfp_mod_def2_b; - - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - carrier_onewire_b <= '0' when wrc_owr_en(0) = '1' else 'Z'; - wrc_owr_in(0) <= carrier_onewire_b; - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - - -- The SFP is permanently enabled. - sfp_tx_disable_o <= '0'; + sfp_mod_def1_b <= '0' when sfp_scl_out = '0' else 'Z'; + sfp_mod_def2_b <= '0' when sfp_sda_out = '0' else 'Z'; + sfp_scl_in <= sfp_mod_def1_b; + sfp_sda_in <= sfp_mod_def2_b; + -- Tristates for 1-wire thermometer + carrier_onewire_b <= '0' when wrc_owr_oe = '1' else 'Z'; + wrc_owr_data <= carrier_onewire_b; --------------------------------------------------------------------------------------------------- -- CSR WISHBONE CROSSBAR -- @@ -884,8 +607,8 @@ begin g_layout => c_INTERCONNECT_LAYOUT, g_sdb_addr => c_SDB_ADDRESS) port map - (clk_sys_i => clk_62m5_sys, - rst_n_i => rst_n_sys, + (clk_sys_i => clk_sys_62m5, + rst_n_i => rst_sys_62m5_n, slave_i => cnx_slave_in, slave_o => cnx_slave_out, master_i => cnx_master_in, @@ -905,8 +628,8 @@ begin g_REVISION_ID => c_SVEC_REVISION_ID, g_PROGRAM_ID => c_SVEC_PROGRAM_ID) port map - (clk_i => clk_62m5_sys, - rst_n_i => rst_n_sys, + (clk_i => clk_sys_62m5, + rst_n_i => rst_sys_62m5_n, vme_i.as_n => vme_as_n_i, vme_i.rst_n => vme_rst_n_i, vme_i.write_n => vme_write_n_i, @@ -932,36 +655,47 @@ begin vme_o.data_oe_n => vme_data_oe_n_o, vme_o.addr_dir => vme_addr_dir_int, vme_o.addr_oe_n => vme_addr_oe_n_o, - wb_o => cnx_slave_in (c_MASTER_VME), - wb_i => cnx_slave_out(c_MASTER_VME)); --vme_wb_in); + wb_o => vme_wb_out, + wb_i => vme_wb_in); -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + vme_berr_o <= not vme_berr_n; + vme_irq_o <= not vme_irq_n; + + -- Shift address for byte addressing. + cnx_slave_in(c_MASTER_VME).cyc <= vme_wb_out.cyc; + cnx_slave_in(c_MASTER_VME).stb <= vme_wb_out.stb; + cnx_slave_in(c_MASTER_VME).adr <= vme_wb_out.adr(29 downto 0) & "00"; + cnx_slave_in(c_MASTER_VME).sel <= vme_wb_out.sel; + cnx_slave_in(c_MASTER_VME).we <= vme_wb_out.we; + cnx_slave_in(c_MASTER_VME).dat <= vme_wb_out.dat; + + -- Drive inject also IRQ to the WB interface. vme_wb_in.ack <= cnx_slave_out(c_MASTER_VME).ack; vme_wb_in.err <= cnx_slave_out(c_MASTER_VME).err; vme_wb_in.rty <= cnx_slave_out(c_MASTER_VME).rty; vme_wb_in.stall <= cnx_slave_out(c_MASTER_VME).stall; vme_wb_in.dat <= cnx_slave_out(c_MASTER_VME).dat; vme_wb_in.int <= irq_to_vmecore; + + -- VME tri-state bufferes vme_data_b <= vme_data_b_out when vme_data_dir_int = '1' else (others => 'Z'); vme_addr_b <= vme_addr_b_out when vme_addr_dir_int = '1' else (others => 'Z'); vme_lword_n_b <= vme_lword_n_b_out when vme_addr_dir_int = '1' else 'Z'; + vme_addr_dir_o <= vme_addr_dir_int; vme_data_dir_o <= vme_data_dir_int; - vme_berr_o <= not vme_berr_n; - vme_irq_o <= not vme_irq_n; - --------------------------------------------------------------------------------------------------- -- TDC BOARDS -- --------------------------------------------------------------------------------------------------- - cmp_tdc_mezzanine_1: fmc_tdc_wrapper generic map ( g_simulation => g_simulation, g_with_direct_readout => false ) port map ( - clk_sys_i => clk_62m5_sys, - rst_sys_n_i => rst_n_sys, + clk_sys_i => clk_sys_62m5, + rst_sys_n_i => rst_sys_62m5_n, rst_n_a_i => tdc1_soft_rst_n, pll_sclk_o => tdc1_pll_sclk_o, pll_sdi_o => tdc1_pll_sdi_o, @@ -1013,7 +747,7 @@ begin tm_link_up_i => tm_link_up, tm_time_valid_i => tm_time_valid, tm_cycles_i => tm_cycles, - tm_tai_i => tm_utc, + tm_tai_i => tm_tai, tm_clk_aux_lock_en_o => tm_clk_aux_lock_en(0), tm_clk_aux_locked_i => tm_clk_aux_locked(0), tm_clk_dmtd_locked_i => '1', @@ -1039,8 +773,8 @@ begin g_simulation => g_simulation, g_with_direct_readout => false ) port map ( - clk_sys_i => clk_62m5_sys, - rst_sys_n_i => rst_n_sys, + clk_sys_i => clk_sys_62m5, + rst_sys_n_i => rst_sys_62m5_n, rst_n_a_i => tdc2_soft_rst_n, pll_sclk_o => tdc2_pll_sclk_o, pll_sdi_o => tdc2_pll_sdi_o, @@ -1092,7 +826,7 @@ begin tm_link_up_i => tm_link_up, tm_time_valid_i => tm_time_valid, tm_cycles_i => tm_cycles, - tm_tai_i => tm_utc, + tm_tai_i => tm_tai, tm_clk_aux_lock_en_o => tm_clk_aux_lock_en(1), tm_clk_aux_locked_i => tm_clk_aux_locked(1), tm_clk_dmtd_locked_i => '1', @@ -1123,8 +857,8 @@ begin g_num_interrupts => 2, g_init_vectors => c_VIC_VECTOR_TABLE) port map - (clk_sys_i => clk_62m5_sys, - rst_n_i => rst_n_sys, + (clk_sys_i => clk_sys_62m5, + rst_n_i => rst_sys_62m5_n, slave_i => cnx_master_out(c_SLAVE_VIC), slave_o => cnx_master_in(c_SLAVE_VIC), irqs_i(0) => tdc1_irq, @@ -1138,8 +872,8 @@ begin -- Also added software resets for the clks_rsts_manager units cmp_carrier_info : carrier_info port map - (rst_n_i => rst_n_sys, - clk_sys_i => clk_62m5_sys, + (rst_n_i => rst_sys_62m5_n, + clk_sys_i => clk_sys_62m5, wb_adr_i => cnx_master_out(c_SLAVE_SVEC_INFO).adr(3 downto 2), wb_dat_i => cnx_master_out(c_SLAVE_SVEC_INFO).dat, wb_dat_o => cnx_master_in(c_SLAVE_SVEC_INFO).dat, @@ -1154,7 +888,9 @@ begin carrier_info_carrier_type_i => c_CARRIER_TYPE, carrier_info_stat_fmc_pres_i => tdc1_prsntm2c_n_i, carrier_info_stat_p2l_pll_lck_i => '0', - carrier_info_stat_sys_pll_lck_i => sys_locked, + -- SVEC board wrapper releases rst_sys_62m5_n only when system clock pll is + -- locked. Therefore we report here '1' - pll locked + carrier_info_stat_sys_pll_lck_i => '1', carrier_info_stat_ddr3_cal_done_i => '0', carrier_info_stat_reserved_i(27 downto 1) => (others => '1'), @@ -1185,8 +921,8 @@ begin g_CLK_FREQ => 62500000, -- in Hz g_REFRESH_RATE => 250) -- in Hz port map - (rst_n_i => rst_n_sys, - clk_i => clk_62m5_sys, + (rst_n_i => rst_sys_62m5_n, + clk_i => clk_sys_62m5, led_intensity_i => "1100100", -- in % led_state_i => led_state, column_o => fp_led_column_o, @@ -1199,9 +935,9 @@ begin -- fp led number : | 5 | 6 | 7 | 8 | 1 | 2 | 3 | 4 | -- LED 1: White Rabbit act - led_state(7 downto 6) <= c_LED_RED when wrabbit_led_red = '1' else c_LED_OFF; + led_state(7 downto 6) <= c_LED_RED when wr_led_act = '1' else c_LED_OFF; -- LED 2: White Rabbit link - led_state(5 downto 4) <= c_LED_GREEN when wrabbit_led_green = '1' else c_LED_OFF; + led_state(5 downto 4) <= c_LED_GREEN when wr_led_link = '1' else c_LED_OFF; -- LED 3: TDC1 empty flag led_state(3 downto 2) <= c_LED_GREEN when led_tdc1_ef = '1' else c_LED_OFF; -- LED 4: TDC2 empty flag @@ -1220,8 +956,8 @@ begin generic map (g_width => 5000000) port map - (clk_i => clk_62m5_sys, - rst_n_i => rst_n_sys, + (clk_i => clk_sys_62m5, + rst_n_i => rst_sys_62m5_n, pulse_i => cnx_slave_in(c_MASTER_VME).cyc, extended_o => led_vme_access); @@ -1230,8 +966,8 @@ begin generic map (g_width => 5000000) port map - (clk_i => clk_62m5_sys, - rst_n_i => rst_n_sys, + (clk_i => clk_sys_62m5, + rst_n_i => rst_sys_62m5_n, pulse_i => tdc1_ef, extended_o => led_tdc1_ef); -- -- -- -- -- -- -- @@ -1242,8 +978,8 @@ begin generic map (g_width => 5000000) port map - (clk_i => clk_62m5_sys, - rst_n_i => rst_n_sys, + (clk_i => clk_sys_62m5, + rst_n_i => rst_sys_62m5_n, pulse_i => tdc2_ef, extended_o => led_tdc2_ef); -- -- -- -- -- -- --