diff --git a/components/tlu/firmware/hdl/T0_Shutter_Iface_rtl.vhd b/components/tlu/firmware/hdl/T0_Shutter_Iface_rtl.vhd index 4c5f7d07e6a452c2d8e7579bb3f95f619aa813d1..f45285727745f5d2d055629df5ba29078de5a21a 100644 --- a/components/tlu/firmware/hdl/T0_Shutter_Iface_rtl.vhd +++ b/components/tlu/firmware/hdl/T0_Shutter_Iface_rtl.vhd @@ -63,7 +63,8 @@ ENTITY T0_Shutter_Iface IS --! Output Signals shutter_o: OUT STD_LOGIC; --! Shutter signal. shutter_veto_o: OUT STD_LOGIC; --! Goes high when shutter vetoes triggers - T0_o: out std_logic --! T0 synchronization pulse + run_active_o: out std_logic; --! goes high when run is active. + T0_o: out std_logic --! T0 synchronization pulse. Pulses on leading edge of run_active_o ); END T0_Shutter_Iface; @@ -80,16 +81,16 @@ ARCHITECTURE rtl OF T0_Shutter_Iface IS signal s_enable_sequence : std_logic ; --! take high to enable sequence signal s_enable_internal_cycle : std_logic ; --! take high to enable internal sequence - signal s_T0_ipbus : std_logic; --! T0 synchronization signal on IPBus clock domain. --- signal s_run_active : std_logic; --! Take active to issue T0 pulse and enable shutters - constant c_NUM_CTRL_REGS : integer := 9; + -- signal s_T0_ipbus : std_logic; --! T0 synchronization signal on IPBus clock domain. + signal s_run_active : std_logic; --! Take active to issue T0 pulse and enable shutters + constant c_NUM_CTRL_REGS : integer := 8; constant c_NUM_STAT_REGS : integer := 1; signal s_ipbus_statusregs: ipb_reg_v(c_NUM_STAT_REGS - 1 downto 0) := (others => (others => '0')); signal s_ipbus_controlregs: ipb_reg_v(c_NUM_CTRL_REGS - 1 downto 0); constant c_ipbus_qmask : ipb_reg_v(c_NUM_CTRL_REGS - 1 downto 0) := (others => (others => '1')); - constant c_T0_address : std_logic_vector(3 downto 0) := "1000"; --! Write 1 to bit 0 of this address to produce a enable shutters and produce T0 pulse +-- constant c_T0_address : std_logic_vector(3 downto 0) := "1000"; --! Write 1 to bit 0 of this address to produce a enable shutters and produce T0 pulse begin @@ -132,42 +133,45 @@ begin ); -- s_enable_sequence <= ( s_ipbus_controlregs(0)(0) and s_run_active ) when (rising_edge(clk_4x_i) and (clk_4x_strobe_i = '1')); - s_enable_sequence <= s_ipbus_controlregs(0)(0) when (rising_edge(clk_4x_i) and (clk_4x_strobe_i = '1')); + s_enable_sequence <= ( s_ipbus_controlregs(0)(0) and s_run_active) when (rising_edge(clk_4x_i) and (clk_4x_strobe_i = '1')); -- s_run_active <= s_ipbus_controlregs(8)(0); --! Set to 1 to issue T0 and start shutter s_enable_internal_cycle <= s_ipbus_controlregs(0)(1); s_trigger_source_select <= s_ipbus_controlregs(1); + s_internal_cycle_length <= s_ipbus_controlregs(2); + s_threshold_t1 <= s_ipbus_controlregs(3); s_threshold_t2 <= s_ipbus_controlregs(4); s_threshold_t3 <= s_ipbus_controlregs(5); - s_internal_cycle_length <= s_ipbus_controlregs(2); - + s_run_active <= s_ipbus_controlregs(6)(0); + + run_active_o <= s_run_active; - -- A bodge. I can't figure out which standard IPBus register generates a - -- pulse, so put this logic in parallel. - -------------------- - ipbus_generateT0: process (ipbus_clk_i) - begin -- process ipbus_clk_i - if rising_edge(ipbus_clk_i) then + ---- A bodge. I can't figure out which standard IPBus register generates a + ---- pulse, so put this logic in parallel. + ---------------------- + --ipbus_generateT0: process (ipbus_clk_i) + --begin -- process ipbus_clk_i + --if rising_edge(ipbus_clk_i) then - if (ipbus_i.ipb_strobe = '1' and ipbus_i.ipb_write = '1' and ipbus_i.ipb_addr(3 downto 0) = c_T0_address ) then - s_T0_ipbus <= '1'; -- set T0 signal high - else - s_T0_ipbus <= '0'; - end if; + -- if (ipbus_i.ipb_strobe = '1' and ipbus_i.ipb_write = '1' and ipbus_i.ipb_addr(3 downto 0) = c_T0_address ) then + -- s_T0_ipbus <= '1'; -- set T0 signal high + -- else + -- s_T0_ipbus <= '0'; + -- end if; - end if; - end process ipbus_generateT0; + -- end if; + --end process ipbus_generateT0; --! Retime T0 generated by IPBus onto clk_4x and align with strobe cmp_T0_retime: entity work.stretchPulse4x port map ( clk_4x_i => clk_4x_i, clk_4x_strobe_i => clk_4x_strobe_i, --- pulse_i => s_run_active, - pulse_i => s_T0_ipbus, + pulse_i => s_run_active, +-- pulse_i => s_T0_ipbus, pulse_o => T0_o); END rtl; diff --git a/projects/TLU_v1e/addr_table/TLUaddrmap.xml b/projects/TLU_v1e/addr_table/TLUaddrmap.xml index b44a86fa5c3372d7a3f1d404f1f7a2709e451561..e9a79500fe0ed58b37fa4aaeee2214fee772772d 100644 --- a/projects/TLU_v1e/addr_table/TLUaddrmap.xml +++ b/projects/TLU_v1e/addr_table/TLUaddrmap.xml @@ -4,12 +4,12 @@ <!-- Registers for the DUTs. These should be correct --> <node id="DUTInterfaces" address="0x1000" description="DUT Interfaces control registers" fwinfo="endpoint;width=4"> - <node id="DutMaskW" address="0x0" permission="w" description="" /> + <node id="DUTMaskW" address="0x0" permission="w" description="" /> <node id="IgnoreDUTBusyW" address="0x1" permission="w" description="" /> <node id="IgnoreShutterVetoW" address="0x2" permission="w" description="" /> <node id="DUTInterfaceModeW" address="0x3" permission="w" description="" /> <node id="DUTInterfaceModeModifierW" address="0x4" permission="w" description="" /> - <node id="DutMaskR" address="0x8" permission="r" description="" /> + <node id="DUTMaskR" address="0x8" permission="r" description="" /> <node id="IgnoreDUTBusyR" address="0x9" permission="r" description="" /> <node id="IgnoreShutterVetoR" address="0xA" permission="r" description="" /> <node id="DUTInterfaceModeR" address="0xB" permission="r" description="" /> @@ -21,10 +21,11 @@ <node id="ShutterSelectRW" address="0x1" permission="rw" description="Selects which input is used to trigger shutter"/> <node id="InternalShutterPeriodRW" address="0x2" permission="rw" description="Internal trig generator period ( units = number of strobe pulses)"/> <node id="ShutterOnTimeRW" address="0x3" permission="rw" description="Time between input trigger being received and shutter asserted(T1) ( units = number of strobe pulses)"/> - <node id="VetoOffTimeRW" address="0x4" permission="rw" description="time between input trigger and veto being de-asserted(T2) ( units = number of strobe pulses)"/> + <node id="ShutterVetoOffTimeRW" address="0x4" permission="rw" description="time between input trigger and veto being de-asserted(T2) ( units = number of strobe pulses)"/> <node id="ShutterOffTimeRW" address="0x5" permission="rw" description="time between input trigger and time at which shutter de-asserted and veto reasserted(T3) ( units = number of strobe pulses)"/> - <node id="PulseT0" address="0x8" permission="rw" description="Writing to Bit-0 of this register causes sync line to pulse for one strobe-pulse interval"/> + <node id="RunActiveRW" address="0x6" permission="rw" description="Writing '1' to Bit-0 of this register raises the run_active line and causes sync line to pulse for one strobe-pulse interval"/> </node> + <!-- I2C registers. Tested ok.--> <node id="i2c_master" address="0x3000" description="I2C Master interface" fwinfo="endpoint;width=3"> <node id="i2c_pre_lo" address="0x0" mask="0x000000ff" permission="rw" description="" /> diff --git a/projects/TLU_v1e/firmware/hdl/top_enclustra_tlu_v1e.vhd b/projects/TLU_v1e/firmware/hdl/top_enclustra_tlu_v1e.vhd index 9ee7a11426a1b68e619a2e3f9fc771c5affe5821..e3898f3e052073018bb76063bf2d4a646bc6bd3d 100644 --- a/projects/TLU_v1e/firmware/hdl/top_enclustra_tlu_v1e.vhd +++ b/projects/TLU_v1e/firmware/hdl/top_enclustra_tlu_v1e.vhd @@ -25,7 +25,7 @@ use work.ipbus.ALL; entity top is generic( - constant FW_VERSION : unsigned(31 downto 0):= X"1e000010"; -- Firmware revision. Remember to change this as needed. + constant FW_VERSION : unsigned(31 downto 0):= X"1e000011"; -- Firmware revision. Remember to change this as needed. g_NUM_DUTS : positive := 4; -- <- was 3 g_NUM_TRIG_INPUTS :positive := 6;-- <- was 4 g_NUM_EDGE_INPUTS :positive := 6;-- <-- was 4 @@ -106,7 +106,7 @@ architecture rtl of top is --signal s_i2c_scl_i : std_logic; ------------------------------------------ -- Internal signal declarations - SIGNAL T0_o : std_logic; + SIGNAL s_T0 : std_logic; SIGNAL buffer_full_o : std_logic; --! Goes high when event buffer almost full SIGNAL clk_8x_logic : std_logic; -- 320MHz clock SIGNAL clk_4x_logic : std_logic; --! normally 160MHz @@ -132,6 +132,7 @@ architecture rtl of top is --SIGNAL s_i2c_scl_enb : std_logic; --SIGNAL s_i2c_sda_enb : std_logic; SIGNAL s_shutter : std_logic; --! shutter signal from TimePix, retimed onto local clock + signal s_run_active : std_logic; --! Goes high when run is active. SIGNAL s_triggerLogic_reset : std_logic; SIGNAL shutter_cnt_i : std_logic_vector(g_SPILL_COUNTER_WIDTH-1 DOWNTO 0); SIGNAL shutter_i : std_logic; @@ -142,8 +143,8 @@ architecture rtl of top is SIGNAL trigger_count : std_logic_vector(g_IPBUS_WIDTH-1 DOWNTO 0); SIGNAL trigger_times : t_triggerTimeArray(g_NUM_TRIG_INPUTS-1 DOWNTO 0); --! trigger arrival time ( w.r.t. logic_strobe) SIGNAL triggers : std_logic_vector(g_NUM_TRIG_INPUTS-1 DOWNTO 0); --! Rising edge of trigger inputs - SIGNAL veto_o : std_logic; --! goes high when one or more DUT are busy - signal shutter_veto_o : std_logic; --! Goes high when triggers should be vetoed by shutter + SIGNAL s_veto : std_logic; --! goes high when one or more DUT are busy + signal s_shutter_veto : std_logic; --! Goes high when triggers should be vetoed by shutter signal ctrl, stat: ipb_reg_v(0 downto 0); --My signals --SIGNAL busy_toggle_o : std_logic_vector(g_NUM_DUTS-1 downto 0); @@ -191,6 +192,7 @@ architecture rtl of top is ipbus_clk_i : IN std_logic; ipbus_i : IN ipb_wbus; T0_o : OUT std_logic; + run_active_o : out std_logic; accelerator_signals_i : in std_logic_vector(g_NUM_ACCELERATOR_SIGNALS-1 DOWNTO 0); ipbus_o : OUT ipb_rbus; shutter_veto_o: out std_logic; @@ -410,14 +412,14 @@ begin -- ModuleWare code(v1.12) for instance 'I19' of 'merge' --gpio_hdr <= dout1 & dout & s_shutter & T0_o; -- ModuleWare code(v1.12) for instance 'I8' of 'sor' - overall_veto <= buffer_full_o OR veto_o ; -- or shutter_veto_o; + overall_veto <= buffer_full_o OR s_veto or s_shutter_veto when rising_edge(clk_4x_logic); -- ModuleWare code(v1.12) for instance 'I16' of 'sor' - s_triggerLogic_reset <= logic_reset OR T0_o; + s_triggerLogic_reset <= logic_reset OR s_T0; i2c_reset <= '1'; clk_gen_rst <= '1'; ---gpio <= strobe_8x_logic;--- - gpio <= veto_o;--- + gpio <= s_veto;--- --gpio <= busy_i(1);--- --Set diff clock out to 0 because we cannot have the correct differential voltage output @@ -582,7 +584,7 @@ begin ipbus_o => ipbrr(N_SLV_EVENT_FORMATTER), data_strobe_o => data_strobe, event_data_o => event_data, - reset_timestamp_i => T0_o, + reset_timestamp_i => s_T0, reset_timestamp_o => OPEN ); @@ -614,9 +616,10 @@ begin clk_4x_i => clk_4x_logic, clk_4x_strobe_i => strobe_4x_logic, accelerator_signals_i => triggers, - T0_o => T0_o, + T0_o => s_T0, + run_active_o => s_run_active, shutter_o => s_shutter, - shutter_veto_o => shutter_veto_o, + shutter_veto_o => s_shutter_veto, ipbus_clk_i => clk_ipb, ipbus_i => ipbww(N_SLV_SHUTTER), ipbus_o => ipbrr(N_SLV_SHUTTER) @@ -633,9 +636,9 @@ begin strobe_4x_logic_i => strobe_4x_logic, trigger_counter_i => trigger_count, trigger_i => overall_trigger, - reset_or_clk_to_dut_i => T0_o, + reset_or_clk_to_dut_i => s_T0, shutter_to_dut_i => s_shutter, - shutter_veto_i => shutter_veto_o, + shutter_veto_i => s_shutter_veto, ipbus_clk_i => clk_ipb, ipbus_i => ipbww(N_SLV_DUTINTERFACES), ipbus_reset_i => rst_ipb, @@ -651,7 +654,7 @@ begin --shutter_to_dut_n_o => shutter_to_dut_n_o, --shutter_to_dut_p_o => shutter_to_dut_p_o, shutter_to_dut => cont_o, - veto_o => veto_o + veto_o => s_veto ); ------------------------------------------ diff --git a/projects/TLU_v1e/firmware/ucf/TLU_enclustra_v1e.xdc b/projects/TLU_v1e/firmware/ucf/TLU_enclustra_v1e.xdc index 1c5fb225c91d5b3592f22c69d0f2c565af3e4712..3285439d438c0f3976ad0ec90c5ba30a87f549b8 100644 --- a/projects/TLU_v1e/firmware/ucf/TLU_enclustra_v1e.xdc +++ b/projects/TLU_v1e/firmware/ucf/TLU_enclustra_v1e.xdc @@ -129,6 +129,9 @@ create_clock -period 25.000 -name sysclk_40_i_p -waveform {0.000 12.500} [get_po set_input_delay -clock [get_clocks [get_clocks -of_objects [get_pins I4/pll_base_inst/CLKOUT0]]] -rise -min 0.300 [get_ports -regexp -filter { NAME =~ ".*thresh.*" && DIRECTION == "IN" }] set_input_delay -clock [get_clocks [get_clocks -of_objects [get_pins I4/pll_base_inst/CLKOUT0]]] -rise -max 1.400 [get_ports -regexp -filter { NAME =~ ".*thresh.*" && DIRECTION == "IN" }] set_clock_groups -asynchronous -group [list [get_clocks clk_ipb_i] [get_clocks sysclk]] -group [list [get_clocks s_clk160] [get_clocks sysclk_40_i_p]] +connect_debug_port u_ila_0/probe13 [get_nets [list shutter_veto_o]] +connect_debug_port u_ila_0/probe16 [get_nets [list veto_i]] + create_debug_core u_ila_0 ila set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_0] set_property ALL_PROBE_SAME_MU_CNT 1 [get_debug_cores u_ila_0] @@ -141,12 +144,12 @@ set_property C_TRIGOUT_EN false [get_debug_cores u_ila_0] set_property port_width 1 [get_debug_ports u_ila_0/clk] connect_debug_port u_ila_0/clk [get_nets [list I4/clk_4x_logic_o]] set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe0] -set_property port_width 6 [get_debug_ports u_ila_0/probe0] -connect_debug_port u_ila_0/probe0 [get_nets [list {I5/trigger_o[0]} {I5/trigger_o[1]} {I5/trigger_o[2]} {I5/trigger_o[3]} {I5/trigger_o[4]} {I5/trigger_o[5]}]] +set_property port_width 4 [get_debug_ports u_ila_0/probe0] +connect_debug_port u_ila_0/probe0 [get_nets [list {I9/s_DUT_ignore_busy[0]} {I9/s_DUT_ignore_busy[1]} {I9/s_DUT_ignore_busy[2]} {I9/s_DUT_ignore_busy[3]}]] create_debug_port u_ila_0 probe set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe1] -set_property port_width 4 [get_debug_ports u_ila_0/probe1] -connect_debug_port u_ila_0/probe1 [get_nets [list {I9/s_DUT_ignore_busy[0]} {I9/s_DUT_ignore_busy[1]} {I9/s_DUT_ignore_busy[2]} {I9/s_DUT_ignore_busy[3]}]] +set_property port_width 6 [get_debug_ports u_ila_0/probe1] +connect_debug_port u_ila_0/probe1 [get_nets [list {I5/trigger_o[0]} {I5/trigger_o[1]} {I5/trigger_o[2]} {I5/trigger_o[3]} {I5/trigger_o[4]} {I5/trigger_o[5]}]] create_debug_port u_ila_0 probe set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe2] set_property port_width 6 [get_debug_ports u_ila_0/probe2] @@ -194,23 +197,15 @@ connect_debug_port u_ila_0/probe12 [get_nets [list I6/s_trigger]] create_debug_port u_ila_0 probe set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe13] set_property port_width 1 [get_debug_ports u_ila_0/probe13] -connect_debug_port u_ila_0/probe13 [get_nets [list shutter_veto_o]] +connect_debug_port u_ila_0/probe13 [get_nets [list I6/trigger_i]] create_debug_port u_ila_0 probe set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe14] set_property port_width 1 [get_debug_ports u_ila_0/probe14] -connect_debug_port u_ila_0/probe14 [get_nets [list I6/trigger_i]] +connect_debug_port u_ila_0/probe14 [get_nets [list I10/cmp_coincidence_logic/trigger_o]] create_debug_port u_ila_0 probe set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe15] set_property port_width 1 [get_debug_ports u_ila_0/probe15] -connect_debug_port u_ila_0/probe15 [get_nets [list I10/cmp_coincidence_logic/trigger_o]] -create_debug_port u_ila_0 probe -set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe16] -set_property port_width 1 [get_debug_ports u_ila_0/probe16] -connect_debug_port u_ila_0/probe16 [get_nets [list veto_i]] -create_debug_port u_ila_0 probe -set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe17] -set_property port_width 1 [get_debug_ports u_ila_0/probe17] -connect_debug_port u_ila_0/probe17 [get_nets [list I9/veto_o]] +connect_debug_port u_ila_0/probe15 [get_nets [list I9/veto_o]] set_property C_CLK_INPUT_FREQ_HZ 300000000 [get_debug_cores dbg_hub] set_property C_ENABLE_CLK_DIVIDER false [get_debug_cores dbg_hub] set_property C_USER_SCAN_CHAIN 1 [get_debug_cores dbg_hub]