From e9e031578c1cb736c51fb9a1cd19e4f9f169d324 Mon Sep 17 00:00:00 2001 From: Peter Lemmens Date: Tue, 14 Oct 2014 09:13:04 +0200 Subject: [PATCH] Working 4-channel soda_source. Tested with 4 clients on 2 different trb boards. Calibration looks good. 1 long fiber and 3 short fibers; calibration times: 0x9A, 0x3D, 0x3B, 0x3C. ToDo: - reset calibration registers @ start-of-calibration - more testing --- code/med_ecp3_sfp_4_SODA.vhd | 161 ++++++++++++++-------------- code/soda_4source.vhd | 117 +++++++++++++------- code/soda_hub.vhd | 3 +- code/trb3_periph_EP_soda4source.vhd | 44 ++++---- soda_4source_EP.ldf | 71 ++++++------ soda_4source_EP.lpf | 48 +++------ soda_client_probe.rvl | 75 ------------- trb3_soda_dual_client.xcf | 9 +- 8 files changed, 241 insertions(+), 287 deletions(-) diff --git a/code/med_ecp3_sfp_4_SODA.vhd b/code/med_ecp3_sfp_4_SODA.vhd index 2d4e86d..8a09882 100644 --- a/code/med_ecp3_sfp_4_SODA.vhd +++ b/code/med_ecp3_sfp_4_SODA.vhd @@ -68,9 +68,9 @@ architecture med_ecp3_sfp_4_soda_arch of med_ecp3_sfp_4_soda is -- Placer Directives attribute HGROUP : string; -- for whole architecture - attribute HGROUP of med_ecp3_sfp_4_sync_down_arch : architecture is "media_downlink_group"; + attribute HGROUP of med_ecp3_sfp_4_soda_arch : architecture is "media_downlink_group"; attribute syn_sharing : string; - attribute syn_sharing of med_ecp3_sfp_4_sync_down_arch : architecture is "off"; + attribute syn_sharing of med_ecp3_sfp_4_soda_arch : architecture is "off"; @@ -343,7 +343,8 @@ serdes_rst_down_quad <= '0'; -- PL: 23/06/14 generated_logic : for i in 0 to 3 generate - SD_TXDIS_OUT(i) <= LINK_DISABLE_IN; --not (rx_allow_q(i) or not IS_SLAVE); --slave only switches on when RX is ready +-- SD_TXDIS_OUT(i) <= LINK_DISABLE_IN; --not (rx_allow_q(i) or not IS_SLAVE); --slave only switches on when RX is ready + SD_TXDIS_OUT(i) <= '0'; --not rx_allow_q(i); --slave only switches on when RX is ready tx_pll_lol(i) <= tx_pll_lol_quad; @@ -419,78 +420,78 @@ generated_logic : for i in 0 to 3 generate end if; end if; end process; --- ------------------------------------------------- --- -- TX Data --- ------------------------------------------------- --- THE_TX : soda_tx_control --- port map( --- CLK_200 => clk_200_txdata, --tx_full_clk(i), --clk_200_i(i), --- CLK_100 => SYSCLK, --- RESET_IN => rst(i), --CLEAR, PL! - --- TX_DATA_IN => MED_DATA_IN(i), --- TX_PACKET_NUMBER_IN => MED_PACKET_NUM_IN(i), --- TX_WRITE_IN => MED_DATAREADY_IN(i), --- TX_READ_OUT => MED_READ_OUT(i), - --- TX_DATA_OUT => tx_data(i), --- TX_K_OUT => tx_k(i), - --- REQUEST_RETRANSMIT_IN => request_retr_i(i), --TODO --- REQUEST_POSITION_IN => request_retr_position_i(i), --TODO - --- START_RETRANSMIT_IN => start_retr_i(i), --TODO --- START_POSITION_IN => request_retr_position_i(i), --TODO - --- TX_DLM_PREVIEW_IN => TX_DLM_PREVIEW_IN(i), --- SEND_DLM => TX_DLM(i), --- SEND_DLM_WORD => TX_DLM_WORD(i), - --- SEND_LINK_RESET_IN => CTRL_OP(i)(15), --- TX_ALLOW_IN => tx_allow(i), --- RX_ALLOW_IN => rx_allow(i), --- LINK_PHASE_OUT => link_phase_S(i), --PL! - --- DEBUG_OUT => debug_tx_control_i(i), --- STAT_REG_OUT => stat_tx_control_i(i) --- ); - --- LINK_PHASE_OUT(i) <= link_phase_S(i); --PL! --- ------------------------------------------------- --- -- RX Data --- ------------------------------------------------- --- THE_RX_CONTROL : rx_control --- port map( --- CLK_200 => clk_200_txdata, --clk_200_i(i), --PL! --- CLK_100 => SYSCLK, --- RESET_IN => rst(i), --CLEAR, PL! + ------------------------------------------------- + -- TX Data + ------------------------------------------------- + THE_TX : soda_tx_control + port map( + CLK_200 => clk_200_txdata, --tx_full_clk(i), --clk_200_i(i), + CLK_100 => SYSCLK, + RESET_IN => rst(i), --CLEAR, PL! + + TX_DATA_IN => (others => '0'), -- MED_DATA_IN(i), + TX_PACKET_NUMBER_IN => (others => '0'), -- MED_PACKET_NUM_IN(i), + TX_WRITE_IN => '0', -- MED_DATAREADY_IN(i), + TX_READ_OUT => open, -- MED_READ_OUT(i), + + TX_DATA_OUT => tx_data(i), + TX_K_OUT => tx_k(i), + + REQUEST_RETRANSMIT_IN => request_retr_i(i), --TODO + REQUEST_POSITION_IN => request_retr_position_i(i), --TODO + + START_RETRANSMIT_IN => start_retr_i(i), --TODO + START_POSITION_IN => request_retr_position_i(i), --TODO + + TX_DLM_PREVIEW_IN => TX_DLM_PREVIEW_IN(i), + SEND_DLM => TX_DLM_IN(i), + SEND_DLM_WORD => TX_DLM_WORD_IN(i), + + SEND_LINK_RESET_IN => '0', --CTRL_OP(i)(15), + TX_ALLOW_IN => tx_allow(i), + RX_ALLOW_IN => rx_allow(i), + LINK_PHASE_OUT => link_phase_S(i), --PL! + + DEBUG_OUT => debug_tx_control_i(i), + STAT_REG_OUT => stat_tx_control_i(i) + ); + + LINK_PHASE_OUT(i) <= link_phase_S(i); --PL! + ------------------------------------------------- + -- RX Data + ------------------------------------------------- + THE_RX_CONTROL : rx_control + port map( + CLK_200 => clk_200_txdata, --clk_200_i(i), --PL! + CLK_100 => SYSCLK, + RESET_IN => rst(i), --CLEAR, PL! --- RX_DATA_OUT => MED_DATA_OUT(i), --- RX_PACKET_NUMBER_OUT => MED_PACKET_NUM_OUT(i), --- RX_WRITE_OUT => MED_DATAREADY_OUT(i), --- RX_READ_IN => MED_READ_IN(i), + RX_DATA_OUT => open, -- MED_DATA_OUT(i), + RX_PACKET_NUMBER_OUT => open, -- MED_PACKET_NUM_OUT(i), + RX_WRITE_OUT => open, -- MED_DATAREADY_OUT(i), + RX_READ_IN => '0', -- MED_READ_IN(i), --- RX_DATA_IN => rx_data(i), --- RX_K_IN => rx_k(i), + RX_DATA_IN => rx_data(i), + RX_K_IN => rx_k(i), --- REQUEST_RETRANSMIT_OUT => request_retr_i(i), --- REQUEST_POSITION_OUT => request_retr_position_i(i), + REQUEST_RETRANSMIT_OUT => request_retr_i(i), + REQUEST_POSITION_OUT => request_retr_position_i(i), --- START_RETRANSMIT_OUT => start_retr_i(i), --- START_POSITION_OUT => start_retr_position_i(i), + START_RETRANSMIT_OUT => start_retr_i(i), + START_POSITION_OUT => start_retr_position_i(i), --send_dlm: 200 MHz, 1 clock strobe, data valid until next DLM --- RX_DLM => RX_DLM(i), --- RX_DLM_WORD => RX_DLM_WORD(i), + RX_DLM => RX_DLM_OUT(i), + RX_DLM_WORD => RX_DLM_WORD_OUT(i), --- SEND_LINK_RESET_OUT => send_link_reset_i(i), --- MAKE_RESET_OUT => make_link_reset_i(i), --- RX_ALLOW_IN => rx_allow(i), --- GOT_LINK_READY => got_link_ready_i(i), + SEND_LINK_RESET_OUT => send_link_reset_i(i), + MAKE_RESET_OUT => make_link_reset_i(i), + RX_ALLOW_IN => rx_allow(i), + GOT_LINK_READY => got_link_ready_i(i), --- DEBUG_OUT => debug_rx_control_i(i), --- STAT_REG_OUT => stat_rx_control_i(i) --- ); + DEBUG_OUT => debug_rx_control_i(i), + STAT_REG_OUT => stat_rx_control_i(i) + ); internal_make_link_reset_out(i) <= make_link_reset_i(i) when (IS_SYNC_SLAVE=c_YES) else '0'; sd_los_i(i) <= SD_LOS_IN(i) when rising_edge(SYSCLK); -- PL! @@ -633,19 +634,19 @@ end process; -- internal_make_link_reset_out(i) <= make_link_reset_i(i) when (IS_SYNC_SLAVE=c_YES) else '0'; -- sd_los_i(i) <= SD_LOS_IN(i) when rising_edge(SYSCLK); -- PL! - STAT_OP(i)(15) <= send_link_reset_i(i) when rising_edge(SYSCLK); - STAT_OP(i)(14) <= '0'; - STAT_OP(i)(13) <= internal_make_link_reset_out(i) when rising_edge(SYSCLK); --make trbnet reset - STAT_OP(i)(12) <= '0'; - STAT_OP(i)(11) <= '0'; - STAT_OP(i)(10) <= rx_allow(i); - STAT_OP(i)(9) <= tx_allow(i); - STAT_OP(i)(8) <= got_link_ready_i(i); - STAT_OP(i)(7) <= send_link_reset_i(i); - STAT_OP(i)(6) <= make_link_reset_i(i); - STAT_OP(i)(5) <= request_retr_i(i); - STAT_OP(i)(4) <= start_retr_i(i); - STAT_OP(i)(3 downto 0) <= x"0" when rx_allow_q(i) = '1' and tx_allow_q(i) = '1' else x"7"; +-- STAT_OP(i)(15) <= send_link_reset_i(i) when rising_edge(SYSCLK); +-- STAT_OP(i)(14) <= '0'; +-- STAT_OP(i)(13) <= internal_make_link_reset_out(i) when rising_edge(SYSCLK); --make trbnet reset +-- STAT_OP(i)(12) <= '0'; +-- STAT_OP(i)(11) <= '0'; +-- STAT_OP(i)(10) <= rx_allow(i); +-- STAT_OP(i)(9) <= tx_allow(i); +-- STAT_OP(i)(8) <= got_link_ready_i(i); +-- STAT_OP(i)(7) <= send_link_reset_i(i); +-- STAT_OP(i)(6) <= make_link_reset_i(i); +-- STAT_OP(i)(5) <= request_retr_i(i); +-- STAT_OP(i)(4) <= start_retr_i(i); +-- STAT_OP(i)(3 downto 0) <= x"0" when rx_allow_q(i) = '1' and tx_allow_q(i) = '1' else x"7"; end generate; end med_ecp3_sfp_4_soda_arch; diff --git a/code/soda_4source.vhd b/code/soda_4source.vhd index 526297c..461c020 100644 --- a/code/soda_4source.vhd +++ b/code/soda_4source.vhd @@ -17,40 +17,41 @@ entity soda_4source is CLEAR : in std_logic; -- asynchronous reset CLK_EN : in std_logic; - SODA_BURST_PULSE_IN : in std_logic := '0'; -- + SODA_BURST_PULSE_IN : in std_logic := '0'; -- -- MULTIPLE DUPLEX DOWN-LINKS - RX_DLM_IN : in t_HUB_BIT; - RX_DLM_WORD_IN : in t_HUB_BYTE; - TX_DLM_OUT : out t_HUB_BIT; - TX_DLM_WORD_OUT : out t_HUB_BYTE; - TX_DLM_PREVIEW_OUT : out t_HUB_BIT; --PL! - LINK_PHASE_IN : in t_HUB_BIT; --PL! + RX_DLM_IN : in t_HUB_BIT; + RX_DLM_WORD_IN : in t_HUB_BYTE; + TX_DLM_OUT : out t_HUB_BIT; + TX_DLM_WORD_OUT : out t_HUB_BYTE; + TX_DLM_PREVIEW_OUT : out t_HUB_BIT; --PL! + LINK_PHASE_IN : in t_HUB_BIT; --PL! SODA_DATA_IN : in std_logic_vector(31 downto 0) := (others => '0'); - SODA_DATA_OUT : out std_logic_vector(31 downto 0) := (others => '0'); + SODA_DATA_OUT : out std_logic_vector(31 downto 0) := (others => '0'); SODA_ADDR_IN : in std_logic_vector(3 downto 0) := (others => '0'); SODA_READ_IN : in std_logic := '0'; - SODA_WRITE_IN : in std_logic := '0'; + SODA_WRITE_IN : in std_logic := '0'; SODA_ACK_OUT : out std_logic := '0'; LEDS_OUT : out std_logic_vector(3 downto 0); - LINK_DEBUG_IN : in std_logic_vector(31 downto 0) := (others => '0') + LINK_DEBUG_IN : in std_logic_vector(31 downto 0) := (others => '0') ); end soda_4source; architecture Behavioral of soda_4source is --SODA - signal soda_cmd_word_S : std_logic_vector(30 downto 0) := (others => '0'); - signal soda_cmd_valid_S : std_logic := '0'; - signal soda_cmd_strobe_S : std_logic := '0'; -- for commands sent in a SODA package - signal soda_cmd_strobe_sodaclk_S : std_logic := '0'; -- for commands sent in a SODA package +-- signal soda_cmd_word_S : std_logic_vector(30 downto 0) := (others => '0'); +-- signal soda_cmd_valid_S : std_logic := '0'; +-- signal soda_cmd_strobe_S : std_logic := '0'; -- for commands sent in a SODA package +-- signal soda_cmd_strobe_sodaclk_S : std_logic := '0'; -- for commands sent in a SODA package signal trb_cmd_word_S : std_logic_vector(30 downto 0) := (others => '0'); - signal trb_cmd_valid_S : std_logic := '0'; +-- signal trb_cmd_valid_S : std_logic := '0'; signal trb_cmd_strobe_S : std_logic := '0'; -- for commands sent over trbnet signal trb_cmd_strobe_sodaclk_S : std_logic := '0'; -- for commands sent over trbnet --- signal soda_cmd_pending_S : std_logic := '0'; --- signal soda_send_cmd_S : std_logic := '0'; + signal trb_cmd_pending_S : std_logic := '0'; + signal trb_send_cmd_S : std_logic := '0'; + signal soda_cmd_window_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 crc_data_S : std_logic_vector(7 downto 0) := (others => '0'); @@ -64,7 +65,7 @@ architecture Behavioral of soda_4source is signal expected_reply_S : t_HUB_BYTE_ARRAY; --std_logic_vector(7 downto 0); signal reply_data_valid_S : t_HUB_BIT_ARRAY; signal reply_OK_S : t_HUB_BIT_ARRAY; - signal recv_start_calibration_S : std_logic := '0'; +-- signal recv_start_calibration_S : std_logic := '0'; signal send_start_calibration_S : t_HUB_BIT_ARRAY; signal start_calibration_S : t_HUB_BIT_ARRAY; signal calib_data_valid_S : t_HUB_BIT_ARRAY; @@ -107,25 +108,34 @@ architecture Behavioral of soda_4source is begin - - + superburst_gen : soda_superburst_generator + generic map(BURST_COUNT => 16) + port map( + SODACLK => SODACLK, + RESET => RESET, + --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, + SODA_CMD_WINDOW_OUT => soda_cmd_window_S + ); channel :for i in c_HUB_CHILDREN-1 downto 0 generate - TXsoda_cmd_valid_S(i) <= soda_cmd_valid_S; - TXstart_of_superburst_S(i) <= start_of_superburst_S; - TXsoda_cmd_word_S(i) <= '0' & soda_cmd_word_S; - TXsuper_burst_nr_S(i) <= '0' & super_burst_nr_S; - - - - start_calibration_S(i) <= send_start_calibration_S(i); + TXsoda_cmd_valid_S(i) <= trb_cmd_strobe_S; --trb_cmd_valid_S; + TXstart_of_superburst_S(i) <= start_of_superburst_S; + TXsoda_cmd_word_S(i) <= '0' & trb_cmd_word_S; + TXsuper_burst_nr_S(i) <= '0' & super_burst_nr_S; + + + start_calibration_S(i) <= send_start_calibration_S(i); packet_builder : soda_packet_builder port map( SODACLK => SODACLK, RESET => RESET, --Internal Connection + LINK_PHASE_IN => LINK_PHASE_IN(i), --link_phase_S, PL! SODA_CMD_STROBE_IN => TXsoda_cmd_valid_S(i), START_OF_SUPERBURST => TXstart_of_superburst_S(i), SUPER_BURST_NR_IN => TXsuper_burst_nr_S(i)(30 downto 0), @@ -254,7 +264,7 @@ begin last_packet_sent_S <= c_NO_PACKET; elsif (start_of_superburst_S='1') then last_packet_sent_S <= c_BST_PACKET; - elsif (soda_cmd_valid_S='1') then + elsif (trb_cmd_strobe_S='1') then last_packet_sent_S <= c_CMD_PACKET; end if; end if; @@ -324,8 +334,35 @@ begin NEXT_STATE <= SLEEP; end case; end process TRANSFORM; + - +soda_cmd_strobe_posedge_to_pulse: posedge_to_pulse + port map( + IN_CLK => SYSCLK, + OUT_CLK => SODACLK, + CLK_EN => '1', + SIGNAL_IN => trb_cmd_strobe_S, + PULSE_OUT => trb_cmd_strobe_sodaclk_S + ); + +SODA_CMD_FLOWCTRL : process(SODACLK) + begin + if( rising_edge(SODACLK) ) then + if( RESET = '1' ) then + trb_cmd_pending_S <= '0'; + trb_send_cmd_S <= '0'; + elsif trb_cmd_strobe_sodaclk_S = '1' then + trb_cmd_pending_S <= '1'; + elsif soda_cmd_window_S = '1' and trb_cmd_pending_S = '1' then + trb_send_cmd_S <= '1'; + trb_cmd_pending_S <= '0'; + else + trb_cmd_pending_S <= '0'; + trb_send_cmd_S <= '0'; + end if; + end if; + end process SODA_CMD_FLOWCTRL; + --------------------------------------------------------- -- data handling -- --------------------------------------------------------- @@ -364,8 +401,8 @@ end process TRANSFORM; dead_channel_S(0) <= CTRL_STATUS_register_S(0)(8); -- slow-control can declare a channel dead dead_channel_S(1) <= CTRL_STATUS_register_S(1)(8); -- slow-control can declare a channel dead - dead_channel_S(2) <= CTRL_STATUS_register_S(2)(8); -- slow-control can declare a channel dead - dead_channel_S(3) <= CTRL_STATUS_register_S(3)(8); -- slow-control can declare a channel dead + dead_channel_S(2) <= CTRL_STATUS_register_S(2)(8); -- slow-control can declare a channel dead + dead_channel_S(3) <= CTRL_STATUS_register_S(3)(8); -- slow-control can declare a channel dead -- register read THE_READ_REG_PROC: process( SYSCLK ) @@ -374,24 +411,24 @@ end process TRANSFORM; if ( RESET = '1' ) then buf_bus_data_out <= (others => '0'); elsif( (store_rd = '1') and (SODA_ADDR_IN = "0000") ) then - buf_bus_data_out <= '0' & soda_cmd_word_S; + buf_bus_data_out <= '0' & trb_cmd_word_S; elsif( (store_rd = '1') and (SODA_ADDR_IN = "0001") ) then buf_bus_data_out <= '0' & super_burst_nr_S; elsif( (store_rd = '1') and (SODA_ADDR_IN = "0100") ) then buf_bus_data_out <= calib_register_S(0); elsif( (store_rd = '1') and (SODA_ADDR_IN = "0101") ) then - buf_bus_data_out <= calib_register_S(0); + buf_bus_data_out <= calib_register_S(1); elsif( (store_rd = '1') and (SODA_ADDR_IN = "0110") ) then - buf_bus_data_out <= calib_register_S(0); + buf_bus_data_out <= calib_register_S(2); elsif( (store_rd = '1') and (SODA_ADDR_IN = "0111") ) then - buf_bus_data_out <= calib_register_S(0); - elsif( (store_rd = '1') and (SODA_ADDR_IN = "0011") ) then + buf_bus_data_out <= calib_register_S(3); + elsif( (store_rd = '1') and (SODA_ADDR_IN = "1000") ) then buf_bus_data_out <= CTRL_STATUS_register_S(0); - elsif( (store_rd = '1') and (SODA_ADDR_IN = "0100") ) then + elsif( (store_rd = '1') and (SODA_ADDR_IN = "1001") ) then buf_bus_data_out <= CTRL_STATUS_register_S(1); - elsif( (store_rd = '1') and (SODA_ADDR_IN = "0101") ) then + elsif( (store_rd = '1') and (SODA_ADDR_IN = "1010") ) then buf_bus_data_out <= CTRL_STATUS_register_S(2); - elsif( (store_rd = '1') and (SODA_ADDR_IN = "0110") ) then + elsif( (store_rd = '1') and (SODA_ADDR_IN = "1011") ) then buf_bus_data_out <= CTRL_STATUS_register_S(3); end if; end if; diff --git a/code/soda_hub.vhd b/code/soda_hub.vhd index 1b104d0..0667744 100644 --- a/code/soda_hub.vhd +++ b/code/soda_hub.vhd @@ -177,6 +177,7 @@ begin SODACLK => SODACLK, RESET => RESET, --Internal Connection + LINK_PHASE_IN => LINK_PHASE_IN, --link_phase_S, PL! 17092014 vergeten ??? of niet nodig ? SODA_CMD_STROBE_IN => TXsoda_cmd_valid_S(i), START_OF_SUPERBURST => TXstart_of_superburst_S(i), SUPER_BURST_NR_IN => TXsuper_burst_nr_S(i)(30 downto 0), @@ -495,4 +496,4 @@ end process TRANSFORM; SODA_DATA_OUT <= buf_bus_data_out; SODA_ACK_OUT <= bus_ack; -end architecture; \ No newline at end of file +end architecture; diff --git a/code/trb3_periph_EP_soda4source.vhd b/code/trb3_periph_EP_soda4source.vhd index 0b33f16..505cd6f 100644 --- a/code/trb3_periph_EP_soda4source.vhd +++ b/code/trb3_periph_EP_soda4source.vhd @@ -243,15 +243,15 @@ begin RESET_DELAY => x"FEEE" ) port map( - CLEAR_IN => '0', -- reset input (high active, async) - CLEAR_N_IN => '1', -- reset input (low active, async) - CLK_IN => clk_200_osc, -- raw master clock, NOT from PLL/DLL! - SYSCLK_IN => clk_100_osc, -- PLL/DLL remastered clock - PLL_LOCKED_IN => pll_lock, -- master PLL lock signal (async) - RESET_IN => '0', -- general reset signal (SYSCLK) - TRB_RESET_IN => med_stat_op(13), -- TRBnet reset signal (SYSCLK) - CLEAR_OUT => clear_i, -- async reset out, USE WITH CARE! - RESET_OUT => reset_i, -- synchronous reset out (SYSCLK) + CLEAR_IN => '0', -- reset input (high active, async) + CLEAR_N_IN => '1', -- reset input (low active, async) + CLK_IN => clk_200_osc, -- raw master clock, NOT from PLL/DLL! + SYSCLK_IN => clk_100_osc, -- PLL/DLL remastered clock + PLL_LOCKED_IN => pll_lock, -- master PLL lock signal (async) + RESET_IN => '0', -- general reset signal (SYSCLK) + TRB_RESET_IN => med_stat_op(13), -- TRBnet reset signal (SYSCLK) + CLEAR_OUT => clear_i, -- async reset out, USE WITH CARE! + RESET_OUT => reset_i, -- synchronous reset out (SYSCLK) DEBUG_OUT => open ); @@ -259,7 +259,7 @@ begin --------------------------------------------------------------------------- -- Clock Handling --------------------------------------------------------------------------- -gen_200_PLL : if USE_125_MHZ = c_NO generate +--gen_200_PLL : if USE_125_MHZ = c_NO generate THE_MAIN_PLL : pll_in200_out100 port map( CLK => CLK_GPLL_RIGHT, @@ -267,12 +267,12 @@ gen_200_PLL : if USE_125_MHZ = c_NO generate CLKOK => clk_200_osc, LOCK => pll_lock ); -end generate; +--end generate; -gen_125 : if USE_125_MHZ = c_YES generate - clk_100_osc <= CLK_GPLL_LEFT; - clk_200_osc <= CLK_GPLL_LEFT; -end generate; +--gen_125 : if USE_125_MHZ = c_YES generate +-- clk_100_osc <= CLK_GPLL_LEFT; +-- clk_200_osc <= CLK_GPLL_LEFT; +--end generate; --------------------------------------------------------------------------- @@ -344,7 +344,7 @@ end generate; BROADCAST_SPECIAL_ADDR => x"45", REGIO_COMPILE_TIME => std_logic_vector(to_unsigned(VERSION_NUMBER_TIME, 32)), REGIO_HARDWARE_VERSION => x"9100b000", - REGIO_INIT_ADDRESS => x"f356", + REGIO_INIT_ADDRESS => x"f358", REGIO_USE_VAR_ENDPOINT_ID => c_YES, CLOCK_FREQUENCY => CLOCK_FREQUENCY, TIMING_TRIGGER_RAW => c_YES, @@ -452,8 +452,8 @@ end generate; THE_BUS_HANDLER : trb_net16_regio_bus_handler generic map( PORT_NUMBER => 4, - PORT_ADDRESSES => (0 => x"d000", 1 => x"b000", 2 => x"be00", others => x"0000"), - PORT_ADDR_MASK => (0 => 9, 1 => 9, 2 => 4, others => 0) + PORT_ADDRESSES => (0 => x"d000", 1 => x"b000", 2 => x"b800", 3 => x"be00", others => x"0000"), + PORT_ADDR_MASK => (0 => 9, 1 => 9, 2 => 9, 3 => 4, others => 0) ) port map( CLK => clk_100_osc, @@ -485,7 +485,7 @@ end generate; BUS_DATA_OUT(1*32+31 downto 1*32+8) => open, BUS_DATA_OUT(2*32+7 downto 2*32) => sci2_data_in, BUS_DATA_OUT(2*32+31 downto 2*32+8) => open, - BUS_DATA_OUT(2*32+31 downto 2*32) => soda_data_in, + BUS_DATA_OUT(3*32+31 downto 3*32) => soda_data_in, BUS_ADDR_OUT(0*16+8 downto 0*16) => spimem_addr, BUS_ADDR_OUT(0*16+15 downto 0*16+9) => open, @@ -499,6 +499,7 @@ end generate; BUS_TIMEOUT_OUT(0) => open, BUS_TIMEOUT_OUT(1) => open, BUS_TIMEOUT_OUT(2) => open, + BUS_TIMEOUT_OUT(3) => open, BUS_DATA_IN(0*32+31 downto 0*32) => spimem_data_out, BUS_DATA_IN(1*32+7 downto 1*32) => sci1_data_out, @@ -677,8 +678,9 @@ THE_SPI_RELOAD : spi_flash_and_fpga_reload --.flash_reboot_arch ); - - SFP_TXDIS(1) <= sfp_txdis_S(1); + + SFP_TXDIS <= sfp_txdis_S; +-- SFP_TXDIS(1) <= sfp_txdis_S(1); --------------------------------------------------------------------------- -- The Soda Central diff --git a/soda_4source_EP.ldf b/soda_4source_EP.ldf index f1e3569..b15517a 100644 --- a/soda_4source_EP.ldf +++ b/soda_4source_EP.ldf @@ -2,27 +2,24 @@ - + - - - - + - + @@ -33,8 +30,17 @@ + + + + + + + + + - + @@ -43,7 +49,7 @@ - + @@ -51,8 +57,11 @@ + + + - + @@ -85,7 +94,7 @@ - + @@ -100,34 +109,34 @@ - + - + - + - + - + - + @@ -205,7 +214,7 @@ - + @@ -262,16 +271,16 @@ - + - + - + @@ -283,23 +292,20 @@ - + - + - + - + - - - @@ -310,21 +316,18 @@ - - - - - + + - + - + diff --git a/soda_4source_EP.lpf b/soda_4source_EP.lpf index 78ae222..11365cc 100644 --- a/soda_4source_EP.lpf +++ b/soda_4source_EP.lpf @@ -1,5 +1,4 @@ -rvl_alias "clk_raw_internal" "clk_raw_internal"; -RVL_ALIAS "clk_raw_internal" "clk_raw_internal"; +rvl_alias "clk_200_osc" "clk_200_osc"; RVL_ALIAS "clk_raw_internal" "clk_raw_internal"; BLOCK RESETPATHS ; BLOCK ASYNCPATHS ; @@ -178,36 +177,21 @@ BLOCK RD_DURING_WR_PATHS ; ################################################################# # Locate Serdes and media interfaces ################################################################# -LOCATE COMP "THE_MEDIA_UPLINK/gen_serdes_1_200.THE_SERDES/PCSD_INST" SITE "PCSA" ; -#LOCATE COMP "THE_MEDIA_UPLINK/gen_serdes_1_200_ctc_THE_SERDES/PCSD_INST" SITE "PCSA" ; -#LOCATE COMP "THE_MEDIA_UPLINK/gen_serdes_200/PCSD_INST" SITE "PCSA" ; -LOCATE COMP "THE_SYNC_LINK/THE_SERDES/PCSD_INST" SITE "PCSB" ; -#REGION "MEDIA_UPLINK_REGION" "R90C95D" 20 25 DEVSIZE; -#REGION "MEDIA_DOWNLINK_REGION" "R90C45D" 25 35 DEVSIZE; -#REGION "IOBUF_REGION" "R10C43D" 88 86 DEVSIZE; -#REGION "SPI_REGION" "R10C150D" 15 16 DEVSIZE; -#LOCATE UGROUP "THE_SPI_RELOAD/THE_SPI_MASTER/SPI_group" REGION "SPI_REGION" ; -#LOCATE UGROUP "THE_SPI_RELOAD/THE_SPI_MEMORY/SPI_group" REGION "SPI_REGION" ; -#LOCATE UGROUP "THE_MEDIA_UPLINK/media_interface_group" REGION "MEDIA_UPLINK_REGION" ; -#LOCATE UGROUP "THE_SYNC_LINK/media_downlink_group" REGION "MEDIA_DOWNLINK_REGION" ; -#USE SECONDARY NET "THE_MEDIA_UPLINK/rx_clock_half_c" "MEDIA_DOWNLINK_REGION" ; +#LOCATE COMP "THE_MEDIA_UPLINK/gen_serdes_1_200.THE_SERDES/PCSD_INST" SITE "PCSA" ; +LOCATE COMP "MED_ECP3_SODA_QUAD_SOURCE/THE_SERDES/PCSD_INST" SITE "PCSB" ; + MULTICYCLE FROM CELL "THE_RESET_HANDLER/rese*" 20.000000 ns ; -MULTICYCLE TO CELL "THE_SYNC_LINK/SCI_DATA_OUT*" 20.000000 ns ; -MULTICYCLE TO CELL "THE_SYNC_LINK/sci*" 20.000000 ns ; -MULTICYCLE FROM CELL "THE_SYNC_LINK/sci*" 25.000000 ns ; -MULTICYCLE TO CELL "THE_MEDIA_UPLINK/SCI_DATA_OUT*" 50.000000 ns ; +MULTICYCLE TO CELL "MED_ECP3_SODA_QUAD_SOURCE/SCI_DATA_OUT*" 20.000000 ns ; +MULTICYCLE TO CELL "MED_ECP3_SODA_QUAD_SOURCE/sci*" 20.000000 ns ; +MULTICYCLE FROM CELL "MED_ECP3_SODA_QUAD_SOURCE/sci*" 25.000000 ns ; +MULTICYCLE TO CELL "MED_ECP3_SODA_QUAD_SOURCE/SCI_DATA_OUT*" 50.000000 ns ; +MULTICYCLE FROM CELL "MED_ECP3_SODA_QUAD_SOURCE/PROC_SCI_CTRL.wa_pos*" 20.000000 ns ; + BLOCK JTAGPATHS ; + ## IOBUF ALLPORTS ; -#USE PRIMARY PURE NET "CLK_PCLK_LEFT_c" QUADRANT_TL QUADRANT_TR QUADRANT_BL QUADRANT_BR ; -#USE PRIMARY PURE NET "CLK_GPLL_RIGHT_c" QUADRANT_TL QUADRANT_TR QUADRANT_BL QUADRANT_BR ; -#FREQUENCY NET "THE_SYNC_LINK/THE_SERDES.rx_full_clk_ch0" 200.000000 MHz ; -#FREQUENCY NET "THE_SYNC_LINK/THE_SERDES.rx_half_clk_ch0" 100.000000 MHz ; -#FREQUENCY NET "THE_SYNC_LINK/THE_SERDES.tx_full_clk_ch0" 200.000000 MHz ; -#FREQUENCY NET "THE_SYNC_LINK/THE_SERDES.tx_half_clk_ch0" 100.000000 MHz ; -#USE PRIMARY PURE NET "THE_SYNC_LINK/THE_SERDES.tx_full_clk_ch0" ; -#USE PRIMARY PURE NET "THE_SYNC_LINK/THE_SERDES.tx_half_clk_ch0" ; -#USE PRIMARY PURE NET "THE_SYNC_LINK/THE_SERDES.rx_full_clk_ch0" ; -#USE PRIMARY PURE NET "THE_SYNC_LINK/THE_SERDES.rx_half_clk_ch0" ; -USE PRIMARY NET "THE_SYNC_LINK/CLK_RX_FULL_OUT_c" ; -USE PRIMARY NET "clk_sys_internal_c" ; -MULTICYCLE FROM CELL "THE_SYNC_LINK/PROC_SCI_CTRL.wa_pos*" 20.000000 ns ; +USE PRIMARY NET "clk_200_osc" ; +USE PRIMARY NET "clk_100_osc" ; +FREQUENCY NET "clk_200_osc" 200.000000 MHz ; +FREQUENCY NET "clk_100_osc" 100.000000 MHz ; + diff --git a/soda_client_probe.rvl b/soda_client_probe.rvl index 1f76566..e69de29 100644 --- a/soda_client_probe.rvl +++ b/soda_client_probe.rvl @@ -1,75 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/trb3_soda_dual_client.xcf b/trb3_soda_dual_client.xcf index 0c9f376..4f46560 100644 --- a/trb3_soda_dual_client.xcf +++ b/trb3_soda_dual_client.xcf @@ -46,8 +46,8 @@ 1 0 - /local/lemmens/lattice/soda/trb3_periph_sodaclient_20140624.bit - 06/24/14 17:16:05 + /local/lemmens/lattice/soda/trb3_periph_sodaclient_20140915.bit + 09/15/14 16:30:11 Fast Program