]> jspc29.x-matter.uni-frankfurt.de Git - trb3.git/commitdiff
*** empty log message ***
authorhadaq <hadaq>
Tue, 19 Mar 2013 14:36:46 +0000 (14:36 +0000)
committerhadaq <hadaq>
Tue, 19 Mar 2013 14:36:46 +0000 (14:36 +0000)
soda_source/SODA_source.ldf
soda_source/TB_soda_source.vhd [new file with mode: 0644]
soda_source/soda_d8crc8.vhd [new file with mode: 0644]
soda_source/soda_packet_builder.vhd [new file with mode: 0644]
soda_source/soda_packet_handler.vhd [new file with mode: 0644]
soda_source/soda_superburst_gen.vhd [new file with mode: 0644]
soda_source/super_burst_generator.vhd [new file with mode: 0644]

index d3299ff1a2d96140616885599a18a0e10016d736..d704f732d61c3ae92f85c978e67fac2aac79524c 100644 (file)
         <Source name="../tdc_releases/tdc_v1.1.1/bit_sync.vhd" type="VHDL" type_short="VHDL">
             <Options/>
         </Source>
+        <Source name="soda_intercept.vhd" type="VHDL" type_short="VHDL">
+            <Options/>
+        </Source>
+        <Source name="../../trbnet/media_interfaces/med_ecp3_sfp_sync.vhd" type="VHDL" type_short="VHDL">
+            <Options/>
+        </Source>
         <Source name="trb3_periph_sodasource.lpf" type="Logic Preference" type_short="LPF">
             <Options/>
         </Source>
