From c3a65a29ffe2bdf0b54f021ca1744f7bc61e3b3b Mon Sep 17 00:00:00 2001 From: Peter Lemmens Date: Thu, 6 Feb 2014 11:49:58 +0100 Subject: [PATCH] Intermediate commit. In the process of creating the soda-hub. Now going to fiddle in the trb3_hub. Probably should have started here. --- soda_hub_probe.rvl | 22 +- soda_source.lpf | 1 + soda_source_probe.rvl | 9 +- source/med_ecp3_sfp_sync_down.vhd | 497 ++++++++++++++++----------- source/med_ecp3_sfp_sync_up.vhd | 64 ++-- source/serdes_sync_downstream.ipx | 14 +- source/serdes_sync_downstream.lpc | 70 ++-- source/serdes_sync_downstream.txt | 111 +++++- source/serdes_sync_downstream.vhd | 409 ++++++++++++++-------- source/serdes_sync_upstream.ipx | 14 +- source/serdes_sync_upstream.lpc | 38 +- source/serdes_sync_upstream.txt | 74 ++-- source/serdes_sync_upstream.vhd | 262 +++++++------- source/soda_cmd_window_generator.vhd | 2 - source/soda_components.vhd | 135 ++++---- source/soda_hub.vhd | 32 +- source/soda_packet_handler.vhd | 98 +----- source/soda_reply_pkt_builder.vhd | 43 +-- source/soda_source.vhd | 27 +- source/soda_superburst_gen.vhd | 18 +- 20 files changed, 1099 insertions(+), 841 deletions(-) diff --git a/soda_hub_probe.rvl b/soda_hub_probe.rvl index 0397f85..642e560 100644 --- a/soda_hub_probe.rvl +++ b/soda_hub_probe.rvl @@ -1,10 +1,10 @@ - + - + - - + + @@ -85,20 +85,18 @@ - - - - - - - + + + + + + - diff --git a/soda_source.lpf b/soda_source.lpf index 3667e7a..44e7920 100644 --- a/soda_source.lpf +++ b/soda_source.lpf @@ -215,6 +215,7 @@ MULTICYCLE TO CELL "THE_SYNC_LINK/sci*" 20.000000 ns ; MULTICYCLE FROM CELL "THE_SYNC_LINK/sci*" 25.000000 ns ; MULTICYCLE TO CELL "THE_SYNC_LINK/wa_pos*" 20.000000 ns ; MULTICYCLE TO CELL "THE_MEDIA_UPLINK/SCI_DATA_OUT*" 50.000000 ns ; +MULTICYCLE TO CELL "THE_SODA_SOURCE.packet_builder.soda_cmd_word_S*" 10.000000 ns ; BLOCK JTAGPATHS ; ## IOBUF ALLPORTS ; #USE PRIMARY PURE NET "CLK_PCLK_LEFT_c" QUADRANT_TL QUADRANT_TR QUADRANT_BL QUADRANT_BR ; diff --git a/soda_source_probe.rvl b/soda_source_probe.rvl index 1d33e9e..dc0203a 100644 --- a/soda_source_probe.rvl +++ b/soda_source_probe.rvl @@ -1,7 +1,7 @@ - + - + @@ -148,6 +148,11 @@ + + + + + diff --git a/source/med_ecp3_sfp_sync_down.vhd b/source/med_ecp3_sfp_sync_down.vhd index e9266fb..f69b1d6 100644 --- a/source/med_ecp3_sfp_sync_down.vhd +++ b/source/med_ecp3_sfp_sync_down.vhd @@ -19,7 +19,7 @@ entity med_ecp3_sfp_sync_down is 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 PL! -- PCSA_REFCLKN : in std_logic; -- external refclock straight into serdes PL! --Internal Connection TX @@ -41,28 +41,28 @@ entity med_ecp3_sfp_sync_down is 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! + 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 + SD_RXD_P_IN : in t_QUAD_BIT; -- well, there's 4 of them... + SD_RXD_N_IN : in t_QUAD_BIT; + SD_TXD_P_OUT : out t_QUAD_BIT; + SD_TXD_N_OUT : out t_QUAD_BIT; + SD_REFCLK_P_IN : in t_QUAD_BIT; --not used + SD_REFCLK_N_IN : in t_QUAD_BIT; --not used + SD_PRSNT_N_IN : in t_QUAD_BIT; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted) + SD_LOS_IN : in t_QUAD_BIT; -- SFP Loss Of Signal ('0' = OK, '1' = no signal) + SD_TXDIS_OUT : out t_QUAD_BIT := (others => '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'; + 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'); @@ -81,7 +81,7 @@ architecture med_ecp3_sfp_sync_down_arch of med_ecp3_sfp_sync_down is attribute syn_sharing : string; attribute syn_sharing of med_ecp3_sfp_sync_down_arch : architecture is "off"; - + component DCS -- synthesis translate_off @@ -102,95 +102,104 @@ end component; --signal refclk_p_in_S : std_logic; --PL! --signal refclk_n_in_S : std_logic; --PL! ---signal refclk2core_S : std_logic; --PL! - -signal clk_200_i : std_logic; -signal clk_200_internal : std_logic; -signal clk_rx_full : std_logic; -signal clk_rx_half : std_logic; -signal clk_tx_full : std_logic; -signal clk_tx_half : std_logic; - -signal tx_data : std_logic_vector(7 downto 0); -signal tx_k : std_logic; -signal rx_data : std_logic_vector(7 downto 0); -signal rx_k : std_logic; -signal rx_error : std_logic; - -signal rst_n : std_logic; -signal rst : std_logic; -- PL! -signal rx_serdes_rst : std_logic; -signal tx_serdes_rst : std_logic; -signal tx_pcs_rst : std_logic; -signal rx_pcs_rst : std_logic; -signal rst_qd : std_logic; -signal serdes_rst_qd : std_logic; -signal sd_los_i : std_logic; --PL! - -signal rx_los_low : std_logic; -signal lsm_status : std_logic; -signal rx_cdr_lol : std_logic; -signal tx_pll_lol : std_logic; - -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 : std_logic_vector(15 downto 0) := x"FFFF"; -signal wa_position_rx : std_logic_vector(15 downto 0) := x"FFFF"; -signal tx_allow : std_logic; -signal rx_allow : std_logic; -signal tx_allow_q : std_logic; -signal rx_allow_q : std_logic; -signal link_phase_S : std_logic; --PL! -signal request_retr_i : std_logic; -signal start_retr_i : std_logic; -signal request_retr_position_i : std_logic_vector(7 downto 0); -signal start_retr_position_i : std_logic_vector(7 downto 0); -signal send_link_reset_i : std_logic; -signal make_link_reset_i : std_logic; -signal got_link_ready_i : std_logic; -signal internal_make_link_reset_out : std_logic; - -signal stat_rx_control_i : std_logic_vector(31 downto 0); -signal stat_tx_control_i : std_logic_vector(31 downto 0); -signal debug_rx_control_i : std_logic_vector(31 downto 0); -signal debug_tx_control_i : std_logic_vector(31 downto 0); -signal rx_fsm_state : std_logic_vector(3 downto 0); -signal tx_fsm_state : std_logic_vector(3 downto 0); -signal debug_reg : std_logic_vector(63 downto 0); +--signal refclk2core_S : std_logic; --PL! + +signal clk_200_i : std_logic; +signal clk_200_internal : std_logic; + +signal rst_n : std_logic; +signal rst : std_logic; -- PL! + +--------------------------- +-- signals for downlinks -- +--------------------------- +signal clk_rx_full : t_QUAD_BIT; +signal clk_rx_half : t_QUAD_BIT; +signal clk_tx_full : t_QUAD_BIT; +signal clk_tx_half : t_QUAD_BIT; + +signal tx_data : t_QUAD_BYTE; +signal tx_k : t_QUAD_BIT; +signal rx_data : t_QUAD_BYTE; +signal rx_k : t_QUAD_BIT; +signal rx_error : t_QUAD_BIT; + +signal rx_serdes_rst : t_QUAD_BIT; +signal tx_serdes_rst : t_QUAD_BIT; +signal tx_pcs_rst : t_QUAD_BIT; +signal rx_pcs_rst : t_QUAD_BIT; +signal rst_qd : t_QUAD_BIT; +signal serdes_rst_qd : t_QUAD_BIT; +signal sd_los_i : t_QUAD_BIT; --PL! + +signal rx_los_low : t_QUAD_BIT; +signal lsm_status : t_QUAD_BIT; +signal rx_cdr_lol : t_QUAD_BIT; +signal tx_pll_lol : t_QUAD_BIT; + +signal wa_position : t_QUAD_WORD := (others => (others => '1')); +signal wa_position_rx : t_QUAD_WORD := (others => (others => '1')); +signal tx_allow : t_QUAD_BIT; +signal rx_allow : t_QUAD_BIT; +signal tx_allow_q : t_QUAD_BIT; +signal rx_allow_q : t_QUAD_BIT; +signal link_phase_S : t_QUAD_BIT; --PL! +signal request_retr_i : t_QUAD_BIT; +signal start_retr_i : t_QUAD_BIT; +signal request_retr_position_i : t_QUAD_BYTE; +signal start_retr_position_i : t_QUAD_BYTE; +signal send_link_reset_i : t_QUAD_BIT; +signal make_link_reset_i : t_QUAD_BIT; +signal got_link_ready_i : t_QUAD_BIT; +signal internal_make_link_reset_out : t_QUAD_BIT; + +signal stat_rx_control_i : t_QUAD_LWORD; +signal stat_tx_control_i : t_QUAD_LWORD; +signal debug_rx_control_i : t_QUAD_LWORD; +signal debug_tx_control_i : t_QUAD_LWORD; +signal rx_fsm_state : t_QUAD_NIBL; +signal tx_fsm_state : t_QUAD_NIBL; + + +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 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 : unsigned(12 downto 0) := (others => '0'); -signal start_timer : unsigned(18 downto 0) := (others => '0'); -signal watchdog_timer : unsigned(20 downto 0) := (others => '0'); -signal watchdog_trigger : std_logic :='0'; +signal sci_state : sci_ctrl; +signal sci_timer : unsigned(12 downto 0) := (others => '0'); +signal start_timer : unsigned(18 downto 0) := (others => '0'); +signal watchdog_timer : unsigned(20 downto 0) := (others => '0'); +signal watchdog_trigger : std_logic :='0'; begin -clk_200_internal <= CLK; +clk_200_internal <= CLK; -CLK_RX_HALF_OUT <= clk_rx_half; -CLK_RX_FULL_OUT <= clk_rx_full; -CLK_TX_HALF_OUT <= clk_tx_half; -CLK_TX_FULL_OUT <= clk_tx_full; +CLK_RX_HALF_OUT <= clk_rx_half(0); +CLK_RX_FULL_OUT <= clk_rx_full(0); +CLK_TX_HALF_OUT <= clk_tx_half(0); +CLK_TX_FULL_OUT <= clk_tx_full(0); -SD_TXDIS_OUT <= '0'; --not (rx_allow_q or not IS_SLAVE); --slave only switches on when RX is ready +SD_TXDIS_OUT <= (others => '0'); --not (rx_allow_q or not IS_SLAVE); --slave only switches on when RX is ready ---rst_n <= not CLEAR; PL! -rst_n <= not(CLEAR or sd_los_i or internal_make_link_reset_out or watchdog_trigger); -rst <= (CLEAR or sd_los_i or internal_make_link_reset_out or watchdog_trigger); +--rst_n <= not CLEAR; PL! +--rst_n <= not(CLEAR or sd_los_i or internal_make_link_reset_out or watchdog_trigger); +--rst <= (CLEAR or sd_los_i or internal_make_link_reset_out or watchdog_trigger); +rst_n <= 0 when (CLEAR='1') or (sd_los_i='1') or (internal_make_link_reset_out='1') or (watchdog_trigger='1') else '1'; +rst <= 1 when (CLEAR='1') or (sd_los_i='1') or (internal_make_link_reset_out='1') or (watchdog_trigger='1') else '0'; gen_slave_clock : if IS_SYNC_SLAVE = c_YES generate @@ -206,83 +215,195 @@ end generate; -- Serdes ------------------------------------------------- THE_SERDES : entity work.serdes_sync_downstream - port map( --- refclkp => PCSA_REFCLKP, -- external refclock straight into serdes PL! --- refclkn => PCSA_REFCLKN, -- external refclock straight into serdes PL! - hdinp_ch0 => SD_RXD_P_IN, - hdinn_ch0 => SD_RXD_N_IN, - hdoutp_ch0 => SD_TXD_P_OUT, - hdoutn_ch0 => SD_TXD_N_OUT, --- rxiclk_ch0 => clk_200_i, -- read fifo is no longer present! PL! - txiclk_ch0 => clk_200_i, - rx_full_clk_ch0 => clk_rx_full, - rx_half_clk_ch0 => clk_rx_half, - tx_full_clk_ch0 => clk_tx_full, - tx_half_clk_ch0 => clk_tx_half, - fpga_rxrefclk_ch0 => clk_200_internal, - txdata_ch0 => tx_data, - tx_k_ch0 => tx_k, - tx_force_disp_ch0 => '0', - tx_disp_sel_ch0 => '0', - rxdata_ch0 => rx_data, - rx_k_ch0 => rx_k, - rx_disp_err_ch0 => open, - rx_cv_err_ch0 => rx_error, - rx_serdes_rst_ch0_c => rx_serdes_rst, - sb_felb_ch0_c => '0', - sb_felb_rst_ch0_c => '0', - tx_pcs_rst_ch0_c => tx_pcs_rst, - tx_pwrup_ch0_c => '1', - rx_pcs_rst_ch0_c => rx_pcs_rst, - rx_pwrup_ch0_c => '1', - rx_los_low_ch0_s => rx_los_low, - lsm_status_ch0_s => lsm_status, - rx_cdr_lol_ch0_s => rx_cdr_lol, - tx_div2_mode_ch0_c => '0', - rx_div2_mode_ch0_c => '0', - refclk2fpga => open, --refclk2core_S, - - 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_SEL_CH0 => sci_ch_i(0), - SCI_RD => sci_read_i, - SCI_WRN => sci_write_i, - - fpga_txrefclk => clk_200_i, - tx_serdes_rst_c => tx_serdes_rst, - tx_pll_lol_qd_s => tx_pll_lol, - rst_qd_c => rst_qd, - serdes_rst_qd_c => serdes_rst_qd + 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_i, -- read fifo is no longer present! PL! + txiclk_ch0 => clk_200_i, + rx_full_clk_ch0 => clk_rx_full(0), + rx_half_clk_ch0 => clk_rx_half(0), + tx_full_clk_ch0 => clk_tx_full(0), + tx_half_clk_ch0 => clk_tx_half(0), + fpga_rxrefclk_ch0 => clk_200_internal, + 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_pwr_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_i, -- read fifo is no longer present! PL! + txiclk_ch1 => clk_200_i, + rx_full_clk_ch1 => clk_rx_full(1), + rx_half_clk_ch1 => clk_rx_half(1), + tx_full_clk_ch1 => clk_tx_full(1), + tx_half_clk_ch1 => clk_tx_half(1), + fpga_rxrefclk_ch1 => clk_200_internal, + 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_pwr_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_i, -- read fifo is no longer present! PL! + txiclk_ch2 => clk_200_i, + rx_full_clk_ch2 => clk_rx_full(2), + rx_half_clk_ch2 => clk_rx_half(2), + tx_full_clk_ch2 => clk_tx_full(2), + tx_half_clk_ch2 => clk_tx_half(2), + fpga_rxrefclk_ch2 => clk_200_internal, + 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_pwr_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_i, -- read fifo is no longer present! PL! + txiclk_ch3 => clk_200_i, + rx_full_clk_ch3 => clk_rx_full(3), + rx_half_clk_ch3 => clk_rx_half(3), + tx_full_clk_ch3 => clk_tx_full(3), + tx_half_clk_ch3 => clk_tx_half(3), + fpga_rxrefclk_ch3 => clk_200_internal, + 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_pwr_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', + + + refclk2fpga => open, --refclk2core_S, + + 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_SEL_CH0 => sci_ch_i(0), + SCI_RD => sci_read_i, + SCI_WRN => sci_write_i, + + fpga_txrefclk => clk_200_i, + tx_serdes_rst_c => tx_serdes_rst, + tx_pll_lol_qd_s => tx_pll_lol, + rst_qd_c => rst_qd, + serdes_rst_qd_c => serdes_rst_qd - ); +); -------------------------------------------------- --- Reset FSM & Link states -------------------------------------------------- -THE_RX_FSM : rx_reset_fsm - port map( - RST_N => rst_n, - RX_REFCLK => clk_200_i, - TX_PLL_LOL_QD_S => tx_pll_lol, - RX_SERDES_RST_CH_C => rx_serdes_rst, - RX_CDR_LOL_CH_S => rx_cdr_lol, - RX_LOS_LOW_CH_S => rx_los_low, - RX_PCS_RST_CH_C => rx_pcs_rst, - WA_POSITION => wa_position_rx(3 downto 0), - STATE_OUT => rx_fsm_state - ); - -THE_TX_FSM : tx_reset_fsm - port map( - RST_N => rst_n, - TX_REFCLK => clk_200_internal, - TX_PLL_LOL_QD_S => tx_pll_lol, - RST_QD_C => rst_qd, - TX_PCS_RST_CH_C => tx_pcs_rst, - STATE_OUT => tx_fsm_state - ); + +channel :for i in c_HUB_CHILDREN-1 downto 0 generate + + ------------------------------------------------- + -- Reset FSM & DOWN-link states + ------------------------------------------------- + THE_RX_FSM : rx_reset_fsm + port map( + RST_N => rst_n, + RX_REFCLK => clk_200_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)(3 downto 0), + STATE_OUT => rx_fsm_state(i) + ); + + THE_TX_FSM : tx_reset_fsm + port map( + RST_N => rst_n, + TX_REFCLK => clk_200_internal, + TX_PLL_LOL_QD_S => tx_pll_lol, + RST_QD_C => rst_qd, + TX_PCS_RST_CH_C => tx_pcs_rst, + STATE_OUT => tx_fsm_state + ); +end generate; -- Master does not do bit-locking wa_position_rx <= wa_position when (IS_SYNC_SLAVE = c_YES) else x"0000"; @@ -306,17 +427,6 @@ end process; rx_allow_q <= rx_allow when rising_edge(SYSCLK); tx_allow_q <= tx_allow when rising_edge(SYSCLK); - ---PROC_START_TIMER : process begin - --wait until rising_edge(clk_200_i); - --if got_link_ready_i = '1' then - --if start_timer(start_timer'left) = '0' then - --start_timer <= start_timer + 1; - --end if; - --else - --start_timer <= (others => '0'); - --end if; ---end process; PROC_START_TIMER : process(clk_200_i) begin @@ -363,21 +473,21 @@ THE_TX : soda_tx_control START_RETRANSMIT_IN => start_retr_i, --TODO START_POSITION_IN => request_retr_position_i, --TODO - + TX_DLM_PREVIEW_IN => TX_DLM_PREVIEW_IN, SEND_DLM => TX_DLM, SEND_DLM_WORD => TX_DLM_WORD, - SEND_LINK_RESET_IN => CTRL_OP(15), + SEND_link_RESET_IN => CTRL_OP(15), TX_ALLOW_IN => tx_allow, - RX_ALLOW_IN => rx_allow, - LINK_PHASE_OUT => link_phase_S, --PL! + RX_ALLOW_IN => rx_allow, + link_PHASE_OUT => link_phase_S, --PL! DEBUG_OUT => debug_tx_control_i, STAT_REG_OUT => stat_tx_control_i ); -LINK_PHASE_OUT <= link_phase_S; --PL! +link_PHASE_OUT <= link_phase_S; --PL! ------------------------------------------------- -- RX Data ------------------------------------------------- @@ -405,10 +515,10 @@ THE_RX_CONTROL : rx_control RX_DLM => RX_DLM, RX_DLM_WORD => RX_DLM_WORD, - SEND_LINK_RESET_OUT => send_link_reset_i, + SEND_link_RESET_OUT => send_link_reset_i, MAKE_RESET_OUT => make_link_reset_i, RX_ALLOW_IN => rx_allow, - GOT_LINK_READY => got_link_ready_i, + GOT_link_READY => got_link_ready_i, DEBUG_OUT => debug_rx_control_i, STAT_REG_OUT => stat_rx_control_i @@ -547,5 +657,4 @@ STAT_OP(6) <= make_link_reset_i; STAT_OP(5) <= request_retr_i; STAT_OP(4) <= start_retr_i; STAT_OP(3 downto 0) <= x"0" when rx_allow_q = '1' and tx_allow_q = '1' else x"7"; -end med_ecp3_sfp_sync_down_arch; - +end med_ecp3_sfp_sync_down_arch; \ No newline at end of file diff --git a/source/med_ecp3_sfp_sync_up.vhd b/source/med_ecp3_sfp_sync_up.vhd index 7295d51..c96cf4a 100644 --- a/source/med_ecp3_sfp_sync_up.vhd +++ b/source/med_ecp3_sfp_sync_up.vhd @@ -218,43 +218,43 @@ end generate; ------------------------------------------------- THE_SERDES : entity work.serdes_sync_upstream port map( - hdinp_ch0 => SD_RXD_P_IN, - hdinn_ch0 => SD_RXD_N_IN, - hdoutp_ch0 => SD_TXD_P_OUT, - hdoutn_ch0 => SD_TXD_N_OUT, --- rxiclk_ch0 => clk_200_i, -- no more RX-fifo - txiclk_ch0 => clk_200_i, - rx_full_clk_ch0 => clk_rx_full, - rx_half_clk_ch0 => clk_rx_half, - tx_full_clk_ch0 => clk_tx_full, - tx_half_clk_ch0 => clk_tx_half, - fpga_rxrefclk_ch0 => clk_200_internal, - txdata_ch0 => tx_data, - tx_k_ch0 => tx_k, - tx_force_disp_ch0 => '0', - tx_disp_sel_ch0 => '0', - rxdata_ch0 => rx_data, - rx_k_ch0 => rx_k, - rx_disp_err_ch0 => open, - rx_cv_err_ch0 => rx_error, - rx_serdes_rst_ch0_c => rx_serdes_rst, - sb_felb_ch0_c => '0', - sb_felb_rst_ch0_c => '0', - tx_pcs_rst_ch0_c => tx_pcs_rst, - tx_pwrup_ch0_c => '1', - rx_pcs_rst_ch0_c => rx_pcs_rst, - rx_pwrup_ch0_c => '1', - rx_los_low_ch0_s => rx_los_low, - lsm_status_ch0_s => lsm_status, - rx_cdr_lol_ch0_s => rx_cdr_lol, - tx_div2_mode_ch0_c => '0', - rx_div2_mode_ch0_c => '0', + hdinp_ch3 => SD_RXD_P_IN, + hdinn_ch3 => SD_RXD_N_IN, + hdoutp_ch3 => SD_TXD_P_OUT, + hdoutn_ch3 => SD_TXD_N_OUT, +-- rxiclk_ch3 => clk_200_i, -- no more RX-fifo + txiclk_ch3 => clk_200_i, + rx_full_clk_ch3 => clk_rx_full, + rx_half_clk_ch3 => clk_rx_half, + tx_full_clk_ch3 => clk_tx_full, + tx_half_clk_ch3 => clk_tx_half, + fpga_rxrefclk_ch3 => clk_200_internal, + txdata_ch3 => tx_data, + tx_k_ch3 => tx_k, + tx_force_disp_ch3 => '0', + tx_disp_sel_ch3 => '0', + rxdata_ch3 => rx_data, + rx_k_ch3 => rx_k, + rx_disp_err_ch3 => open, + rx_cv_err_ch3 => rx_error, + rx_serdes_rst_ch3_c => rx_serdes_rst, + sb_felb_ch3_c => '0', + sb_felb_rst_ch3_c => '0', + tx_pcs_rst_ch3_c => tx_pcs_rst, + tx_pwrup_ch3_c => '1', + rx_pcs_rst_ch3_c => rx_pcs_rst, + rx_pwrup_ch3_c => '1', + rx_los_low_ch3_s => rx_los_low, + lsm_status_ch3_s => lsm_status, + rx_cdr_lol_ch3_s => rx_cdr_lol, + tx_div2_mode_ch3_c => '0', + rx_div2_mode_ch3_c => '0', 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_SEL_CH0 => sci_ch_i(0), + SCI_SEL_CH3 => sci_ch_i(0), SCI_RD => sci_read_i, SCI_WRN => sci_write_i, diff --git a/source/serdes_sync_downstream.ipx b/source/serdes_sync_downstream.ipx index d3573a3..9537910 100644 --- a/source/serdes_sync_downstream.ipx +++ b/source/serdes_sync_downstream.ipx @@ -1,11 +1,11 @@ - + - - - - - - + + + + + + diff --git a/source/serdes_sync_downstream.lpc b/source/serdes_sync_downstream.lpc index 9f4ab45..f11341b 100644 --- a/source/serdes_sync_downstream.lpc +++ b/source/serdes_sync_downstream.lpc @@ -16,8 +16,8 @@ CoreRevision=8.1 ModuleName=serdes_sync_downstream SourceFormat=VHDL ParameterFileVersion=1.0 -Date=01/21/2014 -Time=12:02:01 +Date=02/04/2014 +Time=15:43:06 [Parameters] Verilog=0 @@ -28,9 +28,9 @@ Expression=BusA(0 to 7) Order=Big Endian [MSB:LSB] IO=0 _mode0=RXTX -_mode1=DISABLED -_mode2=DISABLED -_mode3=DISABLED +_mode1=RXTX +_mode2=RXTX +_mode3=RXTX _protocol0=G8B10B _protocol1=G8B10B _protocol2=G8B10B @@ -44,9 +44,9 @@ _pll_txsrc=INTERNAL _refclk_mult=10X _refclk_rate=200 _tx_protocol0=G8B10B -_tx_protocol1=DISABLED -_tx_protocol2=DISABLED -_tx_protocol3=DISABLED +_tx_protocol1=G8B10B +_tx_protocol2=G8B10B +_tx_protocol3=G8B10B _tx_data_rate0=FULL _tx_data_rate1=FULL _tx_data_rate2=FULL @@ -64,41 +64,41 @@ _tx_ficlk_rate1=200 _tx_ficlk_rate2=200 _tx_ficlk_rate3=200 _pll_rxsrc0=INTERNAL -_pll_rxsrc1=EXTERNAL -_pll_rxsrc2=EXTERNAL -_pll_rxsrc3=EXTERNAL +_pll_rxsrc1=INTERNAL +_pll_rxsrc2=INTERNAL +_pll_rxsrc3=INTERNAL Multiplier0= Multiplier1= Multiplier2= Multiplier3= _rx_datarange0=2 -_rx_datarange1=2.5 -_rx_datarange2=2.5 -_rx_datarange3=2.5 +_rx_datarange1=2 +_rx_datarange2=2 +_rx_datarange3=2 _rx_protocol0=G8B10B -_rx_protocol1=DISABLED -_rx_protocol2=DISABLED -_rx_protocol3=DISABLED +_rx_protocol1=G8B10B +_rx_protocol2=G8B10B +_rx_protocol3=G8B10B _rx_data_rate0=FULL _rx_data_rate1=FULL _rx_data_rate2=FULL _rx_data_rate3=FULL _rxrefclk_rate0=200 -_rxrefclk_rate1=250.0 -_rxrefclk_rate2=250.0 -_rxrefclk_rate3=250.0 +_rxrefclk_rate1=200 +_rxrefclk_rate2=200 +_rxrefclk_rate3=200 _rx_data_width0=8 _rx_data_width1=8 _rx_data_width2=8 _rx_data_width3=8 _rx_fifo0=DISABLED -_rx_fifo1=ENABLED -_rx_fifo2=ENABLED -_rx_fifo3=ENABLED +_rx_fifo1=DISABLED +_rx_fifo2=DISABLED +_rx_fifo3=DISABLED _rx_ficlk_rate0=200 -_rx_ficlk_rate1=250.0 -_rx_ficlk_rate2=250.0 -_rx_ficlk_rate3=250.0 +_rx_ficlk_rate1=200 +_rx_ficlk_rate2=200 +_rx_ficlk_rate3=200 _tdrv_ch0=0 _tdrv_ch1=0 _tdrv_ch2=0 @@ -120,9 +120,9 @@ _rterm_rx1=50 _rterm_rx2=50 _rterm_rx3=50 _rx_dcc0=DC -_rx_dcc1=AC -_rx_dcc2=AC -_rx_dcc3=AC +_rx_dcc1=DC +_rx_dcc2=DC +_rx_dcc3=DC _los_threshold_mode0=LOS_E _los_threshold_mode1=LOS_E _los_threshold_mode2=LOS_E @@ -191,9 +191,9 @@ _cc_match_mode1=1 _cc_match_mode2=1 _cc_match_mode3=1 _k00=01 -_k01=00 -_k02=00 -_k03=00 +_k01=01 +_k02=01 +_k03=01 _k10=00 _k11=00 _k12=00 @@ -207,9 +207,9 @@ _k31=01 _k32=01 _k33=01 _byten00=00011100 -_byten01=00000000 -_byten02=00000000 -_byten03=00000000 +_byten01=00011100 +_byten02=00011100 +_byten03=00011100 _byten10=00000000 _byten11=00000000 _byten12=00000000 diff --git a/source/serdes_sync_downstream.txt b/source/serdes_sync_downstream.txt index ec77632..2bb812f 100644 --- a/source/serdes_sync_downstream.txt +++ b/source/serdes_sync_downstream.txt @@ -5,53 +5,158 @@ DEVICE_NAME "LFE3-150EA" CH0_PROTOCOL "G8B10B" +CH1_PROTOCOL "G8B10B" +CH2_PROTOCOL "G8B10B" +CH3_PROTOCOL "G8B10B" CH0_MODE "RXTX" -CH1_MODE "DISABLED" -CH2_MODE "DISABLED" -CH3_MODE "DISABLED" +CH1_MODE "RXTX" +CH2_MODE "RXTX" +CH3_MODE "RXTX" CH0_CDR_SRC "REFCLK_CORE" +CH1_CDR_SRC "REFCLK_CORE" +CH2_CDR_SRC "REFCLK_CORE" +CH3_CDR_SRC "REFCLK_CORE" PLL_SRC "REFCLK_CORE" TX_DATARATE_RANGE "MEDHIGH" CH0_RX_DATARATE_RANGE "MEDHIGH" +CH1_RX_DATARATE_RANGE "MEDHIGH" +CH2_RX_DATARATE_RANGE "MEDHIGH" +CH3_RX_DATARATE_RANGE "MEDHIGH" REFCK_MULT "10X" #REFCLK_RATE 200 CH0_RX_DATA_RATE "FULL" +CH1_RX_DATA_RATE "FULL" +CH2_RX_DATA_RATE "FULL" +CH3_RX_DATA_RATE "FULL" CH0_TX_DATA_RATE "FULL" +CH1_TX_DATA_RATE "FULL" +CH2_TX_DATA_RATE "FULL" +CH3_TX_DATA_RATE "FULL" CH0_TX_DATA_WIDTH "8" +CH1_TX_DATA_WIDTH "8" +CH2_TX_DATA_WIDTH "8" +CH3_TX_DATA_WIDTH "8" CH0_RX_DATA_WIDTH "8" +CH1_RX_DATA_WIDTH "8" +CH2_RX_DATA_WIDTH "8" +CH3_RX_DATA_WIDTH "8" CH0_TX_FIFO "DISABLED" +CH1_TX_FIFO "ENABLED" +CH2_TX_FIFO "ENABLED" +CH3_TX_FIFO "ENABLED" CH0_RX_FIFO "DISABLED" +CH1_RX_FIFO "DISABLED" +CH2_RX_FIFO "DISABLED" +CH3_RX_FIFO "DISABLED" CH0_TDRV "0" +CH1_TDRV "0" +CH2_TDRV "0" +CH3_TDRV "0" #CH0_TX_FICLK_RATE 200 +#CH1_TX_FICLK_RATE 200 +#CH2_TX_FICLK_RATE 200 +#CH3_TX_FICLK_RATE 200 #CH0_RXREFCLK_RATE "200" +#CH1_RXREFCLK_RATE "200" +#CH2_RXREFCLK_RATE "200" +#CH3_RXREFCLK_RATE "200" #CH0_RX_FICLK_RATE 200 +#CH1_RX_FICLK_RATE 200 +#CH2_RX_FICLK_RATE 200 +#CH3_RX_FICLK_RATE 200 CH0_TX_PRE "DISABLED" +CH1_TX_PRE "DISABLED" +CH2_TX_PRE "DISABLED" +CH3_TX_PRE "DISABLED" CH0_RTERM_TX "50" +CH1_RTERM_TX "50" +CH2_RTERM_TX "50" +CH3_RTERM_TX "50" CH0_RX_EQ "DISABLED" +CH1_RX_EQ "DISABLED" +CH2_RX_EQ "DISABLED" +CH3_RX_EQ "DISABLED" CH0_RTERM_RX "50" +CH1_RTERM_RX "50" +CH2_RTERM_RX "50" +CH3_RTERM_RX "50" CH0_RX_DCC "DC" +CH1_RX_DCC "DC" +CH2_RX_DCC "DC" +CH3_RX_DCC "DC" CH0_LOS_THRESHOLD_LO "2" +CH1_LOS_THRESHOLD_LO "2" +CH2_LOS_THRESHOLD_LO "2" +CH3_LOS_THRESHOLD_LO "2" PLL_TERM "50" PLL_DCC "AC" PLL_LOL_SET "0" CH0_TX_SB "DISABLED" +CH1_TX_SB "DISABLED" +CH2_TX_SB "DISABLED" +CH3_TX_SB "DISABLED" CH0_RX_SB "DISABLED" +CH1_RX_SB "DISABLED" +CH2_RX_SB "DISABLED" +CH3_RX_SB "DISABLED" CH0_TX_8B10B "ENABLED" +CH1_TX_8B10B "ENABLED" +CH2_TX_8B10B "ENABLED" +CH3_TX_8B10B "ENABLED" CH0_RX_8B10B "ENABLED" +CH1_RX_8B10B "ENABLED" +CH2_RX_8B10B "ENABLED" +CH3_RX_8B10B "ENABLED" CH0_COMMA_A "1100000101" +CH1_COMMA_A "1100000101" +CH2_COMMA_A "1100000101" +CH3_COMMA_A "1100000101" CH0_COMMA_B "0011111010" +CH1_COMMA_B "0011111010" +CH2_COMMA_B "0011111010" +CH3_COMMA_B "0011111010" CH0_COMMA_M "1111111100" +CH1_COMMA_M "1111111100" +CH2_COMMA_M "1111111100" +CH3_COMMA_M "1111111100" CH0_RXWA "ENABLED" +CH1_RXWA "ENABLED" +CH2_RXWA "ENABLED" +CH3_RXWA "ENABLED" CH0_ILSM "ENABLED" +CH1_ILSM "ENABLED" +CH2_ILSM "ENABLED" +CH3_ILSM "ENABLED" CH0_CTC "DISABLED" +CH1_CTC "DISABLED" +CH2_CTC "DISABLED" +CH3_CTC "DISABLED" CH0_CC_MATCH4 "0100011100" +CH1_CC_MATCH4 "0100011100" +CH2_CC_MATCH4 "0100011100" +CH3_CC_MATCH4 "0100011100" CH0_CC_MATCH_MODE "1" +CH1_CC_MATCH_MODE "1" +CH2_CC_MATCH_MODE "1" +CH3_CC_MATCH_MODE "1" CH0_CC_MIN_IPG "3" +CH1_CC_MIN_IPG "3" +CH2_CC_MIN_IPG "3" +CH3_CC_MIN_IPG "3" CCHMARK "9" CCLMARK "7" CH0_SSLB "DISABLED" +CH1_SSLB "DISABLED" +CH2_SSLB "DISABLED" +CH3_SSLB "DISABLED" CH0_SPLBPORTS "DISABLED" +CH1_SPLBPORTS "DISABLED" +CH2_SPLBPORTS "DISABLED" +CH3_SPLBPORTS "DISABLED" CH0_PCSLBPORTS "DISABLED" +CH1_PCSLBPORTS "DISABLED" +CH2_PCSLBPORTS "DISABLED" +CH3_PCSLBPORTS "DISABLED" INT_ALL "DISABLED" QD_REFCK2CORE "ENABLED" diff --git a/source/serdes_sync_downstream.vhd b/source/serdes_sync_downstream.vhd index 17cfd20..c5eaff8 100644 --- a/source/serdes_sync_downstream.vhd +++ b/source/serdes_sync_downstream.vhd @@ -20,9 +20,9 @@ GENERIC( -- CONFIG_FILE : String := "serdes_sync_downstream.txt"; -- QUAD_MODE : String := "SINGLE"; -- CH0_CDR_SRC : String := "REFCLK_CORE"; --- CH1_CDR_SRC : String := "REFCLK_EXT"; --- CH2_CDR_SRC : String := "REFCLK_EXT"; --- CH3_CDR_SRC : String := "REFCLK_EXT"; +-- CH1_CDR_SRC : String := "REFCLK_CORE"; +-- CH2_CDR_SRC : String := "REFCLK_CORE"; +-- CH3_CDR_SRC : String := "REFCLK_CORE"; -- PLL_SRC : String := "REFCLK_CORE" ); port ( @@ -1558,15 +1558,102 @@ entity serdes_sync_downstream is tx_pcs_rst_ch0_c : in std_logic; tx_pwrup_ch0_c : in std_logic; rx_pcs_rst_ch0_c : in std_logic; - rx_pwrup_ch0_c : in std_logic; + rx_pwr_ch0_c : in std_logic; rx_los_low_ch0_s : out std_logic; lsm_status_ch0_s : out std_logic; rx_cdr_lol_ch0_s : out std_logic; tx_div2_mode_ch0_c : in std_logic; rx_div2_mode_ch0_c : in std_logic; -- CH1 -- + hdinp_ch1, hdinn_ch1 : in std_logic; + hdoutp_ch1, hdoutn_ch1 : out std_logic; + sci_sel_ch1 : in std_logic; + txiclk_ch1 : in std_logic; + rx_full_clk_ch1 : out std_logic; + rx_half_clk_ch1 : out std_logic; + tx_full_clk_ch1 : out std_logic; + tx_half_clk_ch1 : out std_logic; + fpga_rxrefclk_ch1 : in std_logic; + txdata_ch1 : in std_logic_vector (7 downto 0); + tx_k_ch1 : in std_logic; + tx_force_disp_ch1 : in std_logic; + tx_disp_sel_ch1 : in std_logic; + rxdata_ch1 : out std_logic_vector (7 downto 0); + rx_k_ch1 : out std_logic; + rx_disp_err_ch1 : out std_logic; + rx_cv_err_ch1 : out std_logic; + rx_serdes_rst_ch1_c : in std_logic; + sb_felb_ch1_c : in std_logic; + sb_felb_rst_ch1_c : in std_logic; + tx_pcs_rst_ch1_c : in std_logic; + tx_pwrup_ch1_c : in std_logic; + rx_pcs_rst_ch1_c : in std_logic; + rx_pwr_ch1_c : in std_logic; + rx_los_low_ch1_s : out std_logic; + lsm_status_ch1_s : out std_logic; + rx_cdr_lol_ch1_s : out std_logic; + tx_div2_mode_ch1_c : in std_logic; + rx_div2_mode_ch1_c : in std_logic; -- CH2 -- + hdinp_ch2, hdinn_ch2 : in std_logic; + hdoutp_ch2, hdoutn_ch2 : out std_logic; + sci_sel_ch2 : in std_logic; + txiclk_ch2 : in std_logic; + rx_full_clk_ch2 : out std_logic; + rx_half_clk_ch2 : out std_logic; + tx_full_clk_ch2 : out std_logic; + tx_half_clk_ch2 : out std_logic; + fpga_rxrefclk_ch2 : in std_logic; + txdata_ch2 : in std_logic_vector (7 downto 0); + tx_k_ch2 : in std_logic; + tx_force_disp_ch2 : in std_logic; + tx_disp_sel_ch2 : in std_logic; + rxdata_ch2 : out std_logic_vector (7 downto 0); + rx_k_ch2 : out std_logic; + rx_disp_err_ch2 : out std_logic; + rx_cv_err_ch2 : out std_logic; + rx_serdes_rst_ch2_c : in std_logic; + sb_felb_ch2_c : in std_logic; + sb_felb_rst_ch2_c : in std_logic; + tx_pcs_rst_ch2_c : in std_logic; + tx_pwrup_ch2_c : in std_logic; + rx_pcs_rst_ch2_c : in std_logic; + rx_pwr_ch2_c : in std_logic; + rx_los_low_ch2_s : out std_logic; + lsm_status_ch2_s : out std_logic; + rx_cdr_lol_ch2_s : out std_logic; + tx_div2_mode_ch2_c : in std_logic; + rx_div2_mode_ch2_c : in std_logic; -- CH3 -- + hdinp_ch3, hdinn_ch3 : in std_logic; + hdoutp_ch3, hdoutn_ch3 : out std_logic; + sci_sel_ch3 : in std_logic; + txiclk_ch3 : in std_logic; + rx_full_clk_ch3 : out std_logic; + rx_half_clk_ch3 : out std_logic; + tx_full_clk_ch3 : out std_logic; + tx_half_clk_ch3 : out std_logic; + fpga_rxrefclk_ch3 : in std_logic; + txdata_ch3 : in std_logic_vector (7 downto 0); + tx_k_ch3 : in std_logic; + tx_force_disp_ch3 : in std_logic; + tx_disp_sel_ch3 : in std_logic; + rxdata_ch3 : out std_logic_vector (7 downto 0); + rx_k_ch3 : out std_logic; + rx_disp_err_ch3 : out std_logic; + rx_cv_err_ch3 : out std_logic; + rx_serdes_rst_ch3_c : in std_logic; + sb_felb_ch3_c : in std_logic; + sb_felb_rst_ch3_c : in std_logic; + tx_pcs_rst_ch3_c : in std_logic; + tx_pwrup_ch3_c : in std_logic; + rx_pcs_rst_ch3_c : in std_logic; + rx_pwr_ch3_c : in std_logic; + rx_los_low_ch3_s : out std_logic; + lsm_status_ch3_s : out std_logic; + rx_cdr_lol_ch3_s : out std_logic; + tx_div2_mode_ch3_c : in std_logic; + rx_div2_mode_ch3_c : in std_logic; ---- Miscillaneous ports sci_wrdata : in std_logic_vector (7 downto 0); sci_addr : in std_logic_vector (5 downto 0); @@ -1577,6 +1664,7 @@ entity serdes_sync_downstream is fpga_txrefclk : in std_logic; tx_serdes_rst_c : in std_logic; tx_pll_lol_qd_s : out std_logic; + tx_sync_qd_c : in std_logic; rst_qd_c : in std_logic; refclk2fpga : out std_logic; serdes_rst_qd_c : in std_logic); @@ -2104,22 +2192,28 @@ end component; attribute PLL_SRC of PCSD_INST : label is "REFCLK_CORE"; attribute CH0_CDR_SRC: string; attribute CH0_CDR_SRC of PCSD_INST : label is "REFCLK_CORE"; + attribute CH1_CDR_SRC: string; + attribute CH1_CDR_SRC of PCSD_INST : label is "REFCLK_CORE"; + attribute CH2_CDR_SRC: string; + attribute CH2_CDR_SRC of PCSD_INST : label is "REFCLK_CORE"; + attribute CH3_CDR_SRC: string; + attribute CH3_CDR_SRC of PCSD_INST : label is "REFCLK_CORE"; attribute FREQUENCY_PIN_FF_RX_F_CLK_0: string; attribute FREQUENCY_PIN_FF_RX_F_CLK_0 of PCSD_INST : label is "200"; attribute FREQUENCY_PIN_FF_RX_F_CLK_1: string; - attribute FREQUENCY_PIN_FF_RX_F_CLK_1 of PCSD_INST : label is "250.000"; + attribute FREQUENCY_PIN_FF_RX_F_CLK_1 of PCSD_INST : label is "200"; attribute FREQUENCY_PIN_FF_RX_F_CLK_2: string; - attribute FREQUENCY_PIN_FF_RX_F_CLK_2 of PCSD_INST : label is "250.000"; + attribute FREQUENCY_PIN_FF_RX_F_CLK_2 of PCSD_INST : label is "200"; attribute FREQUENCY_PIN_FF_RX_F_CLK_3: string; - attribute FREQUENCY_PIN_FF_RX_F_CLK_3 of PCSD_INST : label is "250.000"; + attribute FREQUENCY_PIN_FF_RX_F_CLK_3 of PCSD_INST : label is "200"; attribute FREQUENCY_PIN_FF_RX_H_CLK_0: string; attribute FREQUENCY_PIN_FF_RX_H_CLK_0 of PCSD_INST : label is "100"; attribute FREQUENCY_PIN_FF_RX_H_CLK_1: string; - attribute FREQUENCY_PIN_FF_RX_H_CLK_1 of PCSD_INST : label is "125.000"; + attribute FREQUENCY_PIN_FF_RX_H_CLK_1 of PCSD_INST : label is "100"; attribute FREQUENCY_PIN_FF_RX_H_CLK_2: string; - attribute FREQUENCY_PIN_FF_RX_H_CLK_2 of PCSD_INST : label is "125.000"; + attribute FREQUENCY_PIN_FF_RX_H_CLK_2 of PCSD_INST : label is "100"; attribute FREQUENCY_PIN_FF_RX_H_CLK_3: string; - attribute FREQUENCY_PIN_FF_RX_H_CLK_3 of PCSD_INST : label is "125.000"; + attribute FREQUENCY_PIN_FF_RX_H_CLK_3 of PCSD_INST : label is "100"; attribute FREQUENCY_PIN_FF_TX_F_CLK_0: string; attribute FREQUENCY_PIN_FF_TX_F_CLK_0 of PCSD_INST : label is "200"; attribute FREQUENCY_PIN_FF_TX_F_CLK_1: string; @@ -2147,6 +2241,9 @@ signal fpsc_vhi : std_logic := '1'; signal cin : std_logic_vector (11 downto 0) := "000000000000"; signal cout : std_logic_vector (19 downto 0); signal tx_full_clk_ch0_sig : std_logic; +signal tx_full_clk_ch1_sig : std_logic; +signal tx_full_clk_ch2_sig : std_logic; +signal tx_full_clk_ch3_sig : std_logic; signal refclk2fpga_sig : std_logic; signal tx_pll_lol_qd_sig : std_logic; @@ -2170,9 +2267,18 @@ vhi_inst : VHI port map(Z => fpsc_vhi); refclk2fpga <= refclk2fpga_sig; rx_los_low_ch0_s <= rx_los_low_ch0_sig; + rx_los_low_ch1_s <= rx_los_low_ch1_sig; + rx_los_low_ch2_s <= rx_los_low_ch2_sig; + rx_los_low_ch3_s <= rx_los_low_ch3_sig; rx_cdr_lol_ch0_s <= rx_cdr_lol_ch0_sig; + rx_cdr_lol_ch1_s <= rx_cdr_lol_ch1_sig; + rx_cdr_lol_ch2_s <= rx_cdr_lol_ch2_sig; + rx_cdr_lol_ch3_s <= rx_cdr_lol_ch3_sig; tx_pll_lol_qd_s <= tx_pll_lol_qd_sig; tx_full_clk_ch0 <= tx_full_clk_ch0_sig; + tx_full_clk_ch1 <= tx_full_clk_ch1_sig; + tx_full_clk_ch2 <= tx_full_clk_ch2_sig; + tx_full_clk_ch3 <= tx_full_clk_ch3_sig; -- pcs_quad instance PCSD_INST : PCSD @@ -2180,6 +2286,9 @@ PCSD_INST : PCSD generic map (CONFIG_FILE => USER_CONFIG_FILE, QUAD_MODE => "SINGLE", CH0_CDR_SRC => "REFCLK_CORE", + CH1_CDR_SRC => "REFCLK_CORE", + CH2_CDR_SRC => "REFCLK_CORE", + CH3_CDR_SRC => "REFCLK_CORE", PLL_SRC => "REFCLK_CORE" ) --synopsys translate_on @@ -2271,7 +2380,7 @@ port map ( FFC_LANE_TX_RST_0 => tx_pcs_rst_ch0_c, FFC_TXPWDNB_0 => tx_pwrup_ch0_c, FFC_LANE_RX_RST_0 => rx_pcs_rst_ch0_c, - FFC_RXPWDNB_0 => rx_pwrup_ch0_c, + FFC_RXPWDNB_0 => rx_pwr_ch0_c, FFS_RLOS_LO_0 => rx_los_low_ch0_sig, FFS_RLOS_HI_0 => open, FFS_PCIE_CON_0 => open, @@ -2294,10 +2403,10 @@ port map ( FFC_RATE_MODE_RX_0 => rx_div2_mode_ch0_c, ----- CH1 ----- - HDOUTP1 => open, - HDOUTN1 => open, - HDINP1 => fpsc_vlo, - HDINN1 => fpsc_vlo, + HDOUTP1 => hdoutp_ch1, + HDOUTN1 => hdoutn_ch1, + HDINP1 => hdinp_ch1, + HDINN1 => hdinn_ch1, PCIE_TXDETRX_PR2TLB_1 => fpsc_vlo, PCIE_TXCOMPLIANCE_1 => fpsc_vlo, PCIE_RXPOLARITY_1 => fpsc_vlo, @@ -2305,27 +2414,27 @@ port map ( PCIE_POWERDOWN_1_1 => fpsc_vlo, PCIE_RXVALID_1 => open, PCIE_PHYSTATUS_1 => open, - SCISELCH1 => fpsc_vlo, - SCIENCH1 => fpsc_vlo, + SCISELCH1 => sci_sel_ch1, + SCIENCH1 => fpsc_vhi, FF_RXI_CLK_1 => fpsc_vlo, - FF_TXI_CLK_1 => fpsc_vlo, + FF_TXI_CLK_1 => txiclk_ch1, FF_EBRD_CLK_1 => fpsc_vlo, - FF_RX_F_CLK_1 => open, - FF_RX_H_CLK_1 => open, - FF_TX_F_CLK_1 => open, - FF_TX_H_CLK_1 => open, - FFC_CK_CORE_RX_1 => fpsc_vlo, - FF_TX_D_1_0 => fpsc_vlo, - FF_TX_D_1_1 => fpsc_vlo, - FF_TX_D_1_2 => fpsc_vlo, - FF_TX_D_1_3 => fpsc_vlo, - FF_TX_D_1_4 => fpsc_vlo, - FF_TX_D_1_5 => fpsc_vlo, - FF_TX_D_1_6 => fpsc_vlo, - FF_TX_D_1_7 => fpsc_vlo, - FF_TX_D_1_8 => fpsc_vlo, - FF_TX_D_1_9 => fpsc_vlo, - FF_TX_D_1_10 => fpsc_vlo, + FF_RX_F_CLK_1 => rx_full_clk_ch1, + FF_RX_H_CLK_1 => rx_half_clk_ch1, + FF_TX_F_CLK_1 => tx_full_clk_ch1_sig, + FF_TX_H_CLK_1 => tx_half_clk_ch1, + FFC_CK_CORE_RX_1 => fpga_rxrefclk_ch1, + FF_TX_D_1_0 => txdata_ch1(0), + FF_TX_D_1_1 => txdata_ch1(1), + FF_TX_D_1_2 => txdata_ch1(2), + FF_TX_D_1_3 => txdata_ch1(3), + FF_TX_D_1_4 => txdata_ch1(4), + FF_TX_D_1_5 => txdata_ch1(5), + FF_TX_D_1_6 => txdata_ch1(6), + FF_TX_D_1_7 => txdata_ch1(7), + FF_TX_D_1_8 => tx_k_ch1, + FF_TX_D_1_9 => tx_force_disp_ch1, + FF_TX_D_1_10 => tx_disp_sel_ch1, FF_TX_D_1_11 => fpsc_vlo, FF_TX_D_1_12 => fpsc_vlo, FF_TX_D_1_13 => fpsc_vlo, @@ -2339,17 +2448,17 @@ port map ( FF_TX_D_1_21 => fpsc_vlo, FF_TX_D_1_22 => fpsc_vlo, FF_TX_D_1_23 => fpsc_vlo, - FF_RX_D_1_0 => open, - FF_RX_D_1_1 => open, - FF_RX_D_1_2 => open, - FF_RX_D_1_3 => open, - FF_RX_D_1_4 => open, - FF_RX_D_1_5 => open, - FF_RX_D_1_6 => open, - FF_RX_D_1_7 => open, - FF_RX_D_1_8 => open, - FF_RX_D_1_9 => open, - FF_RX_D_1_10 => open, + FF_RX_D_1_0 => rxdata_ch1(0), + FF_RX_D_1_1 => rxdata_ch1(1), + FF_RX_D_1_2 => rxdata_ch1(2), + FF_RX_D_1_3 => rxdata_ch1(3), + FF_RX_D_1_4 => rxdata_ch1(4), + FF_RX_D_1_5 => rxdata_ch1(5), + FF_RX_D_1_6 => rxdata_ch1(6), + FF_RX_D_1_7 => rxdata_ch1(7), + FF_RX_D_1_8 => rx_k_ch1, + FF_RX_D_1_9 => rx_disp_err_ch1, + FF_RX_D_1_10 => rx_cv_err_ch1, FF_RX_D_1_11 => open, FF_RX_D_1_12 => open, FF_RX_D_1_13 => open, @@ -2364,30 +2473,30 @@ port map ( FF_RX_D_1_22 => open, FF_RX_D_1_23 => open, - FFC_RRST_1 => fpsc_vlo, + FFC_RRST_1 => rx_serdes_rst_ch1_c, FFC_SIGNAL_DETECT_1 => fpsc_vlo, - FFC_SB_PFIFO_LP_1 => fpsc_vlo, - FFC_PFIFO_CLR_1 => fpsc_vlo, + FFC_SB_PFIFO_LP_1 => sb_felb_ch1_c, + FFC_PFIFO_CLR_1 => sb_felb_rst_ch1_c, FFC_SB_INV_RX_1 => fpsc_vlo, FFC_PCIE_CT_1 => fpsc_vlo, FFC_PCI_DET_EN_1 => fpsc_vlo, FFC_FB_LOOPBACK_1 => fpsc_vlo, FFC_ENABLE_CGALIGN_1 => fpsc_vlo, FFC_EI_EN_1 => fpsc_vlo, - FFC_LANE_TX_RST_1 => fpsc_vlo, - FFC_TXPWDNB_1 => fpsc_vlo, - FFC_LANE_RX_RST_1 => fpsc_vlo, - FFC_RXPWDNB_1 => fpsc_vlo, - FFS_RLOS_LO_1 => open, + FFC_LANE_TX_RST_1 => tx_pcs_rst_ch1_c, + FFC_TXPWDNB_1 => tx_pwrup_ch1_c, + FFC_LANE_RX_RST_1 => rx_pcs_rst_ch1_c, + FFC_RXPWDNB_1 => rx_pwr_ch1_c, + FFS_RLOS_LO_1 => rx_los_low_ch1_sig, FFS_RLOS_HI_1 => open, FFS_PCIE_CON_1 => open, FFS_PCIE_DONE_1 => open, - FFS_LS_SYNC_STATUS_1 => open, + FFS_LS_SYNC_STATUS_1 => lsm_status_ch1_s, FFS_CC_OVERRUN_1 => open, FFS_CC_UNDERRUN_1 => open, FFS_SKP_ADDED_1 => open, FFS_SKP_DELETED_1 => open, - FFS_RLOL_1 => open, + FFS_RLOL_1 => rx_cdr_lol_ch1_sig, FFS_RXFBFIFO_ERROR_1 => open, FFS_TXFBFIFO_ERROR_1 => open, LDR_CORE2TX_1 => fpsc_vlo, @@ -2395,15 +2504,15 @@ port map ( LDR_RX2CORE_1 => open, FFS_CDR_TRAIN_DONE_1 => open, FFC_DIV11_MODE_TX_1 => fpsc_vlo, - FFC_RATE_MODE_TX_1 => fpsc_vlo, + FFC_RATE_MODE_TX_1 => tx_div2_mode_ch1_c, FFC_DIV11_MODE_RX_1 => fpsc_vlo, - FFC_RATE_MODE_RX_1 => fpsc_vlo, + FFC_RATE_MODE_RX_1 => rx_div2_mode_ch1_c, ----- CH2 ----- - HDOUTP2 => open, - HDOUTN2 => open, - HDINP2 => fpsc_vlo, - HDINN2 => fpsc_vlo, + HDOUTP2 => hdoutp_ch2, + HDOUTN2 => hdoutn_ch2, + HDINP2 => hdinp_ch2, + HDINN2 => hdinn_ch2, PCIE_TXDETRX_PR2TLB_2 => fpsc_vlo, PCIE_TXCOMPLIANCE_2 => fpsc_vlo, PCIE_RXPOLARITY_2 => fpsc_vlo, @@ -2411,27 +2520,27 @@ port map ( PCIE_POWERDOWN_2_1 => fpsc_vlo, PCIE_RXVALID_2 => open, PCIE_PHYSTATUS_2 => open, - SCISELCH2 => fpsc_vlo, - SCIENCH2 => fpsc_vlo, + SCISELCH2 => sci_sel_ch2, + SCIENCH2 => fpsc_vhi, FF_RXI_CLK_2 => fpsc_vlo, - FF_TXI_CLK_2 => fpsc_vlo, + FF_TXI_CLK_2 => txiclk_ch2, FF_EBRD_CLK_2 => fpsc_vlo, - FF_RX_F_CLK_2 => open, - FF_RX_H_CLK_2 => open, - FF_TX_F_CLK_2 => open, - FF_TX_H_CLK_2 => open, - FFC_CK_CORE_RX_2 => fpsc_vlo, - FF_TX_D_2_0 => fpsc_vlo, - FF_TX_D_2_1 => fpsc_vlo, - FF_TX_D_2_2 => fpsc_vlo, - FF_TX_D_2_3 => fpsc_vlo, - FF_TX_D_2_4 => fpsc_vlo, - FF_TX_D_2_5 => fpsc_vlo, - FF_TX_D_2_6 => fpsc_vlo, - FF_TX_D_2_7 => fpsc_vlo, - FF_TX_D_2_8 => fpsc_vlo, - FF_TX_D_2_9 => fpsc_vlo, - FF_TX_D_2_10 => fpsc_vlo, + FF_RX_F_CLK_2 => rx_full_clk_ch2, + FF_RX_H_CLK_2 => rx_half_clk_ch2, + FF_TX_F_CLK_2 => tx_full_clk_ch2_sig, + FF_TX_H_CLK_2 => tx_half_clk_ch2, + FFC_CK_CORE_RX_2 => fpga_rxrefclk_ch2, + FF_TX_D_2_0 => txdata_ch2(0), + FF_TX_D_2_1 => txdata_ch2(1), + FF_TX_D_2_2 => txdata_ch2(2), + FF_TX_D_2_3 => txdata_ch2(3), + FF_TX_D_2_4 => txdata_ch2(4), + FF_TX_D_2_5 => txdata_ch2(5), + FF_TX_D_2_6 => txdata_ch2(6), + FF_TX_D_2_7 => txdata_ch2(7), + FF_TX_D_2_8 => tx_k_ch2, + FF_TX_D_2_9 => tx_force_disp_ch2, + FF_TX_D_2_10 => tx_disp_sel_ch2, FF_TX_D_2_11 => fpsc_vlo, FF_TX_D_2_12 => fpsc_vlo, FF_TX_D_2_13 => fpsc_vlo, @@ -2445,17 +2554,17 @@ port map ( FF_TX_D_2_21 => fpsc_vlo, FF_TX_D_2_22 => fpsc_vlo, FF_TX_D_2_23 => fpsc_vlo, - FF_RX_D_2_0 => open, - FF_RX_D_2_1 => open, - FF_RX_D_2_2 => open, - FF_RX_D_2_3 => open, - FF_RX_D_2_4 => open, - FF_RX_D_2_5 => open, - FF_RX_D_2_6 => open, - FF_RX_D_2_7 => open, - FF_RX_D_2_8 => open, - FF_RX_D_2_9 => open, - FF_RX_D_2_10 => open, + FF_RX_D_2_0 => rxdata_ch2(0), + FF_RX_D_2_1 => rxdata_ch2(1), + FF_RX_D_2_2 => rxdata_ch2(2), + FF_RX_D_2_3 => rxdata_ch2(3), + FF_RX_D_2_4 => rxdata_ch2(4), + FF_RX_D_2_5 => rxdata_ch2(5), + FF_RX_D_2_6 => rxdata_ch2(6), + FF_RX_D_2_7 => rxdata_ch2(7), + FF_RX_D_2_8 => rx_k_ch2, + FF_RX_D_2_9 => rx_disp_err_ch2, + FF_RX_D_2_10 => rx_cv_err_ch2, FF_RX_D_2_11 => open, FF_RX_D_2_12 => open, FF_RX_D_2_13 => open, @@ -2470,30 +2579,30 @@ port map ( FF_RX_D_2_22 => open, FF_RX_D_2_23 => open, - FFC_RRST_2 => fpsc_vlo, + FFC_RRST_2 => rx_serdes_rst_ch2_c, FFC_SIGNAL_DETECT_2 => fpsc_vlo, - FFC_SB_PFIFO_LP_2 => fpsc_vlo, - FFC_PFIFO_CLR_2 => fpsc_vlo, + FFC_SB_PFIFO_LP_2 => sb_felb_ch2_c, + FFC_PFIFO_CLR_2 => sb_felb_rst_ch2_c, FFC_SB_INV_RX_2 => fpsc_vlo, FFC_PCIE_CT_2 => fpsc_vlo, FFC_PCI_DET_EN_2 => fpsc_vlo, FFC_FB_LOOPBACK_2 => fpsc_vlo, FFC_ENABLE_CGALIGN_2 => fpsc_vlo, FFC_EI_EN_2 => fpsc_vlo, - FFC_LANE_TX_RST_2 => fpsc_vlo, - FFC_TXPWDNB_2 => fpsc_vlo, - FFC_LANE_RX_RST_2 => fpsc_vlo, - FFC_RXPWDNB_2 => fpsc_vlo, - FFS_RLOS_LO_2 => open, + FFC_LANE_TX_RST_2 => tx_pcs_rst_ch2_c, + FFC_TXPWDNB_2 => tx_pwrup_ch2_c, + FFC_LANE_RX_RST_2 => rx_pcs_rst_ch2_c, + FFC_RXPWDNB_2 => rx_pwr_ch2_c, + FFS_RLOS_LO_2 => rx_los_low_ch2_sig, FFS_RLOS_HI_2 => open, FFS_PCIE_CON_2 => open, FFS_PCIE_DONE_2 => open, - FFS_LS_SYNC_STATUS_2 => open, + FFS_LS_SYNC_STATUS_2 => lsm_status_ch2_s, FFS_CC_OVERRUN_2 => open, FFS_CC_UNDERRUN_2 => open, FFS_SKP_ADDED_2 => open, FFS_SKP_DELETED_2 => open, - FFS_RLOL_2 => open, + FFS_RLOL_2 => rx_cdr_lol_ch2_sig, FFS_RXFBFIFO_ERROR_2 => open, FFS_TXFBFIFO_ERROR_2 => open, LDR_CORE2TX_2 => fpsc_vlo, @@ -2501,15 +2610,15 @@ port map ( LDR_RX2CORE_2 => open, FFS_CDR_TRAIN_DONE_2 => open, FFC_DIV11_MODE_TX_2 => fpsc_vlo, - FFC_RATE_MODE_TX_2 => fpsc_vlo, + FFC_RATE_MODE_TX_2 => tx_div2_mode_ch2_c, FFC_DIV11_MODE_RX_2 => fpsc_vlo, - FFC_RATE_MODE_RX_2 => fpsc_vlo, + FFC_RATE_MODE_RX_2 => rx_div2_mode_ch2_c, ----- CH3 ----- - HDOUTP3 => open, - HDOUTN3 => open, - HDINP3 => fpsc_vlo, - HDINN3 => fpsc_vlo, + HDOUTP3 => hdoutp_ch3, + HDOUTN3 => hdoutn_ch3, + HDINP3 => hdinp_ch3, + HDINN3 => hdinn_ch3, PCIE_TXDETRX_PR2TLB_3 => fpsc_vlo, PCIE_TXCOMPLIANCE_3 => fpsc_vlo, PCIE_RXPOLARITY_3 => fpsc_vlo, @@ -2517,27 +2626,27 @@ port map ( PCIE_POWERDOWN_3_1 => fpsc_vlo, PCIE_RXVALID_3 => open, PCIE_PHYSTATUS_3 => open, - SCISELCH3 => fpsc_vlo, - SCIENCH3 => fpsc_vlo, + SCISELCH3 => sci_sel_ch3, + SCIENCH3 => fpsc_vhi, FF_RXI_CLK_3 => fpsc_vlo, - FF_TXI_CLK_3 => fpsc_vlo, + FF_TXI_CLK_3 => txiclk_ch3, FF_EBRD_CLK_3 => fpsc_vlo, - FF_RX_F_CLK_3 => open, - FF_RX_H_CLK_3 => open, - FF_TX_F_CLK_3 => open, - FF_TX_H_CLK_3 => open, - FFC_CK_CORE_RX_3 => fpsc_vlo, - FF_TX_D_3_0 => fpsc_vlo, - FF_TX_D_3_1 => fpsc_vlo, - FF_TX_D_3_2 => fpsc_vlo, - FF_TX_D_3_3 => fpsc_vlo, - FF_TX_D_3_4 => fpsc_vlo, - FF_TX_D_3_5 => fpsc_vlo, - FF_TX_D_3_6 => fpsc_vlo, - FF_TX_D_3_7 => fpsc_vlo, - FF_TX_D_3_8 => fpsc_vlo, - FF_TX_D_3_9 => fpsc_vlo, - FF_TX_D_3_10 => fpsc_vlo, + FF_RX_F_CLK_3 => rx_full_clk_ch3, + FF_RX_H_CLK_3 => rx_half_clk_ch3, + FF_TX_F_CLK_3 => tx_full_clk_ch3_sig, + FF_TX_H_CLK_3 => tx_half_clk_ch3, + FFC_CK_CORE_RX_3 => fpga_rxrefclk_ch3, + FF_TX_D_3_0 => txdata_ch3(0), + FF_TX_D_3_1 => txdata_ch3(1), + FF_TX_D_3_2 => txdata_ch3(2), + FF_TX_D_3_3 => txdata_ch3(3), + FF_TX_D_3_4 => txdata_ch3(4), + FF_TX_D_3_5 => txdata_ch3(5), + FF_TX_D_3_6 => txdata_ch3(6), + FF_TX_D_3_7 => txdata_ch3(7), + FF_TX_D_3_8 => tx_k_ch3, + FF_TX_D_3_9 => tx_force_disp_ch3, + FF_TX_D_3_10 => tx_disp_sel_ch3, FF_TX_D_3_11 => fpsc_vlo, FF_TX_D_3_12 => fpsc_vlo, FF_TX_D_3_13 => fpsc_vlo, @@ -2551,17 +2660,17 @@ port map ( FF_TX_D_3_21 => fpsc_vlo, FF_TX_D_3_22 => fpsc_vlo, FF_TX_D_3_23 => fpsc_vlo, - FF_RX_D_3_0 => open, - FF_RX_D_3_1 => open, - FF_RX_D_3_2 => open, - FF_RX_D_3_3 => open, - FF_RX_D_3_4 => open, - FF_RX_D_3_5 => open, - FF_RX_D_3_6 => open, - FF_RX_D_3_7 => open, - FF_RX_D_3_8 => open, - FF_RX_D_3_9 => open, - FF_RX_D_3_10 => open, + FF_RX_D_3_0 => rxdata_ch3(0), + FF_RX_D_3_1 => rxdata_ch3(1), + FF_RX_D_3_2 => rxdata_ch3(2), + FF_RX_D_3_3 => rxdata_ch3(3), + FF_RX_D_3_4 => rxdata_ch3(4), + FF_RX_D_3_5 => rxdata_ch3(5), + FF_RX_D_3_6 => rxdata_ch3(6), + FF_RX_D_3_7 => rxdata_ch3(7), + FF_RX_D_3_8 => rx_k_ch3, + FF_RX_D_3_9 => rx_disp_err_ch3, + FF_RX_D_3_10 => rx_cv_err_ch3, FF_RX_D_3_11 => open, FF_RX_D_3_12 => open, FF_RX_D_3_13 => open, @@ -2576,30 +2685,30 @@ port map ( FF_RX_D_3_22 => open, FF_RX_D_3_23 => open, - FFC_RRST_3 => fpsc_vlo, + FFC_RRST_3 => rx_serdes_rst_ch3_c, FFC_SIGNAL_DETECT_3 => fpsc_vlo, - FFC_SB_PFIFO_LP_3 => fpsc_vlo, - FFC_PFIFO_CLR_3 => fpsc_vlo, + FFC_SB_PFIFO_LP_3 => sb_felb_ch3_c, + FFC_PFIFO_CLR_3 => sb_felb_rst_ch3_c, FFC_SB_INV_RX_3 => fpsc_vlo, FFC_PCIE_CT_3 => fpsc_vlo, FFC_PCI_DET_EN_3 => fpsc_vlo, FFC_FB_LOOPBACK_3 => fpsc_vlo, FFC_ENABLE_CGALIGN_3 => fpsc_vlo, FFC_EI_EN_3 => fpsc_vlo, - FFC_LANE_TX_RST_3 => fpsc_vlo, - FFC_TXPWDNB_3 => fpsc_vlo, - FFC_LANE_RX_RST_3 => fpsc_vlo, - FFC_RXPWDNB_3 => fpsc_vlo, - FFS_RLOS_LO_3 => open, + FFC_LANE_TX_RST_3 => tx_pcs_rst_ch3_c, + FFC_TXPWDNB_3 => tx_pwrup_ch3_c, + FFC_LANE_RX_RST_3 => rx_pcs_rst_ch3_c, + FFC_RXPWDNB_3 => rx_pwr_ch3_c, + FFS_RLOS_LO_3 => rx_los_low_ch3_sig, FFS_RLOS_HI_3 => open, FFS_PCIE_CON_3 => open, FFS_PCIE_DONE_3 => open, - FFS_LS_SYNC_STATUS_3 => open, + FFS_LS_SYNC_STATUS_3 => lsm_status_ch3_s, FFS_CC_OVERRUN_3 => open, FFS_CC_UNDERRUN_3 => open, FFS_SKP_ADDED_3 => open, FFS_SKP_DELETED_3 => open, - FFS_RLOL_3 => open, + FFS_RLOL_3 => rx_cdr_lol_ch3_sig, FFS_RXFBFIFO_ERROR_3 => open, FFS_TXFBFIFO_ERROR_3 => open, LDR_CORE2TX_3 => fpsc_vlo, @@ -2607,9 +2716,9 @@ port map ( LDR_RX2CORE_3 => open, FFS_CDR_TRAIN_DONE_3 => open, FFC_DIV11_MODE_TX_3 => fpsc_vlo, - FFC_RATE_MODE_TX_3 => fpsc_vlo, + FFC_RATE_MODE_TX_3 => tx_div2_mode_ch3_c, FFC_DIV11_MODE_RX_3 => fpsc_vlo, - FFC_RATE_MODE_RX_3 => fpsc_vlo, + FFC_RATE_MODE_RX_3 => rx_div2_mode_ch3_c, ----- Auxilliary ---- SCIWDATA7 => sci_wrdata(7), @@ -2645,7 +2754,7 @@ port map ( FFC_QUAD_RST => rst_qd_c, FFC_TRST => tx_serdes_rst_c, FFS_PLOL => tx_pll_lol_qd_sig, - FFC_SYNC_TOGGLE => fpsc_vlo, + FFC_SYNC_TOGGLE => tx_sync_qd_c, REFCK2CORE => refclk2fpga_sig, CIN0 => fpsc_vlo, CIN1 => fpsc_vlo, diff --git a/source/serdes_sync_upstream.ipx b/source/serdes_sync_upstream.ipx index 17c7119..1a5ec6c 100644 --- a/source/serdes_sync_upstream.ipx +++ b/source/serdes_sync_upstream.ipx @@ -1,11 +1,11 @@ - + - - - - - - + + + + + + diff --git a/source/serdes_sync_upstream.lpc b/source/serdes_sync_upstream.lpc index df0331c..872bc8c 100644 --- a/source/serdes_sync_upstream.lpc +++ b/source/serdes_sync_upstream.lpc @@ -16,8 +16,8 @@ CoreRevision=8.1 ModuleName=serdes_sync_upstream SourceFormat=VHDL ParameterFileVersion=1.0 -Date=01/16/2014 -Time=15:35:12 +Date=02/05/2014 +Time=09:13:21 [Parameters] Verilog=0 @@ -27,10 +27,10 @@ Destination=Synplicity Expression=BusA(0 to 7) Order=Big Endian [MSB:LSB] IO=0 -_mode0=RXTX +_mode0=DISABLED _mode1=DISABLED _mode2=DISABLED -_mode3=DISABLED +_mode3=RXTX _protocol0=G8B10B _protocol1=G8B10B _protocol2=G8B10B @@ -43,10 +43,10 @@ _datarange=2.0 _pll_txsrc=INTERNAL _refclk_mult=10X _refclk_rate=200.0 -_tx_protocol0=G8B10B +_tx_protocol0=DISABLED _tx_protocol1=DISABLED _tx_protocol2=DISABLED -_tx_protocol3=DISABLED +_tx_protocol3=G8B10B _tx_data_rate0=FULL _tx_data_rate1=FULL _tx_data_rate2=FULL @@ -66,7 +66,7 @@ _tx_ficlk_rate3=200.0 _pll_rxsrc0=INTERNAL _pll_rxsrc1=EXTERNAL _pll_rxsrc2=EXTERNAL -_pll_rxsrc3=EXTERNAL +_pll_rxsrc3=INTERNAL Multiplier0= Multiplier1= Multiplier2= @@ -74,11 +74,11 @@ Multiplier3= _rx_datarange0=2.0 _rx_datarange1=2.5 _rx_datarange2=2.5 -_rx_datarange3=2.5 -_rx_protocol0=G8B10B +_rx_datarange3=2 +_rx_protocol0=DISABLED _rx_protocol1=DISABLED _rx_protocol2=DISABLED -_rx_protocol3=DISABLED +_rx_protocol3=G8B10B _rx_data_rate0=FULL _rx_data_rate1=FULL _rx_data_rate2=FULL @@ -86,7 +86,7 @@ _rx_data_rate3=FULL _rxrefclk_rate0=200.0 _rxrefclk_rate1=250.0 _rxrefclk_rate2=250.0 -_rxrefclk_rate3=250.0 +_rxrefclk_rate3=200 _rx_data_width0=8 _rx_data_width1=8 _rx_data_width2=8 @@ -94,11 +94,11 @@ _rx_data_width3=8 _rx_fifo0=DISABLED _rx_fifo1=ENABLED _rx_fifo2=ENABLED -_rx_fifo3=ENABLED +_rx_fifo3=DISABLED _rx_ficlk_rate0=200.0 _rx_ficlk_rate1=250.0 _rx_ficlk_rate2=250.0 -_rx_ficlk_rate3=250.0 +_rx_ficlk_rate3=200 _tdrv_ch0=0 _tdrv_ch1=0 _tdrv_ch2=0 @@ -122,7 +122,7 @@ _rterm_rx3=50 _rx_dcc0=AC _rx_dcc1=AC _rx_dcc2=AC -_rx_dcc3=AC +_rx_dcc3=DC _los_threshold_mode0=LOS_E _los_threshold_mode1=LOS_E _los_threshold_mode2=LOS_E @@ -192,8 +192,8 @@ _cc_match_mode2=1 _cc_match_mode3=1 _k00=01 _k01=00 -_k02=00 -_k03=00 +_k02=01 +_k03=01 _k10=00 _k11=00 _k12=00 @@ -208,8 +208,8 @@ _k32=01 _k33=01 _byten00=00011100 _byten01=00000000 -_byten02=00000000 -_byten03=00000000 +_byten02=00011100 +_byten03=00011100 _byten10=00000000 _byten11=00000000 _byten12=00000000 @@ -245,7 +245,7 @@ _rx_los_port3=Internal _sci_ports=ENABLED _sci_int_port=ENABLED _refck2core=DISABLED -Regen=auto +Regen=module PAR1=0 PARTrace1=0 PAR3=0 diff --git a/source/serdes_sync_upstream.txt b/source/serdes_sync_upstream.txt index 940e01a..062baf6 100644 --- a/source/serdes_sync_upstream.txt +++ b/source/serdes_sync_upstream.txt @@ -4,54 +4,54 @@ # end user to adjust the PCSD quad to the final design requirements. DEVICE_NAME "LFE3-150EA" -CH0_PROTOCOL "G8B10B" -CH0_MODE "RXTX" +CH3_PROTOCOL "G8B10B" +CH0_MODE "DISABLED" CH1_MODE "DISABLED" CH2_MODE "DISABLED" -CH3_MODE "DISABLED" -CH0_CDR_SRC "REFCLK_CORE" +CH3_MODE "RXTX" +CH3_CDR_SRC "REFCLK_CORE" PLL_SRC "REFCLK_CORE" TX_DATARATE_RANGE "MEDHIGH" -CH0_RX_DATARATE_RANGE "MEDHIGH" +CH3_RX_DATARATE_RANGE "MEDHIGH" REFCK_MULT "10X" #REFCLK_RATE 200.0 -CH0_RX_DATA_RATE "FULL" -CH0_TX_DATA_RATE "FULL" -CH0_TX_DATA_WIDTH "8" -CH0_RX_DATA_WIDTH "8" -CH0_TX_FIFO "ENABLED" -CH0_RX_FIFO "DISABLED" -CH0_TDRV "0" -#CH0_TX_FICLK_RATE 200.0 -#CH0_RXREFCLK_RATE "200.0" -#CH0_RX_FICLK_RATE 200.0 -CH0_TX_PRE "DISABLED" -CH0_RTERM_TX "50" -CH0_RX_EQ "DISABLED" -CH0_RTERM_RX "50" -CH0_RX_DCC "AC" -CH0_LOS_THRESHOLD_LO "2" +CH3_RX_DATA_RATE "FULL" +CH3_TX_DATA_RATE "FULL" +CH3_TX_DATA_WIDTH "8" +CH3_RX_DATA_WIDTH "8" +CH3_TX_FIFO "ENABLED" +CH3_RX_FIFO "DISABLED" +CH3_TDRV "0" +#CH3_TX_FICLK_RATE 200.0 +#CH3_RXREFCLK_RATE "200" +#CH3_RX_FICLK_RATE 200 +CH3_TX_PRE "DISABLED" +CH3_RTERM_TX "50" +CH3_RX_EQ "DISABLED" +CH3_RTERM_RX "50" +CH3_RX_DCC "DC" +CH3_LOS_THRESHOLD_LO "2" PLL_TERM "50" PLL_DCC "AC" PLL_LOL_SET "0" -CH0_TX_SB "DISABLED" -CH0_RX_SB "DISABLED" -CH0_TX_8B10B "ENABLED" -CH0_RX_8B10B "ENABLED" -CH0_COMMA_A "1100000101" -CH0_COMMA_B "0011111010" -CH0_COMMA_M "1111111100" -CH0_RXWA "ENABLED" -CH0_ILSM "ENABLED" -CH0_CTC "DISABLED" -CH0_CC_MATCH4 "0100011100" -CH0_CC_MATCH_MODE "1" -CH0_CC_MIN_IPG "3" +CH3_TX_SB "DISABLED" +CH3_RX_SB "DISABLED" +CH3_TX_8B10B "ENABLED" +CH3_RX_8B10B "ENABLED" +CH3_COMMA_A "1100000101" +CH3_COMMA_B "0011111010" +CH3_COMMA_M "1111111100" +CH3_RXWA "ENABLED" +CH3_ILSM "ENABLED" +CH3_CTC "DISABLED" +CH3_CC_MATCH4 "0100011100" +CH3_CC_MATCH_MODE "1" +CH3_CC_MIN_IPG "3" CCHMARK "9" CCLMARK "7" -CH0_SSLB "DISABLED" -CH0_SPLBPORTS "DISABLED" -CH0_PCSLBPORTS "DISABLED" +CH3_SSLB "DISABLED" +CH3_SPLBPORTS "DISABLED" +CH3_PCSLBPORTS "DISABLED" INT_ALL "ENABLED" QD_REFCK2CORE "DISABLED" diff --git a/source/serdes_sync_upstream.vhd b/source/serdes_sync_upstream.vhd index 02b4eba..e1a71a5 100644 --- a/source/serdes_sync_upstream.vhd +++ b/source/serdes_sync_upstream.vhd @@ -22,7 +22,7 @@ GENERIC( -- CH0_CDR_SRC : String := "REFCLK_CORE"; -- CH1_CDR_SRC : String := "REFCLK_EXT"; -- CH2_CDR_SRC : String := "REFCLK_EXT"; --- CH3_CDR_SRC : String := "REFCLK_EXT"; +-- CH3_CDR_SRC : String := "REFCLK_CORE"; -- PLL_SRC : String := "REFCLK_CORE" ); port ( @@ -1535,38 +1535,38 @@ entity serdes_sync_upstream is port ( ------------------ -- CH0 -- - hdinp_ch0, hdinn_ch0 : in std_logic; - hdoutp_ch0, hdoutn_ch0 : out std_logic; - sci_sel_ch0 : in std_logic; - txiclk_ch0 : in std_logic; - rx_full_clk_ch0 : out std_logic; - rx_half_clk_ch0 : out std_logic; - tx_full_clk_ch0 : out std_logic; - tx_half_clk_ch0 : out std_logic; - fpga_rxrefclk_ch0 : in std_logic; - txdata_ch0 : in std_logic_vector (7 downto 0); - tx_k_ch0 : in std_logic; - tx_force_disp_ch0 : in std_logic; - tx_disp_sel_ch0 : in std_logic; - rxdata_ch0 : out std_logic_vector (7 downto 0); - rx_k_ch0 : out std_logic; - rx_disp_err_ch0 : out std_logic; - rx_cv_err_ch0 : out std_logic; - rx_serdes_rst_ch0_c : in std_logic; - sb_felb_ch0_c : in std_logic; - sb_felb_rst_ch0_c : in std_logic; - tx_pcs_rst_ch0_c : in std_logic; - tx_pwrup_ch0_c : in std_logic; - rx_pcs_rst_ch0_c : in std_logic; - rx_pwrup_ch0_c : in std_logic; - rx_los_low_ch0_s : out std_logic; - lsm_status_ch0_s : out std_logic; - rx_cdr_lol_ch0_s : out std_logic; - tx_div2_mode_ch0_c : in std_logic; - rx_div2_mode_ch0_c : in std_logic; -- CH1 -- -- CH2 -- -- CH3 -- + hdinp_ch3, hdinn_ch3 : in std_logic; + hdoutp_ch3, hdoutn_ch3 : out std_logic; + sci_sel_ch3 : in std_logic; + txiclk_ch3 : in std_logic; + rx_full_clk_ch3 : out std_logic; + rx_half_clk_ch3 : out std_logic; + tx_full_clk_ch3 : out std_logic; + tx_half_clk_ch3 : out std_logic; + fpga_rxrefclk_ch3 : in std_logic; + txdata_ch3 : in std_logic_vector (7 downto 0); + tx_k_ch3 : in std_logic; + tx_force_disp_ch3 : in std_logic; + tx_disp_sel_ch3 : in std_logic; + rxdata_ch3 : out std_logic_vector (7 downto 0); + rx_k_ch3 : out std_logic; + rx_disp_err_ch3 : out std_logic; + rx_cv_err_ch3 : out std_logic; + rx_serdes_rst_ch3_c : in std_logic; + sb_felb_ch3_c : in std_logic; + sb_felb_rst_ch3_c : in std_logic; + tx_pcs_rst_ch3_c : in std_logic; + tx_pwrup_ch3_c : in std_logic; + rx_pcs_rst_ch3_c : in std_logic; + rx_pwrup_ch3_c : in std_logic; + rx_los_low_ch3_s : out std_logic; + lsm_status_ch3_s : out std_logic; + rx_cdr_lol_ch3_s : out std_logic; + tx_div2_mode_ch3_c : in std_logic; + rx_div2_mode_ch3_c : in std_logic; ---- Miscillaneous ports sci_wrdata : in std_logic_vector (7 downto 0); sci_addr : in std_logic_vector (5 downto 0); @@ -2102,8 +2102,8 @@ end component; attribute QUAD_MODE of PCSD_INST : label is "SINGLE"; attribute PLL_SRC: string; attribute PLL_SRC of PCSD_INST : label is "REFCLK_CORE"; - attribute CH0_CDR_SRC: string; - attribute CH0_CDR_SRC of PCSD_INST : label is "REFCLK_CORE"; + attribute CH3_CDR_SRC: string; + attribute CH3_CDR_SRC of PCSD_INST : label is "REFCLK_CORE"; attribute FREQUENCY_PIN_FF_RX_F_CLK_0: string; attribute FREQUENCY_PIN_FF_RX_F_CLK_0 of PCSD_INST : label is "200.000"; attribute FREQUENCY_PIN_FF_RX_F_CLK_1: string; @@ -2111,7 +2111,7 @@ end component; attribute FREQUENCY_PIN_FF_RX_F_CLK_2: string; attribute FREQUENCY_PIN_FF_RX_F_CLK_2 of PCSD_INST : label is "250.000"; attribute FREQUENCY_PIN_FF_RX_F_CLK_3: string; - attribute FREQUENCY_PIN_FF_RX_F_CLK_3 of PCSD_INST : label is "250.000"; + attribute FREQUENCY_PIN_FF_RX_F_CLK_3 of PCSD_INST : label is "200"; attribute FREQUENCY_PIN_FF_RX_H_CLK_0: string; attribute FREQUENCY_PIN_FF_RX_H_CLK_0 of PCSD_INST : label is "100.000"; attribute FREQUENCY_PIN_FF_RX_H_CLK_1: string; @@ -2119,7 +2119,7 @@ end component; attribute FREQUENCY_PIN_FF_RX_H_CLK_2: string; attribute FREQUENCY_PIN_FF_RX_H_CLK_2 of PCSD_INST : label is "125.000"; attribute FREQUENCY_PIN_FF_RX_H_CLK_3: string; - attribute FREQUENCY_PIN_FF_RX_H_CLK_3 of PCSD_INST : label is "125.000"; + attribute FREQUENCY_PIN_FF_RX_H_CLK_3 of PCSD_INST : label is "100"; attribute FREQUENCY_PIN_FF_TX_F_CLK_0: string; attribute FREQUENCY_PIN_FF_TX_F_CLK_0 of PCSD_INST : label is "200.000"; attribute FREQUENCY_PIN_FF_TX_F_CLK_1: string; @@ -2144,7 +2144,7 @@ signal fpsc_vlo : std_logic := '0'; signal fpsc_vhi : std_logic := '1'; signal cin : std_logic_vector (11 downto 0) := "000000000000"; signal cout : std_logic_vector (19 downto 0); -signal tx_full_clk_ch0_sig : std_logic; +signal tx_full_clk_ch3_sig : std_logic; signal refclk2fpga_sig : std_logic; signal tx_pll_lol_qd_sig : std_logic; @@ -2166,17 +2166,17 @@ begin vlo_inst : VLO port map(Z => fpsc_vlo); vhi_inst : VHI port map(Z => fpsc_vhi); - rx_los_low_ch0_s <= rx_los_low_ch0_sig; - rx_cdr_lol_ch0_s <= rx_cdr_lol_ch0_sig; + rx_los_low_ch3_s <= rx_los_low_ch3_sig; + rx_cdr_lol_ch3_s <= rx_cdr_lol_ch3_sig; tx_pll_lol_qd_s <= tx_pll_lol_qd_sig; - tx_full_clk_ch0 <= tx_full_clk_ch0_sig; + tx_full_clk_ch3 <= tx_full_clk_ch3_sig; -- pcs_quad instance PCSD_INST : PCSD --synopsys translate_off generic map (CONFIG_FILE => USER_CONFIG_FILE, QUAD_MODE => "SINGLE", - CH0_CDR_SRC => "REFCLK_CORE", + CH3_CDR_SRC => "REFCLK_CORE", PLL_SRC => "REFCLK_CORE" ) --synopsys translate_on @@ -2185,10 +2185,10 @@ port map ( REFCLKN => fpsc_vlo, ----- CH0 ----- - HDOUTP0 => hdoutp_ch0, - HDOUTN0 => hdoutn_ch0, - HDINP0 => hdinp_ch0, - HDINN0 => hdinn_ch0, + HDOUTP0 => open, + HDOUTN0 => open, + HDINP0 => fpsc_vlo, + HDINN0 => fpsc_vlo, PCIE_TXDETRX_PR2TLB_0 => fpsc_vlo, PCIE_TXCOMPLIANCE_0 => fpsc_vlo, PCIE_RXPOLARITY_0 => fpsc_vlo, @@ -2196,27 +2196,27 @@ port map ( PCIE_POWERDOWN_0_1 => fpsc_vlo, PCIE_RXVALID_0 => open, PCIE_PHYSTATUS_0 => open, - SCISELCH0 => sci_sel_ch0, - SCIENCH0 => fpsc_vhi, + SCISELCH0 => fpsc_vlo, + SCIENCH0 => fpsc_vlo, FF_RXI_CLK_0 => fpsc_vlo, - FF_TXI_CLK_0 => txiclk_ch0, + FF_TXI_CLK_0 => fpsc_vlo, FF_EBRD_CLK_0 => fpsc_vlo, - FF_RX_F_CLK_0 => rx_full_clk_ch0, - FF_RX_H_CLK_0 => rx_half_clk_ch0, - FF_TX_F_CLK_0 => tx_full_clk_ch0_sig, - FF_TX_H_CLK_0 => tx_half_clk_ch0, - FFC_CK_CORE_RX_0 => fpga_rxrefclk_ch0, - FF_TX_D_0_0 => txdata_ch0(0), - FF_TX_D_0_1 => txdata_ch0(1), - FF_TX_D_0_2 => txdata_ch0(2), - FF_TX_D_0_3 => txdata_ch0(3), - FF_TX_D_0_4 => txdata_ch0(4), - FF_TX_D_0_5 => txdata_ch0(5), - FF_TX_D_0_6 => txdata_ch0(6), - FF_TX_D_0_7 => txdata_ch0(7), - FF_TX_D_0_8 => tx_k_ch0, - FF_TX_D_0_9 => tx_force_disp_ch0, - FF_TX_D_0_10 => tx_disp_sel_ch0, + FF_RX_F_CLK_0 => open, + FF_RX_H_CLK_0 => open, + FF_TX_F_CLK_0 => open, + FF_TX_H_CLK_0 => open, + FFC_CK_CORE_RX_0 => fpsc_vlo, + FF_TX_D_0_0 => fpsc_vlo, + FF_TX_D_0_1 => fpsc_vlo, + FF_TX_D_0_2 => fpsc_vlo, + FF_TX_D_0_3 => fpsc_vlo, + FF_TX_D_0_4 => fpsc_vlo, + FF_TX_D_0_5 => fpsc_vlo, + FF_TX_D_0_6 => fpsc_vlo, + FF_TX_D_0_7 => fpsc_vlo, + FF_TX_D_0_8 => fpsc_vlo, + FF_TX_D_0_9 => fpsc_vlo, + FF_TX_D_0_10 => fpsc_vlo, FF_TX_D_0_11 => fpsc_vlo, FF_TX_D_0_12 => fpsc_vlo, FF_TX_D_0_13 => fpsc_vlo, @@ -2230,17 +2230,17 @@ port map ( FF_TX_D_0_21 => fpsc_vlo, FF_TX_D_0_22 => fpsc_vlo, FF_TX_D_0_23 => fpsc_vlo, - FF_RX_D_0_0 => rxdata_ch0(0), - FF_RX_D_0_1 => rxdata_ch0(1), - FF_RX_D_0_2 => rxdata_ch0(2), - FF_RX_D_0_3 => rxdata_ch0(3), - FF_RX_D_0_4 => rxdata_ch0(4), - FF_RX_D_0_5 => rxdata_ch0(5), - FF_RX_D_0_6 => rxdata_ch0(6), - FF_RX_D_0_7 => rxdata_ch0(7), - FF_RX_D_0_8 => rx_k_ch0, - FF_RX_D_0_9 => rx_disp_err_ch0, - FF_RX_D_0_10 => rx_cv_err_ch0, + FF_RX_D_0_0 => open, + FF_RX_D_0_1 => open, + FF_RX_D_0_2 => open, + FF_RX_D_0_3 => open, + FF_RX_D_0_4 => open, + FF_RX_D_0_5 => open, + FF_RX_D_0_6 => open, + FF_RX_D_0_7 => open, + FF_RX_D_0_8 => open, + FF_RX_D_0_9 => open, + FF_RX_D_0_10 => open, FF_RX_D_0_11 => open, FF_RX_D_0_12 => open, FF_RX_D_0_13 => open, @@ -2255,30 +2255,30 @@ port map ( FF_RX_D_0_22 => open, FF_RX_D_0_23 => open, - FFC_RRST_0 => rx_serdes_rst_ch0_c, + FFC_RRST_0 => fpsc_vlo, FFC_SIGNAL_DETECT_0 => fpsc_vlo, - FFC_SB_PFIFO_LP_0 => sb_felb_ch0_c, - FFC_PFIFO_CLR_0 => sb_felb_rst_ch0_c, + FFC_SB_PFIFO_LP_0 => fpsc_vlo, + FFC_PFIFO_CLR_0 => fpsc_vlo, FFC_SB_INV_RX_0 => fpsc_vlo, FFC_PCIE_CT_0 => fpsc_vlo, FFC_PCI_DET_EN_0 => fpsc_vlo, FFC_FB_LOOPBACK_0 => fpsc_vlo, FFC_ENABLE_CGALIGN_0 => fpsc_vlo, FFC_EI_EN_0 => fpsc_vlo, - FFC_LANE_TX_RST_0 => tx_pcs_rst_ch0_c, - FFC_TXPWDNB_0 => tx_pwrup_ch0_c, - FFC_LANE_RX_RST_0 => rx_pcs_rst_ch0_c, - FFC_RXPWDNB_0 => rx_pwrup_ch0_c, - FFS_RLOS_LO_0 => rx_los_low_ch0_sig, + FFC_LANE_TX_RST_0 => fpsc_vlo, + FFC_TXPWDNB_0 => fpsc_vlo, + FFC_LANE_RX_RST_0 => fpsc_vlo, + FFC_RXPWDNB_0 => fpsc_vlo, + FFS_RLOS_LO_0 => open, FFS_RLOS_HI_0 => open, FFS_PCIE_CON_0 => open, FFS_PCIE_DONE_0 => open, - FFS_LS_SYNC_STATUS_0 => lsm_status_ch0_s, + FFS_LS_SYNC_STATUS_0 => open, FFS_CC_OVERRUN_0 => open, FFS_CC_UNDERRUN_0 => open, FFS_SKP_ADDED_0 => open, FFS_SKP_DELETED_0 => open, - FFS_RLOL_0 => rx_cdr_lol_ch0_sig, + FFS_RLOL_0 => open, FFS_RXFBFIFO_ERROR_0 => open, FFS_TXFBFIFO_ERROR_0 => open, LDR_CORE2TX_0 => fpsc_vlo, @@ -2286,9 +2286,9 @@ port map ( LDR_RX2CORE_0 => open, FFS_CDR_TRAIN_DONE_0 => open, FFC_DIV11_MODE_TX_0 => fpsc_vlo, - FFC_RATE_MODE_TX_0 => tx_div2_mode_ch0_c, + FFC_RATE_MODE_TX_0 => fpsc_vlo, FFC_DIV11_MODE_RX_0 => fpsc_vlo, - FFC_RATE_MODE_RX_0 => rx_div2_mode_ch0_c, + FFC_RATE_MODE_RX_0 => fpsc_vlo, ----- CH1 ----- HDOUTP1 => open, @@ -2503,10 +2503,10 @@ port map ( FFC_RATE_MODE_RX_2 => fpsc_vlo, ----- CH3 ----- - HDOUTP3 => open, - HDOUTN3 => open, - HDINP3 => fpsc_vlo, - HDINN3 => fpsc_vlo, + HDOUTP3 => hdoutp_ch3, + HDOUTN3 => hdoutn_ch3, + HDINP3 => hdinp_ch3, + HDINN3 => hdinn_ch3, PCIE_TXDETRX_PR2TLB_3 => fpsc_vlo, PCIE_TXCOMPLIANCE_3 => fpsc_vlo, PCIE_RXPOLARITY_3 => fpsc_vlo, @@ -2514,27 +2514,27 @@ port map ( PCIE_POWERDOWN_3_1 => fpsc_vlo, PCIE_RXVALID_3 => open, PCIE_PHYSTATUS_3 => open, - SCISELCH3 => fpsc_vlo, - SCIENCH3 => fpsc_vlo, + SCISELCH3 => sci_sel_ch3, + SCIENCH3 => fpsc_vhi, FF_RXI_CLK_3 => fpsc_vlo, - FF_TXI_CLK_3 => fpsc_vlo, + FF_TXI_CLK_3 => txiclk_ch3, FF_EBRD_CLK_3 => fpsc_vlo, - FF_RX_F_CLK_3 => open, - FF_RX_H_CLK_3 => open, - FF_TX_F_CLK_3 => open, - FF_TX_H_CLK_3 => open, - FFC_CK_CORE_RX_3 => fpsc_vlo, - FF_TX_D_3_0 => fpsc_vlo, - FF_TX_D_3_1 => fpsc_vlo, - FF_TX_D_3_2 => fpsc_vlo, - FF_TX_D_3_3 => fpsc_vlo, - FF_TX_D_3_4 => fpsc_vlo, - FF_TX_D_3_5 => fpsc_vlo, - FF_TX_D_3_6 => fpsc_vlo, - FF_TX_D_3_7 => fpsc_vlo, - FF_TX_D_3_8 => fpsc_vlo, - FF_TX_D_3_9 => fpsc_vlo, - FF_TX_D_3_10 => fpsc_vlo, + FF_RX_F_CLK_3 => rx_full_clk_ch3, + FF_RX_H_CLK_3 => rx_half_clk_ch3, + FF_TX_F_CLK_3 => tx_full_clk_ch3_sig, + FF_TX_H_CLK_3 => tx_half_clk_ch3, + FFC_CK_CORE_RX_3 => fpga_rxrefclk_ch3, + FF_TX_D_3_0 => txdata_ch3(0), + FF_TX_D_3_1 => txdata_ch3(1), + FF_TX_D_3_2 => txdata_ch3(2), + FF_TX_D_3_3 => txdata_ch3(3), + FF_TX_D_3_4 => txdata_ch3(4), + FF_TX_D_3_5 => txdata_ch3(5), + FF_TX_D_3_6 => txdata_ch3(6), + FF_TX_D_3_7 => txdata_ch3(7), + FF_TX_D_3_8 => tx_k_ch3, + FF_TX_D_3_9 => tx_force_disp_ch3, + FF_TX_D_3_10 => tx_disp_sel_ch3, FF_TX_D_3_11 => fpsc_vlo, FF_TX_D_3_12 => fpsc_vlo, FF_TX_D_3_13 => fpsc_vlo, @@ -2548,17 +2548,17 @@ port map ( FF_TX_D_3_21 => fpsc_vlo, FF_TX_D_3_22 => fpsc_vlo, FF_TX_D_3_23 => fpsc_vlo, - FF_RX_D_3_0 => open, - FF_RX_D_3_1 => open, - FF_RX_D_3_2 => open, - FF_RX_D_3_3 => open, - FF_RX_D_3_4 => open, - FF_RX_D_3_5 => open, - FF_RX_D_3_6 => open, - FF_RX_D_3_7 => open, - FF_RX_D_3_8 => open, - FF_RX_D_3_9 => open, - FF_RX_D_3_10 => open, + FF_RX_D_3_0 => rxdata_ch3(0), + FF_RX_D_3_1 => rxdata_ch3(1), + FF_RX_D_3_2 => rxdata_ch3(2), + FF_RX_D_3_3 => rxdata_ch3(3), + FF_RX_D_3_4 => rxdata_ch3(4), + FF_RX_D_3_5 => rxdata_ch3(5), + FF_RX_D_3_6 => rxdata_ch3(6), + FF_RX_D_3_7 => rxdata_ch3(7), + FF_RX_D_3_8 => rx_k_ch3, + FF_RX_D_3_9 => rx_disp_err_ch3, + FF_RX_D_3_10 => rx_cv_err_ch3, FF_RX_D_3_11 => open, FF_RX_D_3_12 => open, FF_RX_D_3_13 => open, @@ -2573,30 +2573,30 @@ port map ( FF_RX_D_3_22 => open, FF_RX_D_3_23 => open, - FFC_RRST_3 => fpsc_vlo, + FFC_RRST_3 => rx_serdes_rst_ch3_c, FFC_SIGNAL_DETECT_3 => fpsc_vlo, - FFC_SB_PFIFO_LP_3 => fpsc_vlo, - FFC_PFIFO_CLR_3 => fpsc_vlo, + FFC_SB_PFIFO_LP_3 => sb_felb_ch3_c, + FFC_PFIFO_CLR_3 => sb_felb_rst_ch3_c, FFC_SB_INV_RX_3 => fpsc_vlo, FFC_PCIE_CT_3 => fpsc_vlo, FFC_PCI_DET_EN_3 => fpsc_vlo, FFC_FB_LOOPBACK_3 => fpsc_vlo, FFC_ENABLE_CGALIGN_3 => fpsc_vlo, FFC_EI_EN_3 => fpsc_vlo, - FFC_LANE_TX_RST_3 => fpsc_vlo, - FFC_TXPWDNB_3 => fpsc_vlo, - FFC_LANE_RX_RST_3 => fpsc_vlo, - FFC_RXPWDNB_3 => fpsc_vlo, - FFS_RLOS_LO_3 => open, + FFC_LANE_TX_RST_3 => tx_pcs_rst_ch3_c, + FFC_TXPWDNB_3 => tx_pwrup_ch3_c, + FFC_LANE_RX_RST_3 => rx_pcs_rst_ch3_c, + FFC_RXPWDNB_3 => rx_pwrup_ch3_c, + FFS_RLOS_LO_3 => rx_los_low_ch3_sig, FFS_RLOS_HI_3 => open, FFS_PCIE_CON_3 => open, FFS_PCIE_DONE_3 => open, - FFS_LS_SYNC_STATUS_3 => open, + FFS_LS_SYNC_STATUS_3 => lsm_status_ch3_s, FFS_CC_OVERRUN_3 => open, FFS_CC_UNDERRUN_3 => open, FFS_SKP_ADDED_3 => open, FFS_SKP_DELETED_3 => open, - FFS_RLOL_3 => open, + FFS_RLOL_3 => rx_cdr_lol_ch3_sig, FFS_RXFBFIFO_ERROR_3 => open, FFS_TXFBFIFO_ERROR_3 => open, LDR_CORE2TX_3 => fpsc_vlo, @@ -2604,9 +2604,9 @@ port map ( LDR_RX2CORE_3 => open, FFS_CDR_TRAIN_DONE_3 => open, FFC_DIV11_MODE_TX_3 => fpsc_vlo, - FFC_RATE_MODE_TX_3 => fpsc_vlo, + FFC_RATE_MODE_TX_3 => tx_div2_mode_ch3_c, FFC_DIV11_MODE_RX_3 => fpsc_vlo, - FFC_RATE_MODE_RX_3 => fpsc_vlo, + FFC_RATE_MODE_RX_3 => rx_div2_mode_ch3_c, ----- Auxilliary ---- SCIWDATA7 => sci_wrdata(7), diff --git a/source/soda_cmd_window_generator.vhd b/source/soda_cmd_window_generator.vhd index 7eb7bb8..cb2acc5 100644 --- a/source/soda_cmd_window_generator.vhd +++ b/source/soda_cmd_window_generator.vhd @@ -24,8 +24,6 @@ end soda_cmd_window_generator; architecture Behavioral of soda_cmd_window_generator is - 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((COMMAND_WINDOS_SIZE / CLOCK_PERIOD) - 1, 16); -- in clock-cycles signal window_delay_counter_S : std_logic_vector(7 downto 0) := (others => '0'); -- signal window_size_counter_S : std_logic_vector(15 downto 0) := (others => '0'); -- diff --git a/source/soda_components.vhd b/source/soda_components.vhd index c831bee..180f201 100644 --- a/source/soda_components.vhd +++ b/source/soda_components.vhd @@ -1,11 +1,12 @@ library ieee; use ieee.std_logic_1164.all; -use ieee.numeric_std.all; +use ieee.numeric_std.all; +use IEEE.STD_LOGIC_ARITH.ALL; library work; -use work.trb_net_std.all; +use work.trb_net_std.all; use work.trb_net_components.all; -use work.trb_net16_hub_func.all; +use work.trb_net16_hub_func.all; package soda_components is @@ -13,26 +14,35 @@ 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 := 2; -- number of children per soda-hub + constant c_HUB_CHILDREN : natural range 1 to 4 := 2; -- number of children per soda-hub constant cSODA_CLOCK_PERIOD : natural range 1 to 20 := 5; -- soda clock-period in ns - constant cBURST_PERIOD : natural := 2400; -- particle-beam burst-period 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 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 + - type t_HUB_DLM is array(c_HUB_CHILDREN-1 downto 0) of std_logic; + type t_HUB_DLM is array(c_HUB_CHILDREN-1 downto 0) of std_logic; type t_HUB_DLM_BYTE is array(c_HUB_CHILDREN-1 downto 0) of std_logic_vector(7 downto 0); type t_HUB_DLM_WORD is array(c_HUB_CHILDREN-1 downto 0) of std_logic_vector(15 downto 0); type t_HUB_DLM_LWORD is array(c_HUB_CHILDREN-1 downto 0) of std_logic_vector(31 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; - type t_HUB_BIT_ARRAY is array(c_HUB_CHILDREN-1 downto 0) of std_logic; + type t_HUB_BIT_ARRAY is array(c_HUB_CHILDREN-1 downto 0) of std_logic; 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); - + + type t_QUAD_BIT is array(3 downto 0) of std_logic; + 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( @@ -44,7 +54,8 @@ package soda_components is --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') + SUPER_BURST_NR_OUT : out std_logic_vector(30 downto 0) := (others => '0'); + SODA_CMD_WINDOW_OUT : out std_logic := '0' ); end component; @@ -75,20 +86,18 @@ package soda_components is --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'); --- EXPECTED_REPLY_OUT : out std_logic_vector(7 downto 0) := (others => '0'); --- CRC_VALID_OUT : out std_logic := '0'; --- CRC_DATA_OUT : out std_logic_vector(7 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; + RESET : in std_logic; SOC_IN : in std_logic; DATA_IN : in std_logic_vector(7 downto 0); DATA_VALID_IN : in std_logic; @@ -96,8 +105,8 @@ package soda_components is CRC_OUT : out std_logic_vector(7 downto 0); CRC_VALID_OUT : out std_logic ); - end component; - + end component; + component soda_source -- box containing soda_source components port( SYSCLK : in std_logic; -- fabric clock @@ -122,8 +131,8 @@ package soda_components is SODA_ACK_OUT : out std_logic := '0'; LEDS_OUT : out std_logic_vector(3 downto 0) ); - end component; - + end component; + component soda_hub port( SYSCLK : in std_logic; -- fabric clock @@ -183,25 +192,25 @@ package soda_components is LEDS_OUT : out std_logic_vector(3 downto 0); LINK_DEBUG_IN : in std_logic_vector(31 downto 0) := (others => '0') ); - end component; + 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 + 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 + 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; + TX_DLM_WORD_OUT : out std_logic_vector(7 downto 0) := (others => '0') + ); + end component; component soda_reply_handler port( @@ -219,20 +228,20 @@ package soda_components is ); 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'; + 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'; CALIB_VALID_OUT : out std_logic := '0'; -- - CALIB_TIME_OUT : out std_logic_vector(15 downto 0) := (others => '0') - ); - end component; - + CALIB_TIME_OUT : out std_logic_vector(15 downto 0) := (others => '0') + ); + end component; + component spi_flash_and_fpga_reload port( CLK_IN : in std_logic; @@ -310,20 +319,20 @@ component med_ecp3_sfp_sync_down is 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! + 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 + SD_RXD_P_IN : in t_QUAD_BIT; + SD_RXD_N_IN : in t_QUAD_BIT; + SD_TXD_P_OUT : out t_QUAD_BIT; + SD_TXD_N_OUT : out t_QUAD_BIT; + SD_REFCLK_P_IN : in t_QUAD_BIT; --not used + SD_REFCLK_N_IN : in t_QUAD_BIT; --not used + SD_PRSNT_N_IN : in t_QUAD_BIT; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted) + SD_LOS_IN : in t_QUAD_BIT; -- SFP Loss Of Signal ('0' = OK, '1' = no signal) + SD_TXDIS_OUT : out t_QUAD_BIT := (others => '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'); @@ -396,7 +405,7 @@ component med_ecp3_sfp_sync_up is CTRL_DEBUG : in std_logic_vector (63 downto 0) := (others => '0') ); end component; - + component soda_tx_control port( CLK_200 : in std_logic; @@ -429,8 +438,8 @@ component soda_tx_control DEBUG_OUT : out std_logic_vector(31 downto 0); STAT_REG_OUT : out std_logic_vector(31 downto 0) ); -end component; - +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 @@ -442,5 +451,5 @@ component soda_cmd_window_generator SODA_CMD_WINDOW_OUT : out std_logic := '0' ); end component; - -end package; + +end package; \ No newline at end of file diff --git a/source/soda_hub.vhd b/source/soda_hub.vhd index 461295e..dec3e52 100644 --- a/source/soda_hub.vhd +++ b/source/soda_hub.vhd @@ -58,18 +58,19 @@ architecture Behavioral of soda_hub is type STATES is (SLEEP,RD_RDY,WR_RDY,RD_ACK,WR_ACK,DONE); signal CURRENT_STATE, NEXT_STATE: STATES; - signal last_packet_sent_S : t_PACKET_TYPE_SENT; - signal expected_reply_S : std_logic_vector(7 downto 0); - signal reply_valid_S : t_HUB_BIT_ARRAY; - signal reply_OK_S : t_HUB_BIT_ARRAY; - signal start_calibration_S : std_logic; - signal calibration_valid_S : t_HUB_BIT_ARRAY; - signal calibration_time_S : t_HUB_WORD_ARRAY; - signal calib_register_s : t_HUB_LWORD_ARRAY; + signal last_packet_sent_S : t_PACKET_TYPE_SENT; + signal expected_reply_S : std_logic_vector(7 downto 0); + signal reply_valid_S : t_HUB_BIT_ARRAY; + signal reply_OK_S : t_HUB_BIT_ARRAY; + signal start_of_calibration_S : std_logic := '0'; + signal start_calibration_S : t_HUB_BIT_ARRAY; + signal calibration_valid_S : t_HUB_BIT_ARRAY; + signal calibration_time_S : t_HUB_WORD_ARRAY; + signal calib_register_s : t_HUB_LWORD_ARRAY; - signal dead_channels_S : t_HUB_BIT_ARRAY; - signal channel_status_S : t_HUB_BIT_ARRAY; - signal status_register : std_logic_vector(31 downto 0) := (others => '0'); + signal dead_channels_S : t_HUB_BIT_ARRAY; + signal channel_status_S : t_HUB_BIT_ARRAY; + signal status_register : std_logic_vector(31 downto 0) := (others => '0'); -- slave bus signals signal bus_ack_x : std_logic; @@ -99,13 +100,14 @@ begin CLK_EN => '1', --Internal Connection START_OF_SUPERBURST_OUT => start_of_superburst_S, + START_OF_CALIBRATION_OUT => start_of_calibration_S, SUPER_BURST_NR_OUT => super_burst_nr_S, SODA_CMD_VALID_OUT => soda_cmd_valid_S, SODA_CMD_WORD_OUT => soda_cmd_word_S, RX_DLM_IN => RXUP_DLM_IN, RX_DLM_WORD_IN => RXUP_DLM_WORD_IN ); - + hub_reply_packet_builder : soda_reply_pkt_builder port map( SODACLK => SODACLK, @@ -125,6 +127,8 @@ begin channel :for i in c_HUB_CHILDREN-1 downto 0 generate + start_calibration_S(i) <= start_of_calibration_S; + packet_builder : soda_packet_builder port map( SODACLK => SODACLK, @@ -135,7 +139,7 @@ begin SUPER_BURST_NR_IN => super_burst_nr_S, SODA_CMD_WORD_IN => soda_cmd_word_S, EXPECTED_REPLY_OUT => open, - TIME_CAL_OUT => start_calibration_S, + TIME_CAL_OUT => open, --start_calibration_S(i), TX_DLM_OUT => TXDN_DLM_OUT(i), TX_DLM_WORD_OUT => TXDN_DLM_WORD_OUT(i) ); @@ -162,7 +166,7 @@ begin CLEAR => '0', CLK_EN => '1', --Internal Connection - START_CALIBRATION => start_calibration_S, + START_CALIBRATION => start_calibration_S(i), END_CALIBRATION => reply_valid_S(i), CALIB_VALID_OUT => calibration_valid_S(i), CALIB_TIME_OUT => calibration_time_S(i) diff --git a/source/soda_packet_handler.vhd b/source/soda_packet_handler.vhd index c070bc1..f294bf0 100644 --- a/source/soda_packet_handler.vhd +++ b/source/soda_packet_handler.vhd @@ -17,11 +17,9 @@ entity soda_packet_handler is --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'); --- EXPECTED_REPLY_OUT : out std_logic_vector(7 downto 0) := (others => '0'); - CRC_VALID_OUT : out std_logic := '0'; - CRC_DATA_OUT : out std_logic_vector(7 downto 0) := (others => '0'); RX_DLM_IN : in std_logic; RX_DLM_WORD_IN : in std_logic_vector(7 downto 0) := (others => '0') ); @@ -37,15 +35,6 @@ architecture Behavioral of soda_packet_handler is c_SODA_PKT5, c_SODA_PKT6, c_SODA_PKT7, c_SODA_PKT8 ); signal packet_state_S : packet_state_type := c_IDLE; --- crc-checker signals -- --- signal soc_S : std_logic; --- signal eoc_S : std_logic; --- signal crc_valid_in_s : std_logic; --- signal crc_datain_S : std_logic_vector(7 downto 0) := (others => '0'); --- signal crc_tmp_S : std_logic_vector(7 downto 0) := (others => '0'); --- signal crc_out_S : std_logic_vector(7 downto 0) := (others => '0'); --- signal crc_valid_out_S : std_logic; --- signal crc_check_ok_s : std_logic; begin @@ -126,24 +115,27 @@ begin end if; end process; - soda_packet_collector_proc : process(SODACLK, packet_state_S) + soda_packet_interpreter_proc : process(SODACLK, packet_state_S) begin if rising_edge(SODACLK) then case packet_state_S is when c_RST => START_OF_SUPERBURST_OUT <= '0'; + START_OF_CALIBRATION_OUT <= '0'; SODA_CMD_VALID_OUT <= '0'; soda_pkt_valid_S <= '0'; soda_pkt_word_S <= (others=>'0'); when c_IDLE => START_OF_SUPERBURST_OUT <= '0'; + START_OF_CALIBRATION_OUT <= '0'; SODA_CMD_VALID_OUT <= '0'; soda_pkt_valid_S <= '0'; soda_pkt_word_S <= (others=>'0'); when c_SODA_PKT1 => START_OF_SUPERBURST_OUT <= '0'; + START_OF_CALIBRATION_OUT <= '0'; SODA_CMD_VALID_OUT <= '0'; - soda_pkt_word_S(31 downto 24) <= RX_DLM_WORD_IN; + soda_pkt_word_S(31 downto 24) <= RX_DLM_WORD_IN; when c_SODA_PKT2 => -- do nothing -- disregard K28.7 when c_SODA_PKT3 => @@ -163,10 +155,14 @@ begin SUPER_BURST_NR_OUT <= soda_pkt_word_S(30 downto 0); else SODA_CMD_VALID_OUT <= '1'; - SODA_CMD_WORD_OUT <= soda_pkt_word_S(30 downto 0); + SODA_CMD_WORD_OUT <= soda_pkt_word_S(30 downto 0); + if soda_pkt_word_S(30)='1' then + START_OF_CALIBRATION_OUT <= '1'; + end if; end if; when others => - START_OF_SUPERBURST_OUT <= '0'; + START_OF_SUPERBURST_OUT <= '0'; + START_OF_CALIBRATION_OUT <= '0'; soda_pkt_valid_S <= '0'; soda_pkt_word_S <= (others=>'0'); SODA_CMD_VALID_OUT <= '0'; @@ -176,75 +172,5 @@ begin end if; end process; - --crc_check_proc : process(SODACLK, packet_state_S) - --begin - --if rising_edge(SODACLK) then - --case packet_state_S is - --when c_RST=> - --CRC_VALID_OUT <= '0'; - --CRC_DATA_OUT<= (others => '0'); - --soc_S <= '1'; - --eoc_S <= '0'; - --CRC_VALID_OUT <= '0'; - --when c_IDLE => - --CRC_VALID_OUT <= '0'; - --CRC_DATA_OUT<= (others => '0'); - --crc_valid_in_S<= '0'; - --crc_datain_S<= (others=>'0'); - --soc_S <= '1'; - --eoc_S <= '0'; - --when c_SODA_PKT1=> - --crc_valid_in_S<= '1'; - --crc_datain_S<=RX_DLM_WORD_IN; - --if (RX_DLM_WORD_IN(7)='0') then -- only calculate crc if it's a command packet - --soc_S <= '0'; - --end if; - --when c_SODA_PKT2=> - --crc_valid_in_S<= '0'; - --crc_datain_S<= (others=>'0'); - --when c_SODA_PKT3=> - --crc_valid_in_S<= '1'; - --crc_datain_S<= RX_DLM_WORD_IN; - --when c_SODA_PKT4=> - --crc_valid_in_S<= '0'; - --crc_datain_S<= (others=>'0'); - --when c_SODA_PKT5=> - --crc_valid_in_S<= '1'; - --crc_datain_S<= RX_DLM_WORD_IN; - --if (soc_S='0') then -- only terminate crc calculation if it is running - --eoc_S <= '1'; - --end if; - --when c_SODA_PKT6=> - --crc_valid_in_S<= '0'; - --crc_datain_S<= (others=>'0'); - --eoc_S <= '0'; - --when c_SODA_PKT7=> - --crc_valid_in_S<= '0'; - --crc_datain_S<= (others=>'0'); - --if ((crc_valid_out_S = '1') and (crc_out_S = RX_DLM_WORD_IN)) then - --crc_check_ok_S<= '1'; - --else - --crc_check_ok_S<= '0'; - --end if; - --CRC_VALID_OUT <= '1'; - --when c_SODA_PKT8=> - --CRC_VALID_OUT <= crc_valid_out_S; - --CRC_DATA_OUT<= crc_out_S; - --crc_valid_in_S<= '0'; - --crc_datain_S<= (others=>'0'); - --eoc_S <= '0'; - --crc_check_ok_S<= '0'; - --CRC_VALID_OUT <= '0'; - --when others => - --CRC_VALID_OUT <= '0'; - --CRC_DATA_OUT<= (others => '0'); - --crc_valid_in_S<= '0'; - --crc_datain_S<= (others=>'0'); - --soc_S <= '0'; - --eoc_S <= '0'; - --CRC_VALID_OUT <= '0'; - --end case; - --end if; - --end process; end architecture; \ No newline at end of file diff --git a/source/soda_reply_pkt_builder.vhd b/source/soda_reply_pkt_builder.vhd index 47ad048..9a20245 100644 --- a/source/soda_reply_pkt_builder.vhd +++ b/source/soda_reply_pkt_builder.vhd @@ -34,7 +34,7 @@ architecture Behavioral of soda_reply_pkt_builder is ); signal packet_state_S : packet_state_type := c_IDLE; -signal soda_dlm_preview_S : std_logic; + signal soda_dlm_preview_S : std_logic; begin @@ -105,47 +105,6 @@ reply_fsm_proc : process(SODACLK) end if; end process; ---reply_fsm_proc : process(SODACLK) --- begin --- if rising_edge(SODACLK) then --- if (RESET='1') then --- packet_state_S <= c_IDLE; --- else --- case packet_state_S is --- when c_IDLE => --- if (START_OF_SUPERBURST='1') or (SODA_CMD_STROBE_IN='1') then --- packet_state_S <= c_PKT1; --- end if; --- when c_PKT1 => --- packet_state_S <= c_PKT2; --- when c_PKT2 => --- packet_state_S <= c_IDLE; --- when others => --- packet_state_S <= c_IDLE; --- end case; --- end if; --- end if; --- end process; - --- collect_reply_proc : process(SODACLK) --- begin --- if rising_edge(SODACLK) then --- if (RESET='1') then --- TX_DLM_OUT <= '0'; --- TX_DLM_WORD_OUT <= (others=>'0'); --- elsif (START_OF_SUPERBURST='1') then --- TX_DLM_OUT <= '1'; --- TX_DLM_WORD_OUT <= SUPER_BURST_NR_IN(7 downto 0); --- elsif (SODA_CMD_STROBE_IN='1') then --- TX_DLM_OUT <= '1'; --- TX_DLM_WORD_OUT <= SODA_CMD_WORD_IN(7 downto 0); --- elsif (packet_state_S=c_PKT1) then --- TX_DLM_OUT <= '0'; --- elsif (packet_state_S=c_PKT2) then --- TX_DLM_WORD_OUT <= (others=>'0'); --- end if; --- end if; --- end process; end architecture; \ No newline at end of file diff --git a/source/soda_source.vhd b/source/soda_source.vhd index f89e144..5f1b223 100644 --- a/source/soda_source.vhd +++ b/source/soda_source.vhd @@ -40,8 +40,11 @@ architecture Behavioral of soda_source is signal soda_cmd_word_S : std_logic_vector(30 downto 0) := (others => '0'); signal soda_cmd_strobe_S : std_logic := '0'; signal soda_cmd_strobe_sodaclk_S : std_logic := '0'; + signal soda_cmd_pending_S : std_logic := '0'; + signal soda_send_cmd_S : std_logic := '0'; signal start_of_superburst_S : std_logic := '0'; signal super_burst_nr_S : std_logic_vector(30 downto 0) := (others => '0'); -- from super-burst-nr-generator + signal soda_cmd_window_S : std_logic := '0'; -- Signals type t_STATES is (SLEEP,RD_RDY,WR_RDY,RD_ACK,WR_ACK,DONE); @@ -81,7 +84,8 @@ begin --Internal Connection SODA_BURST_PULSE_IN => SODA_BURST_PULSE_IN, START_OF_SUPERBURST_OUT => start_of_superburst_S, - SUPER_BURST_NR_OUT => super_burst_nr_S + SUPER_BURST_NR_OUT => super_burst_nr_S, + SODA_CMD_WINDOW_OUT => soda_cmd_window_S ); packet_builder : soda_packet_builder @@ -90,7 +94,7 @@ begin RESET => RESET, --Internal Connection LINK_PHASE_IN => LINK_PHASE_IN, --link_phase_S, PL! - SODA_CMD_STROBE_IN => soda_cmd_strobe_sodaclk_S, + SODA_CMD_STROBE_IN => soda_send_cmd_S, START_OF_SUPERBURST => start_of_superburst_S, SUPER_BURST_NR_IN => super_burst_nr_S, SODA_CMD_WORD_IN => soda_cmd_word_S, @@ -213,7 +217,24 @@ soda_cmd_strobe_posedge_to_pulse: posedge_to_pulse SIGNAL_IN => soda_cmd_strobe_S, PULSE_OUT => soda_cmd_strobe_sodaclk_S ); - + + SODA_CMD_FLOWCTRL : process(SODACLK) + begin + if( rising_edge(SODACLK) ) then + if( RESET = '1' ) then + soda_cmd_pending_S <= '0'; + soda_send_cmd_S <= '0'; + elsif soda_cmd_strobe_sodaclk_S = '1' then + soda_cmd_pending_S <= '1'; + elsif soda_cmd_window_S = '1' and soda_cmd_pending_S = '1' then + soda_send_cmd_S <= '1'; + soda_cmd_pending_S <= '0'; + else + soda_cmd_pending_S <= '0'; + soda_send_cmd_S <= '0'; + end if; + end if; + end process SODA_CMD_FLOWCTRL; --------------------------------------------------------- -- data handling -- --------------------------------------------------------- diff --git a/source/soda_superburst_gen.vhd b/source/soda_superburst_gen.vhd index 518fe60..79fe7a1 100644 --- a/source/soda_superburst_gen.vhd +++ b/source/soda_superburst_gen.vhd @@ -12,7 +12,7 @@ use work.soda_components.all; entity soda_superburst_generator is generic( - BURST_COUNT : natural range 1 to 256 := 16 -- number of bursts to be counted between super-bursts + BURST_COUNT : natural range 4 to 256 := 16 -- number of bursts to be counted between super-bursts ); port( SODACLK : in std_logic; -- fabric clock @@ -20,7 +20,8 @@ entity soda_superburst_generator is --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') + SUPER_BURST_NR_OUT : out std_logic_vector(30 downto 0) := (others => '0'); + SODA_CMD_WINDOW_OUT : out std_logic := '0' ); end soda_superburst_generator; @@ -60,5 +61,18 @@ begin end if; end if; end process; + + soda_cmd_window_proc : process(SODACLK) + begin + if rising_edge(SODACLK) then + if (RESET='1') then + SODA_CMD_WINDOW_OUT <= '0'; + elsif (burst_counter_S = (cBURST_COUNT - 1)) then + SODA_CMD_WINDOW_OUT <= '1'; + elsif (burst_counter_S = 2) then + SODA_CMD_WINDOW_OUT <= '0'; + end if; + end if; + end process; end Behavioral; -- 2.43.0