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)
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 --------------------------------------------------------------------------------
189 --------------------------------------------------------------------------------
191 component lx_rocon_tumbl
194 IMEM_ABITS_g : positive := 11;
195 DMEM_ABITS_g : positive := 12;
197 USE_HW_MUL_g : boolean := true;
198 USE_BARREL_g : boolean := true;
199 COMPATIBILITY_MODE_g : boolean := false
203 clk_i : in std_logic;
204 rst_i : in std_logic;
205 halt_i : in std_logic;
206 int_i : in std_logic;
207 trace_i : in std_logic;
208 trace_kick_i : in std_logic;
210 pc_o : out std_logic_vector(31 downto 0);
211 -- Internal halt (remove with trace kick)
212 halted_o : out std_logic;
213 halt_code_o : out std_logic_vector(4 downto 0);
214 -- Internal memory (instruction)
215 imem_clk_i : in std_logic;
216 imem_en_i : in std_logic;
217 imem_we_i : in std_logic_vector(3 downto 0);
218 imem_addr_i : in std_logic_vector(8 downto 0);
219 imem_data_i : in std_logic_vector(31 downto 0);
220 imem_data_o : out std_logic_vector(31 downto 0);
221 -- Internal memory (data)
222 dmem_clk_i : in std_logic;
223 dmem_en_i : in std_logic;
224 dmem_we_i : in std_logic_vector(3 downto 0);
225 dmem_addr_i : in std_logic_vector(9 downto 0);
226 dmem_data_i : in std_logic_vector(31 downto 0);
227 dmem_data_o : out std_logic_vector(31 downto 0);
228 -- External memory bus
229 xmemb_sel_o : out std_logic;
230 xmemb_i : in DMEMB2CORE_Type;
231 xmemb_o : out CORE2DMEMB_Type
235 component lx_rocon_imem
238 -- Memory wiring for Tumbl
239 clk_i : in std_logic;
241 adr_i : in std_logic_vector(10 downto 2);
242 dat_o : out std_logic_vector(31 downto 0);
243 -- Memory wiring for Master CPU
244 clk_m : in std_logic;
246 we_m : in std_logic_vector(3 downto 0);
247 addr_m : in std_logic_vector(8 downto 0);
248 din_m : in std_logic_vector(31 downto 0);
249 dout_m : out std_logic_vector(31 downto 0)
253 component lx_rocon_dmem
256 -- Memory wiring for Tumbl
257 clk_i : in std_logic;
259 adr_i : in std_logic_vector(11 downto 2);
260 bls_i : in std_logic_vector(3 downto 0);
261 dat_i : in std_logic_vector(31 downto 0);
262 dat_o : out std_logic_vector(31 downto 0);
263 -- Memory wiring for Master CPU
264 clk_m : in std_logic;
266 we_m : in std_logic_vector(3 downto 0);
267 addr_m : in std_logic_vector(9 downto 0);
268 din_m : in std_logic_vector(31 downto 0);
269 dout_m : out std_logic_vector(31 downto 0)
273 component lx_rocon_gprf_abd
276 clk_i : in std_logic;
277 rst_i : in std_logic;
278 clken_i : in std_logic;
280 ID2GPRF_i : in ID2GPRF_Type;
281 MEM_WRB_i : in WRB_Type;
282 GPRF2EX_o : out GPRF2EX_Type
286 --------------------------------------------------------------------------------
288 --------------------------------------------------------------------------------
290 -- Measurement register
291 component measurement_register
294 id_g : std_logic_vector(31 downto 0) := (others => '0')
299 clk_i : in std_logic;
301 reset_i : in std_logic;
305 switch_i : in std_logic;
307 data_i : in std_logic_vector(31 downto 0);
308 data_o : out std_logic_vector(31 downto 0);
310 bls_i : in std_logic_vector(3 downto 0)
318 clk_i : in std_logic;
319 reset_i : in std_logic;
321 address_i : in std_logic_vector(4 downto 0);
322 next_ce_i : in std_logic;
323 data_i : in std_logic_vector(31 downto 0);
324 data_o : out std_logic_vector(31 downto 0);
326 bls_i : in std_logic_vector(3 downto 0);
328 irc_i : in IRC_INPUT_Array_Type(7 downto 0)
332 -- Measurement interconnect
333 component bus_measurement
337 clk_i : in std_logic;
339 reset_i : in std_logic;
343 address_i : in std_logic_vector(1 downto 0);
345 data_i : in std_logic_vector(31 downto 0);
346 data_o : out std_logic_vector(31 downto 0);
348 bls_i : in std_logic_vector(3 downto 0)
352 -- Tumbl interconnect
357 clk_i : in std_logic;
361 reset_i : in std_logic;
362 -- Master CPU bus for the memory
363 bls_i : in std_logic_vector(3 downto 0);
364 address_i : in std_logic_vector(11 downto 0);
365 data_i : in std_logic_vector(31 downto 0);
366 data_o : out std_logic_vector(31 downto 0);
367 -- Tumbl extrenal memory bus
368 xmemb_sel_o : out std_logic;
369 xmemb_i : in DMEMB2CORE_Type;
370 xmemb_o : out CORE2DMEMB_Type
374 -- Register on the bus
375 component bus_register is
379 reset_value_g : std_logic_vector(31 downto 0) := (others => '0');
389 clk_i : in std_logic;
391 reset_i : in std_logic;
395 data_i : in std_logic_vector((b0_g+b1_g+b2_g+b3_g-1) downto 0);
396 data_o : out std_logic_vector((b0_g+b1_g+b2_g+b3_g-1) downto 0);
398 bls_i : in std_logic_vector(3 downto 0)
402 -- LX Master bus interconnect
403 component bus_lxmaster
406 clk_i : in std_logic;
407 reset_i : in std_logic;
409 address_i : in std_logic_vector(10 downto 0);
410 next_ce_i : in std_logic;
411 data_i : in std_logic_vector(15 downto 0);
412 data_o : out std_logic_vector(15 downto 0);
414 bls_i : in std_logic_vector(1 downto 0);
415 -- Signals for LX Master
416 clock_i : in std_logic;
417 miso_i : in std_logic;
418 sync_i : in std_logic;
420 clock_o : out std_logic;
421 mosi_o : out std_logic;
422 sync_o : out std_logic
426 --------------------------------------------------------------------------------
428 --------------------------------------------------------------------------------
429 type BRAM_type is (READ_FIRST, WRITE_FIRST, NO_CHANGE);
431 component xilinx_dualport_bram
434 byte_width : positive := 8;
435 address_width : positive := 8;
436 we_width : positive := 4;
437 port_a_type : BRAM_type := READ_FIRST;
438 port_b_type : BRAM_type := READ_FIRST
445 wea : in std_logic_vector((we_width-1) downto 0);
446 addra : in std_logic_vector((address_width-1) downto 0);
447 dina : in std_logic_vector(((byte_width*we_width)-1) downto 0);
448 douta : out std_logic_vector(((byte_width*we_width)-1) downto 0);
452 web : in std_logic_vector((we_width-1) downto 0);
453 addrb : in std_logic_vector((address_width-1) downto 0);
454 dinb : in std_logic_vector(((byte_width*we_width)-1) downto 0);
455 doutb : out std_logic_vector(((byte_width*we_width)-1) downto 0)
461 package body lx_rocon_pkg is