2 use ieee.std_logic_1164.all;
3 use ieee.std_logic_arith.all;
4 use ieee.std_logic_unsigned.all;
5 use ieee.numeric_std.all;
9 -- Entities within lx_rocon
11 package lx_rocon_pkg is
14 type IRC_INPUT_Type is record
20 type IRC_COUNT_OUTPUT_Type is record
21 qcount : std_logic_vector(7 downto 0);
22 index : std_logic_vector(7 downto 0);
23 index_event : std_logic;
26 type IRC_STATE_OUTPUT_Type is record
28 index_event : std_logic;
32 type IRC_OUTPUT_Type is record
33 count : IRC_COUNT_OUTPUT_Type;
34 state : IRC_STATE_OUTPUT_Type;
38 type IRC_INPUT_Array_Type is array (natural range <>) of IRC_INPUT_Type;
39 type IRC_OUTPUT_Array_Type is array (natural range <>) of IRC_OUTPUT_Type;
40 type IRC_COUNT_OUTPUT_Array_Type is array (natural range <>) of IRC_COUNT_OUTPUT_Type;
41 type IRC_STATE_OUTPUT_Array_Type is array (natural range <>) of IRC_STATE_OUTPUT_Type;
43 -- IRC coprocessor MAIN
44 component irc_proc_main
47 num_irc_g : positive := 4
53 reset_i : in std_logic;
55 irc_i : in IRC_COUNT_OUTPUT_Array_Type((num_irc_g-1) downto 0);
57 irc_index_reset_o : out std_logic_vector((num_irc_g-1) downto 0);
59 mem_clk_i : in std_logic;
60 mem_en_i : in std_logic;
61 mem_we_i : in std_logic_vector(3 downto 0);
62 mem_addr_i : in std_logic_vector(ceil_log2(num_irc_g) downto 0);
63 mem_data_i : in std_logic_vector(31 downto 0);
64 mem_data_o : out std_logic_vector(31 downto 0)
68 -- IRC coprocessor INC
69 component irc_proc_inc
72 num_irc_g : positive := 4
78 reset_i : in std_logic;
80 op_o : out std_logic_vector(1 downto 0);
81 axis_o : out std_logic_vector((ceil_log2(num_irc_g)-1) downto 0)
91 reset_i : in std_logic;
92 irc_i : in IRC_INPUT_Type;
94 reset_index_event_i : in std_logic;
95 reset_index_event2_i : in std_logic;
96 reset_ab_error_i : in std_logic;
98 irc_o : out IRC_OUTPUT_Type
107 clk_i : in std_logic;
108 reset_i : in std_logic;
109 a0_i, b0_i : in std_logic;
110 index0_i : in std_logic;
112 reset_index_event_i : in std_logic;
113 reset_index_event2_i : in std_logic;
114 reset_ab_error_i : in std_logic;
116 qcount_o : out std_logic_vector(7 downto 0);
117 qcount_index_o : out std_logic_vector(7 downto 0);
118 index_event_o : out std_logic;
119 index_event2_o : out std_logic;
120 a_rise_o, a_fall_o : out std_logic;
121 b_rise_o, b_fall_o : out std_logic;
122 ab_event_o : out std_logic;
123 ab_error_o : out std_logic
131 clk_i : in std_logic;
132 reset_i : in std_logic;
138 -- D sampler (filtered)
142 clk_i : in std_logic;
143 reset_i : in std_logic;
152 clk_i : in std_logic;
153 reset_i : in std_logic;
154 input_i : in std_logic;
155 crc_o : out std_logic_vector(7 downto 0)
160 component lxmaster_transmitter
163 clk_i : in std_logic;
164 reset_i : in std_logic;
166 clock_o : out std_logic;
167 mosi_o : out std_logic;
168 sync_o : out std_logic;
170 register_i : in std_logic;
171 register_o : out std_logic;
172 register_we_i : in std_logic;
174 mem_clk_i : in std_logic;
175 mem_en_i : in std_logic;
176 mem_we_i : in std_logic_vector(1 downto 0);
177 mem_addr_i : in std_logic_vector(8 downto 0);
178 mem_data_i : in std_logic_vector(15 downto 0);
179 mem_data_o : out std_logic_vector(15 downto 0)
183 --------------------------------------------------------------------------------
185 --------------------------------------------------------------------------------
187 component lx_rocon_tumbl
190 IMEM_ABITS_g : positive := 11;
191 DMEM_ABITS_g : positive := 12;
193 USE_HW_MUL_g : boolean := true;
194 USE_BARREL_g : boolean := true;
195 COMPATIBILITY_MODE_g : boolean := false
199 clk_i : in std_logic;
200 rst_i : in std_logic;
201 halt_i : in std_logic;
202 int_i : in std_logic;
203 trace_i : in std_logic;
204 trace_kick_i : in std_logic;
206 pc_o : out std_logic_vector(31 downto 0);
207 -- Internal halt (remove with trace kick)
208 halted_o : out std_logic;
209 halt_code_o : out std_logic_vector(4 downto 0);
210 -- Internal memory (instruction)
211 imem_clk_i : in std_logic;
212 imem_en_i : in std_logic;
213 imem_we_i : in std_logic_vector(3 downto 0);
214 imem_addr_i : in std_logic_vector(8 downto 0);
215 imem_data_i : in std_logic_vector(31 downto 0);
216 imem_data_o : out std_logic_vector(31 downto 0);
217 -- Internal memory (data)
218 dmem_clk_i : in std_logic;
219 dmem_en_i : in std_logic;
220 dmem_we_i : in std_logic_vector(3 downto 0);
221 dmem_addr_i : in std_logic_vector(9 downto 0);
222 dmem_data_i : in std_logic_vector(31 downto 0);
223 dmem_data_o : out std_logic_vector(31 downto 0);
224 -- External memory bus
225 xmemb_sel_o : out std_logic;
226 xmemb_i : in DMEMB2CORE_Type;
227 xmemb_o : out CORE2DMEMB_Type
231 component lx_rocon_imem
234 -- Memory wiring for Tumbl
235 clk_i : in std_logic;
237 adr_i : in std_logic_vector(10 downto 2);
238 dat_o : out std_logic_vector(31 downto 0);
239 -- Memory wiring for Master CPU
240 clk_m : in std_logic;
242 we_m : in std_logic_vector(3 downto 0);
243 addr_m : in std_logic_vector(8 downto 0);
244 din_m : in std_logic_vector(31 downto 0);
245 dout_m : out std_logic_vector(31 downto 0)
249 component lx_rocon_dmem
252 -- Memory wiring for Tumbl
253 clk_i : in std_logic;
255 adr_i : in std_logic_vector(11 downto 2);
256 bls_i : in std_logic_vector(3 downto 0);
257 dat_i : in std_logic_vector(31 downto 0);
258 dat_o : out std_logic_vector(31 downto 0);
259 -- Memory wiring for Master CPU
260 clk_m : in std_logic;
262 we_m : in std_logic_vector(3 downto 0);
263 addr_m : in std_logic_vector(9 downto 0);
264 din_m : in std_logic_vector(31 downto 0);
265 dout_m : out std_logic_vector(31 downto 0)
269 component lx_rocon_gprf_abd
272 clk_i : in std_logic;
273 rst_i : in std_logic;
274 clken_i : in std_logic;
276 ID2GPRF_i : in ID2GPRF_Type;
277 MEM_WRB_i : in WRB_Type;
278 GPRF2EX_o : out GPRF2EX_Type
282 --------------------------------------------------------------------------------
284 --------------------------------------------------------------------------------
286 -- Measurement register
287 component measurement_register
290 id_g : std_logic_vector(31 downto 0) := (others => '0')
295 clk_i : in std_logic;
297 reset_i : in std_logic;
301 switch_i : in std_logic;
303 data_i : in std_logic_vector(31 downto 0);
304 data_o : out std_logic_vector(31 downto 0);
306 bls_i : in std_logic_vector(3 downto 0)
314 clk_i : in std_logic;
315 reset_i : in std_logic;
317 address_i : in std_logic_vector(4 downto 0);
318 next_ce_i : in std_logic;
319 data_i : in std_logic_vector(31 downto 0);
320 data_o : out std_logic_vector(31 downto 0);
322 bls_i : in std_logic_vector(3 downto 0);
324 irc_i : in IRC_INPUT_Array_Type(7 downto 0)
328 -- Measurement interconnect
329 component bus_measurement
333 clk_i : in std_logic;
335 reset_i : in std_logic;
339 address_i : in std_logic_vector(1 downto 0);
341 data_i : in std_logic_vector(31 downto 0);
342 data_o : out std_logic_vector(31 downto 0);
344 bls_i : in std_logic_vector(3 downto 0)
348 -- Tumbl interconnect
353 clk_i : in std_logic;
357 reset_i : in std_logic;
358 -- Master CPU bus for the memory
359 bls_i : in std_logic_vector(3 downto 0);
360 address_i : in std_logic_vector(11 downto 0);
361 data_i : in std_logic_vector(31 downto 0);
362 data_o : out std_logic_vector(31 downto 0);
363 -- Tumbl extrenal memory bus
364 xmemb_sel_o : out std_logic;
365 xmemb_i : in DMEMB2CORE_Type;
366 xmemb_o : out CORE2DMEMB_Type
370 -- Register on the bus
371 component bus_register is
375 reset_value_g : std_logic_vector(31 downto 0) := (others => '0');
385 clk_i : in std_logic;
387 reset_i : in std_logic;
391 data_i : in std_logic_vector((b0_g+b1_g+b2_g+b3_g-1) downto 0);
392 data_o : out std_logic_vector((b0_g+b1_g+b2_g+b3_g-1) downto 0);
394 bls_i : in std_logic_vector(3 downto 0)
398 -- LX Master bus interconnect
399 component bus_lxmaster
402 clk_i : in std_logic;
403 reset_i : in std_logic;
405 address_i : in std_logic_vector(9 downto 0);
406 next_ce_i : in std_logic;
407 data_i : in std_logic_vector(15 downto 0);
408 data_o : out std_logic_vector(15 downto 0);
410 bls_i : in std_logic_vector(1 downto 0);
411 -- Signals for LX Master
412 mosi_o : out std_logic;
413 clock_o : out std_logic;
414 sync_o : out std_logic
418 --------------------------------------------------------------------------------
420 --------------------------------------------------------------------------------
422 component xilinx_dualport_bram_write_first
425 byte_width : positive := 8;
426 address_width : positive := 8;
427 we_width : positive := 4
434 wea : in std_logic_vector((we_width-1) downto 0);
435 addra : in std_logic_vector((address_width-1) downto 0);
436 dina : in std_logic_vector(((byte_width*we_width)-1) downto 0);
437 douta : out std_logic_vector(((byte_width*we_width)-1) downto 0);
441 web : in std_logic_vector((we_width-1) downto 0);
442 addrb : in std_logic_vector((address_width-1) downto 0);
443 dinb : in std_logic_vector(((byte_width*we_width)-1) downto 0);
444 doutb : out std_logic_vector(((byte_width*we_width)-1) downto 0)
448 component xilinx_dualport_bram_no_change
451 byte_width : positive := 8;
452 address_width : positive := 8;
453 we_width : positive := 4
460 wea : in std_logic_vector((we_width-1) downto 0);
461 addra : in std_logic_vector((address_width-1) downto 0);
462 dina : in std_logic_vector(((byte_width*we_width)-1) downto 0);
463 douta : out std_logic_vector(((byte_width*we_width)-1) downto 0);
467 web : in std_logic_vector((we_width-1) downto 0);
468 addrb : in std_logic_vector((address_width-1) downto 0);
469 dinb : in std_logic_vector(((byte_width*we_width)-1) downto 0);
470 doutb : out std_logic_vector(((byte_width*we_width)-1) downto 0)
476 package body lx_rocon_pkg is