Ignore:
Timestamp:
04/21/11 11:17:11 (13 years ago)
Author:
weitzel
Message:
new FTM firmware featuring e.g. start/stop run commands and new header
Location:
firmware/FTM/ethernet
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • firmware/FTM/ethernet/dd_write_general_modul_beha.vhd

    r10418 r10441  
    88-- using Mentor Graphics HDL Designer(TM) 2009.1 (Build 12)
    99--
    10 
    1110LIBRARY ieee;
    1211USE ieee.std_logic_1164.all;
    1312USE ieee.std_logic_arith.all;
    1413USE IEEE.STD_LOGIC_UNSIGNED.all;
    15 -- LIBRARY FACT_FTM_lib;
    16 -- USE FACT_FTM_lib.ftm_array_types.all;
    17 -- USE FACT_FTM_lib.ftm_constants.all;
     14
    1815library ftm_definitions;
    1916USE ftm_definitions.ftm_array_types.all;
     
    2623  dd_write_general_started  : OUT std_logic := '0';
    2724  dd_write_general_ready    : OUT std_logic := '0';
    28   dd_busy            : IN      std_logic;
    29   dd_write           : OUT     std_logic := '0';
    30   dd_started         : IN      std_logic;
    31   dd_ready           : IN      std_logic;
    32   dd_addr            : OUT     std_logic_vector (11 DOWNTO 0) := (others => '0');
    33   dd_data            : OUT     std_logic_vector (15 DOWNTO 0) := (others => '0')
     25  dd_busy                   : IN  std_logic;
     26  dd_write                  : OUT std_logic := '0';
     27  dd_started                : IN  std_logic;
     28  dd_ready                  : IN  std_logic;
     29  dd_addr                   : OUT std_logic_vector (11 DOWNTO 0) := (others => '0');
     30  dd_data                   : OUT std_logic_vector (15 DOWNTO 0) := (others => '0');
     31  get_ot_counter            : OUT std_logic := '0';
     32  get_ot_counter_started    : IN std_logic;
     33  get_ot_counter_ready      : IN std_logic;
     34  on_time_counter           : IN std_logic_vector (47 DOWNTO 0);
     35  temp_sensor_ready         : IN std_logic;
     36  temp_sensor_array         : IN sensor_array_type
    3437  );
    3538END ENTITY dd_write_general_modul;
     
    3841ARCHITECTURE beha OF dd_write_general_modul IS
    3942
    40   type state_write_general_proc_type is (WGP_INIT, WGP_CONFIG, WGP_IDLE, WGP_WRITE_COUNTER_01, WGP_WRITE_COUNTER_02, WGP_WRITE_COUNTER_03,
     43  type state_write_general_proc_type is (WGP_INIT, WGP_CONFIG, WGP_IDLE,
     44                                         WGP_OT_CNT, WGP_OT_CNT_END,
     45                                         WGP_WRITE_COUNTER_00, WGP_WRITE_COUNTER_01, WGP_WRITE_COUNTER_02, WGP_WRITE_COUNTER_03,
    4146                                         WGP_WRITE_TEMP_01, WGP_WRITE_TEMP_02, WGP_WRITE_TEMP_03, WGP_WRITE_TEMP_04, WGP_WRITE_READY, WRITE_TO_DD_ADDR);
    4247  type state_write_dd_type is (WRITE_DD_START, WRITE_DD_WAIT, WRITE_DD_END);
     
    4954  signal local_dd_data : std_logic_vector (15 DOWNTO 0) := (others => '0');
    5055
    51   signal on_time_counter  : std_logic_vector (47 DOWNTO 0) := X"333322221111";
    52   signal temp_sensor_0    : std_logic_vector (15 DOWNTO 0) := X"00FF";
    53   signal temp_sensor_1    : std_logic_vector (15 DOWNTO 0) := X"11FF";
    54   signal temp_sensor_2    : std_logic_vector (15 DOWNTO 0) := X"22FF";
    55   signal temp_sensor_3    : std_logic_vector (15 DOWNTO 0) := X"33FF";
    5656
    5757BEGIN
     
    7171            dd_write_general_started <= '1';
    7272            dd_write_general_ready <= '0';
    73             state_write_general_proc <= WGP_WRITE_COUNTER_01;
     73            get_ot_counter <= '1';
     74            state_write_general_proc <= WGP_OT_CNT;
    7475          end if;
    7576         
     77        when WGP_OT_CNT =>
     78          if (get_ot_counter_started = '1') then
     79            get_ot_counter <= '0';
     80            state_write_general_proc <= WGP_OT_CNT_END;
     81          end if;
     82
     83        when WGP_OT_CNT_END =>
     84          if (get_ot_counter_ready = '1') then
     85            state_write_general_proc <= WGP_WRITE_COUNTER_00;
     86          end if;
     87         
     88        when WGP_WRITE_COUNTER_00 =>
     89          local_dd_addr <= X"000";
     90          local_dd_data <= X"0000";
     91          next_state_dd <= WGP_WRITE_COUNTER_01;
     92          state_write_general_proc <= WRITE_TO_DD_ADDR;
     93       
    7694        when WGP_WRITE_COUNTER_01 =>
    77           local_dd_addr <= X"000";
     95          local_dd_addr <= X"001";
    7896          local_dd_data <= on_time_counter (47 DOWNTO 32);
    7997          next_state_dd <= WGP_WRITE_COUNTER_02;
     
    8199       
    82100        when WGP_WRITE_COUNTER_02 =>
    83           local_dd_addr <= X"001";
     101          local_dd_addr <= X"002";
    84102          local_dd_data <= on_time_counter (31 DOWNTO 16);
    85103          next_state_dd <= WGP_WRITE_COUNTER_03;
     
    87105       
    88106        when WGP_WRITE_COUNTER_03 =>
    89           local_dd_addr <= X"002";
     107          local_dd_addr <= X"003";
    90108          local_dd_data <= on_time_counter (15 DOWNTO 0);
    91109          next_state_dd <= WGP_WRITE_TEMP_01;
     
    93111       
    94112        when WGP_WRITE_TEMP_01 =>
    95           local_dd_addr <= X"003";
    96           local_dd_data <= temp_sensor_0;
    97           next_state_dd <= WGP_WRITE_TEMP_02;
    98           state_write_general_proc <= WRITE_TO_DD_ADDR;
     113          if (temp_sensor_ready = '1') then
     114            local_dd_addr <= X"004";
     115            local_dd_data <= conv_std_logic_vector (temp_sensor_array (0), 16);
     116            next_state_dd <= WGP_WRITE_TEMP_02;
     117            state_write_general_proc <= WRITE_TO_DD_ADDR;
     118          end if;
    99119       
    100120        when WGP_WRITE_TEMP_02 =>
    101           local_dd_addr <= X"004";
    102           local_dd_data <= temp_sensor_1;
    103           next_state_dd <= WGP_WRITE_TEMP_03;
    104           state_write_general_proc <= WRITE_TO_DD_ADDR;
     121          if (temp_sensor_ready = '1') then
     122            local_dd_addr <= X"005";
     123            local_dd_data <= conv_std_logic_vector (temp_sensor_array (1), 16);
     124            next_state_dd <= WGP_WRITE_TEMP_03;
     125            state_write_general_proc <= WRITE_TO_DD_ADDR;
     126          end if;
    105127       
    106128        when WGP_WRITE_TEMP_03 =>
    107           local_dd_addr <= X"005";
    108           local_dd_data <= temp_sensor_2;
    109           next_state_dd <= WGP_WRITE_TEMP_04;
    110           state_write_general_proc <= WRITE_TO_DD_ADDR;
     129          if (temp_sensor_ready = '1') then
     130            local_dd_addr <= X"006";
     131            local_dd_data <= conv_std_logic_vector (temp_sensor_array (2), 16);
     132            next_state_dd <= WGP_WRITE_TEMP_04;
     133            state_write_general_proc <= WRITE_TO_DD_ADDR;
     134          end if;
    111135       
    112136        when WGP_WRITE_TEMP_04 =>
    113           local_dd_addr <= X"006";
    114           local_dd_data <= temp_sensor_3;
    115           next_state_dd <= WGP_WRITE_READY;
    116           state_write_general_proc <= WRITE_TO_DD_ADDR;
     137          if (temp_sensor_ready = '1') then
     138            local_dd_addr <= X"007";
     139            local_dd_data <= conv_std_logic_vector (temp_sensor_array (3), 16);
     140            next_state_dd <= WGP_WRITE_READY;
     141            state_write_general_proc <= WRITE_TO_DD_ADDR;
     142          end if;
    117143         
    118144        when WGP_WRITE_READY =>
     
    150176
    151177END ARCHITECTURE beha;
     178
  • firmware/FTM/ethernet/ethernet_modul_beha.vhd

    r10366 r10441  
    33-- Created:
    44--          by - kai.users (tpkw.local.priv)
    5 --          at - 10:39:41 04/13/11
     5--          at - 11:20:56 04/20/11
    66--
    77-- Generated by Mentor Graphics' HDL Designer(TM) 2009.1 (Build 12)
     
    1010USE ieee.std_logic_1164.all;
    1111USE ieee.std_logic_arith.all;
    12 --LIBRARY FACT_FTM_lib;
     12
    1313library ftm_definitions;
    1414USE ftm_definitions.ftm_array_types.all;
    1515USE ftm_definitions.ftm_constants.all;
    16 
    1716
    1817ENTITY ethernet_modul IS
     
    7069      fl_addr_ftu            : IN     std_logic_vector (11 DOWNTO 0);
    7170      fl_data_in_ftu         : IN     std_logic_vector (15 DOWNTO 0) := (others => '0');
     71      --
    7272      ping_ftu_start         : OUT    std_logic                      := '0';
    7373      ping_ftu_started       : IN     std_logic;
     
    8989      ftu_error_calls        : IN     std_logic_vector (15 DOWNTO 0);
    9090      ftu_error_data         : IN     std_logic_vector (223 DOWNTO 0);                    -- (28 * 8) - 1
     91      --
    9192      ftu_error_send         : IN     std_logic;
    9293      ftu_error_send_ack     : OUT    std_logic                      := '1';
     
    9596      trigger_counter        : IN     std_logic_vector (31 DOWNTO 0) := (others => '0');
    9697      trigger_counter_read   : OUT    std_logic                      := '0';
    97       trigger_counter_valid  : IN     std_logic
     98      trigger_counter_valid  : IN     std_logic;
     99      board_id               : IN     std_logic_vector (63 DOWNTO 0);
     100      get_ts_counter         : OUT    std_logic                      := '0';
     101      get_ts_counter_ready   : IN     std_logic;
     102      get_ts_counter_started : IN     std_logic;
     103      timestamp_counter      : IN     std_logic_vector (47 DOWNTO 0);
     104      get_ot_counter         : OUT    std_logic                      := '0';
     105      get_ot_counter_ready   : IN     std_logic;
     106      get_ot_counter_started : IN     std_logic;
     107      on_time_counter        : IN     std_logic_vector (47 DOWNTO 0);
     108      temp_sensor_array      : IN     sensor_array_type;
     109      temp_sensor_ready      : IN     std_logic;
     110      crate_reset            : OUT    std_logic                      := '0';
     111      crate_reset_ack        : IN     std_logic;
     112      crate_reset_param      : OUT    std_logic_vector (15 DOWNTO 0) := (others => '0');
     113      --
     114      start_run              : OUT    std_logic                      := '0';
     115      start_run_ack          : IN     std_logic;
     116      stop_run               : OUT    std_logic                      := '0';
     117      stop_run_ack           : IN     std_logic;
     118      current_cc_state       : IN     std_logic_vector (15 DOWNTO 0);
     119      start_run_param        : OUT    std_logic_vector (15 DOWNTO 0) := (others => '0');
     120      start_run_num_events   : OUT    std_logic_vector (31 DOWNTO 0) := (others => '0')
    98121   );
    99122
     
    159182   SIGNAL header_timestamp_counter : std_logic_vector(47 DOWNTO 0);
    160183   SIGNAL header_trigger_counter   : std_logic_vector(31 DOWNTO 0);
     184   SIGNAL header_current_state     : std_logic_vector(15 DOWNTO 0) := (others => '0');
    161185
    162186   -- Implicit buffer signal declarations
     
    268292      dd_ready                 : IN     std_logic ;
    269293      dd_addr                  : OUT    std_logic_vector (11 DOWNTO 0) := (others => '0');
    270       dd_data                  : OUT    std_logic_vector (15 DOWNTO 0) := (others => '0')
     294      dd_data                  : OUT    std_logic_vector (15 DOWNTO 0) := (others => '0');
     295      get_ot_counter           : OUT    std_logic                      := '0';
     296      get_ot_counter_started   : IN     std_logic ;
     297      get_ot_counter_ready     : IN     std_logic ;
     298      on_time_counter          : IN     std_logic_vector (47 DOWNTO 0);
     299      temp_sensor_ready        : IN     std_logic ;
     300      temp_sensor_array        : IN     sensor_array_type
    271301   );
    272302   END COMPONENT;
     
    338368      get_header_started       : OUT    std_logic                      := '0';
    339369      get_header_ready         : OUT    std_logic                      := '0';
     370      board_id                 : IN     std_logic_vector (63 DOWNTO 0);
    340371      trigger_counter_read     : OUT    std_logic                      := '0';
    341372      trigger_counter_valid    : IN     std_logic ;
    342373      trigger_counter          : IN     std_logic_vector (31 DOWNTO 0) := (others => '0');
     374      get_ts_counter           : OUT    std_logic                      := '0';
     375      get_ts_counter_started   : IN     std_logic ;
     376      get_ts_counter_ready     : IN     std_logic ;
     377      timestamp_counter        : IN     std_logic_vector (47 DOWNTO 0);
    343378      header_board_id          : OUT    std_logic_vector (63 DOWNTO 0) := (others => '0');
    344379      header_firmware_id       : OUT    std_logic_vector (15 DOWNTO 0) := (others => '0');
    345380      header_trigger_counter   : OUT    std_logic_vector (31 DOWNTO 0) := (others => '0');
    346       header_timestamp_counter : OUT    std_logic_vector (47 DOWNTO 0) := (others => '0')
     381      header_timestamp_counter : OUT    std_logic_vector (47 DOWNTO 0) := (others => '0');
     382      header_current_state     : OUT    std_logic_vector (15 DOWNTO 0) := (others => '0');
     383      current_cc_state         : IN     std_logic_vector (15 DOWNTO 0)
    347384   );
    348385   END COMPONENT;
     
    411448      header_firmware_id       : IN     std_logic_vector (15 DOWNTO 0);
    412449      header_trigger_counter   : IN     std_logic_vector (31 DOWNTO 0);
    413       header_timestamp_counter : IN     std_logic_vector (47 DOWNTO 0)
     450      header_timestamp_counter : IN     std_logic_vector (47 DOWNTO 0);
     451      header_current_state     : IN     std_logic_vector (15 DOWNTO 0);
     452      --
     453      start_run                : OUT    std_logic                      := '0';
     454      start_run_ack            : IN     std_logic ;
     455      start_run_param          : OUT    std_logic_vector (15 DOWNTO 0) := (others => '0');
     456      start_run_num_events     : OUT    std_logic_vector (31 DOWNTO 0) := (others => '0');
     457      stop_run                 : OUT    std_logic                      := '0';
     458      stop_run_ack             : IN     std_logic ;
     459      crate_reset              : OUT    std_logic                      := '0';
     460      crate_reset_ack          : IN     std_logic ;
     461      crate_reset_param        : OUT    std_logic_vector (15 DOWNTO 0) := (others => '0')
    414462   );
    415463   END COMPONENT;
     
    514562         dd_ready                 => dd_ready_internal,
    515563         dd_addr                  => dd_addr1,
    516          dd_data                  => dd_data
     564         dd_data                  => dd_data,
     565         get_ot_counter           => get_ot_counter,
     566         get_ot_counter_started   => get_ot_counter_started,
     567         get_ot_counter_ready     => get_ot_counter_ready,
     568         on_time_counter          => on_time_counter,
     569         temp_sensor_ready        => temp_sensor_ready,
     570         temp_sensor_array        => temp_sensor_array
    517571      );
    518572   U_8 : dram_control
     
    580634         get_header_started       => get_header_started,
    581635         get_header_ready         => get_header_ready,
     636         board_id                 => board_id,
    582637         trigger_counter_read     => trigger_counter_read,
    583638         trigger_counter_valid    => trigger_counter_valid,
    584639         trigger_counter          => trigger_counter,
     640         get_ts_counter           => get_ts_counter,
     641         get_ts_counter_started   => get_ts_counter_started,
     642         get_ts_counter_ready     => get_ts_counter_ready,
     643         timestamp_counter        => timestamp_counter,
    585644         header_board_id          => header_board_id,
    586645         header_firmware_id       => header_firmware_id,
    587646         header_trigger_counter   => header_trigger_counter,
    588          header_timestamp_counter => header_timestamp_counter
     647         header_timestamp_counter => header_timestamp_counter,
     648         header_current_state     => header_current_state,
     649         current_cc_state         => current_cc_state
    589650      );
    590651   U_0 : w5300_modul
     
    646707         header_firmware_id       => header_firmware_id,
    647708         header_trigger_counter   => header_trigger_counter,
    648          header_timestamp_counter => header_timestamp_counter
     709         header_timestamp_counter => header_timestamp_counter,
     710         header_current_state     => header_current_state,
     711         start_run                => start_run,
     712         start_run_ack            => start_run_ack,
     713         start_run_param          => start_run_param,
     714         start_run_num_events     => start_run_num_events,
     715         stop_run                 => stop_run,
     716         stop_run_ack             => stop_run_ack,
     717         crate_reset              => crate_reset,
     718         crate_reset_ack          => crate_reset_ack,
     719         crate_reset_param        => crate_reset_param
    649720      );
    650721
  • firmware/FTM/ethernet/header_modul_beha.vhd

    r10366 r10441  
    1212USE ieee.std_logic_arith.all;
    1313USE IEEE.STD_LOGIC_UNSIGNED.all;
    14 --LIBRARY FACT_FTM_lib;
    15 --USE FACT_FTM_lib.ftm_array_types.all;
    16 --USE FACT_FTM_lib.ftm_constants.all;
     14
    1715library ftm_definitions;
    1816USE ftm_definitions.ftm_array_types.all;
     
    2523  get_header_started        : OUT std_logic := '0';
    2624  get_header_ready          : OUT std_logic := '0';
     25  board_id                  : IN std_logic_vector (63 DOWNTO 0);
    2726  trigger_counter_read      : OUT std_logic := '0';
    2827  trigger_counter_valid     : IN std_logic;
    2928  trigger_counter           : IN  std_logic_vector (31 DOWNTO 0) := (others => '0');
     29  get_ts_counter            : OUT std_logic := '0';
     30  get_ts_counter_started    : IN std_logic;
     31  get_ts_counter_ready      : IN std_logic;
     32  timestamp_counter         : IN std_logic_vector (47 DOWNTO 0);
    3033  header_board_id           : OUT std_logic_vector (63 DOWNTO 0) := (others => '0');
    3134  header_firmware_id        : OUT std_logic_vector (15 DOWNTO 0) := (others => '0');
    3235  header_trigger_counter    : OUT std_logic_vector (31 DOWNTO 0) := (others => '0');
    33   header_timestamp_counter  : OUT std_logic_vector (47 DOWNTO 0) := (others => '0')
     36  header_timestamp_counter  : OUT std_logic_vector (47 DOWNTO 0) := (others => '0');
     37  header_current_state      : OUT std_logic_vector (15 DOWNTO 0) := (others => '0');
     38  current_cc_state          : IN  std_logic_vector (15 DOWNTO 0)
    3439  );
    3540END ENTITY header_modul;
     
    3843ARCHITECTURE beha OF header_modul IS
    3944
    40   type state_header_proc_type is (HP_INIT, HP_CONFIG, HP_IDLE, HP_START, HP_TRG_CNT, HP_END);
     45  type state_header_proc_type is (HP_INIT, HP_CONFIG, HP_IDLE, HP_START, HP_TRG_CNT,
     46                                  HP_TS_CNT, HP_TS_CNT_END, HP_END);
    4147 
    4248  signal state_header_proc : state_header_proc_type := HP_INIT;
     
    4753    if rising_edge (clk) then
    4854      case state_header_proc is
    49      
    50       when HP_INIT =>
    51         state_header_proc <= HP_CONFIG;
    5255       
    53       when HP_CONFIG =>
    54         state_header_proc <= HP_IDLE;
     56        when HP_INIT =>
     57          state_header_proc <= HP_CONFIG;
     58         
     59        when HP_CONFIG =>
     60          state_header_proc <= HP_IDLE;
     61         
     62        when HP_IDLE =>
     63          if (get_header = '1') then
     64            get_header_started <= '1';
     65            get_header_ready <= '0';
     66            state_header_proc <= HP_START;
     67          end if;
     68         
     69        when HP_START =>
     70          header_board_id <= board_id;
     71          header_firmware_id <= X"00" & FIRMWARE_ID;
     72          header_current_state <= current_cc_state;
     73         
     74          trigger_counter_read <= '1';
     75          state_header_proc <= HP_TRG_CNT;
     76         
     77        when HP_TRG_CNT =>
     78          trigger_counter_read <= '0';
     79          if (trigger_counter_valid = '1') then
     80            header_trigger_counter <= trigger_counter;
     81            get_ts_counter <= '1';
     82            state_header_proc <= HP_TS_CNT;
     83          end if;
     84         
     85        when HP_TS_CNT =>
     86          if (get_ts_counter_started = '1') then
     87            get_ts_counter <= '0';
     88            state_header_proc <= HP_TS_CNT_END;
     89          end if;
     90         
     91        when HP_TS_CNT_END =>
     92          if (get_ts_counter_ready = '1') then
     93            header_timestamp_counter <= timestamp_counter;
     94            state_header_proc <= HP_END;
     95          end if;
     96         
     97        when HP_END =>
     98          if (get_header <= '0') then
     99            get_header_started <= '0';
     100            get_header_ready <= '1';
     101            state_header_proc <= HP_IDLE;
     102          end if;
    55103       
    56       when HP_IDLE =>
    57         if (get_header = '1') then
    58           get_header_started <= '1';
    59           get_header_ready <= '0';
    60           state_header_proc <= HP_START;
    61         end if;
    62        
    63       when HP_START =>
    64         header_board_id <= to_stdlogicvector (DNA_FOR_SIM);
    65         header_firmware_id <= X"00" & FIRMWARE_ID;
    66         header_timestamp_counter <= X"333322221111";
    67        
    68         trigger_counter_read <= '1';
    69         state_header_proc <= HP_TRG_CNT;
    70        
    71       when HP_TRG_CNT =>
    72         trigger_counter_read <= '0';
    73         if (trigger_counter_valid = '1') then
    74           header_trigger_counter <= trigger_counter;
    75           state_header_proc <= HP_END;
    76         end if;
    77        
    78       when HP_END =>
    79         if (get_header <= '0') then
    80           get_header_started <= '0';
    81           get_header_ready <= '1';
    82           state_header_proc <= HP_IDLE;
    83         end if;
    84      
    85104      end case;
    86105    end if;
  • firmware/FTM/ethernet/w5300_modul.vhd

    r10366 r10441  
    1818--
    1919----------------------------------------------------------------------------------
    20 
     20-- hds interface_start
    2121LIBRARY IEEE;
    2222USE IEEE.STD_LOGIC_1164.all;
     
    2424USE IEEE.STD_LOGIC_UNSIGNED.all;
    2525
    26 --LIBRARY FACT_FTM_lib;
    27 --USE FACT_FTM_lib.ftm_array_types.all;
    28 --USE FACT_FTM_lib.ftm_constants.all;
    2926library ftm_definitions;
    3027USE ftm_definitions.ftm_array_types.all;
     
    10097    header_firmware_id        : IN  std_logic_vector (15 DOWNTO 0);
    10198    header_trigger_counter    : IN  std_logic_vector (31 DOWNTO 0);
    102     header_timestamp_counter  : IN  std_logic_vector (47 DOWNTO 0)
    103 
     99    header_timestamp_counter  : IN  std_logic_vector (47 DOWNTO 0);
     100    header_current_state      : IN  std_logic_vector (15 DOWNTO 0);
     101    --
     102    start_run                 : OUT std_logic := '0';
     103    start_run_ack             : IN  std_logic;
     104    start_run_param           : OUT std_logic_vector (15 DOWNTO 0) := (others => '0');
     105    start_run_num_events      : OUT std_logic_vector (31 DOWNTO 0) := (others => '0');
     106    stop_run                  : OUT std_logic := '0';
     107    stop_run_ack              : IN  std_logic;
     108    crate_reset               : OUT std_logic := '0';
     109    crate_reset_ack           : IN  std_logic;
     110    crate_reset_param         : OUT std_logic_vector (15 DOWNTO 0) := (others => '0')
    104111  );
    105112
     
    113120                           READ_DATA, WRITE_TO_SD_ADDR, READ_FTU_ERROR, READ_FROM_SD_ADDR, READ_FROM_DD_ADDR, READ_FROM_FL_ADDR, READ_FROM_HEADER_MODUL);
    114121  type state_write_type is (WR_START, WR_LENGTH, WR_01, WR_02, WR_03, WR_04, WR_05, WR_06, WR_07, WR_08,
    115                             WR_GET_HEADER, WR_GET_HEADER_WAIT, WR_FIFO_DATA, WR_FIFO_DATA_01, WR_FIFO_HEADER, WR_FIFO_HEADER_01);
     122                            WR_WRITE_START_DEL, WR_GET_HEADER, WR_GET_HEADER_WAIT, WR_FIFO_DATA, WR_FIFO_DATA_01, WR_FIFO_HEADER, WR_FIFO_HEADER_01, WR_WRITE_END_DEL);
    116123  type state_interrupt_1_type is (IR1_01, IR1_02, IR1_03, IR1_04);
    117124  type state_interrupt_2_type is (IR2_01, IR2_02, IR2_03, IR2_04, IR2_05, IR2_06);
    118   type state_read_data_type is (RD_1, RD_2, RD_3, RD_4, RD_5, RD_CMD, RD_CMD_PARSE, RD_PING, RD_WRITE_SD_ADDR, RD_READ_SD_ADDR, RD_READ_SD_BLOCK, RD_READ_DD_BLOCK, RD_WRITE_SD_BLOCK, RD_END);
     125  type state_read_data_type is (RD_1, RD_2, RD_3, RD_4, RD_5, RD_CMD, RD_CMD_PARSE, RD_PING, RD_WRITE_SD_ADDR, RD_READ_SD_ADDR, RD_READ_SD_BLOCK, RD_READ_DD_BLOCK, RD_WRITE_SD_BLOCK, RD_X_EVNTS,RD_END);
    119126  type state_write_sd_type is (WRITE_SD_START, WRITE_SD_WAIT, WRITE_SD_END);
    120127  type state_read_sd_type is (READ_SD_START, READ_SD_WAIT, READ_SD_END);
     
    163170
    164171  signal next_packet_data_cnt : integer range 0 to 4095 := 0;
    165   signal rx_packets_cnt   : std_logic_vector (15 downto 0);
     172  signal rx_packets_cnt   : std_logic_vector (15 downto 0) := X"0000";
    166173  signal new_config_flag  : std_logic := '0';
    167174
     
    182189  signal local_sd_addr : std_logic_vector (11 downto 0);
    183190  signal local_sd_data : std_logic_vector (15 downto 0);
     191 
     192  signal data_package_type : std_logic_vector (15 downto 0) := X"0000";
     193  signal data_package_length : std_logic_vector (15 downto 0) := X"0000";
    184194
    185195
     
    574584              when SFE_START =>
    575585                next_state <= SEND_FTU_ERROR;
     586                data_package_type <= FTM_PACKAGE_TYPE_FTU_ERR;
     587                data_package_length <= FTU_ERROR_LENGTH + 1; -- +1 := package end
    576588                read_addr_state <= READ_FTU_ERROR;
    577589                local_sd_addr <= X"000";
     
    626638
    627639              when RD_END =>
     640                if (new_config_flag = '1') then
     641                  new_config_flag <= '0';
     642                  next_state <= CONFIG;
     643                else
     644                  next_state <= MAIN;
     645                end if;
    628646                if (internal_cmd = '0') then
    629647                  par_addr   <= W5300_S0_CR;
     
    632650                else
    633651                  internal_cmd <= '0';
    634                 end if;
    635                 if (new_config_flag = '1') then
    636                   new_config_flag <= '0';
    637                   next_state <= CONFIG;
    638                 else
    639                   next_state <= MAIN;
     652                  state_init <= MAIN;
    640653                end if;
    641654
     
    670683                    led_int <= NOT led_int;
    671684                    state_read_data <= RD_5;
     685                   
     686                  when CMD_START =>
     687                    case cmd_array (2) is
     688                      -- start "normal" run
     689                      when PAR_START_RUN =>
     690                        start_run <= '1';
     691                        start_run_param <= cmd_array (2);
     692                        if (start_run_ack = '1') then
     693                          start_run <= '0';
     694                          state_read_data <= RD_5;
     695                        end if;
     696                      -- start run an take X events
     697                      when PAR_START_X_EVNTS =>
     698                        next_state_read_data <= RD_X_EVNTS;
     699                        state_read_data <= RD_5;
     700                      when others =>
     701                        state_read_data <= RD_5;
     702                    end case;
     703                   
     704                  when CMD_STOP =>
     705                    stop_run <= '1';
     706                    if (stop_run_ack = '1') then
     707                      stop_run <= '0';
     708                      state_read_data <= RD_5;
     709                    end if;
     710                   
     711                  when CMD_CRESET =>
     712                    crate_reset <= '1';
     713                    crate_reset_param <= cmd_array (2);
     714                    if (crate_reset_ack = '1') then
     715                      crate_reset <= '0';
     716                      state_read_data <= RD_5;
     717                    end if;
    672718
    673719                  when CMD_WRITE =>
     
    739785                  when PING_WRITE_LIST =>
    740786                    state_read_data <= RD_5;
     787                    data_package_type <= FTM_PACKAGE_TYPE_FTU_LIST;
     788                    data_package_length <= FL_BLOCK_SIZE + 1; -- +1 := package end
    741789                    read_addr_state <= READ_FROM_FL_ADDR;
    742790                    local_sd_addr <= X"000"; --start at address 0x000
     
    767815                  when READ_DD_BLOCK_WRITE =>
    768816                    if (dd_write_general_ready = '1') then
     817                      data_package_type <= FTM_PACKAGE_TYPE_DD;
     818                      data_package_length <= DD_BLOCK_SIZE + 1; -- +1 := package end
    769819                      read_addr_state <= READ_FROM_DD_ADDR;
    770820                      local_sd_addr <= X"000"; -- start at address 0x000
     
    796846              -- read static data block and write it to ethernet
    797847              when RD_READ_SD_BLOCK =>
     848                data_package_type <= FTM_PACKAGE_TYPE_SD;
     849                data_package_length <= SD_BLOCK_SIZE + 1; -- +1 := package end
    798850                state_read_data <= RD_5;
    799851                read_addr_state <= READ_FROM_SD_ADDR;
     
    806858              -- read from address in static data ram and write data to ethernet
    807859              when RD_READ_SD_ADDR =>
     860                data_package_type <= FTM_PACKAGE_TYPE_SD_WORD;
     861                data_package_length <= SD_SINGLE_WORD_SIZE + 1; -- +1 := package end
    808862                state_read_data <= RD_5;
    809863                read_addr_state <= READ_FROM_SD_ADDR;
     
    841895                  state_init <= WRITE_TO_SD_ADDR;
    842896                end if;
     897               
     898              -- read X events
     899              when RD_X_EVNTS =>
     900                if (next_packet_data_cnt = 0) then
     901                  start_run_num_events (31 downto 16) <= data_read;
     902                else
     903                  start_run_num_events (15 downto 0) <= data_read;
     904                  start_run_param <= cmd_array (2);
     905                  start_run <= '1';
     906                  if (start_run_ack = '1') then
     907                    start_run <= '0';
     908                    next_packet_data_cnt <= 0;
     909                    next_state_read_data <= RD_CMD;
     910                    state_read_data <= RD_5;
     911                  end if;
     912                end if;
    843913
    844914            end case;  -- state_read_data
     
    860930            case header_cnt is
    861931              when X"00" =>
     932                local_sd_data <= data_package_type;
     933              when X"01" =>
     934                local_sd_data <= data_package_length;
     935              when X"02" =>
     936                local_sd_data <= header_current_state;
     937              when X"03" =>
    862938                local_sd_data <= header_board_id (63 DOWNTO 48);
    863               when X"01" =>
     939              when X"04" =>
    864940                local_sd_data <= header_board_id (47 DOWNTO 32);
    865               when X"02" =>
     941              when X"05" =>
    866942                local_sd_data <= header_board_id (31 DOWNTO 16);
    867               when X"03" =>
     943              when X"06" =>
    868944                local_sd_data <= header_board_id (15 DOWNTO 0);
    869               when X"04" =>
     945              when X"07" =>
    870946                local_sd_data <= header_firmware_id;
    871               when X"05" =>
     947              when X"08" =>
    872948                local_sd_data <= header_trigger_counter (31 DOWNTO 16);
    873               when X"06" =>
     949              when X"09" =>
    874950                local_sd_data <= header_trigger_counter (15 DOWNTO 0);
    875               when X"07" =>
     951              when X"0A" =>
     952                local_sd_data <= X"0000";
     953              when X"0B" =>
    876954                local_sd_data <= header_timestamp_counter (47 DOWNTO 32);
    877               when X"08" =>
     955              when X"0C" =>
    878956                local_sd_data <= header_timestamp_counter (31 DOWNTO 16);
    879               when X"09" =>
     957              when X"0D" =>
    880958                local_sd_data <= header_timestamp_counter (15 DOWNTO 0);
    881               when X"0A" =>
    882                 local_sd_data <= X"FFFF"; -- spare
    883959              when others =>
    884960                null;
     
    9811057                local_socket_nr    <= "000";
    9821058                next_state_tmp     <= next_state;
    983                 write_length_bytes <= (FTM_HEADER_LENGTH + local_write_length (15 downto 0)) & '0';  -- shift left (*2)
     1059                -- Write Length: 2 := START and END of package
     1060                write_length_bytes <= (2 + FTM_HEADER_LENGTH + local_write_length (15 downto 0)) & '0';  -- shift left (*2)
    9841061                data_cnt           <= 0;
    9851062                header_cnt         <= X"00";
     
    10041081                  state_write <= WR_01;
    10051082                else
    1006                   state_write <= WR_GET_HEADER;
    1007                 end if;
     1083                  state_write <= WR_WRITE_START_DEL;
     1084                end if;
     1085
     1086              -- write package start delimiter
     1087              when WR_WRITE_START_DEL =>
     1088                par_addr       <= W5300_S0_TX_FIFOR + local_socket_nr * W5300_S_INC;
     1089                par_data       <= FTM_PACKAGE_START;
     1090                state_init     <= WRITE_REG;
     1091                next_state     <= WRITE_DATA;
     1092                state_write    <= WR_GET_HEADER;
    10081093
    10091094              -- get header data
     
    10531138                  state_write    <= WR_FIFO_DATA;
    10541139                else
    1055                   state_write <= WR_05;
    1056                 end if;
     1140                  state_write <= WR_WRITE_END_DEL;
     1141                end if;
     1142
     1143              -- write package end delimiter
     1144              when WR_WRITE_END_DEL =>
     1145                par_addr       <= W5300_S0_TX_FIFOR + local_socket_nr * W5300_S_INC;
     1146                par_data       <= FTM_PACKAGE_END;
     1147                state_init     <= WRITE_REG;
     1148                next_state     <= WRITE_DATA;
     1149                state_write    <= WR_05;
    10571150
    10581151              -- Send FIFO
     
    11371230
    11381231end Behavioral;
     1232
Note: See TracChangeset for help on using the changeset viewer.