diff --git a/soda_source/TB_soda_source.vhd b/soda_source/TB_soda_source.vhd
new file mode 100644 (file)
index 0000000..d1b5b46
--- /dev/null
@@ -0,0 +1,162 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+--library work;
+--use work.trb_net_std.all;
+--use work.trb_net_components.all;
+--use work.trb3_components.all;
+--use work.med_sync_define.all;
+--use work.version.all;
+
+entity TB_soda_source is
+end entity;
+\r
+architecture TestBench of TB_soda_source is\r
+\r
+   -- Clock period definitions
+   constant clk_period          : time          := 4ns;
+\r
+\r
+component super_burst_generator
+       generic(
+               BURST_COUNT : integer range 1 to 64 := 16   -- number of bursts to be counted between super-bursts
+       );
+port(
+       SYSCLK                                  : in    std_logic; -- fabric clock
+       RESET                                           : in    std_logic; -- synchronous reset
+       CLEAR                                           : in    std_logic; -- asynchronous reset
+       CLK_EN                                  : in    std_logic;
+       --Internal Connection
+       SODA_BURST_PULSE_IN     : in    std_logic := '0';       -- 
+       START_OF_SUPERBURST     : out   std_logic := '0';
+       SUPER_BURST_NR_OUT      : out   std_logic_vector(30 downto 0) := (others => '0')\r
+       );
+end component;\r\r
+
+component soda_packet_builder
+       port(
+               SYSCLK                                  : in    std_logic; -- fabric clock
+               RESET                                           : in    std_logic; -- synchronous reset
+               CLEAR                                           : in    std_logic; -- asynchronous reset
+               CLK_EN                                  : in    std_logic;
+               --Internal Connection
+               SODA_CMD_STROBE_IN      : in    std_logic := '0';       -- 
+               START_OF_SUPERBURST     : in    std_logic := '0';
+               SUPER_BURST_NR_IN               : in    std_logic_vector(30 downto 0) := (others => '0');
+               SODA_CMD_WORD_IN                : in    std_logic_vector(31 downto 0) := (others => '0');               --REGIO_CTRL_REG in trbnet handler is 32 bit
+               TX_DLM_OUT                              : out   std_logic := '0';       -- 
+               TX_DLM_WORD_OUT         : out   std_logic_vector(7 downto 0) := (others => '0')\r
+       );
+end component;\r
+\r
+component soda_packet_handler
+port(
+       SYSCLK                                          : in    std_logic; -- fabric clock
+       RESET                                                   : in    std_logic; -- synchronous reset
+       CLEAR                                                   : in    std_logic; -- asynchronous reset
+       CLK_EN                                          : in    std_logic;
+       --Internal Connection
+       RX_DLM_WORD_IN                          : in    std_logic_vector(7 downto 0) := (others => '0');
+       RX_DLM_IN                                       : in std_logic
+       );
+end component;
+\r
+--Inputs
+       signal rst_S                                                    : std_logic;
+       signal clk_S                                                    : std_logic;
+       signal enable_S                                         : std_logic := '0';
+       signal soda_cmd_word_S                          : std_logic_vector(31 downto 0) := (others => '0');
+       signal soda_cmd_strobe_S                        : std_logic := '0';
+       signal SOS_S                                                    : std_logic := '0';
+       signal super_burst_nr_S                         : std_logic_vector(30 downto 0) := (others => '0');             -- from super-burst-nr-generator
+       signal SOB_S                                                    : std_logic := '0';
+       signal dlm_word_S                                               : std_logic_vector(7 downto 0)  := (others => '0');\r
+       signal dlm_valid_S                                      : std_logic;\r
+\r
+begin\r
+\r
+       superburst_gen :  super_burst_generator
+               generic map(BURST_COUNT         => 16)
+               port map(
+                       SYSCLK                                  =>      clk_S,
+                       RESET                                           => rst_S,
+                       CLEAR                                           =>      '0',
+                       CLK_EN                                  =>      '0',
+                       --Internal Connection
+                       SODA_BURST_PULSE_IN     =>      SOB_S,
+                       START_OF_SUPERBURST     =>      SOS_S,
+                       SUPER_BURST_NR_OUT      =>      super_burst_nr_S
+               );
+\r
+       packet_builder : soda_packet_builder\r
+               port map(\r
+                       SYSCLK                                  =>      clk_S,
+                       RESET                                           => rst_S,
+                       CLEAR                                           =>      '0',
+                       CLK_EN                                  => '0',
+                       --Internal Connection
+                       SODA_CMD_STROBE_IN      => soda_cmd_strobe_S,
+                       START_OF_SUPERBURST     => SOS_S,
+                       SUPER_BURST_NR_IN               => super_burst_nr_S,
+                       SODA_CMD_WORD_IN                => soda_cmd_word_S,
+                       TX_DLM_OUT                              => dlm_valid_S,
+                       TX_DLM_WORD_OUT         => dlm_word_S
+               \r
+                       );\r
+
+       packet_handler : soda_packet_handler
+       port map(
+               SYSCLK                                          =>      clk_S,
+               RESET                                                   => rst_S,
+               CLEAR                                                   =>      '0',
+               CLK_EN                                          =>      '0',
+               --Internal Connection
+               RX_DLM_IN                                       => dlm_valid_S,
+               RX_DLM_WORD_IN                          => dlm_word_S
+               );
+\r
+------------------------------------------------------------------------------------------------------------
+   -- SODA command packet
+------------------------------------------------------------------------------------------------------------
+       cmd_proc        :process
+       begin
+      wait for 2us;
+               soda_cmd_word_S <= x"40000000";
+               soda_cmd_strobe_S       <= '1';
+      wait for clk_period;
+               soda_cmd_strobe_S       <= '0';
+      wait;
+       end process;
+
+------------------------------------------------------------------------------------------------------------
+   -- Clock process definitions
+------------------------------------------------------------------------------------------------------------
+   clk_proc :process
+   begin
+               clk_S <= '0';
+               wait for clk_period/2;
+               clk_S <= '1';
+               wait for clk_period/2;
+   end process; 
+
+   -- reset process
+   reset_proc: process
+   begin
+                rst_S <= '1';
+      wait for clk_period * 5; 
+                rst_S <= '0';
+      wait;
+   end process;
+\r
+   burst_proc :process
+   begin
+                SOB_S <= '0';
+                wait for 2.35us;
+                SOB_S <= '1';
+                wait for 50ns;
+   end process; 
+
+\r
+end TestBench;\r
+\r
diff --git a/soda_source/soda_d8crc8.vhd b/soda_source/soda_d8crc8.vhd
new file mode 100644 (file)
index 0000000..b49827e
--- /dev/null
@@ -0,0 +1,97 @@
+
+-- ########################################################################
+-- crc engine rtl design 
+-- copyright (c) www.electronicdesignworks.com 
+-- source code generated by electronicdesignworks ip generator (crc).
+-- documentation can be downloaded from www.electronicdesignworks.com 
+-- ******************************** 
+--license 
+-- ******************************** 
+-- this source file may be used and distributed freely provided that this
+-- copyright notice, list of conditions and the following disclaimer is
+-- not removed from the file.
+-- any derivative work should contain this copyright notice and associated disclaimer.
+-- this source code file is provided "as is" and without any warranty, 
+-- without even the implied warranty of merchantability or fitness for a 
+-- particular purpose.
+-- ********************************
+-- specification 
+-- ********************************
+-- file name : crc8_data8.vhd
+-- description : crc engine entity 
+-- clock : positive edge 
+-- reset : active low
+-- first serial: msb 
+-- data bus width: 8 bits 
+-- polynomial: (0 4 5 8) 
+-- date: 12-mar-2013
+-- version : 1.0
+-- ########################################################################
+
+library ieee ;
+use ieee.std_logic_1164.all ;
+use ieee.std_logic_arith.all ;
+use ieee.std_logic_unsigned.all ;
+entity soda_d8crc8 is
+       port( 
+               CLOCK                   : in std_logic; 
+               RESET                   : in std_logic; 
+               SOC                     : in std_logic; 
+               DATA                    : in std_logic_vector(7 downto 0); 
+               DATA_VALID      : in std_logic; 
+               EOC                     : in std_logic; 
+               CRC                     : out std_logic_vector(7 downto 0); 
+               CRC_VALID       : out std_logic 
+       );
+end soda_d8crc8;
+
+architecture behavioral of soda_d8crc8 is
+       signal crc_r: std_logic_vector(7 downto 0);
+       signal crc_c: std_logic_vector(7 downto 0);
+       signal crc_i: std_logic_vector(7 downto 0);
+       signal crc_const: std_logic_vector(7 downto 0) := "00000000";
+
+begin 
+
+       
+       crc_i<= crc_const when soc = '1' else
+                                       crc_r;
+
+       crc_c(0) <= DATA(0) xor DATA(3) xor DATA(4) xor crc_i(0) xor crc_i(4) xor DATA(6) xor crc_i(3) xor crc_i(6); 
+       crc_c(1) <= data(1) xor DATA(4) xor DATA(5) xor crc_i(1) xor crc_i(5) xor DATA(7) xor crc_i(4) xor crc_i(7); 
+       crc_c(2) <= DATA(2) xor DATA(5) xor DATA(6) xor crc_i(2) xor crc_i(6) xor crc_i(5); 
+       crc_c(3) <= DATA(3) xor DATA(6) xor DATA(7) xor crc_i(3) xor crc_i(7) xor crc_i(6); 
+       crc_c(4) <= DATA(0) xor DATA(7) xor crc_i(7) xor DATA(3) xor crc_i(0) xor DATA(6) xor crc_i(3) xor crc_i(6); 
+       crc_c(5) <= DATA(0) xor DATA(1) xor crc_i(1) xor DATA(7) xor crc_i(7) xor DATA(3) xor crc_i(0) xor DATA(6) xor crc_i(3) xor crc_i(6); 
+       crc_c(6) <= DATA(1) xor DATA(2) xor crc_i(2) xor DATA(4) xor crc_i(1) xor DATA(7) xor crc_i(4) xor crc_i(7); 
+       crc_c(7) <= DATA(2) xor DATA(3) xor crc_i(3) xor DATA(5) xor crc_i(2) xor crc_i(5); 
+
+
+       crc_gen_process : process(clock, reset) 
+       begin
+               if(reset = '1') then
+                       crc_r <= "00000000" ;
+               elsif   rising_edge(clock) then 
+                       if(DATA_valid = '1') then 
+                               crc_r <= crc_c; 
+                       end if; 
+               end if;
+       end process crc_gen_process;
+                
+
+       crc_valid_gen : process(clock, reset) 
+       begin
+               if(reset = '1') then 
+                       CRC_VALID <= '0'; 
+               elsif   rising_edge(clock) then 
+                       if(DATA_valid = '1' and EOC = '1') then 
+                               CRC_VALID <= '1'; 
+                       else 
+                               CRC_VALID <= '0'; 
+                       end if; 
+               end if;
+       end process crc_valid_gen; 
+
+       CRC <= crc_r;
+
+end behavioral;
\ No newline at end of file
diff --git a/soda_source/soda_packet_builder.vhd b/soda_source/soda_packet_builder.vhd
new file mode 100644 (file)
index 0000000..38ced54
--- /dev/null
@@ -0,0 +1,278 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.numeric_std.all;\r
+\r
+library work;\r
+--use work.trb_net_std.all;\r
+--use work.trb_net_components.all;\r
+--use work.trb3_components.all;\r
+--use work.med_sync_define.all;\r
+--use work.version.all;\r
+\r
+entity soda_packet_builder is\r
+port(\r
+       SYSCLK                                  : in    std_logic; -- fabric clock\r
+       RESET                                           : in    std_logic; -- synchronous reset\r
+       CLEAR                                           : in    std_logic; -- asynchronous reset\r
+       CLK_EN                                  : in    std_logic;\r
+       --Internal Connection\r
+       SODA_CMD_STROBE_IN      : in    std_logic := '0';       -- \r
+       START_OF_SUPERBURST     : in    std_logic := '0';\r
+       SUPER_BURST_NR_IN               : in    std_logic_vector(30 downto 0) := (others => '0');\r
+       SODA_CMD_WORD_IN                : in    std_logic_vector(31 downto 0) := (others => '0');               --REGIO_CTRL_REG in trbnet handler is 32 bit\r
+       TX_DLM_OUT                              : out   std_logic := '0';       -- 
+       TX_DLM_WORD_OUT         : out   std_logic_vector(7 downto 0) := (others => '0')\r
+       );\r
+end soda_packet_builder;\r
+\r
+architecture Behavioral of soda_packet_builder is\r
+
+component soda_d8crc8
+       port( 
+               clock                   : in std_logic; 
+               reset                   : in std_logic; 
+               soc                     : in std_logic; 
+               data                    : in std_logic_vector(7 downto 0); 
+               data_valid      : in std_logic; 
+               eoc                     : in std_logic; 
+               crc                     : out std_logic_vector(7 downto 0); 
+               crc_valid       : out std_logic 
+       );
+end component;
+
+--     constant        c_K287                                          : std_logic_vector(7 downto 0) := x"FB";\r
+\r
+       signal  clk_S                                                   : std_logic;\r
+       signal  rst_S                                                   : std_logic;\r
+       signal  soda_cmd_strobe_S                       : std_logic;\r
+       signal  start_of_superburst_S   : std_logic;\r
+       signal  super_burst_nr_S                        : std_logic_vector(30 downto 0) := (others => '0');             -- from super-burst-nr-generator\r
+       signal  soda_cmd_word_S                 : std_logic_vector(31 downto 0) := (others => '0');             -- from slowcontrol\r
+       signal  soda_pkt_word_S                 : std_logic_vector(7 downto 0)  := (others => '0');\r
+       signal  soda_pkt_valid_S                        : std_logic;\r
+
+       signal  soc_S                                                   : std_logic;\r
+       signal  eoc_S                                                   : std_logic;\r
+       signal  crc_data_valid_S                        : std_logic;\r
+       signal  crc_datain_S                            : std_logic_vector(7 downto 0)  := (others => '0');\r
+       signal  crc_tmp_S                                       : std_logic_vector(7 downto 0)  := (others => '0');\r
+       signal  crc_out_S                                       : std_logic_vector(7 downto 0)  := (others => '0');\r
+       signal  crc_valid_S                                     : std_logic;\r
+       \r
+       type            packet_state_type is    (       c_RST, c_IDLE, c_ERROR,
+                                                                                                       c_STD1, c_STD2, c_STD3, c_STD4, c_STD5, c_STD6, c_STD7, c_STD8,
+                                                                                                       c_CMD1, c_CMD2, c_CMD3, c_CMD4, c_CMD5, c_CMD6, c_CMD7, c_CMD8
+                                                                                               );\r
+       signal  packet_state_S                          :       packet_state_type := c_IDLE;\r
+--     signal  packet_state_S                          :       packet_state_type := c_IDLE;\r
+\r
+begin\r
+\r
+       tx_crc8: soda_d8crc8 
+               port map(
+                       clock                   => clk_S,
+                       reset                   => rst_S,
+                       soc                     => soc_S,
+                       data                    => crc_datain_S,
+                       data_valid      => crc_data_valid_S,
+                       eoc                     => eoc_S,
+                       crc                     => crc_out_S,
+                       crc_valid       => crc_valid_S
+               );
+
+       clk_S                                                   <= SYSCLK;\r
+       rst_S                                                   <= RESET;\r
+       soda_cmd_strobe_S                       <=      SODA_CMD_STROBE_IN;
+       soda_cmd_word_S                 <= SODA_CMD_WORD_IN;\r
+       start_of_superburst_S   <= START_OF_SUPERBURST;\r
+       super_burst_nr_S                        <=      SUPER_BURST_NR_IN;
+       \r
+       TX_DLM_WORD_OUT                 <=      soda_pkt_word_S;\r
+       TX_DLM_OUT                                      <=      soda_pkt_valid_S;\r
+       \r
+--     packet_state_S  <= packet_state_S;\r
+       \r
+       packet_fsm_proc : process(clk_S, rst_S, packet_state_S, crc_valid_S, start_of_superburst_S, soda_cmd_strobe_S)\r
+       begin\r
+               if rising_edge(clk_S) then\r
+                       if (rst_S='1') then\r
+                               packet_state_S  <=      c_RST;\r
+                       else\r
+                               case packet_state_S is\r
+                                       when c_RST      =>\r
+                                               if (start_of_superburst_S='1') then\r
+                                                       packet_state_S  <= c_STD1;\r
+                                               elsif (soda_cmd_strobe_S='1') then\r
+                                                       packet_state_S  <= c_CMD1;\r
+                                               else
+                                                       packet_state_S  <=      c_IDLE;
+                                               end if;\r
+                                       when c_IDLE     =>\r
+                                               if (start_of_superburst_S='1') then\r
+                                                       packet_state_S  <= c_STD1;\r
+                                               elsif (soda_cmd_strobe_S='1') then\r
+                                                       packet_state_S  <= c_CMD1;\r
+                                               end if;\r
+                                       when c_STD1     =>\r
+                                               packet_state_S  <= c_STD2;\r
+                                       when c_STD2     =>\r
+                                               packet_state_S  <= c_STD3;\r
+                                       when c_STD3     =>\r
+                                               packet_state_S  <= c_STD4;\r
+                                       when c_STD4     =>\r
+                                               packet_state_S  <= c_STD5;\r
+                                       when c_STD5     =>\r
+                                               packet_state_S  <= c_STD6;\r
+                                       when c_STD6     =>\r
+                                               packet_state_S  <= c_STD7;\r
+                                       when c_STD7     =>\r
+                                               packet_state_S  <= c_STD8;\r
+                                       when c_STD8     =>\r
+                                               if (soda_cmd_strobe_S='0') then\r
+                                                       packet_state_S  <= c_IDLE;\r
+                                               else\r
+                                                       packet_state_S  <= c_CMD1;\r
+                                               end if;\r
+                                       when c_CMD1     =>\r
+                                                       packet_state_S  <= c_CMD2;\r
+                                       when c_CMD2     =>\r
+                                                       packet_state_S  <= c_CMD3;\r
+                                       when c_CMD3     =>\r
+                                                       packet_state_S  <= c_CMD4;\r
+                                       when c_CMD4     =>\r
+                                                       packet_state_S  <= c_CMD5;\r
+                                       when c_CMD5     =>\r
+                                                       packet_state_S  <= c_CMD6;\r
+                                       when c_CMD6     =>\r
+                                                       packet_state_S  <= c_CMD7;\r
+                                       when c_CMD7     =>\r
+                                               if (crc_valid_S = '0') then
+                                                       packet_state_S  <= c_ERROR;\r
+                                               else
+                                                       packet_state_S  <= c_CMD8;\r
+                                               end if;\r
+                                       when c_CMD8     =>
+                                               packet_state_S          <= c_IDLE;\r
+                                       when c_ERROR    =>
+                                               packet_state_S          <= c_IDLE;\r
+                                       when others     =>\r
+                                               packet_state_S          <= c_IDLE;\r
+                               end case;\r
+                       end if;\r
+               end if;\r
+       end process;\r
+\r
+       soda_packet_fill_proc : process(clk_S, packet_state_S)\r
+       begin\r
+               if rising_edge(clk_S) then\r
+                       case packet_state_S is\r
+                                       when c_IDLE     =>\r
+                                               soda_pkt_valid_S        <= '0';\r
+                                               soda_pkt_word_S <= (others=>'0');\r
+                                       when c_STD1     =>\r
+                                               soda_pkt_valid_S        <= '1';\r
+                                               soda_pkt_word_S <= '1' & super_burst_nr_S(30 downto 24);\r
+                                       when c_STD2     =>\r
+                                               soda_pkt_valid_S        <= '0';\r
+                                       when c_STD3     =>\r
+                                               soda_pkt_valid_S        <= '1';\r
+                                               soda_pkt_word_S <= super_burst_nr_S(23 downto 16);\r
+                                       when c_STD4     =>\r
+                                               soda_pkt_valid_S        <= '0';\r
+                                       when c_STD5     =>\r
+                                               soda_pkt_valid_S        <= '1';\r
+                                               soda_pkt_word_S <= super_burst_nr_S(15 downto 8);\r
+                                       when c_STD6     =>\r
+                                               soda_pkt_valid_S        <= '0';\r
+                                       when c_STD7     =>\r
+                                               soda_pkt_valid_S        <= '1';\r
+                                               soda_pkt_word_S <= super_burst_nr_S(7 downto 0);\r
+                                       when c_STD8     =>\r
+                                               soda_pkt_valid_S        <= '0';\r
+                                       when c_CMD1     =>\r
+                                               soda_pkt_valid_S        <= '1';\r
+                                               soda_pkt_word_S <= '0' & soda_cmd_word_S(30 downto 24);\r
+                                       when c_CMD2     =>\r
+                                               soda_pkt_valid_S        <= '0';\r
+                                       when c_CMD3     =>\r
+                                               soda_pkt_valid_S        <= '1';\r
+                                               soda_pkt_word_S <= soda_cmd_word_S(23 downto 16);\r
+                                       when c_CMD4     =>\r
+                                               soda_pkt_valid_S        <= '0';\r
+                                       when c_CMD5     =>\r
+                                               soda_pkt_valid_S        <= '1';\r
+                                               soda_pkt_word_S <= soda_cmd_word_S(15 downto 8);\r
+                                       when c_CMD6     =>\r
+                                               soda_pkt_valid_S        <= '0';\r
+                                       when c_CMD7     =>\r
+                                               soda_pkt_valid_S        <= '1';\r
+                                               soda_pkt_word_S <= crc_out_S;\r
+                                       when c_CMD8     =>
+                                                       soda_pkt_valid_S        <= '0';\r
+                                       when others     =>\r
+                                               soda_pkt_valid_S        <= '0';\r
+                                               soda_pkt_word_S <= (others=>'0');\r
+                       end case;               \r
+               end if;\r
+       end process;\r
+\r
+\r
+       crc_gen_proc : process(clk_S, packet_state_S)\r
+       begin\r
+               if rising_edge(clk_S) then\r
+                       case packet_state_S is\r
+                                       when c_IDLE     =>\r
+                                               crc_data_valid_S        <= '0';\r
+                                               crc_datain_S            <= (others=>'0');
+                                               soc_S                                   <= '1';\r
+                                               eoc_S                                   <= '0';\r
+                                       when c_CMD1     =>\r
+                                               crc_data_valid_S        <= '1';\r
+                                               crc_datain_S            <= '0' & soda_cmd_word_S(30 downto 24);
+                                               soc_S                                   <= '0';\r
+                                               eoc_S                                   <= '0';\r
+                                       when c_CMD2     =>\r
+                                               crc_data_valid_S        <= '0';\r
+                                               crc_datain_S            <= (others=>'0');\r
+                                               soc_S                                   <= '0';\r
+                                               eoc_S                                   <= '0';\r
+                                       when c_CMD3     =>\r
+                                               crc_data_valid_S        <= '1';\r
+                                               crc_datain_S            <= soda_cmd_word_S(23 downto 16);\r
+                                               soc_S                                   <= '0';\r
+                                               eoc_S                                   <= '0';\r
+                                       when c_CMD4     =>\r
+                                               crc_data_valid_S        <= '0';\r
+                                               crc_datain_S            <= (others=>'0');\r
+                                               soc_S                                   <= '0';\r
+                                               eoc_S                                   <= '0';\r
+                                       when c_CMD5     =>\r
+                                               crc_data_valid_S        <= '1';\r
+                                               crc_datain_S    <= soda_cmd_word_S(15 downto 8);\r
+                                               soc_S                                   <= '0';\r
+                                               eoc_S                                   <= '1';\r
+                                       when c_CMD6     =>\r
+                                               crc_data_valid_S        <= '0';\r
+                                               crc_datain_S            <= (others=>'0');\r
+                                               soc_S                                   <= '0';\r
+                                               eoc_S                                   <= '0';\r
+                                       when c_CMD7     =>\r
+                                               crc_data_valid_S        <= '0';\r
+                                               crc_datain_S            <= (others=>'0');\r
+                                               soc_S                                   <= '0';\r
+                                               eoc_S                                   <= '0';\r
+                                       when c_CMD8     =>\r
+                                               crc_data_valid_S        <= '0';\r
+                                               crc_datain_S            <= (others=>'0');\r
+                                               soc_S                                   <= '0';\r
+                                               eoc_S                                   <= '0';\r
+                                       when others     =>\r
+                                               crc_data_valid_S        <= '0';\r
+                                               crc_datain_S            <= (others=>'0');\r
+                                               soc_S                                   <= '0';\r
+                                               eoc_S                                   <= '0';\r
+                       end case;               \r
+               end if;\r
+       end process;
+       
+end architecture;
\ No newline at end of file
diff --git a/soda_source/soda_packet_handler.vhd b/soda_source/soda_packet_handler.vhd
new file mode 100644 (file)
index 0000000..7ff2099
--- /dev/null
@@ -0,0 +1,273 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+library work;
+--use work.trb_net_std.all;
+--use work.trb_net_components.all;
+--use work.trb3_components.all;
+--use work.med_sync_define.all;
+--use work.version.all;
+
+entity soda_packet_handler is
+port(
+       SYSCLK                                  : in    std_logic; -- fabric clock
+       RESET                                           : in    std_logic; -- synchronous reset
+       CLEAR                                           : in    std_logic; -- asynchronous reset
+       CLK_EN                                  : in    std_logic;
+       --Internal Connection
+       RX_DLM_IN                               : in std_logic;
+       RX_DLM_WORD_IN                  : in    std_logic_vector(7 downto 0) := (others => '0')
+       );
+end soda_packet_handler;
+
+architecture Behavioral of soda_packet_handler is
+
+       component soda_d8crc8
+               port( 
+                       clock                   : in std_logic; 
+                       reset                   : in std_logic; 
+                       soc                     : in std_logic; 
+                       data                    : in std_logic_vector(7 downto 0); 
+                       data_valid      : in std_logic; 
+                       eoc                     : in std_logic; 
+                       crc                     : out std_logic_vector(7 downto 0); 
+                       crc_valid       : out std_logic 
+               );
+       end component;
+
+       constant        c_K287                                          : std_logic_vector(7 downto 0) := x"FB";
+
+       signal  clk_S                                                   : std_logic;
+       signal  rst_S                                                   : std_logic;
+       signal  rx_dlm_in_S                                     : std_logic;
+       signal  rx_dlm_word_in_S                        : std_logic_vector(7 downto 0) := (others => '0');
+       signal  soda_cmd_strobe_S                       : std_logic;
+       signal  start_of_superburst_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(31 downto 0) := (others => '0');
+       signal  soda_pkt_valid_S                        : std_logic;
+       
+       type            packet_state_type is (  c_RST, c_IDLE, c_ERROR,
+                                                                                               c_SODA_PKT1, c_SODA_PKT2, c_SODA_PKT3, c_SODA_PKT4,
+                                                                                               c_SODA_PKT5, c_SODA_PKT6, c_SODA_PKT7, c_SODA_PKT8
+                                                                                       );
+       signal  packet_state_S                          :       packet_state_type := c_IDLE;
+
+       signal  soc_S                                                   : std_logic     :=      '1';\r
+       signal  eoc_S                                                   : std_logic     := '0';\r
+       signal  crc_data_valid_S                        : std_logic     := '0';\r
+       signal  crc_datain_S                            : std_logic_vector(7 downto 0)  := (others => '0');\r
+       signal  crc_tmp_S                                       : std_logic_vector(7 downto 0)  := (others => '0');\r
+       signal  crc_out_S                                       : std_logic_vector(7 downto 0)  := (others => '0');\r
+       signal  crc_valid_S                                     : std_logic     := '0';\r
+
+       signal  crc_check_S                                     : std_logic     := '0';\r
+       signal  crc_check_valid_S                       : std_logic     := '0';\r
+
+begin
+
+       rx_crc8: soda_d8crc8 
+               port map(
+                       clock                   => clk_S,
+                       reset                   => rst_S,
+                       soc                     => soc_S,
+                       data                    => crc_datain_S,
+                       data_valid      => crc_data_valid_S,
+                       eoc                     => eoc_S,
+                       crc                     => crc_out_S,
+                       crc_valid       => crc_valid_S
+               );
+
+       clk_S                                                   <= SYSCLK;
+       rst_S                                                   <= RESET;
+       
+--     packet_state_S  <= packet_state_S;
+       
+                       rx_dlm_in_S                                     <=      RX_DLM_IN;
+                       rx_dlm_word_in_S                        <=      RX_DLM_WORD_IN;
+       
+       packet_fsm_proc : process(clk_S)
+       begin
+               if rising_edge(clk_S) then
+                       if (rst_S='1') then
+                               packet_state_S  <=      c_RST;
+                       else
+                               case packet_state_S is
+                                       when c_RST      =>
+                                               if (rx_dlm_in_S='1') then                                               -- received K27.7 #1
+                                                       packet_state_S  <= c_SODA_PKT1;
+                                               else
+                                                       packet_state_S  <= c_IDLE;
+                                               end if;
+                                       when c_IDLE     =>
+                                               if (rx_dlm_in_S='1') then                                               -- received K27.7 #1
+                                                       packet_state_S  <= c_SODA_PKT1;
+                                               else
+                                                       packet_state_S  <= c_IDLE;
+                                               end if;
+                                       when c_SODA_PKT1        =>
+                                               if (rx_dlm_in_S='0') then                                               -- possibly received data-byte
+                                                       packet_state_S  <= c_SODA_PKT2;
+                                               else
+                                                       packet_state_S  <= c_ERROR;
+                                               end if;
+                                       when c_SODA_PKT2        =>
+                                               if (rx_dlm_in_S='1') then                                               -- received K27.7 #2
+                                                       packet_state_S  <= c_SODA_PKT3;
+                                               else
+                                                       packet_state_S  <= c_ERROR;
+                                               end if;
+                                       when c_SODA_PKT3        =>
+                                               if (rx_dlm_in_S='0') then                                               -- possibly received data-byte
+                                                       packet_state_S  <= c_SODA_PKT4;
+                                               else
+                                                       packet_state_S  <= c_ERROR;
+                                               end if;
+                                       when c_SODA_PKT4        =>
+                                               if (rx_dlm_in_S='1') then                                               -- received K27.7 #3
+                                                       packet_state_S  <= c_SODA_PKT5;
+                                               else
+                                                       packet_state_S  <= c_ERROR;
+                                               end if;
+                                       when c_SODA_PKT5        =>
+                                               if (rx_dlm_in_S='0') then                                               -- possibly received data-byte
+                                                       packet_state_S  <= c_SODA_PKT6;
+                                               else
+                                                       packet_state_S  <= c_ERROR;
+                                               end if;
+                                       when c_SODA_PKT6        =>
+                                               if (rx_dlm_in_S='1') then                                               -- received K27.7 #4
+                                                       packet_state_S  <= c_SODA_PKT7;
+                                               else
+                                                       packet_state_S  <= c_ERROR;
+                                               -- else do nothing
+                                               end if;
+                                       when c_SODA_PKT7        =>
+                                               if (rx_dlm_in_S='1') or (crc_valid_S = '0') or not(crc_out_S = RX_DLM_WORD_IN) then
+                                                       packet_state_S  <= c_ERROR;     -- if there's an unexpected K27.7 or no valid CRC-output or the CRC-check doesn't match
+                                               else
+                                                       packet_state_S  <= c_SODA_PKT8;
+                                               end if;
+                                       when c_SODA_PKT8        =>
+                                               if (rx_dlm_in_S='1') then                                               -- received K27.7 #4+1... must be another packet coming in....
+                                                       packet_state_S  <= c_SODA_PKT1;
+                                               else
+                                                       packet_state_S  <= c_IDLE;
+                                               end if;
+                                       when c_ERROR    =>
+                                                       packet_state_S  <= c_IDLE;                              -- TODO: Insert ERROR_HANDLER
+                                       when others     =>
+                                                       packet_state_S  <= c_IDLE;
+                               end case;
+                       end if;
+               end if;
+       end process;
+
+       soda_packet_collector_proc : process(clk_S, packet_state_S)
+       begin
+               if rising_edge(clk_S) then
+                       case packet_state_S is
+                                       when c_RST      =>
+                                               soda_pkt_valid_S        <= '0';
+                                               soda_pkt_word_S                                         <= (others=>'0');
+                                       when c_IDLE     =>
+                                               soda_pkt_valid_S        <= '0';
+                                               soda_pkt_word_S                                         <= (others=>'0');
+                                       when c_SODA_PKT1        =>
+                                               soda_pkt_word_S(31 downto 24)           <=      RX_DLM_WORD_IN;
+                                       when c_SODA_PKT2        =>
+                                               -- do nothing -- disregard k27.7
+                                       when c_SODA_PKT3        =>
+                                               soda_pkt_word_S(23 downto 16)           <=      RX_DLM_WORD_IN;
+                                       when c_SODA_PKT4        =>
+                                               -- do nothing -- disregard k27.7
+                                       when c_SODA_PKT5        =>
+                                               soda_pkt_word_S(15 downto 8)            <=      RX_DLM_WORD_IN;
+                                       when c_SODA_PKT6        =>
+                                               -- do nothing -- disregard k27.7
+                                       when c_SODA_PKT7        =>
+                                               soda_pkt_word_S(7 downto 0)             <=      RX_DLM_WORD_IN; -- get transmitted CRC
+                                       when c_SODA_PKT8        =>
+                                       when others     =>
+                                               soda_pkt_valid_S                                                <= '0';
+                                               soda_pkt_word_S                                         <= (others=>'0');
+                       end case;
+                       
+                       if (soda_pkt_valid_S ='1') then
+                               if (soda_pkt_word_S(31) = '1') then
+                                       super_burst_nr_S                                                        <= soda_pkt_word_S(30 downto 0);
+                                       start_of_superburst_S                                   <= '1';
+                               else
+                                       soda_cmd_word_S                                                 <= soda_pkt_word_S(30 downto 0);
+                                       soda_cmd_strobe_S                                                       <= '1';
+                               end if;
+                       else
+                               start_of_superburst_S                                           <= '0';
+                               soda_cmd_strobe_S                                                               <= '0';
+                       end if;
+               end if;
+       end process;
+
+       crc_check_proc : process(clk_S, packet_state_S)\r
+       begin\r
+               if rising_edge(clk_S) then\r
+                       case packet_state_S is\r
+                                       when c_RST      =>
+                                               soc_S                                                                           <= '1';
+                                               eoc_S                                                                           <= '0';
+                                               crc_check_valid_S                                               <= '0';\r
+                                       when c_IDLE     =>\r
+                                               crc_data_valid_S                                                <= '0';\r
+                                               crc_datain_S                                                    <= (others=>'0');
+                                               soc_S                                                                           <= '1';\r
+                                               eoc_S                                                                           <= '0';\r
+                                       when c_SODA_PKT1        =>\r
+                                               crc_data_valid_S                                                <= '1';\r
+                                               crc_datain_S                                                    <=      RX_DLM_WORD_IN;
+                                               soc_S                                                                           <= '0';\r
+                                       when c_SODA_PKT2        =>\r
+                                               crc_data_valid_S                                                <= '0';\r
+                                               crc_datain_S                                                    <= (others=>'0');\r
+                                       when c_SODA_PKT3        =>\r
+                                               crc_data_valid_S                                                <= '1';\r
+                                               crc_datain_S                                                    <= RX_DLM_WORD_IN;\r
+                                       when c_SODA_PKT4        =>\r
+                                               crc_data_valid_S                                                <= '0';\r
+                                               crc_datain_S                                                    <= (others=>'0');\r
+                                       when c_SODA_PKT5        =>\r
+                                               crc_data_valid_S                                                <= '1';\r
+                                               crc_datain_S                                                    <= RX_DLM_WORD_IN;\r
+                                               eoc_S                                                                           <= '1';\r
+                                       when c_SODA_PKT6        =>\r
+                                               crc_data_valid_S                                                <= '0';\r
+                                               crc_datain_S                                                    <= (others=>'0');\r
+                                               eoc_S                                                                           <= '0';\r
+                                       when c_SODA_PKT7        =>\r
+                                               crc_data_valid_S                                                <= '0';\r
+                                               crc_datain_S                                                    <= (others=>'0');
+                                               if ((crc_valid_S = '1') and (crc_out_S = RX_DLM_WORD_IN)) then
+                                                       crc_check_S                                                     <= '1';
+                                               else
+                                                       crc_check_S                                                     <= '0';
+                                               end if;
+                                               crc_check_valid_S                                               <= '1';\r
+                                       when c_SODA_PKT8        =>\r
+                                               crc_data_valid_S                                                <= '0';\r
+                                               crc_datain_S                                                    <= (others=>'0');\r
+                                               soc_S                                                                           <= '0';\r
+                                               eoc_S                                                                           <= '0';\r
+                                               crc_check_S                                                             <= '0';
+                                               crc_check_valid_S                                               <= '0';\r
+                                       when others     =>\r
+                                               crc_data_valid_S                                                <= '0';\r
+                                               crc_datain_S                                                    <= (others=>'0');\r
+                                               soc_S                                                                           <= '0';\r
+                                               eoc_S                                                                           <= '0';\r
+                                               crc_check_valid_S                                               <= '0';\r
+                       end case;               \r
+               end if;\r
+       end process;
+
+end architecture;
\ No newline at end of file
diff --git a/soda_source/soda_superburst_gen.vhd b/soda_source/soda_superburst_gen.vhd
new file mode 100644 (file)
index 0000000..ade1e6c
--- /dev/null
@@ -0,0 +1,54 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+library work;
+use work.trb_net_std.all;
+use work.trb_net_components.all;
+use work.trb3_components.all;
+use work.med_sync_define.all;
+use work.version.all;
+
+entity soda_packet_builder is
+--     generic(
+--     INTERCEPT_MODE : integer range 0 to 1 := c_NO   --use the RX clock for internal logic and transmission. Should be NO for soda tests!
+--     );
+port(
+       SYSCLK                                  : in    std_logic; -- fabric clock
+       RESET                                           : in    std_logic; -- synchronous reset
+       CLEAR                                           : in    std_logic; -- asynchronous reset
+       CLK_EN                                  : in    std_logic;
+       --Internal Connection
+       START_OF_BURST                  : in    std_logic := '0';
+       SUPER_BURST_NR_OUT      : out   std_logic_vector(30 downto 0) := (others => '0');
+       SUPER_BURST_NR_VALID    : out std_logic
+       START_OF_SUPERBURST     : out std_logic
+       );\r
+end soda_packet_builder;
+\r
+architecture Behavioral of soda_packet_builder is
+       constant        c_K287                                          : std_logic_vector(7 downto 0) := x"FB";\r
+
+       signal  clk_S                                                   : std_logic;
+       signal  rst_S                                                   : std_logic;
+       signal  soda_cmd_strobe_S                       : std_logic;
+       signal  start_of_burst_S                        : std_logic;
+       signal  start_of_superburst_S   : std_logic;
+       signal  super_burst_nr_S                        : std_logic_vector(30 downto 0) := (others => '0');             -- from super-burst-nr-generator
+       signal  superburst_nr_valid_S   : std_logic;
+       \r
+       signal  burst_count_S                           : std_logic_vector(3 downto 0)  := (others => '0');\r
+
+begin
+\r
+       clk_S                                                           <= SYSCLK;\r
+       rst_S                                                           <= RESET;\r
+       start_of_burst_S                                <= START_OF_BURST;\r
+       \r
+       SUPER_BURST_NR_OUT                      <=      soda_pkt_word_S;\r
+       SUPER_BURST_NR_VALID                    <=      soda_pkt_valid_S;\r
+       START_OF_SUPERBURST                     <= start_of_burst_S;
+       \r
+       
+\r
+end architecture;
\ No newline at end of file
diff --git a/soda_source/super_burst_generator.vhd b/soda_source/super_burst_generator.vhd
new file mode 100644 (file)
index 0000000..db15df1
--- /dev/null
@@ -0,0 +1,73 @@
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+use IEEE.STD_LOGIC_ARITH.ALL;
+use ieee.std_logic_signed.all;
+
+--library work;
+--use work.trb_net_std.all;
+--use work.trb_net_components.all;
+--use work.trb3_components.all;
+--use work.med_sync_define.all;
+--use work.version.all;
+
+entity super_burst_generator is
+       generic(
+               BURST_COUNT : natural range 1 to 256 := 16   -- number of bursts to be counted between super-bursts
+               );
+       port(
+               SYSCLK                                  : in    std_logic; -- fabric clock
+               RESET                                           : in    std_logic; -- synchronous reset
+               CLEAR                                           : in    std_logic; -- asynchronous reset
+               CLK_EN                                  : in    std_logic;
+               --Internal Connection
+               SODA_BURST_PULSE_IN     : in    std_logic := '0';       -- 
+               START_OF_SUPERBURST     : out   std_logic := '0';\r
+               SUPER_BURST_NR_OUT      : out   std_logic_vector(30 downto 0) := (others => '0')\r
+               );
+end super_burst_generator;
+
+architecture Behavioral of super_burst_generator is
+
+       constant        cBURST_COUNT                            : std_logic_vector(7 downto 0)  := conv_std_logic_vector(BURST_COUNT - 1,8);
+
+       signal  clk_S                                                   : std_logic;
+       signal  rst_S                                                   : std_logic;
+       signal  soda_burst_pulse_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  burst_counter_S                 : std_logic_vector(7 downto 0)  := (others => '0');             -- from super-burst-nr-generator
+       
+
+begin
+
+       clk_S                                                   <= SYSCLK;
+       rst_S                                                   <= RESET;
+       START_OF_SUPERBURST             <= start_of_superburst_S;\r
+       SUPER_BURST_NR_OUT              <=      super_burst_nr_S;
+       
+       burst_pulse_edge_proc : process(clk_S, rst_S, SODA_BURST_PULSE_IN, soda_burst_pulse_S, burst_counter_S)\r
+       begin
+               if rising_edge(clk_S) then
+                       soda_burst_pulse_S <= SODA_BURST_PULSE_IN;\r
+                       if (rst_S='1') then
+                               burst_counter_S <= cBURST_COUNT;
+                               start_of_superburst_S   <= '0';
+                               super_burst_nr_S                        <= (others => '0');\r
+                       elsif ((SODA_BURST_PULSE_IN = '1') and (soda_burst_pulse_S = '0')) then\r
+                               if (burst_counter_S = x"00") then\r
+                                       start_of_superburst_S   <= '1';\r
+                                       super_burst_nr_S                        <= super_burst_nr_S + 1;
+                                       burst_counter_S <= cBURST_COUNT;
+                               else\r
+                                       start_of_superburst_S   <= '0';
+                                       burst_counter_s <=      burst_counter_s - 1;\r
+                               end if;
+                       else
+                               start_of_superburst_S           <= '0';
+                       end if;\r
+               end if;\r
+       end process;\r
+       
+
+end Behavioral;
\ No newline at end of file