From 0b63aaa3f549b42fb5ff94b93c8125f386a72f5a Mon Sep 17 00:00:00 2001 From: Peter Lemmens Date: Wed, 30 Oct 2013 16:26:52 +0100 Subject: [PATCH] Nice soda.... crashes on first trbcmd read/write --- soda_source.lpf | 2 +- source/med_ecp3_sfp_sync_down.vhd | 4 +- source/soda_components.vhd | 12 ++- source/soda_packet_builder.vhd | 147 +++++++++++------------------- source/soda_source.vhd | 42 +-------- source/trb3_periph_sodasource.vhd | 6 +- 6 files changed, 69 insertions(+), 144 deletions(-) diff --git a/soda_source.lpf b/soda_source.lpf index d63a6c5..7bf08a5 100644 --- a/soda_source.lpf +++ b/soda_source.lpf @@ -1,4 +1,4 @@ -rvl_alias "reveal_ist_129" "the_sync_link/the_serdes/rx_full_clk_ch0"; +rvl_alias "reveal_ist_114" "the_sync_link/the_serdes/rx_full_clk_ch0"; BLOCK RESETPATHS ; BLOCK ASYNCPATHS ; BLOCK RD_DURING_WR_PATHS ; diff --git a/source/med_ecp3_sfp_sync_down.vhd b/source/med_ecp3_sfp_sync_down.vhd index 93bb871..b9af9a1 100644 --- a/source/med_ecp3_sfp_sync_down.vhd +++ b/source/med_ecp3_sfp_sync_down.vhd @@ -37,7 +37,7 @@ entity med_ecp3_sfp_sync_down is 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_INIT : in std_logic := '0'; --PL! + TX_DLM_PREVIEW_IN : in std_logic := '0'; --PL! LINK_PHASE_OUT : out std_logic := '0'; --PL! --SFP Connection @@ -324,7 +324,7 @@ THE_TX : soda_tx_control START_RETRANSMIT_IN => start_retr_i, --TODO START_POSITION_IN => request_retr_position_i, --TODO - TX_DLM_INIT => TX_DLM_INIT, + TX_DLM_PREVIEW_IN => TX_DLM_PREVIEW_IN, SEND_DLM => TX_DLM, SEND_DLM_WORD => TX_DLM_WORD, diff --git a/source/soda_components.vhd b/source/soda_components.vhd index ce9f7a0..38a0530 100644 --- a/source/soda_components.vhd +++ b/source/soda_components.vhd @@ -6,11 +6,12 @@ library work; use work.trb_net_std.all; use work.trb_net_components.all; use work.trb_net16_hub_func.all; +use work.soda_components.all; package soda_components is - constant c_NOT_IN_SYNC : std_logic := '0'; -- byt2word allignment of soda - constant c_IN_SYNC : std_logic := '1'; -- byt2word allignment of soda + 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 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 @@ -52,6 +53,7 @@ package soda_components is SODA_CMD_WORD_IN : in std_logic_vector(30 downto 0) := (others => '0'); --REGIO_CTRL_REG in trbnet handler is 32 bit EXPECTED_REPLY_OUT : out std_logic_vector(7 downto 0) := (others => '0'); TIME_CAL_OUT : out std_logic := '0'; -- + 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') ); @@ -101,7 +103,7 @@ package soda_components is RX_DLM_IN : in std_logic; TX_DLM_OUT : out std_logic; TX_DLM_WORD_OUT : out std_logic_vector(7 downto 0) := (others => '0'); - TX_DLM_INIT_OUT : out std_logic := '0'; --PL! + TX_DLM_PREVIEW_OUT : out std_logic := '0'; --PL! LINK_PHASE_IN : in std_logic := '0'; --PL! @@ -287,7 +289,7 @@ component med_ecp3_sfp_sync_down is 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_INIT : in std_logic := '0'; --PL! + TX_DLM_PREVIEW_IN : in std_logic := '0'; --PL! LINK_PHASE_OUT : out std_logic := '0'; --PL! --SFP Connection @@ -394,7 +396,7 @@ component soda_tx_control START_RETRANSMIT_IN : in std_logic := '0'; START_POSITION_IN : in std_logic_vector( 7 downto 0) := (others => '0'); --send_dlm: 200 MHz, 1 clock strobe, data valid until next DLM - TX_DLM_INIT : in std_logic := '0'; + TX_DLM_PREVIEW_IN : in std_logic := '0'; SEND_DLM : in std_logic := '0'; SEND_DLM_WORD : in std_logic_vector( 7 downto 0) := (others => '0'); diff --git a/source/soda_packet_builder.vhd b/source/soda_packet_builder.vhd index d33d2b3..296afe7 100644 --- a/source/soda_packet_builder.vhd +++ b/source/soda_packet_builder.vhd @@ -21,6 +21,7 @@ entity soda_packet_builder is SODA_CMD_WORD_IN : in std_logic_vector(30 downto 0) := (others => '0'); --REGIO_CTRL_REG in trbnet handler is 32 bit EXPECTED_REPLY_OUT : out std_logic_vector(7 downto 0) := (others => '0'); TIME_CAL_OUT : out std_logic := '0'; + 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') ); @@ -29,8 +30,8 @@ end soda_packet_builder; architecture Behavioral of soda_packet_builder is signal soda_cmd_window_S : std_logic; - signal soda_cmd_strobe_S : std_logic; - signal super_burst_nr_S : std_logic_vector(30 downto 0) := (others => '0'); -- from super-burst-nr-generator +-- signal soda_cmd_strobe_S : std_logic; +-- signal super_burst_nr_S : std_logic_vector(30 downto 0) := (others => '0'); -- from super-burst-nr-generator signal soda_cmd_word_S : std_logic_vector(30 downto 0) := (others => '0'); -- from slowcontrol signal soda_pkt_word_S : std_logic_vector(7 downto 0) := (others => '0'); signal soda_pkt_valid_S : std_logic; @@ -49,6 +50,7 @@ architecture Behavioral of soda_packet_builder is ); signal packet_state_S : packet_state_type := c_IDLE; + signal soda_dlm_preview_S : std_logic; signal soda_cmd_reg_full_S : std_logic; signal soda_cmd_reg_S : std_logic_vector(31 downto 0) := (others => '0'); -- from super-burst-nr-generator @@ -66,33 +68,42 @@ begin CRC_VALID_OUT => crc_valid_S ); - soda_cmd_strobe_S <= SODA_CMD_STROBE_IN; +-- soda_cmd_strobe_S <= SODA_CMD_STROBE_IN; soda_cmd_word_S <= SODA_CMD_WORD_IN; - super_burst_nr_S <= SUPER_BURST_NR_IN; +-- super_burst_nr_S <= SUPER_BURST_NR_IN; - TX_DLM_WORD_OUT <= soda_pkt_word_S; + TX_DLM_PREVIEW_OUT <= '1' when (((LINK_PHASE_IN='1') and ((soda_dlm_preview_S='1') or (START_OF_SUPERBURST='1') or (SODA_CMD_STROBE_IN='1'))) or + ((LINK_PHASE_IN='0') and (soda_dlm_preview_S='1'))) + else '0'; +-- TX_DLM_PREVIEW_OUT <= soda_dlm_preview_S; TX_DLM_OUT <= soda_pkt_valid_S; + TX_DLM_WORD_OUT <= soda_pkt_word_S; packet_fsm_proc : process(SODACLK) begin if rising_edge(SODACLK) then if (RESET='1') then - packet_state_S <= c_IDLE; + packet_state_S <= c_IDLE; + soda_dlm_preview_S <= '0'; + soda_pkt_valid_S <= '0'; + soda_pkt_word_S <= (others => '0'); else case packet_state_S is when c_IDLE => if (START_OF_SUPERBURST='1') then - if (LINK_PHASE_IN = c_IN_SYNC) then + soda_dlm_preview_S <= '1'; + if (LINK_PHASE_IN = c_PHASE_H) then packet_state_S <= c_BST1; soda_pkt_valid_S <= '1'; - soda_pkt_word_S <= '1' & super_burst_nr_S(30 downto 24); + soda_pkt_word_S <= '1' & SUPER_BURST_NR_IN(30 downto 24); else packet_state_S <= c_WAIT4BST1; soda_pkt_valid_S <= '0'; end if; - elsif (soda_cmd_strobe_S='1') then - if (LINK_PHASE_IN = c_IN_SYNC) then + elsif (SODA_CMD_STROBE_IN='1') then + soda_dlm_preview_S <= '1'; + if (LINK_PHASE_IN = c_PHASE_H) then packet_state_S <= c_CMD1; soda_pkt_valid_S <= '1'; soda_pkt_word_S <= '0' & soda_cmd_word_S(30 downto 24); @@ -108,46 +119,52 @@ begin end if; when c_WAIT4BST1 => packet_state_S <= c_BST1; + soda_dlm_preview_S <= '1'; soda_pkt_valid_S <= '1'; - soda_pkt_word_S <= '1' & super_burst_nr_S(30 downto 24); + soda_pkt_word_S <= '1' & SUPER_BURST_NR_IN(30 downto 24); when c_BST1 => packet_state_S <= c_BST2; soda_pkt_valid_S <= '0'; when c_BST2 => packet_state_S <= c_BST3; soda_pkt_valid_S <= '1'; - soda_pkt_word_S <= super_burst_nr_S(23 downto 16); + soda_pkt_word_S <= SUPER_BURST_NR_IN(23 downto 16); when c_BST3 => packet_state_S <= c_BST4; soda_pkt_valid_S <= '0'; when c_BST4 => packet_state_S <= c_BST5; soda_pkt_valid_S <= '1'; - soda_pkt_word_S <= super_burst_nr_S(15 downto 8); + soda_pkt_word_S <= SUPER_BURST_NR_IN(15 downto 8); when c_BST5 => packet_state_S <= c_BST6; soda_pkt_valid_S <= '0'; when c_BST6 => packet_state_S <= c_BST7; soda_pkt_valid_S <= '1'; - soda_pkt_word_S <= super_burst_nr_S(7 downto 0); + soda_pkt_word_S <= SUPER_BURST_NR_IN(7 downto 0); when c_BST7 => packet_state_S <= c_BST8; + soda_dlm_preview_S <= '0'; soda_pkt_valid_S <= '0'; when c_BST8 => - if (soda_cmd_strobe_S='0') then + if (SODA_CMD_STROBE_IN='0') then + soda_dlm_preview_S <= '0'; packet_state_S <= c_IDLE; else - packet_state_S <= c_CMD1; + soda_dlm_preview_S <= '1'; + packet_state_S <= c_CMD1; end if; - soda_pkt_valid_S <= '0'; - soda_pkt_word_S <= (others=>'0'); + soda_pkt_valid_S <= '0'; + soda_pkt_word_S <= (others=>'0'); when c_WAIT4CMD1 => packet_state_S <= c_CMD1; + soda_dlm_preview_S <= '1'; soda_pkt_valid_S <= '1'; soda_pkt_word_S <= '0' & soda_cmd_word_S(30 downto 24); when c_CMD1 => packet_state_S <= c_CMD2; + soda_dlm_preview_S <= '1'; soda_pkt_valid_S <= '0'; when c_CMD2 => packet_state_S <= c_CMD3; @@ -173,98 +190,39 @@ begin else packet_state_S <= c_CMD8; end if; + soda_dlm_preview_S <= '0'; soda_pkt_valid_S <= '0'; when c_CMD8 => packet_state_S <= c_IDLE; + soda_dlm_preview_S <= '0'; soda_pkt_valid_S <= '0'; soda_pkt_word_S <= (others=>'0'); when c_ERROR => packet_state_S <= c_IDLE; + soda_dlm_preview_S <= '0'; soda_pkt_valid_S <= '0'; when others => packet_state_S <= c_IDLE; + soda_dlm_preview_S <= '0'; soda_pkt_valid_S <= '0'; end case; end if; end if; end process; - soda_cmd_reg_proc : process(SODACLK) - begin - if rising_edge(SODACLK) then - if (RESET='1') then - soda_cmd_reg_full_S <= '0'; - soda_cmd_reg_S <= (others => '0'); - elsif (soda_pkt_valid_S = '1') then - soda_cmd_reg_full_S <= '1'; - soda_cmd_reg_S <= '0' & soda_cmd_word_S; - - end if; - end if; - end process; - - - --soda_packet_fill_proc : process(SODACLK, packet_state_S) - --begin - --if rising_edge(SODACLK) then - --case packet_state_S is - --when c_IDLE => - --TIME_CAL_OUT <= '0'; - --soda_pkt_valid_S <= '0'; - --soda_pkt_word_S <= (others=>'0'); - --when c_WAIT4BST1 => -- no need to do anything just yet. - --when c_BST1 => - --soda_pkt_valid_S <= '1'; - --soda_pkt_word_S <= '1' & super_burst_nr_S(30 downto 24); - --when c_BST2 => - --soda_pkt_valid_S <= '0'; - --when c_BST3 => - --soda_pkt_valid_S <= '1'; - --soda_pkt_word_S <= super_burst_nr_S(23 downto 16); - --when c_BST4 => - --soda_pkt_valid_S <= '0'; - --when c_BST5 => - --soda_pkt_valid_S <= '1'; - --soda_pkt_word_S <= super_burst_nr_S(15 downto 8); - --when c_BST6 => - --soda_pkt_valid_S <= '0'; - --when c_BST7 => - --soda_pkt_valid_S <= '1'; - --soda_pkt_word_S <= super_burst_nr_S(7 downto 0); - --EXPECTED_REPLY_OUT <= super_burst_nr_S(7 downto 0); - --when c_BST8 => - --soda_pkt_valid_S <= '0'; - --when c_WAIT4CMD1 => -- no need to do anything just yet. - --when c_CMD1 => - --soda_pkt_valid_S <= '1'; - --soda_pkt_word_S <= '0' & soda_cmd_word_S(30 downto 24); - --when c_CMD2 => - --soda_pkt_valid_S <= '0'; - --when c_CMD3 => - --soda_pkt_valid_S <= '1'; - --soda_pkt_word_S <= soda_cmd_word_S(23 downto 16); - --when c_CMD4 => - --soda_pkt_valid_S <= '0'; - --when c_CMD5 => - --soda_pkt_valid_S <= '1'; - --soda_pkt_word_S <= soda_cmd_word_S(15 downto 8); - --when c_CMD6 => - --soda_pkt_valid_S <= '0'; - --when c_CMD7 => - --soda_pkt_valid_S <= '1'; - --soda_pkt_word_S <= crc_out_S; - --EXPECTED_REPLY_OUT <= crc_out_S; - --TIME_CAL_OUT <= '1'; - --when c_CMD8 => - --TIME_CAL_OUT <= '0'; - --soda_pkt_valid_S <= '0'; - --when others => - --TIME_CAL_OUT <= '0'; - --soda_pkt_valid_S <= '0'; - --soda_pkt_word_S <= (others=>'0'); - --end case; - --end if; - --end process; +-- soda_cmd_reg_proc : process(SODACLK) +-- begin +-- if rising_edge(SODACLK) then +-- if (RESET='1') then +-- soda_cmd_reg_full_S <= '0'; +-- soda_cmd_reg_S <= (others => '0'); +-- elsif (soda_pkt_valid_S = '1') then +-- soda_cmd_reg_full_S <= '1'; +-- soda_cmd_reg_S <= '0' & soda_cmd_word_S; +-- +-- end if; +-- end if; +-- end process; crc_gen_proc : process(SODACLK, packet_state_S) @@ -325,6 +283,7 @@ begin end if; end process; + cmd_window_gen : soda_cmd_window_generator generic map(CLOCK_PERIOD => cSODA_CLOCK_PERIOD, -- clock-period in ns COMMAND_WINDOS_SIZE => cSODA_COMMAND_WINDOS_SIZE -- command window size in ns diff --git a/source/soda_source.vhd b/source/soda_source.vhd index 6f2b853..6fb51ad 100644 --- a/source/soda_source.vhd +++ b/source/soda_source.vhd @@ -21,7 +21,7 @@ entity soda_source is RX_DLM_IN : in std_logic; TX_DLM_OUT : out std_logic; TX_DLM_WORD_OUT : out std_logic_vector(7 downto 0) := (others => '0'); - TX_DLM_INIT_OUT : out std_logic := '0'; --PL! + TX_DLM_PREVIEW_OUT : out std_logic := '0'; --PL! LINK_PHASE_IN : in std_logic := '0'; --PL! SODA_DATA_IN : in std_logic_vector(31 downto 0) := (others => '0'); @@ -94,7 +94,8 @@ begin SUPER_BURST_NR_IN => super_burst_nr_S, SODA_CMD_WORD_IN => soda_cmd_word_S, EXPECTED_REPLY_OUT => expected_reply_S, - TIME_CAL_OUT => start_calibration_S, + TIME_CAL_OUT => start_calibration_S, + TX_DLM_PREVIEW_OUT => TX_DLM_PREVIEW_OUT, TX_DLM_OUT => TX_DLM_OUT, TX_DLM_WORD_OUT => TX_DLM_WORD_OUT ); @@ -138,43 +139,6 @@ begin end process; - ------------------------------------------------------------ --- TX_DLM_INIT for media-interface transmissions -- ------------------------------------------------------------ - tx_dlm_init_proc : process (SODACLK, start_of_superburst_S, soda_cmd_strobe_S) - begin - if( RESET = '1' ) then - TX_DLM_INIT_OUT <= '0'; - elsif ((start_of_superburst_S='1' or soda_cmd_strobe_sodaclk_S='1') and LINK_PHASE_IN=c_IN_SYNC) then - TX_DLM_INIT_OUT <= '1'; - elsif rising_edge(SODACLK) then - if (start_of_superburst_S='1' or soda_cmd_strobe_sodaclk_S='1') then - TX_DLM_INIT_OUT <= '1'; - else - TX_DLM_INIT_OUT <= '0'; - end if; - end if; - end process; - - - ------------------------------------------------------------ --- Phase fsm for 16-bit transmissions -- ------------------------------------------------------------ --- phase_fsm_proc : process(SODACLK) --- begin --- if rising_edge(SODACLK) then --- if( RESET = '1' ) then --- link_phase_S <= '0'; -- (0 => '1', others => '0'); --- elsif (link_phase_S='0') then --- link_phase_S <= '1'; --- else --- link_phase_S <= '0'; --(others => '0'); --- end if; --- end if; --- end process; - --------------------------------------------------------- -- RegIO Statemachine --------------------------------------------------------- diff --git a/source/trb3_periph_sodasource.vhd b/source/trb3_periph_sodasource.vhd index a98540c..1092549 100644 --- a/source/trb3_periph_sodasource.vhd +++ b/source/trb3_periph_sodasource.vhd @@ -213,7 +213,7 @@ architecture trb3_periph_sodasource_arch of trb3_periph_sodasource is signal rx_dlm_i : std_logic; signal tx_dlm_word : std_logic_vector(7 downto 0); signal rx_dlm_word : std_logic_vector(7 downto 0); - signal tx_dlm_init_S : std_logic; --PL! + signal tx_dlm_preview_S : std_logic; --PL! signal link_phase_S : std_logic; --PL! --SODA @@ -540,7 +540,7 @@ THE_SYNC_LINK : med_ecp3_sfp_sync_down RX_DLM_WORD => rx_dlm_word, TX_DLM => tx_dlm_i, TX_DLM_WORD => tx_dlm_word, - TX_DLM_INIT => tx_dlm_init_S, --PL! + TX_DLM_PREVIEW_IN => tx_dlm_preview_S, --PL! LINK_PHASE_OUT => link_phase_S, --PL! --SFP Connection SD_RXD_P_IN => SERDES_ADDON_RX(0), @@ -593,7 +593,7 @@ THE_SODA_SOURCE : soda_source RX_DLM_IN => rx_dlm_i, TX_DLM_OUT => tx_dlm_i, TX_DLM_WORD_OUT => tx_dlm_word, - TX_DLM_INIT_OUT => tx_dlm_init_S, + TX_DLM_PREVIEW_OUT => tx_dlm_preview_S, LINK_PHASE_IN => link_phase_S, SODA_DATA_IN => soda_data_in, SODA_DATA_OUT => soda_data_out, -- 2.43.0