signal cbm_next_epoch_i : std_logic_vector(31 downto 0);
signal cbm_next_epoch_updated_i : std_logic;
-
signal cbm_from_trb_next_epoch_i : std_logic_vector(31 downto 0);
signal cbm_from_trb_next_epoch_updated_i : std_logic;
signal trb_rdo_fsm_i : TRB_RDO_FSM_T;
signal trb_rdo_fsm_state_i : std_logic_vector(3 downto 0);
- signal trb_rdo_counter_i : integer range 0 to 15;
+ signal trb_rdo_counter_i : integer range 0 to trb_rdo_buffer_i'high;
signal trb_rdo_finished_i : std_logic;
type CBM_TRB_RDO_FSM_T is (IDLE, WAIT_FOR_RELEASE, WAIT_BEFORE_IDLE);
if TRB_TRIGGER_IN = '1' or TRB_RDO_VALID_NO_TIMING_IN = '1' then
-- store data
header_v(31 downto 28) := "0001"; -- version
- header_v(23 downto 8) := trb_pulser_threshold_i(15 downto 0);
+ header_v(23 downto 8) := std_logic_vector(trb_pulser_threshold_i(15 downto 0));
header_v( 7 downto 4) := CBM_PHY_BARREL_SHIFTER_POS_IN;
header_v( 3 downto 0) := trb_from_cbm_current_epoch_updated_i & "0" & trb_epoch_update_scheme_i;
-- signals commented out are registered in the cbm clock domain in the next process
trb_rdo_buffer_i( 0) <= header_v;
- trb_rdo_buffer_i( 1) <= trb_timestamp_i;
- -- trb_rdo_buffer_i( 2) <= cbm_timestamp_i;
- trb_rdo_buffer_i( 3) <= trb_timestamp_last_pulse_i;
- -- trb_rdo_buffer_i( 4) <= cbm_timestamp_last_pulse_i;
- -- trb_rdo_buffer_i( 5) <= cbm_current_epoch_i;
- -- trb_rdo_buffer_i( 6) <= cbm_timestamp_last_dlm_i;
- trb_rdo_buffer_i( 7) <= trb_timestamp_last_dlm_i;
- -- trb_rdo_buffer_i( 8) <= cbm_dlm_counter_i;
- -- trb_rdo_buffer_i( 9) <= cbm_pulse_counter_i;
- trb_rdo_buffer_i(10)(31 downto 16) <= trb_reset_counter_i;
- -- trb_rdo_buffer_i(10)(15 downto 0) <= cbm_reset_counter_i;
+ trb_rdo_buffer_i( 1) <= std_logic_vector(trb_timestamp_i);
+ -- trb_rdo_buffer_i( 2) <= std_logic_vector(cbm_timestamp_i);
+ trb_rdo_buffer_i( 3) <= std_logic_vector(trb_timestamp_last_pulse_i);
+ -- trb_rdo_buffer_i( 4) <= std_logic_vector(cbm_timestamp_last_pulse_i);
+ -- trb_rdo_buffer_i( 5) <= std_logic_vector(cbm_current_epoch_i);
+ -- trb_rdo_buffer_i( 6) <= std_logic_vector(cbm_timestamp_last_dlm_i);
+ trb_rdo_buffer_i( 7) <= std_logic_vector(trb_timestamp_last_dlm_i);
+ -- trb_rdo_buffer_i( 8) <= std_logic_vector(cbm_dlm_counter_i);
+ -- trb_rdo_buffer_i( 9) <= std_logic_vector(cbm_pulse_counter_i);
+ trb_rdo_buffer_i(10)(31 downto 16) <= std_logic_vector(trb_reset_counter_i);
+ -- trb_rdo_buffer_i(10)(15 downto 0) <= cbm_reset_counter_i);
trb_rdo_fsm_i <= WAIT_FOR_VALID;
end if;
end if;
if cbm_from_trb_trigger_in = '1' or cbm_from_trb_rdo_valid_no_timing_in = '1' then
- trb_rdo_buffer_i( 2) <= cbm_timestamp_i;
- trb_rdo_buffer_i( 4) <= cbm_timestamp_last_pulse_i;
- trb_rdo_buffer_i( 5) <= cbm_current_epoch_i;
- trb_rdo_buffer_i( 6) <= cbm_timestamp_last_dlm_i;
- trb_rdo_buffer_i( 8) <= cbm_dlm_counter_i;
- trb_rdo_buffer_i( 9) <= cbm_pulse_counter_i;
- trb_rdo_buffer_i(10)(15 downto 0) <= cbm_reset_counter_i;
+ trb_rdo_buffer_i( 2) <= std_logic_vector(cbm_timestamp_i);
+ trb_rdo_buffer_i( 4) <= std_logic_vector(cbm_timestamp_last_pulse_i);
+ trb_rdo_buffer_i( 5) <= std_logic_vector(cbm_current_epoch_i);
+ trb_rdo_buffer_i( 6) <= std_logic_vector(cbm_timestamp_last_dlm_i);
+ trb_rdo_buffer_i( 8) <= std_logic_vector(cbm_dlm_counter_i);
+ trb_rdo_buffer_i( 9) <= std_logic_vector(cbm_pulse_counter_i);
+ trb_rdo_buffer_i(10)(15 downto 0) <= std_logic_vector(cbm_reset_counter_i);
cbm_trb_rdo_fsm_i <= WAIT_FOR_RELEASE;
end if;
TRB_REGIO_OUT.wack <= TRB_REGIO_IN.write;
TRB_REGIO_OUT.unknown <= '0';
TRB_REGIO_OUT.data <= (others => '0');
+ TRB_REGIO_OUT.nack <= '0';
+ TRB_REGIO_OUT.ack <= '0';
if trb_from_cbm_dlm_sensed_i = '1' then
trb_next_epoch_updated_i <= '0';
TRB_REGIO_OUT.data( 3 downto 0) <= "00" & trb_epoch_update_scheme_i;
when 1 =>
- TRB_REGIO_OUT.data <= trb_pulser_threshold_i;
+ TRB_REGIO_OUT.data <= std_logic_vector(trb_pulser_threshold_i);
when 2 =>
TRB_REGIO_OUT.data <= trb_next_epoch_i;
when trb_sync_lowest_address_c =>
TRB_REGIO_OUT.data <= trb_from_cbm_current_epoch_i;
- trb_sync_buffer_i(trb_sync_lowest_address_c+1) <= trb_from_cbm_timestamp_i;
- trb_sync_buffer_i(trb_sync_lowest_address_c+2) <= trb_from_cbm_timestamp_last_dlm_i;
- trb_sync_buffer_i(trb_sync_lowest_address_c+3) <= trb_from_cbm_timestamp_last_pulse_i;
- trb_sync_buffer_i(trb_sync_lowest_address_c+4) <= trb_timestamp_i;
- trb_sync_buffer_i(trb_sync_lowest_address_c+5) <= trb_timestamp_last_dlm_i;
- trb_sync_buffer_i(trb_sync_lowest_address_c+6) <= trb_timestamp_last_pulse_i;
- trb_sync_buffer_i(trb_sync_lowest_address_c+7) <= trb_from_cbm_dlm_counter_i;
- trb_sync_buffer_i(trb_sync_lowest_address_c+8) <= trb_from_cbm_pulse_counter_i;
+ trb_sync_buffer_i(trb_sync_lowest_address_c+1) <= std_logic_vector(trb_from_cbm_timestamp_i);
+ trb_sync_buffer_i(trb_sync_lowest_address_c+2) <= std_logic_vector(trb_from_cbm_timestamp_last_dlm_i);
+ trb_sync_buffer_i(trb_sync_lowest_address_c+3) <= std_logic_vector(trb_from_cbm_timestamp_last_pulse_i);
+ trb_sync_buffer_i(trb_sync_lowest_address_c+4) <= std_logic_vector(trb_timestamp_i);
+ trb_sync_buffer_i(trb_sync_lowest_address_c+5) <= std_logic_vector(trb_timestamp_last_dlm_i);
+ trb_sync_buffer_i(trb_sync_lowest_address_c+6) <= std_logic_vector(trb_timestamp_last_pulse_i);
+ trb_sync_buffer_i(trb_sync_lowest_address_c+7) <= std_logic_vector(trb_from_cbm_dlm_counter_i);
+ trb_sync_buffer_i(trb_sync_lowest_address_c+8) <= std_logic_vector(trb_from_cbm_pulse_counter_i);
trb_sync_buffer_i(trb_sync_lowest_address_c+9) <= STD_LOGIC_VECTOR(trb_reset_counter_i) & STD_LOGIC_VECTOR(trb_from_cbm_reset_counter_i);
- when trb_sync_lowest_address_c + 1 to trb_sync_lowest_address_c + trb_sync_buffer_i'high =>
+ when trb_sync_lowest_address_c + 1 to trb_sync_lowest_address_c =>
TRB_REGIO_OUT.data <= trb_sync_buffer_i(trb_regio_addr_i);
when others =>
cbm_dlm_sensed_i <= sensed_v;
if CBM_RESET_IN='1' then
- cbm_dlm_counter_i <= 0;
+ cbm_dlm_counter_i <= (others=>'0');
elsif sensed_v='1' then
cbm_dlm_counter_i <= cbm_dlm_counter_i + 1;
end if;
begin
wait until rising_edge(CBM_CLK_IN);
- cbm_from_trb_pulser_threshold_i <= trb_pulser_threshold_i;
+ cbm_from_trb_pulser_threshold_i <= unsigned(trb_pulser_threshold_i);
cbm_pulse_i <= '0';
if CBM_RESET_IN='1' then
- cbm_pulse_counter_i <= 0;
+ cbm_pulse_counter_i <= (others=>'0');
end if;
if CBM_RESET_IN='1' or cbm_from_trb_pulser_threshold_i=x"00000000" then
- cbm_pulser_period_counter_i <= 0;
+ cbm_pulser_period_counter_i <= (others=>'0');
elsif cbm_pulser_period_counter_i = cbm_from_trb_pulser_threshold_i then
- cbm_pulser_period_counter_i <= 0;
+ cbm_pulser_period_counter_i <= (others=>'0');
cbm_pulse_counter_i <= cbm_pulse_counter_i + 1;
cbm_timestamp_last_pulse_i <= cbm_timestamp_i;
cbm_pulse_i <= '1';
elsif cbm_pulser_period_counter_i > cbm_from_trb_pulser_threshold_i then
- cbm_pulser_period_counter_i <= 0;
+ cbm_pulser_period_counter_i <= (others=>'0');
else
cbm_pulser_period_counter_i <= cbm_pulser_period_counter_i + 1;
cbm_from_trb_rdo_finished_i <= trb_rdo_finished_i when rising_edge(CBM_CLK_IN);
cbm_from_trb_reset_in <= TRB_RESET_IN when rising_edge(CBM_CLK_IN);
+-- DEBUG
+ DEBUG_OUT <= (others => '0');
+
end architecture;
\ No newline at end of file
when 0 =>
REGIO_DATA_OUT(0) <= send_enabled_i;
- when 1 => REGIO_DATA_OUT(15 downto 0) <= send_length_min_i;
- when 2 => REGIO_DATA_OUT(15 downto 0) <= send_length_max_i;
- when 3 => REGIO_DATA_OUT(15 downto 0) <= send_length_step_i;
- when 4 => REGIO_DATA_OUT <= event_id;
- when 5 => REGIO_DATA_OUT <= event_gap_i;
+ when 1 => REGIO_DATA_OUT(15 downto 0) <= std_logic_vector(send_length_min_i);
+ when 2 => REGIO_DATA_OUT(15 downto 0) <= std_logic_vector(send_length_max_i);
+ when 3 => REGIO_DATA_OUT(15 downto 0) <= std_logic_vector(send_length_step_i);
+ when 4 => REGIO_DATA_OUT <= std_logic_vector(event_id);
+ when 5 => REGIO_DATA_OUT <= std_logic_vector(event_gap_i);
when others =>
REGIO_UNKNOWN_ADDR_OUT <= REGIO_WRITE_ENABLE_IN or REGIO_READ_ENABLE_IN;
if REGIO_WRITE_ENABLE_IN = '1' then
case address is
when 0 => send_enabled_i <= REGIO_DATA_IN(0);
- when 1 => send_length_min_i <= REGIO_DATA_IN(15 downto 0);
- when 2 => send_length_max_i <= REGIO_DATA_IN(15 downto 0);
- when 3 => send_length_step_i <= REGIO_DATA_IN(15 downto 0);
- when 5 => event_gap_i <= REGIO_DATA_IN;
+ when 1 => send_length_min_i <= unsigned(REGIO_DATA_IN(15 downto 0));
+ when 2 => send_length_max_i <= unsigned(REGIO_DATA_IN(15 downto 0));
+ when 3 => send_length_step_i <= unsigned(REGIO_DATA_IN(15 downto 0));
+ when 5 => event_gap_i <= unsigned(REGIO_DATA_IN);
when others =>
REGIO_WRITE_ACK_OUT <= '0';
trb_fsm_i <= SEND_PAYLOAD_RT_L;
when SEND_PAYLOAD_RT_L =>
- HUB_FEE_DATA_OUT <= x"c0de";
+ HUB_FEE_DATA_OUT <= x"affe";
HUB_FEE_DATAREADY_OUT <= '1';
trb_fsm_i <= SEND_PAYLOAD_H;
send_counter_i <= send_counter_i - 1;