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
29 index_event : std_logic;
33 type IRC_OUTPUT_Type is record
34 count : IRC_COUNT_OUTPUT_Type;
35 state : IRC_STATE_OUTPUT_Type;
39 type IRC_INPUT_Array_Type is array (natural range <>) of IRC_INPUT_Type;
40 type IRC_OUTPUT_Array_Type is array (natural range <>) of IRC_OUTPUT_Type;
41 type IRC_COUNT_OUTPUT_Array_Type is array (natural range <>) of IRC_COUNT_OUTPUT_Type;
42 type IRC_STATE_OUTPUT_Array_Type is array (natural range <>) of IRC_STATE_OUTPUT_Type;
44 -- IRC coprocessor MAIN
45 component irc_proc_main
48 num_irc_g : positive := 4
54 reset_i : in std_logic;
56 irc_i : in IRC_COUNT_OUTPUT_Array_Type((num_irc_g-1) downto 0);
58 irc_index_reset_o : out std_logic_vector((num_irc_g-1) downto 0);
60 mem_clk_i : in std_logic;
61 mem_en_i : in std_logic;
62 mem_we_i : in std_logic_vector(3 downto 0);
63 mem_addr_i : in std_logic_vector(ceil_log2(num_irc_g) downto 0);
64 mem_data_i : in std_logic_vector(31 downto 0);
65 mem_data_o : out std_logic_vector(31 downto 0)
69 -- IRC coprocessor INC
70 component irc_proc_inc
73 num_irc_g : positive := 4
79 reset_i : in std_logic;
81 op_o : out std_logic_vector(1 downto 0);
82 axis_o : out std_logic_vector((ceil_log2(num_irc_g)-1) downto 0)
92 reset_i : in std_logic;
93 irc_i : in IRC_INPUT_Type;
95 reset_index_event_i : in std_logic;
96 reset_index_event2_i : in std_logic;
97 reset_ab_error_i : in std_logic;
99 irc_o : out IRC_OUTPUT_Type
108 clk_i : in std_logic;
109 reset_i : in std_logic;
110 a0_i, b0_i : in std_logic;
111 index0_i : in std_logic;
113 reset_index_event_i : in std_logic;
114 reset_index_event2_i : in std_logic;
115 reset_ab_error_i : in std_logic;
117 qcount_o : out std_logic_vector(7 downto 0);
118 qcount_index_o : out std_logic_vector(7 downto 0);
119 index_o : out std_logic;
120 index_event_o : out std_logic;
121 index_event2_o : out std_logic;
122 a_rise_o, a_fall_o : out std_logic;
123 b_rise_o, b_fall_o : out std_logic;
124 ab_event_o : out std_logic;
125 ab_error_o : out std_logic
129 -- D sampler (filtered, 2 cycles)
133 clk_i : in std_logic;
139 -- D sampler (filtered, 3 cycles)
143 clk_i : in std_logic;
153 clk_i : in std_logic;
154 reset_i : in std_logic;
155 input_i : in std_logic;
156 crc_o : out std_logic_vector(7 downto 0)
163 cnt_width_g : natural := 8
167 clk_i : in std_logic;
169 reset_i : in std_logic;
170 ratio_i : in std_logic_vector(cnt_width_g-1 downto 0);
171 q_out_o : out std_logic
175 -- LX Master transmitter
176 component lxmaster_transmitter
178 cycle_cnt_width_g : natural := 12
182 clk_i : in std_logic;
183 reset_i : in std_logic;
185 clock_o : out std_logic;
186 mosi_o : out std_logic;
187 sync_o : out std_logic;
189 register_i : in std_logic;
190 register_o : out std_logic_vector(1 downto 0);
191 register_we_i : in std_logic;
193 cycle_reg_i : in std_logic_vector(cycle_cnt_width_g-1 downto 0);
194 cycle_reg_o : out std_logic_vector(cycle_cnt_width_g-1 downto 0);
195 cycle_reg_we_i : in std_logic;
197 wdog_i : in std_logic;
198 wdog_we_i : in std_logic;
200 mem_clk_i : in std_logic;
201 mem_en_i : in std_logic;
202 mem_we_i : in std_logic_vector(1 downto 0);
203 mem_addr_i : in std_logic_vector(8 downto 0);
204 mem_data_i : in std_logic_vector(15 downto 0);
205 mem_data_o : out std_logic_vector(15 downto 0)
209 -- LX Master receiver
210 component lxmaster_receiver
213 clk_i : in std_logic;
214 reset_i : in std_logic;
216 clock_i : in std_logic;
217 miso_i : in std_logic;
218 sync_i : in std_logic;
219 -- Receive done pulse
220 rx_done_o : out std_logic;
222 register_i : in std_logic;
223 register_o : out std_logic_vector(1 downto 0);
224 register_we_i : in std_logic;
226 mem_clk_i : in std_logic;
227 mem_en_i : in std_logic;
228 mem_we_i : in std_logic_vector(1 downto 0);
229 mem_addr_i : in std_logic_vector(8 downto 0);
230 mem_data_i : in std_logic_vector(15 downto 0);
231 mem_data_o : out std_logic_vector(15 downto 0)
235 -- Clock Cross Domain Synchronization Elastic Buffer/FIFO
236 component lx_crosdom_ser_fifo
239 fifo_len_g : positive := 8;
240 sync_adj_g : integer := 0
244 -- Asynchronous clock domain interface
245 acd_clock_i : in std_logic;
246 acd_miso_i : in std_logic;
247 acd_sync_i : in std_logic;
249 clk_i : in std_logic;
250 reset_i : in std_logic;
251 -- Output synchronous with clk_i
252 miso_o : out std_logic;
253 sync_o : out std_logic;
254 data_ready_o : out std_logic
258 --------------------------------------------------------------------------------
260 --------------------------------------------------------------------------------
262 component lx_rocon_tumbl
265 IMEM_ABITS_g : positive := 11;
266 DMEM_ABITS_g : positive := 12;
268 USE_HW_MUL_g : boolean := true;
269 USE_BARREL_g : boolean := true;
270 COMPATIBILITY_MODE_g : boolean := false
274 clk_i : in std_logic;
275 rst_i : in std_logic;
276 halt_i : in std_logic;
277 int_i : in std_logic;
278 trace_i : in std_logic;
279 trace_kick_i : in std_logic;
281 pc_o : out std_logic_vector(31 downto 0);
282 -- Internal halt (remove with trace kick)
283 halted_o : out std_logic;
284 halt_code_o : out std_logic_vector(4 downto 0);
285 -- Internal memory (instruction)
286 imem_clk_i : in std_logic;
287 imem_en_i : in std_logic;
288 imem_we_i : in std_logic_vector(3 downto 0);
289 imem_addr_i : in std_logic_vector(8 downto 0);
290 imem_data_i : in std_logic_vector(31 downto 0);
291 imem_data_o : out std_logic_vector(31 downto 0);
292 -- Internal memory (data)
293 dmem_clk_i : in std_logic;
294 dmem_en_i : in std_logic;
295 dmem_we_i : in std_logic_vector(3 downto 0);
296 dmem_addr_i : in std_logic_vector(9 downto 0);
297 dmem_data_i : in std_logic_vector(31 downto 0);
298 dmem_data_o : out std_logic_vector(31 downto 0);
299 -- External memory bus
300 xmemb_sel_o : out std_logic;
301 xmemb_i : in DMEMB2CORE_Type;
302 xmemb_o : out CORE2DMEMB_Type
306 component lx_rocon_imem
309 -- Memory wiring for Tumbl
310 clk_i : in std_logic;
312 adr_i : in std_logic_vector(10 downto 2);
313 dat_o : out std_logic_vector(31 downto 0);
314 -- Memory wiring for Master CPU
315 clk_m : in std_logic;
317 we_m : in std_logic_vector(3 downto 0);
318 addr_m : in std_logic_vector(8 downto 0);
319 din_m : in std_logic_vector(31 downto 0);
320 dout_m : out std_logic_vector(31 downto 0)
324 component lx_rocon_dmem
327 -- Memory wiring for Tumbl
328 clk_i : in std_logic;
330 adr_i : in std_logic_vector(11 downto 2);
331 bls_i : in std_logic_vector(3 downto 0);
332 dat_i : in std_logic_vector(31 downto 0);
333 dat_o : out std_logic_vector(31 downto 0);
334 -- Memory wiring for Master CPU
335 clk_m : in std_logic;
337 we_m : in std_logic_vector(3 downto 0);
338 addr_m : in std_logic_vector(9 downto 0);
339 din_m : in std_logic_vector(31 downto 0);
340 dout_m : out std_logic_vector(31 downto 0)
344 component lx_rocon_gprf_abd
347 clk_i : in std_logic;
348 rst_i : in std_logic;
349 clken_i : in std_logic;
351 ID2GPRF_i : in ID2GPRF_Type;
352 MEM_WRB_i : in WRB_Type;
353 GPRF2EX_o : out GPRF2EX_Type
357 --------------------------------------------------------------------------------
359 --------------------------------------------------------------------------------
361 -- Measurement register
362 component measurement_register
365 id_g : std_logic_vector(31 downto 0) := (others => '0')
370 clk_i : in std_logic;
372 reset_i : in std_logic;
376 switch_i : in std_logic;
378 data_i : in std_logic_vector(31 downto 0);
379 data_o : out std_logic_vector(31 downto 0);
381 bls_i : in std_logic_vector(3 downto 0)
389 clk_i : in std_logic;
390 reset_i : in std_logic;
392 address_i : in std_logic_vector(4 downto 0);
393 next_ce_i : in std_logic;
394 data_i : in std_logic_vector(31 downto 0);
395 data_o : out std_logic_vector(31 downto 0);
397 bls_i : in std_logic_vector(3 downto 0);
399 irc_i : in IRC_INPUT_Array_Type(7 downto 0)
403 -- Measurement interconnect
404 component bus_measurement
408 clk_i : in std_logic;
410 reset_i : in std_logic;
414 address_i : in std_logic_vector(1 downto 0);
416 data_i : in std_logic_vector(31 downto 0);
417 data_o : out std_logic_vector(31 downto 0);
419 bls_i : in std_logic_vector(3 downto 0)
423 -- Tumbl interconnect
428 clk_i : in std_logic;
432 reset_i : in std_logic;
433 -- Master CPU bus for the memory
434 bls_i : in std_logic_vector(3 downto 0);
435 address_i : in std_logic_vector(11 downto 0);
436 data_i : in std_logic_vector(31 downto 0);
437 data_o : out std_logic_vector(31 downto 0);
438 -- Tumbl extrenal memory bus
439 xmemb_sel_o : out std_logic;
440 xmemb_i : in DMEMB2CORE_Type;
441 xmemb_o : out CORE2DMEMB_Type
445 -- Register on the bus
446 component bus_register is
450 reset_value_g : std_logic_vector(31 downto 0) := (others => '0');
460 clk_i : in std_logic;
462 reset_i : in std_logic;
466 data_i : in std_logic_vector((b0_g+b1_g+b2_g+b3_g-1) downto 0);
467 data_o : out std_logic_vector((b0_g+b1_g+b2_g+b3_g-1) downto 0);
469 bls_i : in std_logic_vector(3 downto 0)
473 -- LX Master bus interconnect
474 component bus_lxmaster
477 clk_i : in std_logic;
478 reset_i : in std_logic;
480 address_i : in std_logic_vector(10 downto 0);
481 next_ce_i : in std_logic;
482 data_i : in std_logic_vector(15 downto 0);
483 data_o : out std_logic_vector(15 downto 0);
485 bls_i : in std_logic_vector(1 downto 0);
487 rx_done_o : out std_logic;
488 -- Signals for LX Master
489 clock_i : in std_logic;
490 miso_i : in std_logic;
491 sync_i : in std_logic;
493 clock_o : out std_logic;
494 mosi_o : out std_logic;
495 sync_o : out std_logic
499 --------------------------------------------------------------------------------
501 --------------------------------------------------------------------------------
502 type BRAM_type is (READ_FIRST, WRITE_FIRST, NO_CHANGE);
504 component xilinx_dualport_bram
507 byte_width : positive := 8;
508 address_width : positive := 8;
509 we_width : positive := 4;
510 port_a_type : BRAM_type := READ_FIRST;
511 port_b_type : BRAM_type := READ_FIRST
518 wea : in std_logic_vector((we_width-1) downto 0);
519 addra : in std_logic_vector((address_width-1) downto 0);
520 dina : in std_logic_vector(((byte_width*we_width)-1) downto 0);
521 douta : out std_logic_vector(((byte_width*we_width)-1) downto 0);
525 web : in std_logic_vector((we_width-1) downto 0);
526 addrb : in std_logic_vector((address_width-1) downto 0);
527 dinb : in std_logic_vector(((byte_width*we_width)-1) downto 0);
528 doutb : out std_logic_vector(((byte_width*we_width)-1) downto 0)
534 package body lx_rocon_pkg is