From: Manuel Penschuck Date: Mon, 3 Nov 2014 09:00:24 +0000 (+0100) Subject: CBMNet: Misc. Clean-Up X-Git-Url: https://jspc29.x-matter.uni-frankfurt.de/git/?a=commitdiff_plain;h=b76aae95b45cfc71f390b72b6c77ea05d918c83d;p=trb3.git CBMNet: Misc. Clean-Up --- diff --git a/cbmnet/code/cbmnet_bridge.lpf b/cbmnet/code/cbmnet_bridge.lpf index f52cf10..baa289b 100644 --- a/cbmnet/code/cbmnet_bridge.lpf +++ b/cbmnet/code/cbmnet_bridge.lpf @@ -23,7 +23,7 @@ DEFINE BUS cbmnet_bridge_tx_data PRIORITIZE BUS "cbmnet_bridge_rx_data" 100 ; PRIORITIZE BUS "cbmnet_bridge_tx_data" 100 ; -MULTICYCLE TO CELL "THE_CBM_BRIDGE/THE_CBM_PHY/THE_RX_GEAR/THE_DELAY_SYNC/sync_q[*]" 2 X; +MULTICYCLE TO CELL "THE_CBM_BRIDGE/THE_CBM_PHY/THE_RX_GEAR/THE_DELAY_SYNC/sync_q[2]" 2 X; UGROUP "CBMNET_PHY_GROUP" BBOX 24 30 # BLKNAME THE_CBM_BRIDGE/THE_CBM_PHY/THE_RX_GEAR diff --git a/cbmnet/code/cbmnet_sync_module.vhd b/cbmnet/code/cbmnet_sync_module.vhd index 1ad56fd..969037f 100644 --- a/cbmnet/code/cbmnet_sync_module.vhd +++ b/cbmnet/code/cbmnet_sync_module.vhd @@ -71,7 +71,6 @@ architecture cbmnet_sync_module_arch of cbmnet_sync_module is 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; @@ -130,7 +129,7 @@ architecture cbmnet_sync_module_arch of cbmnet_sync_module is 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); @@ -172,7 +171,7 @@ begin 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; @@ -181,17 +180,17 @@ begin -- 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; @@ -254,13 +253,13 @@ begin 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; @@ -287,6 +286,8 @@ begin 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'; @@ -310,24 +311,24 @@ begin 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 => @@ -400,7 +401,7 @@ begin 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; @@ -458,25 +459,25 @@ begin 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; @@ -547,4 +548,7 @@ begin 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 diff --git a/cbmnet/code/strech_sync.vhd b/cbmnet/code/strech_sync.vhd new file mode 100644 index 0000000..8ed45d2 --- /dev/null +++ b/cbmnet/code/strech_sync.vhd @@ -0,0 +1,22 @@ +entity POS_EDGE_STRECH_SYNC is + generic ( + LENGTH : positive := 2 + ); + port ( + IN_CLK_IN : std_logic; + DATA_IN : std_logic; + OUT_CLK_IN : std_logic; + DATA_OUT : std_logic + ) +end entity; + +architecture RTL of STRECH_SYNC is + signal in_buffer_i : std_logic_vector(LENGTH - 1 downto 0); + signal in_buffer_aggr_i : std_logic; + signal out_buffer_i : std_logic; +begin + in_buffer_i <= in_buffer_i(LENGTH-2 downto 0) & DATA_IN when rising_edge(OUT_CLK_IN); + in_buffer_aggr_i <= OR_ALL(in_buffer_i); + + out_buffer_i <= not out_buffer_i and in_buffer_aggr_i when rising_edge(OUT_CLK_IN); +end architecture; \ No newline at end of file diff --git a/cbmnet/code/trbnet_rdo_pattern_generator.vhd b/cbmnet/code/trbnet_rdo_pattern_generator.vhd index 0d66f50..f28139d 100644 --- a/cbmnet/code/trbnet_rdo_pattern_generator.vhd +++ b/cbmnet/code/trbnet_rdo_pattern_generator.vhd @@ -85,11 +85,11 @@ begin 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; @@ -99,10 +99,10 @@ begin 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'; @@ -209,7 +209,7 @@ begin 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; diff --git a/cbmnet/compile_periph_frankfurt.pl b/cbmnet/compile_periph_frankfurt.pl index 7cb13d4..4dbd051 100755 --- a/cbmnet/compile_periph_frankfurt.pl +++ b/cbmnet/compile_periph_frankfurt.pl @@ -109,7 +109,7 @@ execute($c); my $tpmap = $TOPNAME . "_map" ; -$c=qq|$lattice_path/ispfpga/bin/lin/map -hier -retime -split_node -a $FAMILYNAME -p $DEVICENAME -t $PACKAGE -s $SPEEDGRADE "$TOPNAME.ngd" -o "$tpmap.ncd" -mp "$TOPNAME.mrp" "$TOPNAME.lpf"|; +$c=qq|$lattice_path/ispfpga/bin/lin/map -xref_sig -xref_sym -hier -retime -split_node -a $FAMILYNAME -p $DEVICENAME -t $PACKAGE -s $SPEEDGRADE "$TOPNAME.ngd" -o "$tpmap.ncd" -mp "$TOPNAME.mrp" "$TOPNAME.lpf"|; execute($c); @@ -123,10 +123,10 @@ $c=qq|$lattice_path/ispfpga/bin/lin/iotiming -s "$TOPNAME.ncd" "$TOPNAME.prf"|; execute($c); # TWR Timing Report -$c=qq|$lattice_path/ispfpga/bin/lin/trce -p -c -v 15 -o "$TOPNAME.twr.setup" "$TOPNAME.ncd" "$TOPNAME.prf"|; +$c=qq|$lattice_path/ispfpga/bin/lin/trce -fullname -p -c -v 15 -o "$TOPNAME.twr.setup" "$TOPNAME.ncd" "$TOPNAME.prf"|; execute($c); -$c=qq|$lattice_path/ispfpga/bin/lin/trce -p -hld -c -v 5 -o "$TOPNAME.twr.hold" "$TOPNAME.ncd" "$TOPNAME.prf"|; +$c=qq|$lattice_path/ispfpga/bin/lin/trce -fullname -p -hld -c -v 5 -o "$TOPNAME.twr.hold" "$TOPNAME.ncd" "$TOPNAME.prf"|; execute($c); $c=qq|$lattice_path/ispfpga/bin/lin/ltxt2ptxt $TOPNAME.ncd|;