From: Peter Lemmens Date: Thu, 26 Mar 2015 14:02:53 +0000 (+0100) Subject: SODA-only looking stable. Minor bug-fixes. X-Git-Url: https://jspc29.x-matter.uni-frankfurt.de/git/?a=commitdiff_plain;h=b76226a6632988d213c6fa01b1ba50312e51ce8d;p=soda.git SODA-only looking stable. Minor bug-fixes. --- diff --git a/SODA_addressmap.odt b/SODA_addressmap.odt index d901b74..c1f671e 100644 Binary files a/SODA_addressmap.odt and b/SODA_addressmap.odt differ diff --git a/code/soda_4source.vhd b/code/soda_4source.vhd index 2b1e536..e74e3da 100644 --- a/code/soda_4source.vhd +++ b/code/soda_4source.vhd @@ -50,6 +50,8 @@ architecture Behavioral of soda_4source is signal soda_cmd_pending_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_reset_S : std_logic; + signal soda_enable_S : std_logic; -- signal soda_40mhz_cycle_S : std_logic := '0'; -- Signals @@ -64,15 +66,22 @@ architecture Behavioral of soda_4source is signal start_calibration_S : t_HUB_BIT_ARRAY := (others => '0'); signal calib_data_valid_S : t_HUB_BIT_ARRAY := (others => '0'); signal calibration_time_S : t_HUB_WORD_ARRAY := (others => (others => '0')); - signal calib_register_s : t_HUB_LWORD_ARRAY := (others => (others => '0')); +-- signal calib_register_s : t_HUB_LWORD_ARRAY := (others => (others => '0')); signal reply_timeout_error_S : t_HUB_BIT_ARRAY := (others => '0'); signal channel_timeout_status_S : t_HUB_BIT_ARRAY := (others => '0'); signal downstream_error_S : t_HUB_BIT_ARRAY := (others => '0'); + signal report_error_S : t_HUB_BIT_ARRAY; + + --signal common_reply_timeout_error_S : std_logic; + signal common_timeout_status_S : std_logic; + signal common_downstream_error_S : std_logic; + signal common_report_error_S : std_logic; signal dead_channel_S : t_HUB_BIT_ARRAY := (others => '0'); - signal CTRL_STATUS_register_S : t_HUB_LWORD_ARRAY := (others => (others => '0')); - + signal COMMON_CTRL_STATUS_register_S: std_logic_vector(31 downto 0); + signal CTRL_STATUS_register_S : t_HUB_LWORD_ARRAY; -- := (others => (others => '0')); + signal TXstart_of_superburst_S : t_HUB_BIT_ARRAY := (others => '0'); signal TXsuper_burst_nr_S : t_HUB_LWORD_ARRAY; -- from super-burst-nr-generator signal TXsoda_cmd_valid_S : t_HUB_BIT_ARRAY; @@ -101,21 +110,21 @@ begin generic map(BURST_COUNT => 16) port map( SODACLK => SODACLK, - RESET => RESET, - --Internal Connection + RESET => soda_reset_S, + ENABLE => soda_enable_S, 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) <= trb_cmd_strobe_S; --trb_cmd_valid_S; TXsoda_cmd_window_S(i) <= soda_cmd_window_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; + TXsuper_burst_nr_S(i) <= '0' & super_burst_nr_S; start_calibration_S(i) <= send_start_calibration_S(i); @@ -124,151 +133,126 @@ begin SODACLK => SODACLK, RESET => RESET, --Internal Connection - LINK_PHASE_IN => LINK_PHASE_IN(i), --link_phase_S, PL! + LINK_PHASE_IN => LINK_PHASE_IN(i), --link_phase_S, PL! SODA_CYCLE_IN => SODA_CYCLE_IN, - - SODA_CMD_STROBE_IN => TXsoda_cmd_valid_S(i), SODA_CMD_WINDOW_IN => TXsoda_cmd_window_S(i), + 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), SODA_CMD_WORD_IN => TXsoda_cmd_word_S(i)(30 downto 0), EXPECTED_REPLY_OUT => expected_reply_S(i), - TIME_CAL_OUT => send_start_calibration_S(i), + SEND_TIME_CAL_OUT => send_start_calibration_S(i), TX_DLM_PREVIEW_OUT => TX_DLM_PREVIEW_OUT(i), TX_DLM_OUT => TX_DLM_OUT(i), TX_DLM_WORD_OUT => TX_DLM_WORD_OUT(i) ); - hub_reply_handler : soda_reply_handler - port map( - SODACLK => SODACLK, - RESET => RESET, - CLEAR => '0', - CLK_EN => '1', - --Internal Connection --- LAST_PACKET => last_packet_sent_S, - EXPECTED_REPLY_IN => expected_reply_S(i), - RX_DLM_IN => RX_DLM_IN(i), - RX_DLM_WORD_IN => RX_DLM_WORD_IN(i), - REPLY_VALID_OUT => reply_data_valid_S(i), - REPLY_OK_OUT => reply_OK_S(i) - ); + hub_reply_handler : soda_reply_handler + port map( + SODACLK => SODACLK, + RESET => RESET, + CLEAR => '0', + CLK_EN => '1', + EXPECTED_REPLY_IN => expected_reply_S(i), + RX_DLM_IN => RX_DLM_IN(i), + RX_DLM_WORD_IN => RX_DLM_WORD_IN(i), + REPLY_VALID_OUT => reply_data_valid_S(i), + REPLY_OK_OUT => reply_OK_S(i) + ); - hub_calibration_timer : soda_calibration_timer - port map( - SODACLK => SODACLK, - RESET => RESET, - CLEAR => '0', - CLK_EN => '1', - --Internal Connection - START_CALIBRATION => start_calibration_S(i), - END_CALIBRATION => reply_data_valid_S(i), - VALID_OUT => calib_data_valid_S(i), - CALIB_TIME_OUT => calibration_time_S(i), - TIMEOUT_ERROR => reply_timeout_error_S(i) - ); - - sodahub_calib_timeout_proc : process(SYSCLK) -- converting to sysclk domain - begin - if rising_edge(SYSCLK) then - if( RESET = '1' ) then - calib_register_S(i) <= (others => '0'); - channel_timeout_status_S(i) <= '0'; - downstream_error_S(i) <= '0'; - CTRL_STATUS_register_S(i)(16) <= '0'; -- reset DOWNSTREAM_ERROR status-bit - CTRL_STATUS_register_S(i)(17) <= '0'; -- reset DOWNSTREAM_ERROR status-bit - CTRL_STATUS_register_S(i)(31) <= '0'; -- reset REPORT_ERROR status-bit - elsif (start_calibration_S(i) = '1') then -- reset registers at start of new calibration - calib_register_S(i) <= (others => '0'); - channel_timeout_status_S(i) <= '0'; - downstream_error_S(i) <= '0'; - CTRL_STATUS_register_S(i)(16) <= '0'; -- reset DOWNSTREAM_ERROR status-bit - CTRL_STATUS_register_S(i)(17) <= '0'; -- reset DOWNSTREAM_ERROR status-bit - CTRL_STATUS_register_S(i)(31) <= '0'; -- reset REPORT_ERROR status-bit - elsif (calib_data_valid_S(i) = '1') then -- calibration finished in time - calib_register_S(i) <= x"0000" & calibration_time_S(i); - channel_timeout_status_S(i) <= '0'; - elsif (reply_data_valid_S(i) = '1') then -- the reply was correct - channel_timeout_status_S(i) <= '0'; - if (reply_OK_S(i) = '1') then - downstream_error_S(i) <= '0'; - elsif (dead_channel_S(i) = '0') then - downstream_error_S(i) <= '1'; - CTRL_STATUS_register_S(i)(16) <= '1'; -- set DOWNSTREAM_ERROR status-bit - CTRL_STATUS_register_S(i)(31) <= '1'; -- set REPORT_ERROR status-bit + hub_calibration_timer : soda_calibration_timer + port map( + SODACLK => SODACLK, + RESET => soda_reset_S, --RESET, + CLEAR => '0', + CLK_EN => '1', + --Internal Connection + START_CALIBRATION => start_calibration_S(i), + END_CALIBRATION => reply_data_valid_S(i), + VALID_OUT => calib_data_valid_S(i), + CALIB_TIME_OUT => calibration_time_S(i), + TIMEOUT_ERROR => reply_timeout_error_S(i) + ); + + sodahub_calib_timeout_proc : process(SODACLK) + begin + if rising_edge(SODACLK) then + if( RESET = '1' ) then + downstream_error_S(i) <= '0'; + channel_timeout_status_S(i) <= '0'; + report_error_S(i) <= '0'; + elsif (soda_reset_S = '1') then -- check if slowcontrol wants to reset errors + channel_timeout_status_S(i) <= '0'; + downstream_error_S(i) <= '0'; -- set CALIBRATION_TIMEOUT_ERROR status-bit + report_error_S(i) <= '0'; -- reset REPORT_ERROR status-bit + elsif (reply_data_valid_S(i) = '1') then -- the reply was correct + channel_timeout_status_S(i) <= '0'; + if (reply_OK_S(i) = '1') then + downstream_error_S(i) <= '0'; + report_error_S(i) <= '0'; -- reset REPORT_ERROR status-bit + elsif (dead_channel_S(i) = '0') then + downstream_error_S(i) <= '1'; + report_error_S(i) <= '1'; -- set REPORT_ERROR status-bit + else + downstream_error_S(i) <= '1'; + report_error_S(i) <= '0'; -- reset REPORT_ERROR status-bit + end if; + elsif (reply_timeout_error_S(i) = '1') then --and (reply_OK_S(i) = '1')) then + if (dead_channel_S(i) = '0') then + channel_timeout_status_S(i) <= '1'; + report_error_S(i) <= '1'; -- set REPORT_ERROR status-bit + else + channel_timeout_status_S(i) <= '1'; + report_error_S(i) <= '0'; -- reset REPORT_ERROR status-bit + end if; end if; - elsif ((reply_timeout_error_S(i) = '1') and (reply_OK_S(i) = '1')) then - channel_timeout_status_S(i) <= '1'; - CTRL_STATUS_register_S(i)(17) <= '1'; -- set CALIBRATION_TIMEOUT_ERROR status-bit - CTRL_STATUS_register_S(i)(31) <= '1'; -- set REPORT_ERROR status-bit - elsif (CTRL_STATUS_register_S(i)(15) = '1') then -- check if slowcontrol wants to reset errors - CTRL_STATUS_register_S(i)(16) <= '0'; -- reset DOWNSTREAM_ERROR status-bit - CTRL_STATUS_register_S(i)(17) <= '0'; -- reset DOWNSTREAM_ERROR status-bit - CTRL_STATUS_register_S(i)(31) <= '0'; -- reset REPORT_ERROR status-bit end if; - end if; - end process; + end process; --- hub_store_calib_proc : process(SYSCLK) --- begin --- if rising_edge(SYSCLK) then --- if( RESET = '1' ) then --- calib_register_S(i) <= (others => '0'); --- else --- calib_register_S(i)(15 downto 0) <= calibration_time_S(i); --- end if; --- end if; --- end process; - - ----------------------------------------------------------- - -- Reply status report -- - ----------------------------------------------------------- --- reply_report_proc : process(SYSCLK) --- begin --- if rising_edge(SYSCLK) then --- if( RESET = '1' ) then --- channel_status_S(i) <= '0'; --- elsif (reply_data_valid_S(i)='1') then --- channel_status_S(i) <= reply_OK_S(i) or dead_channels_S(i); --- else --- channel_status_S(i) <= '0'; --- end if; --- end if; --- --- end process; + --------------------------------------------------------- + -- Control bits -- + --------------------------------------------------------- + dead_channel_S(i) <= CTRL_STATUS_register_S(i)(29); -- slow-control can declare a channel dead + --------------------------------------------------------- + -- Status bits -- + --------------------------------------------------------- + CTRL_STATUS_SYNC: signal_sync + generic map( + DEPTH => 1, + WIDTH => 3 + ) + port map( + RESET => RESET, + D_IN(0) => report_error_S(i), + D_IN(1) => downstream_error_S(i), + D_IN(2) => channel_timeout_status_S(i), + CLK0 => SYSCLK, + CLK1 => SODACLK, + D_OUT(0) => CTRL_STATUS_register_S(i)(15), + D_OUT(1) => CTRL_STATUS_register_S(i)(1), + D_OUT(2) => CTRL_STATUS_register_S(i)(0) + ); + + --CTRL_STATUS_register_S(i)(15) <= report_error_S(i); + CTRL_STATUS_register_S(i)(14 downto 2) <= (others => '0'); + --CTRL_STATUS_register_S(i)(1) <= downstream_error_S(i); + --CTRL_STATUS_register_S(i)(0) <= channel_timeout_status_S(i); end generate; ------------------------------------------------------------ --- Reset the unused bits of channel_status_S -- ------------------------------------------------------------ --- other_bits :for j in 31 downto c_HUB_CHILDREN generate --- init_unused_bits_proc : process(SYSCLK) --- begin --- if rising_edge(SYSCLK) then --- if( RESET = '1' ) then --- channel_status_S(j) <= '0'; -- reset status bits --- end if; --- end if; --- end process; --- end generate; - ------------------------------------------------------------ --- Transmission history for reply-checking -- ------------------------------------------------------------ --- packet_history_proc : process(SYSCLK) --- begin --- if rising_edge(SYSCLK) then --- if( RESET = '1' ) then --- last_packet_sent_S <= c_NO_PACKET; --- elsif (start_of_superburst_S='1') then --- last_packet_sent_S <= c_BST_PACKET; --- elsif (trb_cmd_strobe_S='1') then --- last_packet_sent_S <= c_CMD_PACKET; --- end if; --- end if; --- end process; - + soda_reset_S <= (RESET or COMMON_CTRL_STATUS_register_S(31)); + soda_enable_S <= COMMON_CTRL_STATUS_register_S(30); + common_downstream_error_S <= '1' when ((downstream_error_S(0)='1') or (downstream_error_S(1)='1') or (downstream_error_S(2)='1') or (downstream_error_S(3)='1')) + else '0'; + common_report_error_S <= '1' when ((report_error_S(0)='1') or (report_error_S(1)='1') or (report_error_S(2)='1') or (report_error_S(3)='1')) + else '0'; + common_timeout_status_S <= '1' when ((channel_timeout_status_S(0)='1') or (channel_timeout_status_S(1)='1') or (channel_timeout_status_S(2)='1')) or ((channel_timeout_status_S(3)='1')) + else '0'; + COMMON_CTRL_STATUS_register_S(15) <= common_report_error_S; + COMMON_CTRL_STATUS_register_S(14 downto 2) <= (others => '0'); + COMMON_CTRL_STATUS_register_S(1) <= common_downstream_error_S; + COMMON_CTRL_STATUS_register_S(0) <= common_timeout_status_S; + --------------------------------------------------------- -- RegIO Statemachine --------------------------------------------------------- @@ -333,7 +317,7 @@ begin NEXT_STATE <= SLEEP; end case; end process TRANSFORM; - + soda_cmd_strobe_posedge_to_pulse: posedge_to_pulse port map( @@ -343,25 +327,7 @@ soda_cmd_strobe_posedge_to_pulse: posedge_to_pulse 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 -- --------------------------------------------------------- @@ -371,37 +337,37 @@ SODA_CMD_FLOWCTRL : process(SODACLK) begin if( rising_edge(SYSCLK) ) then if ( RESET = '1' ) then - trb_cmd_strobe_S <= '0'; - trb_cmd_word_S <= (others => '0'); - CTRL_STATUS_register_S(0)(15 downto 0) <= (others => '0'); - CTRL_STATUS_register_S(1)(15 downto 0) <= (others => '0'); - CTRL_STATUS_register_S(2)(15 downto 0) <= (others => '0'); - CTRL_STATUS_register_S(3)(15 downto 0) <= (others => '0'); + trb_cmd_strobe_S <= '0'; + trb_cmd_word_S <= (others => '0'); + COMMON_CTRL_STATUS_register_S(31 downto 16) <= (30 => '1', others => '0'); -- enable soda by default + CTRL_STATUS_register_S(0)(31 downto 16) <= (others => '0'); + CTRL_STATUS_register_S(1)(31 downto 16) <= (others => '0'); + CTRL_STATUS_register_S(2)(31 downto 16) <= (others => '0'); + CTRL_STATUS_register_S(3)(31 downto 16) <= (others => '0'); elsif( (store_wr = '1') and (SODA_ADDR_IN = "0000") ) then trb_cmd_strobe_S <= '1'; trb_cmd_word_S <= SODA_DATA_IN(30 downto 0); - elsif( (store_wr = '1') and (SODA_ADDR_IN = "0001") ) then - trb_cmd_strobe_S <= '0'; - CTRL_STATUS_register_S(0)(15 downto 0) <= SODA_DATA_IN(15 downto 0); -- use only the 16 lower bits for control - elsif( (store_wr = '1') and (SODA_ADDR_IN = "0010") ) then - trb_cmd_strobe_S <= '0'; - CTRL_STATUS_register_S(1)(15 downto 0) <= SODA_DATA_IN(15 downto 0); -- use only the 16 lower bits for control elsif( (store_wr = '1') and (SODA_ADDR_IN = "0011") ) then - trb_cmd_strobe_S <= '0'; - CTRL_STATUS_register_S(2)(15 downto 0) <= SODA_DATA_IN(15 downto 0); -- use only the 16 lower bits for control + trb_cmd_strobe_S <= '0'; + COMMON_CTRL_STATUS_register_S(31 downto 16) <= SODA_DATA_IN(31 downto 16); -- use only the 16 lower bits for control elsif( (store_wr = '1') and (SODA_ADDR_IN = "0100") ) then - trb_cmd_strobe_S <= '0'; - CTRL_STATUS_register_S(3)(15 downto 0) <= SODA_DATA_IN(15 downto 0); -- use only the 16 lower bits for control + trb_cmd_strobe_S <= '0'; + CTRL_STATUS_register_S(0)(31 downto 16) <= SODA_DATA_IN(31 downto 16); -- use only the 16 lower bits for control + elsif( (store_wr = '1') and (SODA_ADDR_IN = "0101") ) then + trb_cmd_strobe_S <= '0'; + CTRL_STATUS_register_S(1)(31 downto 16) <= SODA_DATA_IN(31 downto 16); -- use only the 16 lower bits for control + elsif( (store_wr = '1') and (SODA_ADDR_IN = "0110") ) then + trb_cmd_strobe_S <= '0'; + CTRL_STATUS_register_S(2)(31 downto 16) <= SODA_DATA_IN(31 downto 16); -- use only the 16 lower bits for control + elsif( (store_wr = '1') and (SODA_ADDR_IN = "0111") ) then + trb_cmd_strobe_S <= '0'; + CTRL_STATUS_register_S(3)(31 downto 16) <= SODA_DATA_IN(31 downto 16); -- use only the 16 lower bits for control else - trb_cmd_strobe_S <= '0'; + trb_cmd_strobe_S <= '0'; end if; end if; end process THE_WRITE_REG_PROC; - 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 -- register read THE_READ_REG_PROC: process( SYSCLK ) @@ -413,71 +379,31 @@ SODA_CMD_FLOWCTRL : process(SODACLK) 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 = "0011") ) then + buf_bus_data_out <= COMMON_CTRL_STATUS_register_S; elsif( (store_rd = '1') and (SODA_ADDR_IN = "0100") ) then - buf_bus_data_out <= calib_register_S(0); + buf_bus_data_out <= CTRL_STATUS_register_S(0); elsif( (store_rd = '1') and (SODA_ADDR_IN = "0101") ) then - buf_bus_data_out <= calib_register_S(1); + buf_bus_data_out <= CTRL_STATUS_register_S(1); elsif( (store_rd = '1') and (SODA_ADDR_IN = "0110") ) then - buf_bus_data_out <= calib_register_S(2); + buf_bus_data_out <= CTRL_STATUS_register_S(2); elsif( (store_rd = '1') and (SODA_ADDR_IN = "0111") ) then - buf_bus_data_out <= calib_register_S(3); + buf_bus_data_out <= CTRL_STATUS_register_S(3); elsif( (store_rd = '1') and (SODA_ADDR_IN = "1000") ) then - buf_bus_data_out <= CTRL_STATUS_register_S(0); + buf_bus_data_out <= x"0000" & calibration_time_S(0); elsif( (store_rd = '1') and (SODA_ADDR_IN = "1001") ) then - buf_bus_data_out <= CTRL_STATUS_register_S(1); + buf_bus_data_out <= x"0000" & calibration_time_S(1); elsif( (store_rd = '1') and (SODA_ADDR_IN = "1010") ) then - buf_bus_data_out <= CTRL_STATUS_register_S(2); + buf_bus_data_out <= x"0000" & calibration_time_S(2); elsif( (store_rd = '1') and (SODA_ADDR_IN = "1011") ) then - buf_bus_data_out <= CTRL_STATUS_register_S(3); + buf_bus_data_out <= x"0000" & calibration_time_S(3); end if; end if; end process THE_READ_REG_PROC; --- buf_bus_data_out <= debug_status_S; --- elsif( (store_rd = '1') and (SODA_ADDR_IN = "0100") ) then --- buf_bus_data_out <= debug_rx_cnt_S; --- elsif( (store_rd = '1') and (SODA_ADDR_IN = "0101") ) then --- buf_bus_data_out <= debug_tx_cnt_S; --- elsif( (store_rd = '1') and (SODA_ADDR_IN = "0110") ) then --- buf_bus_data_out <= debug_sos_cnt_S; --- elsif( (store_rd = '1') and (SODA_ADDR_IN = "0111") ) then --- buf_bus_data_out <= debug_cmd_cnt_S; --- end if; --- end if; --- end process THE_READ_REG_PROC; - --- debug signals - --DEBUG_HUB : process(SODACLK) - --begin - --if( rising_edge(SODACLK) ) then - --debug_status_S(0) <= RESET; - --debug_status_S(1) <= CLEAR; - --debug_status_S(2) <= CLK_EN; - --if ( RESET = '1' ) then - --debug_rx_cnt_S <= (others => '0'); - --debug_tx_cnt_S <= (others => '0'); - --else - --if (txup_dlm_out_S = '1') then - --debug_tx_cnt_S <= debug_tx_cnt_S + 1; - --end if; - --if (RXUP_DLM_IN = '1') then - --debug_rx_cnt_S <= debug_rx_cnt_S + 1; - --end if; - --if (start_of_superburst_S = '1') then - --debug_sos_cnt_S <= debug_sos_cnt_S + 1; - --end if; - --if (soda_cmd_valid_S = '1') then - --debug_cmd_cnt_S <= debug_cmd_cnt_S + 1; - --end if; - --end if; - --end if; - --end process; - --debug_status_S(31 downto 3) <= LINK_DEBUG_IN(31 downto 3); --- TXUP_DLM_OUT <= txup_dlm_out_S; --- output signals LEDS_OUT <= (others => '0'); --LEDregister_i(3 downto 0); SODA_DATA_OUT <= buf_bus_data_out; SODA_ACK_OUT <= bus_ack; -end architecture; +end architecture; \ No newline at end of file diff --git a/code/soda_calibration_timer.vhd b/code/soda_calibration_timer.vhd index 951aa53..bbd46f9 100644 --- a/code/soda_calibration_timer.vhd +++ b/code/soda_calibration_timer.vhd @@ -40,7 +40,7 @@ begin CALIBRATION_RUNNING <= calibration_running_S; - packet_fsm_proc : process(SODACLK)--, RESET, packet_state_S, crc_valid_S, START_OF_SUPERBURST, soda_cmd_strobe_S) + calibration_fsm_proc : process(SODACLK) begin if rising_edge(SODACLK) then if (RESET='1') then diff --git a/code/soda_components.vhd b/code/soda_components.vhd index 515cb6b..df80d96 100644 --- a/code/soda_components.vhd +++ b/code/soda_components.vhd @@ -666,12 +666,12 @@ package soda_components is 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_NACK : out std_logic := '0'--; -- Status and control port -- STAT_OP : out t_HUB_WORD; --std_logic_vector (15 downto 0); -- CTRL_OP : in t_HUB_WORD; --std_logic_vector (15 downto 0) := (others => '0'); - STAT_DEBUG : out std_logic_vector (63 downto 0); - CTRL_DEBUG : in std_logic_vector (63 downto 0) := (others => '0') +-- STAT_DEBUG : out std_logic_vector (63 downto 0); +-- CTRL_DEBUG : in std_logic_vector (63 downto 0) := (others => '0') ); end component; diff --git a/code/soda_hub.vhd b/code/soda_hub.vhd index 7c927cd..6739dba 100644 --- a/code/soda_hub.vhd +++ b/code/soda_hub.vhd @@ -48,12 +48,14 @@ end soda_hub; architecture Behavioral of soda_hub is --SODA + signal soda_reset_S : std_logic; + signal soda_enable_S : std_logic; + 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_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'; @@ -67,7 +69,6 @@ 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 : t_HUB_BYTE_ARRAY := (others => (others => '0')); signal reply_data_valid_S : t_HUB_BIT_ARRAY := (others => '0'); signal reply_OK_S : t_HUB_BIT_ARRAY := (others => '0'); @@ -77,15 +78,21 @@ architecture Behavioral of soda_hub is signal stop_calibration_S : t_HUB_BIT_ARRAY := (others => '0'); signal calib_data_valid_S : t_HUB_BIT_ARRAY := (others => '0'); signal calibration_time_S : t_HUB_WORD_ARRAY := (others => (others => '0')); - signal calib_register_s : t_HUB_LWORD_ARRAY := (others => (others => '0')); - signal calib_timeout_error_S : t_HUB_BIT_ARRAY; signal calibration_running_S : t_HUB_BIT_ARRAY; - signal channel_timeout_status_S : t_HUB_BIT_ARRAY; +-- signal calib_register_s : t_HUB_LWORD_ARRAY := (others => (others => '0')); + signal reply_timeout_error_S : t_HUB_BIT_ARRAY := (others => '0'); + signal channel_timeout_status_S : t_HUB_BIT_ARRAY := (others => '0'); + signal downstream_error_S : t_HUB_BIT_ARRAY := (others => '0'); signal report_error_S : t_HUB_BIT_ARRAY; - signal downstream_error_S : t_HUB_BIT_ARRAY; + --signal common_reply_timeout_error_S : std_logic; + signal common_timeout_status_S : std_logic; + signal common_downstream_error_S : std_logic; + signal common_report_error_S : std_logic; + signal dead_channel_S : t_HUB_BIT_ARRAY := (others => '0'); + signal COMMON_CTRL_STATUS_register_S: std_logic_vector(31 downto 0); signal CTRL_STATUS_register_S : t_HUB_LWORD_ARRAY := (others => (others => '0')); signal TXstart_of_superburst_S : t_HUB_BIT_ARRAY; @@ -147,44 +154,26 @@ begin channel :for i in c_HUB_CHILDREN-1 downto 0 generate - --X_clk_domain : process(TX_SODACLK(i)) - --begin - --if rising_edge(TX_SODACLK(i)) then - --if RESET='1' then - --TXsoda_cmd_valid_S(i) <= '0'; - --TXstart_of_superburst_S(i) <= '0'; - --TXsoda_cmd_word_S(i) <= (others => '0'); - --TXsuper_burst_nr_S(i) <= (others => '0'); - --else - -- 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; - --end if; - --end if; - --end process; - - - - start_calibration_S(i) <= send_start_calibration_S(i); + 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 => UPLINK_PHASE_IN, --link_phase_S, PL! 17092014 vergeten ??? of niet nodig ? - SODA_CYCLE_IN => '1', -- 40MHz cycle is only required to sync superbursts at the source PL! 24022015 - SODA_CMD_STROBE_IN => trb_cmd_strobe_S, --soda_cmd_valid_S, --TXsoda_cmd_valid_S(i), - START_OF_SUPERBURST => start_of_superburst_S, --TXstart_of_superburst_S(i), - SUPER_BURST_NR_IN => super_burst_nr_S, --TXsuper_burst_nr_S(i)(30 downto 0), - SODA_CMD_WORD_IN => trb_cmd_word_S, --soda_cmd_word_S, --TXsoda_cmd_word_S(i)(30 downto 0), - EXPECTED_REPLY_OUT => expected_reply_S(i), - SEND_TIME_CAL_OUT => send_start_calibration_S(i), - TX_DLM_PREVIEW_OUT => TXDN_DLM_PREVIEW_OUT(i), - TX_DLM_OUT => TXDN_DLM_OUT(i), - TX_DLM_WORD_OUT => TXDN_DLM_WORD_OUT(i) - ); + packet_builder : soda_packet_builder + port map( + SODACLK => SODACLK, + RESET => RESET, + --Internal Connection + LINK_PHASE_IN => UPLINK_PHASE_IN, --link_phase_S, PL! 17092014 vergeten ??? of niet nodig ? + SODA_CYCLE_IN => '1', -- 40MHz cycle is only required to sync superbursts at the source PL! 24022015 + SODA_CMD_WINDOW_IN => '1', -- soda-source determines the sending of a command; hub always copies + SODA_CMD_STROBE_IN => trb_cmd_strobe_S, --soda_cmd_valid_S, --TXsoda_cmd_valid_S(i), + START_OF_SUPERBURST => start_of_superburst_S, --TXstart_of_superburst_S(i), + SUPER_BURST_NR_IN => super_burst_nr_S, --TXsuper_burst_nr_S(i)(30 downto 0), + SODA_CMD_WORD_IN => trb_cmd_word_S, --soda_cmd_word_S, --TXsoda_cmd_word_S(i)(30 downto 0), + EXPECTED_REPLY_OUT => expected_reply_S(i), + SEND_TIME_CAL_OUT => send_start_calibration_S(i), + TX_DLM_PREVIEW_OUT => TXDN_DLM_PREVIEW_OUT(i), + TX_DLM_OUT => TXDN_DLM_OUT(i), + TX_DLM_WORD_OUT => TXDN_DLM_WORD_OUT(i) + ); hub_reply_handler : soda_reply_handler port map( @@ -192,8 +181,6 @@ begin RESET => RESET, CLEAR => '0', CLK_EN => '1', - --Internal Connection - -- LAST_PACKET => last_packet_sent_S, EXPECTED_REPLY_IN => expected_reply_S(i), RX_DLM_IN => RXDN_DLM_IN(i), RX_DLM_WORD_IN => RXDN_DLM_WORD_IN(i), @@ -213,62 +200,93 @@ begin CALIBRATION_RUNNING => calibration_running_S(i), VALID_OUT => calib_data_valid_S(i), CALIB_TIME_OUT => calibration_time_S(i), - TIMEOUT_ERROR => calib_timeout_error_S(i) + TIMEOUT_ERROR => reply_timeout_error_S(i) ); - stop_calibration_S(i) <= '1' when ((calibration_running_S(i)='1') and ((reply_data_valid_S(i) = '1') or (calib_timeout_error_S(i)='1'))) else '0'; - channel_timeout_status_S(i) <= '1' when ((calibration_running_S(i)='0') and (calib_timeout_error_S(i)='1')) else '0'; - downstream_error_S(i) <= '1' when ((reply_data_valid_S(i) = '1') and (reply_OK_S(i) = '0')) else '0'; - report_error_S(i) <= '1' when ((dead_channel_S(i) = '0') and ((downstream_error_S(i)='1') or (channel_timeout_status_S(i)='1'))) else '0'; + stop_calibration_S(i) <= '1' when ((calibration_running_S(i)='1') and ((reply_data_valid_S(i) = '1') or (reply_timeout_error_S(i)='1'))) else '0'; +-- channel_timeout_status_S(i) <= '1' when ((calibration_running_S(i)='0') and (reply_timeout_error_S(i)='1')) else '0'; +-- downstream_error_S(i) <= '1' when ((reply_data_valid_S(i) = '1') and (reply_OK_S(i) = '0')) else '0'; +-- report_error_S(i) <= '1' when ((dead_channel_S(i) = '0') and ((downstream_error_S(i)='1') or (channel_timeout_status_S(i)='1'))) else '0'; - sodahub_calib_timeout_proc : process(SYSCLK) -- converting to sysclk domain + sodahub_calib_timeout_proc : process(SODACLK) begin - if rising_edge(SYSCLK) then + if rising_edge(SODACLK) then if( RESET = '1' ) then - CTRL_STATUS_register_S(i)(31 downto 16) <= (others => '0'); -- reset REPORT_ERROR status-bit - calib_register_S(i) <= (others => '0'); -- reset REPORT_ERROR status-bit - else - CTRL_STATUS_register_S(i)(16) <= downstream_error_S(i); -- reset DOWNSTREAM_ERROR status-bit - CTRL_STATUS_register_S(i)(17) <= channel_timeout_status_S(i); -- reset CALIBRATION_TIMEOUT_ERROR status-bit - CTRL_STATUS_register_S(i)(31) <= report_error_S(i); -- reset REPORT_ERROR status-bit - if (reply_data_valid_S(i) = '1') then -- calibration time has ended and there is a reply - calib_register_S(i) <= x"0000" & calibration_time_S(i); -- store the elapsed time + downstream_error_S(i) <= '0'; + channel_timeout_status_S(i) <= '0'; + report_error_S(i) <= '0'; + elsif (soda_reset_S = '1') then -- check if slowcontrol wants to reset errors + channel_timeout_status_S(i) <= '0'; + downstream_error_S(i) <= '0'; -- set CALIBRATION_TIMEOUT_ERROR status-bit + report_error_S(i) <= '0'; -- reset REPORT_ERROR status-bit + elsif (reply_data_valid_S(i) = '1') then -- the reply was correct + channel_timeout_status_S(i) <= '0'; + if (reply_OK_S(i) = '1') then + downstream_error_S(i) <= '0'; + report_error_S(i) <= '0'; -- reset REPORT_ERROR status-bit + elsif (dead_channel_S(i) = '0') then + downstream_error_S(i) <= '1'; + report_error_S(i) <= '1'; -- set REPORT_ERROR status-bit + else + downstream_error_S(i) <= '1'; + report_error_S(i) <= '0'; -- reset REPORT_ERROR status-bit + end if; + elsif (reply_timeout_error_S(i) = '1') then --and (reply_OK_S(i) = '1')) then + if (dead_channel_S(i) = '0') then + channel_timeout_status_S(i) <= '1'; + report_error_S(i) <= '1'; -- set REPORT_ERROR status-bit + else + channel_timeout_status_S(i) <= '1'; + report_error_S(i) <= '0'; -- reset REPORT_ERROR status-bit end if; end if; end if; end process; - end generate; ------------------------------------------------------------ --- Reset the unused bits of channel_status_S -- ------------------------------------------------------------ --- other_bits :for j in 31 downto c_HUB_CHILDREN generate --- init_unused_bits_proc : process(SYSCLK) --- begin --- if rising_edge(SYSCLK) then --- if( RESET = '1' ) then --- channel_status_S(j) <= '0'; -- reset status bits --- end if; --- end if; --- end process; --- end generate; + --------------------------------------------------------- + -- Control bits -- + --------------------------------------------------------- + dead_channel_S(i) <= CTRL_STATUS_register_S(i)(29); -- slow-control can declare a channel dead + --------------------------------------------------------- + -- Status bits -- + --------------------------------------------------------- + CTRL_STATUS_SYNC: signal_sync + generic map( + DEPTH => 1, + WIDTH => 3 + ) + port map( + RESET => RESET, + D_IN(0) => report_error_S(i), + D_IN(1) => downstream_error_S(i), + D_IN(2) => channel_timeout_status_S(i), + CLK0 => SYSCLK, + CLK1 => SODACLK, + D_OUT(0) => CTRL_STATUS_register_S(i)(15), + D_OUT(1) => CTRL_STATUS_register_S(i)(1), + D_OUT(2) => CTRL_STATUS_register_S(i)(0) + ); + + --CTRL_STATUS_register_S(i)(15) <= report_error_S(i); + CTRL_STATUS_register_S(i)(14 downto 2) <= (others => '0'); + --CTRL_STATUS_register_S(i)(1) <= downstream_error_S(i); + --CTRL_STATUS_register_S(i)(0) <= channel_timeout_status_S(i); ------------------------------------------------------------ --- Transmission history for reply-checking -- ------------------------------------------------------------ - packet_history_proc : process(SYSCLK) - begin - if rising_edge(SYSCLK) then - if( RESET = '1' ) then - 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 - last_packet_sent_S <= c_CMD_PACKET; - end if; - end if; - end process; + end generate; + + soda_reset_S <= (RESET or COMMON_CTRL_STATUS_register_S(31)); + soda_enable_S <= COMMON_CTRL_STATUS_register_S(30); + common_downstream_error_S <= '1' when ((downstream_error_S(0)='1') or (downstream_error_S(1)='1') or (downstream_error_S(2)='1') or (downstream_error_S(3)='1')) + else '0'; + common_report_error_S <= '1' when ((report_error_S(0)='1') or (report_error_S(1)='1') or (report_error_S(2)='1') or (report_error_S(3)='1')) + else '0'; + common_timeout_status_S <= '1' when ((channel_timeout_status_S(0)='1') or (channel_timeout_status_S(1)='1') or (channel_timeout_status_S(2)='1')) or ((channel_timeout_status_S(3)='1')) + else '0'; + COMMON_CTRL_STATUS_register_S(15) <= common_report_error_S; + COMMON_CTRL_STATUS_register_S(14 downto 2) <= (others => '0'); + COMMON_CTRL_STATUS_register_S(1) <= common_downstream_error_S; + COMMON_CTRL_STATUS_register_S(0) <= common_timeout_status_S; --------------------------------------------------------- -- RegIO Statemachine @@ -335,6 +353,14 @@ begin 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 + ); --------------------------------------------------------- -- data handling -- @@ -345,37 +371,37 @@ end process TRANSFORM; begin if( rising_edge(SYSCLK) ) then if ( RESET = '1' ) then - trb_cmd_strobe_S <= '0'; - trb_cmd_word_S <= (others => '0'); - CTRL_STATUS_register_S(0)(15 downto 0) <= (others => '0'); - CTRL_STATUS_register_S(1)(15 downto 0) <= (others => '0'); - CTRL_STATUS_register_S(2)(15 downto 0) <= (others => '0'); - CTRL_STATUS_register_S(3)(15 downto 0) <= (others => '0'); + trb_cmd_strobe_S <= '0'; + trb_cmd_word_S <= (others => '0'); + COMMON_CTRL_STATUS_register_S(31 downto 16) <= (30 => '1', others => '0'); -- enable soda by default + CTRL_STATUS_register_S(0)(31 downto 16) <= (others => '0'); + CTRL_STATUS_register_S(1)(31 downto 16) <= (others => '0'); + CTRL_STATUS_register_S(2)(31 downto 16) <= (others => '0'); + CTRL_STATUS_register_S(3)(31 downto 16) <= (others => '0'); elsif( (store_wr = '1') and (SODA_ADDR_IN = "0000") ) then trb_cmd_strobe_S <= '1'; trb_cmd_word_S <= SODA_DATA_IN(30 downto 0); - elsif( (store_wr = '1') and (SODA_ADDR_IN = "0001") ) then - trb_cmd_strobe_S <= '0'; - CTRL_STATUS_register_S(0)(15 downto 0) <= SODA_DATA_IN(15 downto 0); -- use only the 16 lower bits for control - elsif( (store_wr = '1') and (SODA_ADDR_IN = "0010") ) then - trb_cmd_strobe_S <= '0'; - CTRL_STATUS_register_S(1)(15 downto 0) <= SODA_DATA_IN(15 downto 0); -- use only the 16 lower bits for control elsif( (store_wr = '1') and (SODA_ADDR_IN = "0011") ) then - trb_cmd_strobe_S <= '0'; - CTRL_STATUS_register_S(2)(15 downto 0) <= SODA_DATA_IN(15 downto 0); -- use only the 16 lower bits for control + trb_cmd_strobe_S <= '0'; + COMMON_CTRL_STATUS_register_S(31 downto 16) <= SODA_DATA_IN(31 downto 16); -- use only the 16 lower bits for control elsif( (store_wr = '1') and (SODA_ADDR_IN = "0100") ) then - trb_cmd_strobe_S <= '0'; - CTRL_STATUS_register_S(3)(15 downto 0) <= SODA_DATA_IN(15 downto 0); -- use only the 16 lower bits for control + trb_cmd_strobe_S <= '0'; + CTRL_STATUS_register_S(0)(31 downto 16) <= SODA_DATA_IN(31 downto 16); -- use only the 16 lower bits for control + elsif( (store_wr = '1') and (SODA_ADDR_IN = "0101") ) then + trb_cmd_strobe_S <= '0'; + CTRL_STATUS_register_S(1)(31 downto 16) <= SODA_DATA_IN(31 downto 16); -- use only the 16 lower bits for control + elsif( (store_wr = '1') and (SODA_ADDR_IN = "0110") ) then + trb_cmd_strobe_S <= '0'; + CTRL_STATUS_register_S(2)(31 downto 16) <= SODA_DATA_IN(31 downto 16); -- use only the 16 lower bits for control + elsif( (store_wr = '1') and (SODA_ADDR_IN = "0111") ) then + trb_cmd_strobe_S <= '0'; + CTRL_STATUS_register_S(3)(31 downto 16) <= SODA_DATA_IN(31 downto 16); -- use only the 16 lower bits for control else - trb_cmd_strobe_S <= '0'; + trb_cmd_strobe_S <= '0'; end if; end if; end process THE_WRITE_REG_PROC; - 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 -- register read THE_READ_REG_PROC: process( SYSCLK ) @@ -384,25 +410,27 @@ 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 = "0011") ) then + buf_bus_data_out <= COMMON_CTRL_STATUS_register_S; elsif( (store_rd = '1') and (SODA_ADDR_IN = "0100") ) then - buf_bus_data_out <= calib_register_S(0); + buf_bus_data_out <= CTRL_STATUS_register_S(0); elsif( (store_rd = '1') and (SODA_ADDR_IN = "0101") ) then - buf_bus_data_out <= calib_register_S(1); + buf_bus_data_out <= CTRL_STATUS_register_S(1); elsif( (store_rd = '1') and (SODA_ADDR_IN = "0110") ) then - buf_bus_data_out <= calib_register_S(2); + buf_bus_data_out <= CTRL_STATUS_register_S(2); elsif( (store_rd = '1') and (SODA_ADDR_IN = "0111") ) then - buf_bus_data_out <= calib_register_S(3); + buf_bus_data_out <= CTRL_STATUS_register_S(3); elsif( (store_rd = '1') and (SODA_ADDR_IN = "1000") ) then - buf_bus_data_out <= CTRL_STATUS_register_S(0); + buf_bus_data_out <= x"0000" & calibration_time_S(0); elsif( (store_rd = '1') and (SODA_ADDR_IN = "1001") ) then - buf_bus_data_out <= CTRL_STATUS_register_S(1); + buf_bus_data_out <= x"0000" & calibration_time_S(1); elsif( (store_rd = '1') and (SODA_ADDR_IN = "1010") ) then - buf_bus_data_out <= CTRL_STATUS_register_S(2); + buf_bus_data_out <= x"0000" & calibration_time_S(2); elsif( (store_rd = '1') and (SODA_ADDR_IN = "1011") ) then - buf_bus_data_out <= CTRL_STATUS_register_S(3); + buf_bus_data_out <= x"0000" & calibration_time_S(3); end if; end if; end process THE_READ_REG_PROC; diff --git a/code/trb3_periph_EP_soda4source.vhd b/code/trb3_periph_EP_soda4source.vhd index a43a376..768e594 100644 --- a/code/trb3_periph_EP_soda4source.vhd +++ b/code/trb3_periph_EP_soda4source.vhd @@ -656,16 +656,15 @@ MED_ECP3_SODA_QUAD_SOURCE : med_ecp3_sfp_4_soda SCI_READ => sci2_read, SCI_WRITE => sci2_write, SCI_ACK => sci2_ack, - SCI_NACK => sci2_nack, + SCI_NACK => sci2_nack--, --Status and control port -- STAT_OP(0) => med_stat_op(15 downto 0), --med_stat_op(1*16+15 downto 1*16), -- CTRL_OP(0) => med_ctrl_op(15 downto 0), --med_ctrl_op(0*16+15 downto 0*16), - - STAT_DEBUG => open, - CTRL_DEBUG => (others => '0') -); - +-- STAT_DEBUG => open, +-- CTRL_DEBUG => (others => '0') + ); + SFP_TXDIS <= sfp_txdis_S; @@ -738,7 +737,7 @@ THE_SOB_SOURCE : soda_start_of_burst_control end if; end process; - blink_H : process (clk_200_osc) + blink_H : process (clk_200_osc, time_counter_S) begin if (rising_edge(clk_200_osc) and (time_counter_S(15 downto 0) = x"FFFF"))then if ((time_counter_S(31 downto 16) = x"FFFF") and (time_counter_S(15 downto 0) = x"FFFF")) then diff --git a/ctsh.ldf b/ctsh.ldf index 649498b..151adf3 100644 --- a/ctsh.ldf +++ b/ctsh.ldf @@ -18,6 +18,9 @@ + + + diff --git a/soda4srcEP.ldf b/soda4srcEP.ldf index 63077e8..d98efa6 100644 --- a/soda4srcEP.ldf +++ b/soda4srcEP.ldf @@ -15,6 +15,15 @@ + + + + + + + + + @@ -48,9 +57,6 @@ - - - @@ -60,9 +66,6 @@ - - - @@ -75,9 +78,6 @@ - - - diff --git a/soda_source.ldf b/soda_source.ldf index 02e2c21..afa532b 100644 --- a/soda_source.ldf +++ b/soda_source.ldf @@ -4,7 +4,7 @@ - + diff --git a/trb3_soda_source.xcf b/trb3_soda_source.xcf index ac352bd..5e6f4c4 100644 --- a/trb3_soda_source.xcf +++ b/trb3_soda_source.xcf @@ -139,8 +139,9 @@ 1 0 - /local/lemmens/lattice/soda/trb3_periph_sodasource_20150318.bit - 03/18/15 15:40:50 + /local/lemmens/lattice/soda/trb3_periph_sodasource_20150319.bit + 03/19/15 08:09:52 + N/A Fast Program