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)
160 -- LX Master transmitter
161 component lxmaster_transmitter
164 clk_i : in std_logic;
165 reset_i : in std_logic;
167 clock_o : out std_logic;
168 mosi_o : out std_logic;
169 sync_o : out std_logic;
171 register_i : in std_logic;
172 register_o : out std_logic_vector(1 downto 0);
173 register_we_i : in std_logic;
175 wdog_i : in std_logic;
176 wdog_we_i : in std_logic;
178 mem_clk_i : in std_logic;
179 mem_en_i : in std_logic;
180 mem_we_i : in std_logic_vector(1 downto 0);
181 mem_addr_i : in std_logic_vector(8 downto 0);
182 mem_data_i : in std_logic_vector(15 downto 0);
183 mem_data_o : out std_logic_vector(15 downto 0)
187 -- LX Master receiver
188 component lxmaster_receiver
191 clk_i : in std_logic;
192 reset_i : in std_logic;
194 clock_i : in std_logic;
195 miso_i : in std_logic;
196 sync_i : in std_logic;
197 -- Receive done pulse
198 rx_done_o : out std_logic;
200 register_i : in std_logic;
201 register_o : out std_logic_vector(1 downto 0);
202 register_we_i : in std_logic;
204 mem_clk_i : in std_logic;
205 mem_en_i : in std_logic;
206 mem_we_i : in std_logic_vector(1 downto 0);
207 mem_addr_i : in std_logic_vector(8 downto 0);
208 mem_data_i : in std_logic_vector(15 downto 0);
209 mem_data_o : out std_logic_vector(15 downto 0)
213 -- Clock Cross Domain Synchronization Elastic Buffer/FIFO
214 component lx_crosdom_ser_fifo
217 fifo_len_g : positive := 8;
218 sync_adj_g : integer := 0
222 -- Asynchronous clock domain interface
223 acd_clock_i : in std_logic;
224 acd_miso_i : in std_logic;
225 acd_sync_i : in std_logic;
227 clk_i : in std_logic;
228 reset_i : in std_logic;
229 -- Output synchronous with clk_i
230 miso_o : out std_logic;
231 sync_o : out std_logic;
232 data_ready_o : out std_logic
236 --------------------------------------------------------------------------------
238 --------------------------------------------------------------------------------
240 component lx_rocon_tumbl
243 IMEM_ABITS_g : positive := 11;
244 DMEM_ABITS_g : positive := 12;
246 USE_HW_MUL_g : boolean := true;
247 USE_BARREL_g : boolean := true;
248 COMPATIBILITY_MODE_g : boolean := false
252 clk_i : in std_logic;
253 rst_i : in std_logic;
254 halt_i : in std_logic;
255 int_i : in std_logic;
256 trace_i : in std_logic;
257 trace_kick_i : in std_logic;
259 pc_o : out std_logic_vector(31 downto 0);
260 -- Internal halt (remove with trace kick)
261 halted_o : out std_logic;
262 halt_code_o : out std_logic_vector(4 downto 0);
263 -- Internal memory (instruction)
264 imem_clk_i : in std_logic;
265 imem_en_i : in std_logic;
266 imem_we_i : in std_logic_vector(3 downto 0);
267 imem_addr_i : in std_logic_vector(8 downto 0);
268 imem_data_i : in std_logic_vector(31 downto 0);
269 imem_data_o : out std_logic_vector(31 downto 0);
270 -- Internal memory (data)
271 dmem_clk_i : in std_logic;
272 dmem_en_i : in std_logic;
273 dmem_we_i : in std_logic_vector(3 downto 0);
274 dmem_addr_i : in std_logic_vector(9 downto 0);
275 dmem_data_i : in std_logic_vector(31 downto 0);
276 dmem_data_o : out std_logic_vector(31 downto 0);
277 -- External memory bus
278 xmemb_sel_o : out std_logic;
279 xmemb_i : in DMEMB2CORE_Type;
280 xmemb_o : out CORE2DMEMB_Type
284 component lx_rocon_imem
287 -- Memory wiring for Tumbl
288 clk_i : in std_logic;
290 adr_i : in std_logic_vector(10 downto 2);
291 dat_o : out std_logic_vector(31 downto 0);
292 -- Memory wiring for Master CPU
293 clk_m : in std_logic;
295 we_m : in std_logic_vector(3 downto 0);
296 addr_m : in std_logic_vector(8 downto 0);
297 din_m : in std_logic_vector(31 downto 0);
298 dout_m : out std_logic_vector(31 downto 0)
302 component lx_rocon_dmem
305 -- Memory wiring for Tumbl
306 clk_i : in std_logic;
308 adr_i : in std_logic_vector(11 downto 2);
309 bls_i : in std_logic_vector(3 downto 0);
310 dat_i : in std_logic_vector(31 downto 0);
311 dat_o : out std_logic_vector(31 downto 0);
312 -- Memory wiring for Master CPU
313 clk_m : in std_logic;
315 we_m : in std_logic_vector(3 downto 0);
316 addr_m : in std_logic_vector(9 downto 0);
317 din_m : in std_logic_vector(31 downto 0);
318 dout_m : out std_logic_vector(31 downto 0)
322 component lx_rocon_gprf_abd
325 clk_i : in std_logic;
326 rst_i : in std_logic;
327 clken_i : in std_logic;
329 ID2GPRF_i : in ID2GPRF_Type;
330 MEM_WRB_i : in WRB_Type;
331 GPRF2EX_o : out GPRF2EX_Type
335 --------------------------------------------------------------------------------
337 --------------------------------------------------------------------------------
339 -- Measurement register
340 component measurement_register
343 id_g : std_logic_vector(31 downto 0) := (others => '0')
348 clk_i : in std_logic;
350 reset_i : in std_logic;
354 switch_i : in std_logic;
356 data_i : in std_logic_vector(31 downto 0);
357 data_o : out std_logic_vector(31 downto 0);
359 bls_i : in std_logic_vector(3 downto 0)
367 clk_i : in std_logic;
368 reset_i : in std_logic;
370 address_i : in std_logic_vector(4 downto 0);
371 next_ce_i : in std_logic;
372 data_i : in std_logic_vector(31 downto 0);
373 data_o : out std_logic_vector(31 downto 0);
375 bls_i : in std_logic_vector(3 downto 0);
377 irc_i : in IRC_INPUT_Array_Type(7 downto 0)
381 -- Measurement interconnect
382 component bus_measurement
386 clk_i : in std_logic;
388 reset_i : in std_logic;
392 address_i : in std_logic_vector(1 downto 0);
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)
401 -- Tumbl interconnect
406 clk_i : in std_logic;
410 reset_i : in std_logic;
411 -- Master CPU bus for the memory
412 bls_i : in std_logic_vector(3 downto 0);
413 address_i : in std_logic_vector(11 downto 0);
414 data_i : in std_logic_vector(31 downto 0);
415 data_o : out std_logic_vector(31 downto 0);
416 -- Tumbl extrenal memory bus
417 xmemb_sel_o : out std_logic;
418 xmemb_i : in DMEMB2CORE_Type;
419 xmemb_o : out CORE2DMEMB_Type
423 -- Register on the bus
424 component bus_register is
428 reset_value_g : std_logic_vector(31 downto 0) := (others => '0');
438 clk_i : in std_logic;
440 reset_i : in std_logic;
444 data_i : in std_logic_vector((b0_g+b1_g+b2_g+b3_g-1) downto 0);
445 data_o : out std_logic_vector((b0_g+b1_g+b2_g+b3_g-1) downto 0);
447 bls_i : in std_logic_vector(3 downto 0)
451 -- LX Master bus interconnect
452 component bus_lxmaster
455 clk_i : in std_logic;
456 reset_i : in std_logic;
458 address_i : in std_logic_vector(10 downto 0);
459 next_ce_i : in std_logic;
460 data_i : in std_logic_vector(15 downto 0);
461 data_o : out std_logic_vector(15 downto 0);
463 bls_i : in std_logic_vector(1 downto 0);
465 rx_done_o : out std_logic;
466 -- Signals for LX Master
467 clock_i : in std_logic;
468 miso_i : in std_logic;
469 sync_i : in std_logic;
471 clock_o : out std_logic;
472 mosi_o : out std_logic;
473 sync_o : out std_logic
477 --------------------------------------------------------------------------------
479 --------------------------------------------------------------------------------
480 type BRAM_type is (READ_FIRST, WRITE_FIRST, NO_CHANGE);
482 component xilinx_dualport_bram
485 byte_width : positive := 8;
486 address_width : positive := 8;
487 we_width : positive := 4;
488 port_a_type : BRAM_type := READ_FIRST;
489 port_b_type : BRAM_type := READ_FIRST
496 wea : in std_logic_vector((we_width-1) downto 0);
497 addra : in std_logic_vector((address_width-1) downto 0);
498 dina : in std_logic_vector(((byte_width*we_width)-1) downto 0);
499 douta : out std_logic_vector(((byte_width*we_width)-1) downto 0);
503 web : in std_logic_vector((we_width-1) downto 0);
504 addrb : in std_logic_vector((address_width-1) downto 0);
505 dinb : in std_logic_vector(((byte_width*we_width)-1) downto 0);
506 doutb : out std_logic_vector(((byte_width*we_width)-1) downto 0)
512 package body lx_rocon_pkg is