Changeset 10418 for firmware


Ignore:
Timestamp:
Apr 20, 2011, 12:37:39 PM (9 years ago)
Author:
weitzel
Message:
New FTM firmare: dna, fad_broadcast, FTU error messages, rates readout
Location:
firmware/FTM
Files:
5 added
9 edited

Legend:

Unmodified
Added
Removed
  • firmware/FTM/FTM_central_control.vhd

    r10366 r10418  
    5959    dd_send_ack          : IN  std_logic;
    6060    dd_send_ready        : IN  std_logic;
     61    dd_block_ready_ftu     : out std_logic := '0';
     62    dd_block_start_ack_ftu : in  std_logic;
     63    dd_block_start_ftu     : out std_logic := '0';
    6164    config_start_cc      : out std_logic := '0';
    6265    config_started_cc    : in  std_logic;
    6366    config_ready_cc      : in  std_logic;
    6467    config_trigger       : out  std_logic := '0';
    65     config_trigger_done  : in  std_logic
     68    config_trigger_done  : in  std_logic;
     69    dna_start            : out std_logic := '0';
     70    dna_ready            : in  std_logic
    6671  );
    6772end FTM_central_control;
     
    8085  signal prescaling_FTU01_sig : std_logic_vector(7 downto 0) := "00100111";
    8186 
    82   type state_central_proc_type is (CP_INIT,
     87  type state_central_proc_type is (CP_INIT, CP_INIT_DNA,
    8388                                   CP_CONFIG_START, CP_CONFIG, CP_CONFIG_01,
    8489                                   CP_CONFIG_CC, CP_CONFIG_CC_01,
     
    8691                                   CP_CONFIG_SCALER, CP_CONFIG_SCALER_01,
    8792                                   CP_CONFIG_TRIGGER, CP_CONFIG_TRIGGER_01,
    88                                    CP_IDLE, CP_PING, CP_READ_RATES, CP_READ_RATES_01,
     93                                   CP_IDLE, CP_PING, CP_START_RATES, CP_READ_RATES, CP_READ_RATES_01,
    8994                                   CP_SEND_START, CP_SEND_END);
    9095  signal state_central_proc : state_central_proc_type := CP_INIT;
     
    97102      case state_central_proc is
    98103
    99         when CP_INIT =>
     104        when CP_INIT =>  -- wait for DCMs to lock
    100105          if (clk_ready = '1') then
     106            state_central_proc <= CP_INIT_DNA;
     107          end if;
     108
     109        when CP_INIT_DNA =>  -- get FPGA DNA
     110          if (dna_ready = '1') then
    101111            state_central_proc <= CP_CONFIG;
    102           end if;
    103            
     112            dna_start <= '0';
     113          else
     114            dna_start <= '1';
     115            state_central_proc <= CP_INIT_DNA;
     116          end if;
     117         
    104118        when CP_CONFIG_START =>
    105119          if (config_started_ack = '1') then
     
    189203          elsif (new_period_sig = '1') then
    190204            new_period_ack_sig <= '1';
    191             rates_ftu <= '1';
    192             state_central_proc <= CP_READ_RATES;
     205            --rates_ftu <= '1';
     206            --state_central_proc <= CP_READ_RATES;
     207            state_central_proc <= CP_START_RATES;
    193208          end if;
    194209
     
    202217          end if;
    203218
     219        when CP_START_RATES =>
     220          new_period_ack_sig <= '0';
     221          dd_block_start_ftu <= '1';
     222          dd_block_ready_ftu <= '0';
     223          if (dd_block_start_ack_ftu = '1') then
     224            dd_block_start_ftu <= '0';
     225            rates_ftu <= '1';
     226            state_central_proc <= CP_READ_RATES;
     227          end if;
     228         
    204229        when CP_READ_RATES =>
    205230          new_period_ack_sig <= '0';
     
    211236        when CP_READ_RATES_01 =>
    212237          if (rates_ready_ftu = '1') then
     238            dd_block_ready_ftu <= '1';
    213239            state_central_proc <= CP_SEND_START;
    214240          end if;
  • firmware/FTM/FTM_top.vhd

    r10366 r10418  
    146146
    147147    -- Bus 2: Trigger-ID to FAD boards
    148     -- Bus2_Tx_En    : out STD_LOGIC;  -- bus 2: transmitter enable                                 
    149     -- Bus2_Rx_En    : out STD_LOGIC;  -- bus 2: receiver enable
    150 
    151     -- Bus2_RxD_0    : in STD_LOGIC;   -- crate 0
    152     -- Bus2_TxD_0    : out STD_LOGIC;
    153 
    154     -- Bus2_RxD_1    : in STD_LOGIC;   -- crate 1
    155     -- Bus2_TxD_1    : out STD_LOGIC;
    156 
    157     -- Bus2_RxD_2    : in STD_LOGIC;   -- crate 2
    158     -- Bus2_TxD_2    : out STD_LOGIC;
    159 
    160     -- Bus2_RxD_3    : in STD_LOGIC;   -- crate 3
    161     -- Bus2_TxD_3    : out STD_LOGIC; 
     148    Bus2_Tx_En    : out STD_LOGIC;  -- bus 2: transmitter enable                                 
     149    Bus2_Rx_En    : out STD_LOGIC;  -- bus 2: receiver enable
     150
     151    Bus2_RxD_0    : in STD_LOGIC;   -- crate 0
     152    Bus2_TxD_0    : out STD_LOGIC;
     153
     154    Bus2_RxD_1    : in STD_LOGIC;   -- crate 1
     155    Bus2_TxD_1    : out STD_LOGIC;
     156
     157    Bus2_RxD_2    : in STD_LOGIC;   -- crate 2
     158    Bus2_TxD_2    : out STD_LOGIC;
     159
     160    Bus2_RxD_3    : in STD_LOGIC;   -- crate 3
     161    Bus2_TxD_3    : out STD_LOGIC; 
    162162   
    163163
     
    326326  signal dd_data_sig                : std_logic_vector(15 DOWNTO 0) := (others => '0');
    327327  signal dd_addr_sig                : std_logic_vector(11 DOWNTO 0) := (others => '0'); 
    328   signal dd_block_start_sig         : std_logic := '0';
     328  signal dd_block_start_ftu_sig     : std_logic := '0';
    329329  signal dd_block_start_ack_ftu_sig : std_logic := '0';
    330   signal dd_block_ready_sig         : std_logic := '0';
     330  signal dd_block_ready_ftu_sig     : std_logic := '0';
    331331  signal dd_busy_sig                : std_logic;
    332332  signal dd_write_sig               : std_logic := '0';
     
    361361  signal clk_ready_sig   : STD_LOGIC := '0';  -- set high by FTM_clk_gen when DCMs have locked
    362362
     363  signal trigger_ID_ready_sig : std_logic;  -- initialized in trigger manager
     364  signal trigger_ID_sig       : std_logic_vector(55 downto 0);  -- initialized in trigger manager
     365  signal trigger_ID_read_sig  : std_logic;  -- initialized in FTM_fad_broadcast
     366 
    363367  signal reset_sig : STD_LOGIC := '0';  -- initialize to 0 on power-up
    364368
    365369  signal trigger_signal_sig : std_logic := '0';
    366370  signal TIM_signal_sig : std_logic := '0';
     371
     372  --signals for FPGA DNA identifier
     373  signal dna_sig : STD_LOGIC_VECTOR(63 downto 0);  -- initialized in FTM_dna_gen
     374  signal dna_start_sig : STD_LOGIC;  -- initialized in FTM_central_control
     375  signal dna_ready_sig : STD_LOGIC;  -- initialized in FTM_dna_gen
    367376 
    368377  signal led_sig : std_logic_vector(7 downto 0) := (others => '0');
     
    389398      clk_250_ps : OUT STD_LOGIC;
    390399      ready      : OUT STD_LOGIC
     400    );
     401  end component;
     402
     403  component FTM_dna_gen
     404    port(
     405      clk   : IN  STD_LOGIC;
     406      start : IN  STD_LOGIC;
     407      dna   : OUT STD_LOGIC_VECTOR(63 downto 0);
     408      ready : OUT STD_LOGIC
    391409    );
    392410  end component;
     
    498516      dd_send_ack          : IN  std_logic;
    499517      dd_send_ready        : IN  std_logic;
     518      dd_block_ready_ftu     : out std_logic := '0';
     519      dd_block_start_ack_ftu : in  std_logic;
     520      dd_block_start_ftu     : out std_logic := '0';
    500521      config_start_cc      : out std_logic := '0';
    501522      config_started_cc    : in  std_logic;
    502523      config_ready_cc      : in  std_logic;
    503524      config_trigger       : out std_logic;
    504       config_trigger_done  : in  std_logic
     525      config_trigger_done  : in  std_logic;
     526      dna_start            : out std_logic;
     527      dna_ready            : in  std_logic
    505528    );
    506529  end component;
     
    532555      ftu_active_cr2      :  in std_logic_vector (15 downto 0);
    533556      ftu_active_cr3      :  in std_logic_vector (15 downto 0);
     557      ftu_error_calls     : out std_logic_vector (15 DOWNTO 0) := (others => '0');
     558      ftu_error_data      : out std_logic_vector ((FTU_RS485_BLOCK_WIDTH - 1) downto 0) := (others => '0');
     559      ftu_error_send      : out std_logic := '0';
     560      ftu_error_send_ack   :  in std_logic;
     561      ftu_error_send_ready :  in std_logic;
    534562      static_RAM_busy     :  in std_logic;
    535563      static_RAM_started  :  in std_logic;
     
    553581  end component;
    554582
     583  component FTM_fad_broadcast
     584    port(
     585      clk_50MHz         : in  std_logic;
     586      rx_en             : out STD_LOGIC;
     587      tx_en             : out STD_LOGIC;
     588      rx_d_0            : in  STD_LOGIC;
     589      tx_d_0            : out STD_LOGIC;
     590      rx_d_1            : in  STD_LOGIC;
     591      tx_d_1            : out STD_LOGIC;
     592      rx_d_2            : in  STD_LOGIC;
     593      tx_d_2            : out STD_LOGIC;
     594      rx_d_3            : in  STD_LOGIC;
     595      tx_d_3            : out STD_LOGIC;
     596      enable_ID_sending :  in std_logic;
     597      TIM_source        : in std_logic;
     598      LP_settings       : in std_logic_vector(3 downto 0);
     599      trigger_ID_ready  :  in std_logic;
     600      trigger_ID        :  in std_logic_vector(FAD_RS485_BLOCK_WIDTH - 1 downto 0);
     601      trigger_ID_read   : out std_logic             
     602    );
     603  end component;
     604 
    555605  component ethernet_modul
    556606    port(
     
    674724      ready      => clk_ready_sig
    675725    );
     726
     727  Inst_FTM_dna_gen : FTM_dna_gen
     728    port map(
     729      clk   => clk_50M_sig,
     730      start => dna_start_sig,
     731      dna   => dna_sig,
     732      ready => dna_ready_sig
     733    );
    676734 
    677735   --differential output buffer for trigger signal
     
    730788      active_FTU_list_3   => ftu_active_cr3_sig,
    731789      --control signals or information for other entities
    732       trigger_ID_read     => '0',
     790      trigger_ID_read     => trigger_ID_read_sig,
    733791      trig_cnt_copy_read  => trigger_counter_read_sig,
    734       trigger_ID_ready    => open,
    735       trigger_ID          => open,
     792      trigger_ID_ready    => trigger_ID_ready_sig,
     793      trigger_ID          => trigger_ID_sig,
    736794      trig_cnt_copy       => trigger_counter_sig,  --counter reading
    737795      trig_cnt_copy_valid => trigger_counter_valid_sig,  --trigger counter reading is valid
     
    795853      dd_send_ack          => dd_send_ack_sig,
    796854      dd_send_ready        => dd_send_ready_sig,
     855      dd_block_ready_ftu     => dd_block_ready_ftu_sig,
     856      dd_block_start_ack_ftu => dd_block_start_ack_ftu_sig,
     857      dd_block_start_ftu     => dd_block_start_ftu_sig,
    797858      config_start_cc      => config_start_cc_sig,
    798859      config_started_cc    => config_started_cc_sig,
    799860      config_ready_cc      => config_ready_cc_sig,
    800861      config_trigger       => config_trigger_sig,
    801       config_trigger_done  => config_trigger_done_sig
     862      config_trigger_done  => config_trigger_done_sig,
     863      dna_start            => dna_start_sig,
     864      dna_ready            => dna_ready_sig
    802865    );
    803866 
     
    828891      ftu_active_cr2      => ftu_active_cr2_sig,
    829892      ftu_active_cr3      => ftu_active_cr3_sig,
     893      ftu_error_calls     => ftu_error_calls_sig,
     894      ftu_error_data      => ftu_error_data_sig,
     895      ftu_error_send      => ftu_error_send_sig,
     896      ftu_error_send_ack  => ftu_error_send_ack_sig,
     897      ftu_error_send_ready=> ftu_error_send_ready_sig,
    830898      static_RAM_busy     => sd_busy_sig,
    831899      static_RAM_started  => sd_started_ftu_sig,
     
    846914      write_FTUlist_RAM   => fl_write_sig,
    847915      addr_FTUlist_RAM    => fl_addr_sig
     916    );
     917
     918  Inst_FTM_fad_broadcast : FTM_fad_broadcast
     919    port map(
     920      clk_50MHz         => clk_50M_sig,
     921      rx_en             => Bus2_Rx_En,
     922      tx_en             => Bus2_Tx_En,
     923      rx_d_0            => Bus2_RxD_0,
     924      tx_d_0            => Bus2_TxD_0,
     925      rx_d_1            => Bus2_RxD_1,
     926      tx_d_1            => Bus2_TxD_1,
     927      rx_d_2            => Bus2_RxD_2,
     928      tx_d_2            => Bus2_TxD_2,
     929      rx_d_3            => Bus2_RxD_3,
     930      tx_d_3            => Bus2_TxD_3,
     931      enable_ID_sending => '1',
     932      TIM_source        => general_settings_sig(0),
     933      LP_settings       => "0000",
     934      trigger_ID_ready  => trigger_ID_ready_sig,
     935      trigger_ID        => trigger_ID_sig,
     936      trigger_ID_read   => trigger_ID_read_sig               
    848937    );
    849938 
     
    9131002      coin_win_p         => coin_win_p_sig,
    9141003      --new stuff
    915       dd_block_ready_ftu     => dd_block_ready_sig,
     1004      dd_block_ready_ftu     => dd_block_ready_ftu_sig,
    9161005      dd_block_start_ack_ftu => dd_block_start_ack_ftu_sig,
    917       dd_block_start_ftu     => dd_block_start_sig,
     1006      dd_block_start_ftu     => dd_block_start_ftu_sig,
    9181007      dd_send                => dd_send_sig,
    9191008      dd_send_ack            => dd_send_ack_sig,
  • firmware/FTM/FTM_top_tb.vhd

    r10366 r10418  
    145145
    146146      -- Bus 2: Trigger-ID to FAD boards
    147       -- Bus2_Tx_En    : out STD_LOGIC;  -- bus 2: transmitter enable                                 
    148       -- Bus2_Rx_En    : out STD_LOGIC;  -- bus 2: receiver enable
    149 
    150       -- Bus2_RxD_0    : in STD_LOGIC;   -- crate 0
    151       -- Bus2_TxD_0    : out STD_LOGIC;
    152 
    153       -- Bus2_RxD_1    : in STD_LOGIC;   -- crate 1
    154       -- Bus2_TxD_1    : out STD_LOGIC;
    155 
    156       -- Bus2_RxD_2    : in STD_LOGIC;   -- crate 2
    157       -- Bus2_TxD_2    : out STD_LOGIC;
    158 
    159       -- Bus2_RxD_3    : in STD_LOGIC;   -- crate 3
    160       -- Bus2_TxD_3    : out STD_LOGIC; 
     147      Bus2_Tx_En    : out STD_LOGIC;  -- bus 2: transmitter enable                                 
     148      Bus2_Rx_En    : out STD_LOGIC;  -- bus 2: receiver enable
     149
     150      Bus2_RxD_0    : in STD_LOGIC;   -- crate 0
     151      Bus2_TxD_0    : out STD_LOGIC;
     152
     153      Bus2_RxD_1    : in STD_LOGIC;   -- crate 1
     154      Bus2_TxD_1    : out STD_LOGIC;
     155
     156      Bus2_RxD_2    : in STD_LOGIC;   -- crate 2
     157      Bus2_TxD_2    : out STD_LOGIC;
     158
     159      Bus2_RxD_3    : in STD_LOGIC;   -- crate 3
     160      Bus2_TxD_3    : out STD_LOGIC; 
    161161   
    162162
     
    347347
    348348  -- Clock period definitions
    349   constant clk_period       : TIME := 25 ns;  --  40 MHZ oscillator U47
    350   constant baud_rate_period : TIME :=  4 us;  -- 250 kHz baud rate
     349  constant clk_period       : TIME :=  25 ns;  --  40 MHZ oscillator U47
     350  --constant baud_rate_period : TIME :=  4 us;  -- 250 kHz baud rate
     351  constant baud_rate_period : TIME := 100 ns;  -- 10 MHz baud rate
    351352 
    352353begin
     
    394395      Bus1_RxD_3    => Bus1_RxD_3_sig,
    395396      Bus1_TxD_3    => Bus1_TxD_3_sig, 
    396 --      Bus2_Tx_En    => Bus2_Tx_En_sig,                               
    397 --      Bus2_Rx_En    => Bus2_Rx_En_sig,
    398 --      Bus2_RxD_0    => Bus2_RxD_0_sig,
    399 --      Bus2_TxD_0    => Bus2_TxD_0_sig,
    400 --      Bus2_RxD_1    => Bus2_RxD_1_sig,
    401 --      Bus2_TxD_1    => Bus2_TxD_1_sig,
    402 --      Bus2_RxD_2    => Bus2_RxD_2_sig,
    403 --      Bus2_TxD_2    => Bus2_TxD_2_sig,
    404 --      Bus2_RxD_3    => Bus2_RxD_3_sig,
    405 --      Bus2_TxD_3    => Bus2_TxD_3_sig,
     397      Bus2_Tx_En    => Bus2_Tx_En_sig,                               
     398      Bus2_Rx_En    => Bus2_Rx_En_sig,
     399      Bus2_RxD_0    => Bus2_RxD_0_sig,
     400      Bus2_TxD_0    => Bus2_TxD_0_sig,
     401      Bus2_RxD_1    => Bus2_RxD_1_sig,
     402      Bus2_TxD_1    => Bus2_TxD_1_sig,
     403      Bus2_RxD_2    => Bus2_RxD_2_sig,
     404      Bus2_TxD_2    => Bus2_TxD_2_sig,
     405      Bus2_RxD_3    => Bus2_RxD_3_sig,
     406      Bus2_TxD_3    => Bus2_TxD_3_sig,
    406407--      Crate_Res0    => Crate_Res0_sig,
    407408--      Crate_Res1    => Crate_Res1_sig,
     
    453454    wait for 100us;
    454455    Busy0_sig <= '0';
    455     wait for 1ms;
    456     Busy0_sig <= '1';
    457     wait for 500us;
    458     Busy0_sig <= '0';
     456--    wait for 1ms;
     457--    Busy0_sig <= '1';
     458--    wait for 500us;
     459--    Busy0_sig <= '0';
    459460    wait;
    460461  end process busy_proc;
     
    531532    -- time of FTU answer
    532533    ---------------------------------------------------------------------------
    533     wait for 2ms;
     534    wait for 1.24ms;
    534535    ---------------------------------------------------------------------------
    535536    -- data package of FTU answer (28 byte)
     
    543544    assign_rs485_0(X"01"); --FTM firmware ID
    544545    wait for 0ns;
    545     assign_rs485_0(X"05"); --instruction
     546    assign_rs485_0(X"02"); --instruction
    546547    wait for 0us;
    547548    assign_rs485_0(X"00"); --data byte 01
    548549    wait for 0ns;
    549     assign_rs485_0(X"00"); --data byte 02
     550    assign_rs485_0(X"F0"); --data byte 02
    550551    wait for 0ns;
    551552    assign_rs485_0(X"00"); --data byte 03
     
    589590    assign_rs485_0(X"00"); --CRC error counter (not used)
    590591    wait for 0ns;
    591     --assign_rs485_0(X"9E"); --check sum for rates
    592     assign_rs485_0(X"A5"); --check sum for ping
     592    assign_rs485_0(X"98"); --check sum for rates
     593    --assign_rs485_0(X"A5"); --check sum for ping
    593594    ---------------------------------------------------------------------------
    594595    -- don't forget final wait!
  • firmware/FTM/ethernet/dd_write_general_modul_beha.vhd

    r10256 r10418  
    118118        when WGP_WRITE_READY =>
    119119          if (dd_write_general = '0') then
     120            dd_write_general_started <= '0';
    120121            dd_write_general_ready <= '1';
    121122            state_write_general_proc <= WGP_IDLE;
  • firmware/FTM/ftm_board.ucf

    r10366 r10418  
    217217
    218218# Bus 2: Trigger-ID to FAD boards
    219 # NET Bus2_Tx_En   LOC  = K2  | IOSTANDARD=LVCMOS33 | SLEW = SLOW ; #
    220 # NET Bus2_Rx_En   LOC  = K4  | IOSTANDARD=LVCMOS33 | SLEW = SLOW ; #
     219NET Bus2_Tx_En   LOC  = K2  | IOSTANDARD=LVCMOS33 | SLEW = SLOW ; #
     220NET Bus2_Rx_En   LOC  = K4  | IOSTANDARD=LVCMOS33 | SLEW = SLOW ; #
    221221
    222222# crate 0
    223 # NET Bus2_RxD_0   LOC  = L4  | IOSTANDARD=LVCMOS33 | SLEW = SLOW ; #
    224 # NET Bus2_TxD_0   LOC  = M3  | IOSTANDARD=LVCMOS33 | SLEW = SLOW ; #
     223NET Bus2_RxD_0   LOC  = L4  | IOSTANDARD=LVCMOS33 | SLEW = SLOW ; #
     224NET Bus2_TxD_0   LOC  = M3  | IOSTANDARD=LVCMOS33 | SLEW = SLOW ; #
    225225
    226226# crate 1
    227 # NET Bus2_RxD_1   LOC  = N2  | IOSTANDARD=LVCMOS33 | SLEW = SLOW ; #
    228 # NET Bus2_TxD_1   LOC  = N1  | IOSTANDARD=LVCMOS33 | SLEW = SLOW ; #
     227NET Bus2_RxD_1   LOC  = N2  | IOSTANDARD=LVCMOS33 | SLEW = SLOW ; #
     228NET Bus2_TxD_1   LOC  = N1  | IOSTANDARD=LVCMOS33 | SLEW = SLOW ; #
    229229
    230230# crate 2
    231 # NET Bus2_RxD_2   LOC  = R2  | IOSTANDARD=LVCMOS33 | SLEW = SLOW ; #
    232 # NET Bus2_TxD_2   LOC  = R1  | IOSTANDARD=LVCMOS33 | SLEW = SLOW ; #
     231NET Bus2_RxD_2   LOC  = R2  | IOSTANDARD=LVCMOS33 | SLEW = SLOW ; #
     232NET Bus2_TxD_2   LOC  = R1  | IOSTANDARD=LVCMOS33 | SLEW = SLOW ; #
    233233
    234234# crate 3
    235 # NET Bus2_RxD_3   LOC  = U4  | IOSTANDARD=LVCMOS33 | SLEW = SLOW ; #
    236 # NET Bus2_TxD_3   LOC  = U2  | IOSTANDARD=LVCMOS33 | SLEW = SLOW ; #
     235NET Bus2_RxD_3   LOC  = U4  | IOSTANDARD=LVCMOS33 | SLEW = SLOW ; #
     236NET Bus2_TxD_3   LOC  = U2  | IOSTANDARD=LVCMOS33 | SLEW = SLOW ; #
    237237
    238238
  • firmware/FTM/ftm_definitions.vhd

    r10366 r10418  
    109109  constant FTU_RS485_BLOCK_WIDTH : integer := 224;  -- 28 byte protocol
    110110  constant FTU_RS485_START_DELIM : std_logic_vector(7 downto 0) := "01000000";  -- start delimiter "@"
     111
     112  --broadcast to FADs
     113  constant FAD_RS485_BAUD_RATE   : integer := 250000;  -- bits / sec in our case
     114  constant FAD_RS485_BLOCK_WIDTH : integer := 56;  -- 7 byte trigger ID
    111115 
    112116  --CRC setup
     
    115119 
    116120  --DNA identifier for simulation
    117   constant DNA_FOR_SIM : bit_vector := X"01710000E0000501";
     121  constant DNA_FOR_SIM : bit_vector := X"01710000F0000501";
    118122
    119123  -- Clock conditioner (LMK03000, National semiconductor) interface
     
    215219  constant FTU_LIST_RAM_OFFSET     : integer := 16#009#;
    216220  constant FTU_LIST_RAM_ADDR_WIDTH : integer := 12;
     221
     222  constant NO_OF_DD_RAM_REG : integer := 12;
    217223 
    218224  -- Static data block
     
    226232  constant SD_FTU_ACTIVE_NUM         : integer := 4;                -- number of active FTU lists (cr0 to cr3)
    227233  constant SD_BLOCK_SIZE             : std_logic_vector (11 downto 0) := X"1B4";  -- total size of static data block
    228 
     234 
    229235  -- dynamic data block
    230236  --constant DD_BLOCK_SIZE         : std_logic_vector (11 downto 0) := X"010"; -- 7 + (40 * 12) = 0x1E7 --total size of dynamic data block
    231   constant DD_BLOCK_SIZE         : std_logic_vector (11 downto 0) := X"1E7"; -- 7 + (40 * 12) = 0x1E7 --total size of dynamic data block
    232   constant DD_BLOCK_SIZE_GENERAL : integer := 7; -- dynamic block size without FTU data
     237  constant DD_BLOCK_SIZE          : std_logic_vector (11 downto 0) := X"1E7"; -- 7 + (40 * 12) = 0x1E7 --total size of dynamic data block
     238  constant DD_BLOCK_SIZE_GENERAL  : integer := 7; -- dynamic block size without FTU data
     239  constant DYNAMIC_RAM_ADDR_WIDTH : integer := 12;
    233240 
    234241  -- addresses in static data block
     
    280287  -- !!! to be defined !!!
    281288  constant sd_block_default_array : sd_block_default_array_type := (
    282       --X"0080", -- SD_ADDR_general_settings  -- general settings
    283       X"0060", -- SD_ADDR_general_settings  -- general settings
     289      X"0080", -- SD_ADDR_general_settings  -- general settings
     290      --X"0010", -- SD_ADDR_general_settings  -- general settings
    284291      X"0000", -- SD_ADDR_led               -- on-board status LEDs
    285       --X"0400", -- SD_ADDR_lp_pt_freq        -- light pulser and pedestal trigger frequency
    286       X"0001", -- SD_ADDR_lp_pt_freq        -- light pulser and pedestal trigger frequency
     292      X"03FF", -- SD_ADDR_lp_pt_freq        -- light pulser and pedestal trigger frequency
     293      --X"0001", -- SD_ADDR_lp_pt_freq        -- light pulser and pedestal trigger frequency
    287294      --X"0001", -- SD_ADDR_lp_pt_ratio...    -- ratio between LP1, LP2 and pedestal triggers
    288       X"0420", -- SD_ADDR_lp_pt_ratio...    -- ratio between LP1, LP2 and pedestal triggers
     295      X"0001", -- SD_ADDR_lp_pt_ratio...    -- ratio between LP1, LP2 and pedestal triggers
    289296      X"0004", -- SD_ADDR_lp1_amplitude     -- light pulser 1 amplitude
    290297      X"0005", -- SD_ADDR_lp2_amplitude     -- light pulser 2 amplitude
     
    295302      X"0000", -- SD_ADDR_trigger_delay     -- trigger delay
    296303      X"0000", -- SD_ADDR_timemarker_delay  -- timemarker delay
    297       --X"0019", -- SD_ADDR_dead_time         -- dead time, 8ns + 4x25ns = 108ns
    298       X"0000", -- SD_ADDR_dead_time         -- dead time, 8ns + 4x25ns = 108ns
     304      X"0017", -- SD_ADDR_dead_time         -- dead time, 8ns + 4x23ns = 100ns
     305      --X"0000", -- SD_ADDR_dead_time         -- dead time, 8ns + 4x25ns = 108ns
    299306      X"0003", -- SD_ADDR_cc_R0_HI          -- clock conditioner R0 bits 31...16
    300307      X"8000", -- SD_ADDR_cc_R0_LO          -- clock conditioner R0 bits 15...0
     
    334341  --default values for active FTU lists
    335342  constant sd_block_default_ftu_active_list : sd_block_default_ftu_active_list_type := (
    336     X"0000",
     343    X"0001",
    337344    X"0000",
    338345    X"0000",
  • firmware/FTM/ftu_control/FTM_ftu_control.vhd

    r10328 r10418  
    7474    ftu_active_cr2 : in std_logic_vector (15 downto 0);
    7575    ftu_active_cr3 : in std_logic_vector (15 downto 0);
     76
     77    --error message interface to ethernet control
     78    ftu_error_calls      : out std_logic_vector (15 DOWNTO 0) := (others => '0');
     79    ftu_error_data       : out std_logic_vector ((FTU_RS485_BLOCK_WIDTH - 1) downto 0) := (others => '0');
     80    ftu_error_send       : out std_logic := '0';
     81    ftu_error_send_ack   :  in std_logic;
     82    ftu_error_send_ready :  in std_logic;
    7683   
    7784    -- communication with static (config) RAM
     
    146153  signal FTU_enable_array_sig  : FTU_enable_array_type;  -- initialized in interpreter
    147154  signal FTU_rate_array_sig    : FTU_rate_array_type;  -- initialized in interpreter
     155  signal FTU_overflow_sig      : std_logic_vector(7 downto 0);  -- initialized in interpreter
    148156  signal FTU_prescaling_sig    : std_logic_vector(7 downto 0);  -- initialized in interpreter
    149157  signal FTU_crc_error_cnt_sig : std_logic_vector(7 downto 0);  -- initialized in interpreter
     
    199207  signal enable_crc_from_interpreter_sig : std_logic;
    200208  signal crc_data_from_FSM_sig           : std_logic_vector (FTU_RS485_BLOCK_WIDTH - 9 downto 0) := (others => '0');
     209  signal crc_data_from_FSM_sig_cp        : std_logic_vector (FTU_RS485_BLOCK_WIDTH - 9 downto 0) := (others => '0');
    201210  signal crc_sig                         : std_logic_vector(CRC_POLYNOMIAL'length - 1 downto 0);
    202211  signal crc_sig_inv                     : std_logic_vector(CRC_POLYNOMIAL'length - 1 downto 0);
     
    211220  signal FTU_list_reg_cnt    : integer range 0 to NO_OF_FTU_LIST_REG := 0;
    212221  signal FTU_list_header_cnt : integer range 0 to FTU_LIST_RAM_OFFSET := 0;
    213 
     222  signal DD_RAM_reg_cnt      : integer range 0 to NO_OF_DD_RAM_REG := 0;
     223 
    214224  -- counter to define timeout and number of retries
    215225  signal timeout_cnt : integer range 0 to FTU_RS485_TIMEOUT := 0;
    216226  signal retry_cnt   : integer range 0 to FTU_RS485_NO_OF_RETRY := 0;
     227
     228  --Zwischenrechnungen
     229  signal FTU_cnt_offset_sig   : integer range 0 to (NO_OF_DD_RAM_REG * NO_OF_FTUS_PER_CRATE) := 0;
     230  signal crate_cnt_offset_sig : integer range 0 to (NO_OF_CRATES * NO_OF_FTUS_PER_CRATE * NO_OF_DD_RAM_REG) := 0;
    217231 
    218232  component FTM_ftu_rs485_interface
     
    260274      FTU_enable_array  : OUT FTU_enable_array_type;
    261275      FTU_rate_array    : OUT FTU_rate_array_type;
     276      FTU_overflow      : OUT std_logic_vector(7 downto 0);
    262277      FTU_prescaling    : OUT std_logic_vector(7 downto 0);
    263278      FTU_crc_error_cnt : OUT std_logic_vector(7 downto 0);
     
    285300  type FTM_ftu_rs485_control_StateType is (INIT, IDLE, ACTIVE_LIST, READ_CONFIG, TRANSMIT_CONFIG,
    286301                                           PING, PING_END, FTU_LIST,
     302                                           SEND_ERROR_1, SEND_ERROR_2,
    287303                                           RATES, RATES_1, RATES_2, RATES_3,
     304                                           DD_RAM, DD_RAM_1, DD_RAM_2, DD_RAM_3,
    288305                                           READ_CONFIG_1, READ_CONFIG_2, READ_CONFIG_3,
    289306                                           TRANSMIT_CONFIG_1, TRANSMIT_CONFIG_2, TRANSMIT_CONFIG_3,
     
    291308                                           FTU_LIST_1, FTU_LIST_2, FTU_LIST_3);
    292309  signal FTM_ftu_rs485_control_State : FTM_ftu_rs485_control_StateType;
     310  signal after_error_State : FTM_ftu_rs485_control_StateType;
    293311
    294312begin
    295313 
    296   Inst_FTM_fTU_rs485_interface_0 : FTM_ftu_rs485_interface  -- crate 0
     314  Inst_FTM_ftu_rs485_interface_0 : FTM_ftu_rs485_interface  -- crate 0
    297315    port map(
    298316      clk      => clk_50MHz,
     
    311329    );
    312330
    313   Inst_FTM_fTU_rs485_interface_1 : FTM_ftu_rs485_interface  -- crate 1
     331  Inst_FTM_ftu_rs485_interface_1 : FTM_ftu_rs485_interface  -- crate 1
    314332    port map(
    315333      clk      => clk_50MHz,
     
    328346    );
    329347
    330   Inst_FTM_fTU_rs485_interface_2 : FTM_ftu_rs485_interface  -- crate 2
     348  Inst_FTM_ftu_rs485_interface_2 : FTM_ftu_rs485_interface  -- crate 2
    331349    port map(
    332350      clk      => clk_50MHz,
     
    345363    );
    346364
    347   Inst_FTM_fTU_rs485_interface_3 : FTM_ftu_rs485_interface  -- crate 3
     365  Inst_FTM_ftu_rs485_interface_3 : FTM_ftu_rs485_interface  -- crate 3
    348366    port map(
    349367      clk      => clk_50MHz,
     
    387405      FTU_enable_array  => FTU_enable_array_sig,
    388406      FTU_rate_array    => FTU_rate_array_sig,
     407      FTU_overflow      => FTU_overflow_sig,
    389408      FTU_prescaling    => FTU_prescaling_sig,
    390409      FTU_crc_error_cnt => FTU_crc_error_cnt_sig,
     
    602621        when TRANSMIT_CONFIG_1 =>  -- wait one cycle for CRC calculation
    603622          enable_crc_from_FSM_sig <= '0';
     623          crc_data_from_FSM_sig_cp <= crc_data_from_FSM_sig;
    604624          FTM_ftu_rs485_control_State <= TRANSMIT_CONFIG_2;
    605625         
     
    614634            elsif (frame_cnt = 27) then
    615635              frame_cnt <= frame_cnt + 1;
     636              ftu_error_data <= crc_sig & crc_data_from_FSM_sig_cp;
    616637              tx_data_sig <= crc_sig;
    617638              tx_start_sig <= '1';
     
    633654            retry_cnt <= 0;
    634655            sel_crc_input_source_sig <= '0';
    635             FTM_ftu_rs485_control_State <= TRANSMIT_CONFIG;
     656            if (retry_cnt = 0) then  -- no errors
     657              FTM_ftu_rs485_control_State <= TRANSMIT_CONFIG;
     658            else  -- send error message and move to next command;
     659              ftu_error_calls <= conv_std_logic_vector((retry_cnt + 1), 16);
     660              after_error_State <= TRANSMIT_CONFIG;
     661              FTM_ftu_rs485_control_State <= SEND_ERROR_1;
     662            end if;
    636663          else
    637664            if (timeout_cnt < FTU_RS485_TIMEOUT) then
     
    649676              else
    650677                retry_cnt <= 0;
    651                 FTU_command_cnt <= FTU_command_cnt;  -- move to next command;
    652                 FTM_ftu_rs485_control_State <= TRANSMIT_CONFIG;
     678                FTU_command_cnt <= FTU_command_cnt;  -- send error message and move to next command
     679                ftu_error_calls <= (others => '0');
     680                after_error_State <= TRANSMIT_CONFIG;
     681                FTM_ftu_rs485_control_State <= SEND_ERROR_1;
    653682              end if;
    654683            end if;
    655684          end if;
    656685
     686        when SEND_ERROR_1 =>  -- send an error message
     687          ftu_error_send <= '1';
     688          if (ftu_error_send_ack = '1') then
     689            ftu_error_send <= '0';
     690            FTM_ftu_rs485_control_State <= SEND_ERROR_2;
     691          end if;
     692
     693        when SEND_ERROR_2 =>
     694          if (ftu_error_send_ready = '1') then
     695            FTM_ftu_rs485_control_State <= after_error_state;
     696          end if;
     697         
    657698        when PING =>  -- ping all FTUs
    658699          rec_reset_sig <= '0';
     
    759800            write_FTUlist_RAM <= '1';
    760801            addr_FTUlist_RAM <= conv_std_logic_vector(FTU_LIST_RAM_OFFSET +
    761                                                       (FTU_cnt - 1)* NO_OF_FTU_LIST_REG +
     802                                                      (crate_cnt * NO_OF_FTUS_PER_CRATE * NO_OF_FTU_LIST_REG) +
     803                                                      ((FTU_cnt - 1) * NO_OF_FTU_LIST_REG) +
    762804                                                      (FTU_list_reg_cnt - 1), FTU_LIST_RAM_ADDR_WIDTH);
    763805            if (retry_cnt < FTU_RS485_NO_OF_RETRY) then
     
    871913        when RATES_1 =>  -- wait one cycle for CRC calculation
    872914          enable_crc_from_FSM_sig <= '0';
     915          crc_data_from_FSM_sig_cp <= crc_data_from_FSM_sig;
    873916          FTM_ftu_rs485_control_State <= RATES_2;
    874917
     
    883926            elsif (frame_cnt = 27) then
    884927              frame_cnt <= frame_cnt + 1;
     928              ftu_error_data <= crc_sig & crc_data_from_FSM_sig_cp;
    885929              tx_data_sig <= crc_sig;
    886930              tx_start_sig <= '1';
     
    901945            timeout_cnt <= 0;
    902946            sel_crc_input_source_sig <= '0';
    903             FTM_ftu_rs485_control_State <= RATES;
     947            --FTM_ftu_rs485_control_State <= RATES;
     948            if (retry_cnt = 0) then  -- no errors
     949              FTM_ftu_rs485_control_State <= DD_RAM;
     950            else  -- send error message and move to next command;
     951              ftu_error_calls <= conv_std_logic_vector((retry_cnt + 1), 16);
     952              after_error_State <= DD_RAM;
     953              FTM_ftu_rs485_control_State <= SEND_ERROR_1;
     954            end if;
    904955          else
    905956            if (timeout_cnt < FTU_RS485_TIMEOUT) then
     
    916967                FTM_ftu_rs485_control_State <= RATES;
    917968              else
    918                 retry_cnt <= 0;
     969                --retry_cnt <= 0;
    919970                FTU_cnt <= FTU_cnt;  -- move on
    920                 FTM_ftu_rs485_control_State <= RATES;
     971                ftu_error_calls <= (others => '0');
     972                after_error_State <= DD_RAM;
     973                FTM_ftu_rs485_control_State <= SEND_ERROR_1;
    921974              end if;
    922975            end if;
     976          end if;
     977
     978        when DD_RAM =>  -- write rates of actual FTU to DD RAM
     979          rec_reset_sig <= '0';
     980          if (DD_RAM_reg_cnt < NO_OF_DD_RAM_REG) then
     981            DD_RAM_reg_cnt <= DD_RAM_reg_cnt + 1;
     982            FTU_cnt_offset_sig <= ((FTU_cnt - 1) * NO_OF_DD_RAM_REG);
     983            crate_cnt_offset_sig <= (crate_cnt * NO_OF_FTUS_PER_CRATE * NO_OF_DD_RAM_REG);
     984            FTM_ftu_rs485_control_State <= DD_RAM_1;
     985          else
     986            DD_RAM_reg_cnt <= 0;
     987            retry_cnt <= 0;
     988            FTM_ftu_rs485_control_State <= RATES;
     989          end if;
     990
     991        when DD_RAM_1 =>
     992          if (dynamic_RAM_busy = '0') then
     993            write_dynamic_RAM <= '1';
     994            addr_dynamic_RAM <= conv_std_logic_vector(DD_BLOCK_SIZE_GENERAL +
     995                                                      crate_cnt_offset_sig +
     996                                                      --(crate_cnt * NO_OF_FTUS_PER_CRATE * NO_OF_DD_RAM_REG) +
     997                                                      --((FTU_cnt - 1) * NO_OF_DD_RAM_REG) +
     998                                                      FTU_cnt_offset_sig +
     999                                                      (DD_RAM_reg_cnt - 1), DYNAMIC_RAM_ADDR_WIDTH);
     1000            if ( (retry_cnt < FTU_RS485_NO_OF_RETRY)
     1001                 and (FTU_cnt_offset_sig < (NO_OF_FTUS_PER_CRATE * NO_OF_DD_RAM_REG))
     1002                 and (crate_cnt_offset_sig < (NO_OF_CRATES * NO_OF_FTUS_PER_CRATE * NO_OF_DD_RAM_REG)) ) then
     1003              if ((DD_RAM_reg_cnt - 1) = 0) then
     1004                data_dynamic_RAM <= FTU_rate_array_sig(0)(31 downto 16);
     1005              elsif ((DD_RAM_reg_cnt - 1) = 1) then
     1006                data_dynamic_RAM <= FTU_rate_array_sig(0)(15 downto 0);
     1007              elsif ((DD_RAM_reg_cnt - 1) = 2) then
     1008                data_dynamic_RAM <= FTU_rate_array_sig(1)(31 downto 16);
     1009              elsif ((DD_RAM_reg_cnt - 1) = 3) then
     1010                data_dynamic_RAM <= FTU_rate_array_sig(1)(15 downto 0);
     1011              elsif ((DD_RAM_reg_cnt - 1) = 4) then
     1012                data_dynamic_RAM <= FTU_rate_array_sig(2)(31 downto 16);
     1013              elsif ((DD_RAM_reg_cnt - 1) = 5) then
     1014                data_dynamic_RAM <= FTU_rate_array_sig(2)(15 downto 0);
     1015              elsif ((DD_RAM_reg_cnt - 1) = 6) then
     1016                data_dynamic_RAM <= FTU_rate_array_sig(3)(31 downto 16);
     1017              elsif ((DD_RAM_reg_cnt - 1) = 7) then
     1018                data_dynamic_RAM <= FTU_rate_array_sig(3)(15 downto 0);
     1019              elsif ((DD_RAM_reg_cnt - 1) = 8) then
     1020                data_dynamic_RAM <= FTU_rate_array_sig(4)(31 downto 16);
     1021              elsif ((DD_RAM_reg_cnt - 1) = 9) then
     1022                data_dynamic_RAM <= FTU_rate_array_sig(4)(15 downto 0);
     1023              elsif ((DD_RAM_reg_cnt - 1) = 10) then
     1024                data_dynamic_RAM <= "00000000" & FTU_overflow_sig;
     1025              elsif ((DD_RAM_reg_cnt - 1) = 11) then
     1026                data_dynamic_RAM <= "00000000" & FTU_crc_error_cnt_sig;
     1027--              elsif ((DD_RAM_reg_cnt - 1) = 10) then
     1028--                data_dynamic_RAM <= "0000" & conv_std_logic_vector(DD_BLOCK_SIZE_GENERAL +
     1029--                                                                   --((FTU_cnt - 1) * NO_OF_DD_RAM_REG) +
     1030--                                                                   FTU_cnt_offset_sig +
     1031--                                                                   (DD_RAM_reg_cnt - 1), DYNAMIC_RAM_ADDR_WIDTH);
     1032--              elsif ((DD_RAM_reg_cnt - 1) = 11) then
     1033--                --data_dynamic_RAM <= "0000" & conv_std_logic_vector(FTU_cnt_offset_sig, DYNAMIC_RAM_ADDR_WIDTH);
     1034--                data_dynamic_RAM <= "0000" & conv_std_logic_vector(DD_BLOCK_SIZE_GENERAL +
     1035--                                                                   --((FTU_cnt - 1) * NO_OF_DD_RAM_REG) +
     1036--                                                                   FTU_cnt_offset_sig +
     1037--                                                                   (DD_RAM_reg_cnt - 1), DYNAMIC_RAM_ADDR_WIDTH);
     1038              end if;
     1039            else
     1040              data_dynamic_RAM <= (others => '0');
     1041            end if;
     1042            FTM_ftu_rs485_control_State <= DD_RAM_2;
     1043          end if;
     1044           
     1045        when DD_RAM_2 =>
     1046          if (dynamic_RAM_started = '1') then
     1047            write_dynamic_RAM <= '0';
     1048            FTM_ftu_rs485_control_State <= DD_RAM_3;
     1049          end if;
     1050
     1051        when DD_RAM_3 =>
     1052          if (dynamic_RAM_ready = '1') then
     1053            FTM_ftu_rs485_control_State <= DD_RAM;
    9231054          end if;
    9241055         
  • firmware/FTM/ftu_control/FTM_ftu_rs485_interpreter.vhd

    r10232 r10418  
    4747    FTU_enable_array  : OUT FTU_enable_array_type := ((others => '0'), (others => '0'), (others => '0'), (others => '0'));
    4848    FTU_rate_array    : OUT FTU_rate_array_type := ((others => '0'), (others => '0'), (others => '0'), (others => '0'), (others => '0'));
     49    FTU_overflow      : OUT std_logic_vector(7 downto 0) := (others => '0');
    4950    FTU_prescaling    : OUT std_logic_vector(7 downto 0) := (others => '0');
    5051    FTU_crc_error_cnt : OUT std_logic_vector(7 downto 0) := (others => '0');
     
    144145                               data_block(199 downto 168)                               
    145146                               );
     147            FTU_overflow <= data_block(207 downto 200);
    146148            FTU_crc_error_cnt <= data_block(215 downto 208);
    147149            FTM_ftu_rs485_interpreter_State <= WAIT_FOR_DATA;
     
    165167          elsif (data_block(39 downto 32) = "00000111") then -- read counter mode
    166168            FTU_prescaling <= data_block(47 downto 40);
     169            FTU_overflow <= data_block(55 downto 48);
    167170            FTM_ftu_rs485_interpreter_State <= WAIT_FOR_DATA;
    168171          elsif (data_block(39 downto 32) = "00000101") then -- ping pong
  • firmware/FTM/trigger/kernel/trigger_generator/trigger_generator.vhd

    r10366 r10418  
    1313-- 14/03/2011 JGi                           110314a     Description
    1414-- 13/04/2011 JGi                           110413a     Update trigger enable management
     15-- 15/04/2011 JGi                           110415a     Update LP1 "N-out-of-40" logic detection
     16--                                                                                                                                                                      in order to allow user to reset it by
     17--                                                                                                                                                                      disabling LP1 pulse as trigger source if the
     18--                                                                                                                                                                      N is never reached and system is locked
    1519--=======================================================================================
    1620-- Library Definition
     
    332336                general_settings(4) = '1' then
    333337                        v_reg.wait_for_calib    := '1';
    334                 elsif i_reg.enable_trigger      = '0' then
     338                -- If trigger is processed or disabled by user, reset detection logic to avoid
     339                -- remaining in locked state
     340                elsif i_reg.enable_trigger      = '0' or general_settings(4) = '0' then
    335341                        v_reg.wait_for_calib    := '0';
    336342                end if;
Note: See TracChangeset for help on using the changeset viewer.