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