diff --git a/common/addr_table/mprocessor.xml b/common/addr_table/mprocessor.xml index 9a988f46d8112a295d7d6f728a376d50f4327c0f..5d54a3c01ebe1974ff5a98bf57c189d373577ebb 100644 --- a/common/addr_table/mprocessor.xml +++ b/common/addr_table/mprocessor.xml @@ -10,14 +10,18 @@ <node id="header_user_bits" address="0x1"/> </node> - <node id="csr" address="0x30" description="MProcessor control and status" fwinfo="endpoint;width=3"> + <node id="csr" address="0x30" description="MProcessor control and status" fwinfo="endpoint;width=4"> <node id="header_start_select" address="0x0" mask="0x7"/> <node id="occupancy_windowL" address="0x1"/> <node id="occupancy_windowH" address="0x2" mask="0x000f"/> - <node id="lff" address="0x4" mask="0x0001"/> - <node id="super_id" address="0x5"/> - <node id="occupancy_max_value" address="0x6"/> + <node id="localx_windowL" address="0x3"/> + <node id="localx_windowH" address="0x4" mask="0x000f"/> + <node id="lff" address="0x8" mask="0x0001"/> + <node id="super_id" address="0x9"/> + <node id="occupancy_max_value" address="0xa"/> + <node id="localx_max_value" address="0xb"/> </node> <node id="occupancy_mem" address="0x400" size="0x100" mode="incremental" fwinfo="endpoint;width=8"/> + <node id="tracking_localx_mem" address="0x1000" size="0x1000" mode="incremental" fwinfo="endpoint;width=12"/> </node> diff --git a/common/firmware/hdl/LinkAggregatorIPBus.vhd b/common/firmware/hdl/LinkAggregatorIPBus.vhd index 4ff1f48d6dbd798a4aa445cfc2adc8ceba15ba5e..1445c4ea0503078eab0f167151cb3fa3c9cd2ed0 100644 --- a/common/firmware/hdl/LinkAggregatorIPBus.vhd +++ b/common/firmware/hdl/LinkAggregatorIPBus.vhd @@ -24,6 +24,7 @@ entity LinkAggregatorIPBus is links_out : out ldata(7 downto 0) := (others => LWORD_NULL); uncompressed_stubs : out ldata(N_LINKS * 8 - 1 downto 0) := (others => LWORD_NULL); readout_reset : out std_logic := '0'; + tracking_stubs : out ldata(5 downto 0) := (others => LWORD_NULL); --- IPBus Ports --- ipb_clk : in std_logic; ipb_rst : in std_logic; @@ -222,7 +223,8 @@ begin -- status_bits => link_aggregator_status_registers(3)(15 downto 0), non_empty_counts => mprocessor_monitoring_registers, bx_valid_count_out => bx_valid_count, - debug_tracking_event_count => tracking_event_count + debug_tracking_event_count => tracking_event_count, + debug_tracking_stubs_out => tracking_stubs ); rate_monitoring_registers(0) <= bx_valid_count(0); diff --git a/common/firmware/hdl/MProcessor.vhd b/common/firmware/hdl/MProcessor.vhd index d8a4465b88679e5360010cb7e0c050db9409db70..6e1be92d635b5cf962a1131deab8f07581c0b2d0 100644 --- a/common/firmware/hdl/MProcessor.vhd +++ b/common/firmware/hdl/MProcessor.vhd @@ -50,8 +50,8 @@ architecture Behavorial of MProcessor is signal aggregated_stubs : ldata(7 downto 0) := (others => LWORD_NULL); signal link_aggregator_input : ldata(N_LINKS - 1 downto 0) := (others => LWORD_NULL); - signal status_registers : ipb_reg_v(3 - 1 downto 0) := (others => (others => '0')); - signal control_registers : ipb_reg_v(3 - 1 downto 0) := (others => (others => '0')); + signal status_registers : ipb_reg_v(4 - 1 downto 0) := (others => (others => '0')); + signal control_registers : ipb_reg_v(5 - 1 downto 0) := (others => (others => '0')); signal super_id : std_logic_vector(31 downto 0) := (others => '0'); @@ -62,7 +62,11 @@ architecture Behavorial of MProcessor is signal occupancy_histogram_reset : std_logic := '0'; signal debug_packet_size : lword := LWORD_NULL; - + signal tracking_stubs : ldata(5 downto 0) := (others => LWORD_NULL); + signal localx_trigger_window_lower : std_logic_vector(31 downto 0) := (others => '0'); + signal localx_trigger_window_upper : std_logic_vector(3 downto 0) := (others => '0'); + signal localx_trigger_window : std_logic_vector(36 - 1 downto 0) := X"0ffffffff"; + signal localx_max_value : std_logic_vector(32 - 1 downto 0) := (others => '0'); begin @@ -90,8 +94,8 @@ begin MProcessorControlInstance: entity work.ipbus_ctrlreg_v --==============================-- generic map( - N_CTRL => 3, - N_STAT => 3 + N_CTRL => 5, + N_STAT => 4 ) port map( clk => ipb_clk, @@ -111,17 +115,18 @@ begin ) port map ( --- Input Ports --- - clk_p => clk_p, - packet_start => packet_start, - links_in => link_aggregator_input, + clk_p => clk_p, + packet_start => packet_start, + links_in => link_aggregator_input, --- Output Ports --- - links_out => aggregated_stubs, - readout_reset => readout_reset, + links_out => aggregated_stubs, + readout_reset => readout_reset, + tracking_stubs => tracking_stubs, --- IPBus Ports --- - ipb_clk => ipb_clk, - ipb_rst => ipb_rst, - ipb_in => ipb_to_slaves(N_SLV_LINK_AGGREGATOR), - ipb_out => ipb_from_slaves(N_SLV_LINK_AGGREGATOR) + ipb_clk => ipb_clk, + ipb_rst => ipb_rst, + ipb_in => ipb_to_slaves(N_SLV_LINK_AGGREGATOR), + ipb_out => ipb_from_slaves(N_SLV_LINK_AGGREGATOR) ); --==============================-- @@ -160,6 +165,24 @@ begin -- stubs_in => aggregated_stubs(0) -- ); + --==============================-- + TrackFinderInstance : entity work.TrackFinder + --==============================-- + port map ( + -- Input Ports -- + clk_p => clk_p, + stubs_in => tracking_stubs, + header_start => packet_start, + localx_trigger_window => localx_trigger_window, + --- Output Ports --- + localx_max_value => localx_max_value, + --- IPBus Ports --- + clk => ipb_clk, + rst => ipb_rst, + ipb_in => ipb_to_slaves(N_SLV_TRACKING_LOCALX_MEM), + ipb_out => ipb_from_slaves(N_SLV_TRACKING_LOCALX_MEM) + ); + link_aggregator_input(N_LINKS - 1 downto 0) <= links_in; status_registers(0)(0) <= gbe_backpressure; @@ -204,8 +227,12 @@ begin occupancy_trigger_window_lower <= control_registers(1); occupancy_trigger_window_upper <= control_registers(2)(3 downto 0); occupancy_trigger_window <= occupancy_trigger_window_upper & occupancy_trigger_window_lower; + localx_trigger_window_lower <= control_registers(3); + localx_trigger_window_upper <= control_registers(4)(3 downto 0); + localx_trigger_window <= localx_trigger_window_upper & localx_trigger_window_lower; status_registers(2)(32 - 1 downto 0) <= occupancy_max_value; + status_registers(3)(32 - 1 downto 0) <= localx_max_value; end Behavorial; diff --git a/common/firmware/hdl/TrackFinder.vhd b/common/firmware/hdl/TrackFinder.vhd index 32e63137329eaf47e736412888f50fff99a4c184..374ad69f604220009b2ecef84e39dfa4c7d811ee 100644 --- a/common/firmware/hdl/TrackFinder.vhd +++ b/common/firmware/hdl/TrackFinder.vhd @@ -31,7 +31,14 @@ entity TrackFinder is port ( clk_p : in STD_LOGIC; stubs_in : in ldata(5 downto 0) := (others => LWORD_NULL); - header_start : in std_logic + header_start : in std_logic; + localx_trigger_window : std_logic_vector(36 - 1 downto 0) := X"0ffffffff"; + localx_max_value : std_logic_vector(32 - 1 downto 0) := (others => '0') + --- IPBus Ports --- + ipb_clk : in std_logic; + ipb_rst : in std_logic; + ipb_in : in ipb_wbus; + ipb_out : out ipb_rbus; ); end TrackFinder; @@ -41,6 +48,9 @@ architecture Behavioral of TrackFinder is signal valid_event_array : std_logic_vector(5 downto 0); signal valid_event : std_logic := '0'; + signal histogram_input : lword := LWORD_NULL; + signal localx_histogram_reset : std_logic := '0'; + begin genValidEventArray: for i in 0 to 5 generate @@ -59,7 +69,49 @@ begin end if; end loop; end if; + valid_event <= and_reduce(valid_event_array) and headder_start; + + if valid_event then + histogram_input.valid <= '1'; + histogram_input.data(11 downto 0) <= std_logic_vector(to_unsigned(stub_array(0).localx, 12)); + else + histogram_input <= LWORD_NULL; + end if; end if; end process pMain; + + --==============================-- + LocalXHistogramInstance : entity work.IPBusHistogram + --==============================-- + generic map ( + input_width => 12, + bin_width => 32, + data_offset => 0 + ) + port map ( + --- Input Ports --- + clk_p => clk_p, + data_in => histogram_input, + histogram_reset => localx_histogram_reset, + --- Output Ports --- + max_bin_value => localx_max_value, + --- IPBus Ports --- + clk => ipb_clk, + rst => ipb_rst, + ipb_in => ipb_in, + ipb_out => ipb_out + ); + + --==============================-- + LocalXHistogramResetter : entity work.HistogramResetter + --==============================-- + port map ( + --- Input Ports --- + clk_p => clk_p, + trigger_window => localx_trigger_window, + --- Output Ports --- + histogram_reset => localx_histogram_reset + ); + end Behavioral; diff --git a/top/addr_table/emp_payload.xml b/top/addr_table/emp_payload.xml index 88bd97a347787c1b5ea5f87497d1148e407eb3f7..65601aff8b667bca11a0fd6c3af46136eb6b8f35 100644 --- a/top/addr_table/emp_payload.xml +++ b/top/addr_table/emp_payload.xml @@ -13,7 +13,7 @@ <node id="link_monitor" address="0x10000" module="file://LinkMonitorInterface.xml"/> - <node id="mprocessor" address="0x40000" description="MProcessor control and status" module="file://mprocessor.xml" fwinfo="endpoint;width=12"/> + <node id="mprocessor" address="0x40000" description="MProcessor control and status" module="file://mprocessor.xml" fwinfo="endpoint;width=13"/> <node id="mproc_ctrl" address="0x4fff0" description="MProcessor channel control" fwinfo="endpoint;width=1"> <node id="control" address="0x0"> <node id="chan_sel" mask="0x7f"/>