23 use IEEE.STD_LOGIC_1164.
ALL;
24 use IEEE.STD_LOGIC_UNSIGNED.
ALL;
25 use IEEE.NUMERIC_STD.
ALL;
27 use work.ipbus_decode_L1CaloHubRodTrace.
all;
31 ADDR_WIDTH: positive := 8;
32 DATA_WIDTH: positive := 32
35 ipb_clk : in std_logic;
36 ipb_rst : in std_logic;
38 ipb_out : out ipb_rbus;
40 pp_clock : in STD_LOGIC;
42 trace_input : in STD_LOGIC_VECTOR (23 downto 0);
43 state : in STD_LOGIC_VECTOR (7 downto 0);
45 wd_event : in STD_LOGIC;
46 timeout_error : in STD_LOGIC
52 end Processor_trace_module;
56 component ipbus_dpram
is
58 ADDR_WIDTH:
positive :=
8;
59 DATA_WIDTH:
positive :=
32
75 ipb_out:
out ipb_rbus;
77 we:
in std_logic := '
0';
78 d:
in std_logic_vector(DATA_WIDTH
- 1 downto 0) := (
others => '
0');
79 q:
out std_logic_vector(DATA_WIDTH
- 1 downto 0);
80 addr:
in std_logic_vector(ADDR_WIDTH
- 1 downto 0)
88 generic ( addr_width :
integer :=
8;
89 data_width :
integer :=
32);
90 Port ( clock :
in STD_LOGIC;
92 trace_input :
in STD_LOGIC_VECTOR (
23 downto 0);
93 state :
in STD_LOGIC_VECTOR (
7 downto 0);
94 trig_state :
in STD_LOGIC_VECTOR (
7 downto 0);
95 wd_event :
in STD_LOGIC;
96 timeout_error :
in STD_LOGIC;
98 arm_wd :
in STD_LOGIC;
99 arm_immediate :
in STD_LOGIC;
100 arm_state :
in STD_LOGIC;
101 arm_timeout :
in STD_LOGIC;
103 armed :
out STD_LOGIC;
104 triggered :
out STD_LOGIC;
107 reset_pointer :
in STD_LOGIC;
109 addr_pointer :
out std_logic_vector(addr_width
-1 downto 0)
122 signal ipbw: ipb_wbus_array(N_SLAVES - 1 downto 0);
123 signal ipbr: ipb_rbus_array(N_SLAVES - 1 downto 0);
124 signal trig_state : STD_LOGIC_VECTOR (7 downto 0);
125 signal trace_control_reg_rst : std_logic;
126 signal trace_control_reg_stb : std_logic;
127 signal trace_control : std_logic_vector (31 downto 0);
130 signal arm_wd : STD_LOGIC;
131 signal arm_immediate : STD_LOGIC;
132 signal arm_state : STD_LOGIC;
133 signal arm_timeout : STD_LOGIC;
134 signal trigger_pattern : std_logic_vector(31 downto 0);
135 signal addr_pointer : std_logic_vector(addr_width-1 downto 0);
136 signal trace_data_in : std_logic_vector(data_width-1 downto 0);
137 signal trace_data_out : std_logic_vector(data_width-1 downto 0);
138 signal armed : std_logic;
139 signal triggered : std_logic;
140 signal ipb_read_strobe : std_logic;
141 signal reset_pointer : std_logic;
142 signal clear : std_logic;
143 signal trace_reset : std_logic;
144 signal trigger_status : std_logic_vector (31 downto 0);
145 signal trigger_pointer : std_logic_vector (31 downto 0);
149 fabric:
entity work.ipbus_fabric_sel
152 SEL_WIDTH => IPBUS_SEL_WIDTH
)
157 sel => ipbus_sel_L1CaloHubRodTrace
(ipb_in.ipb_addr
),
158 ipb_to_slaves => ipbw,
159 ipb_from_slaves => ipbr
166 Trace_Control_reg:
entity work.ipbus_reg_v
169 reset => trace_control_reg_rst,
170 ipbus_in => ipbw
(N_SLV_TRACE_CONTROL
),
171 ipbus_out => ipbr
(N_SLV_TRACE_CONTROL
),
172 stb
(0) => trace_control_reg_stb,
173 q
(0) => trace_control
175 trace_control_reg_rst <= trace_control_reg_stb or ipb_rst;
177 arm_wd <= trace_control(0);
178 arm_state <= trace_control(1);
179 arm_immediate <= trace_control(2);
180 arm_timeout <= trace_control(3);
181 clear <= trace_control(4);
182 reset_pointer <= trace_control(5) or trace_control(4);
188 trigger_status_reg:
entity work.ipbus_syncreg_v
196 ipb_in => ipbw
(N_SLV_TRIGGER_STATUS
),
197 ipb_out => ipbr
(N_SLV_TRIGGER_STATUS
),
199 d
(0) => trigger_status,
200 qmask =>
(others =>
(others => '1'
)),
205 trigger_status(0) <= armed;
206 trigger_status(1) <= triggered;
207 trigger_status(31 downto 2) <= (others => '0');
210 Trigger_pattern_reg:
entity work.ipbus_reg_v
214 ipbus_in => ipbw
(N_SLV_TRIGGER_PATTERN
),
215 ipbus_out => ipbr
(N_SLV_TRIGGER_PATTERN
),
216 q
(0) => trigger_pattern
220 trig_state <= trigger_pattern(7 downto 0);
222 trigger_pointer_reg:
entity work.ipbus_syncreg_v
230 ipb_in => ipbw
(N_SLV_TRIGGER_POINTER
),
231 ipb_out => ipbr
(N_SLV_TRIGGER_POINTER
),
233 d
(0) => trigger_pointer,
234 qmask =>
(others =>
(others => '1'
)),
239 trigger_pointer(addr_width-1 downto 0) <= addr_pointer;
240 trigger_pointer(31 downto addr_width) <= (others => '0');
242 trace_words_reg:
entity work.ipbus_syncreg_v
250 ipb_in => ipbw
(N_SLV_TRACE_WORDS
),
251 ipb_out => ipbr
(N_SLV_TRACE_WORDS
),
253 d
(0) => trace_data_out,
254 qmask =>
(others =>
(others => '1'
)),
259 trace_data_in <= trace_input(23 downto 0) & "00" & state(5 downto 0);
261 trace_mem : ipbus_dpram
263 ADDR_WIDTH => addr_width,
269 ipb_in => ipbw
(N_SLV_TRACE_MEMORY
),
270 ipb_out => ipbr
(N_SLV_TRACE_MEMORY
),
275 addr => addr_pointer
(addr_width-
1 downto 0)
281 ipb_read_strobe <= ipbw(N_SLV_TRACE_WORDS).ipb_strobe;
282 trace_reset <= ipb_rst or clear or reset;
286 generic map ( addr_width => addr_width,
290 reset => trace_reset,
291 trace_input => trace_input,
293 trig_state => trig_state,
294 wd_event => wd_event,
295 timeout_error => timeout_error,
298 arm_immediate => arm_immediate,
299 arm_state => arm_state,
300 arm_timeout => arm_timeout,
303 triggered => triggered,
305 read => ipb_read_strobe,
306 reset_pointer => reset_pointer,
307 addr_pointer => addr_pointer