]> rtime.felk.cvut.cz Git - fpga/lx-cpu1/lx-rocon.git/blob - hw/lx_rocon_pkg.vhd
Merge 8x IRC support from origin/master branch into bluebot branch.
[fpga/lx-cpu1/lx-rocon.git] / hw / lx_rocon_pkg.vhd
1 library ieee;
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;
6 use work.mbl_pkg.all;
7 use work.util_pkg.all;
8
9 -- Entities within lx_rocon
10
11 package lx_rocon_pkg is
12
13         -- Types
14         type IRC_INPUT_Type is record
15                 a, b  : std_logic;
16                 index : std_logic;
17                 mark  : std_logic;
18         end record;
19         --
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;
24         end record;
25         --
26         type IRC_STATE_OUTPUT_Type is record
27                 ab_error     : std_logic;
28                 index_event  : std_logic;
29                 mark         : std_logic;
30         end record;
31         --
32         type IRC_OUTPUT_Type is record
33                 count       : IRC_COUNT_OUTPUT_Type;
34                 state       : IRC_STATE_OUTPUT_Type;
35         end record;
36
37         -- Arrays
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;
42
43         -- IRC coprocessor MAIN
44         component irc_proc_main
45         generic
46         (
47                 num_irc_g  : positive := 4
48         );
49         port
50         (
51                 -- Basic input
52                 clk_i             : in std_logic;
53                 reset_i           : in std_logic;
54                 -- Signals from IRC
55                 irc_i             : in IRC_COUNT_OUTPUT_Array_Type((num_irc_g-1) downto 0);
56                 -- Index resetting
57                 irc_index_reset_o : out std_logic_vector((num_irc_g-1) downto 0);
58                 -- BRAM access
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)
65         );
66         end component;
67
68         -- IRC coprocessor INC
69         component irc_proc_inc
70         generic
71         (
72                 num_irc_g  : positive := 4
73         );
74         port
75         (
76                 -- Clock
77                 clk_i   : in std_logic;
78                 reset_i : in std_logic;
79                 -- Output
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)
82         );
83         end component;
84
85         -- IRC reader
86         component irc_reader
87         port
88         (
89                 -- Inputs
90     clk_i                : in std_logic;
91     reset_i              : in std_logic;
92     irc_i                : in IRC_INPUT_Type;
93                 -- State
94                 reset_index_event_i  : in std_logic;
95                 reset_index_event2_i : in std_logic;
96                 reset_ab_error_i     : in std_logic;
97                 -- Outputs
98     irc_o                : out IRC_OUTPUT_Type
99   );
100         end component;
101
102         -- Quadcount
103         component qcounter
104         port
105         (
106                 -- Inputs
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;
111                 -- State
112                 reset_index_event_i  : in std_logic;
113                 reset_index_event2_i : in std_logic;
114                 reset_ab_error_i     : in std_logic;
115                 -- Outputs
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
124   );
125         end component;
126
127         -- D sampler
128         component dff
129         port
130         (
131     clk_i   : in std_logic;
132                 reset_i : in std_logic;
133     d_i     : in std_logic;
134     q_o     : out std_logic
135   );
136   end component;
137
138         -- D sampler (filtered)
139         component dff2
140         port
141         (
142     clk_i   : in std_logic;
143                 reset_i : in std_logic;
144     d_i     : in std_logic;
145     q_o     : out std_logic
146   );
147   end component;
148
149         component crc
150   port
151         (
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)
156   );
157         end component;
158
159         -- LX Master
160         component lxmaster_transmitter
161         port
162         (
163                 clk_i             : in std_logic;
164                 reset_i           : in std_logic;
165                 -- Transmision
166                 clock_o           : out std_logic;
167                 mosi_o            : out std_logic;
168                 sync_o            : out std_logic;
169                 -- Register
170                 register_i        : in std_logic;
171                 register_o        : out std_logic;
172                 register_we_i     : in std_logic;
173                 -- BRAM access
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)
180         );
181         end component;
182
183         --------------------------------------------------------------------------------
184         -- TUMBL
185         --------------------------------------------------------------------------------
186
187         component lx_rocon_tumbl
188         generic
189         (
190                 IMEM_ABITS_g         : positive := 11;
191                 DMEM_ABITS_g         : positive := 12;
192                 --
193                 USE_HW_MUL_g         : boolean := true;
194                 USE_BARREL_g         : boolean := true;
195                 COMPATIBILITY_MODE_g : boolean := false
196         );
197         port
198         (
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;
205                 -- Program counter
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
228         );
229         end component;
230
231         component lx_rocon_imem
232         port
233         (
234                 -- Memory wiring for Tumbl
235                 clk_i  : in std_logic;
236                 cs_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;
241     en_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)
246         );
247         end component;
248
249         component lx_rocon_dmem
250         port
251         (
252     -- Memory wiring for Tumbl
253                 clk_i  : in std_logic;
254                 ce_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;
261     en_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)
266         );
267         end component;
268
269         component lx_rocon_gprf_abd
270         port
271         (
272                 clk_i        :  in std_logic;
273                 rst_i        :  in std_logic;
274                 clken_i      :  in std_logic;
275                 --
276                 ID2GPRF_i    :  in ID2GPRF_Type;
277                 MEM_WRB_i    :  in WRB_Type;
278                 GPRF2EX_o    :  out GPRF2EX_Type
279         );
280         end component;
281
282         --------------------------------------------------------------------------------
283         -- MEMORY BUS
284         --------------------------------------------------------------------------------
285
286         -- Measurement register
287         component measurement_register
288         generic
289         (
290                 id_g   : std_logic_vector(31 downto 0) := (others => '0')
291         );
292         port
293         (
294                 -- Clock
295                 clk_i    : in std_logic;
296                 -- Reset
297                 reset_i  : in std_logic;
298                 -- Chip enable
299                 ce_i     : in std_logic;
300                 -- Switch
301                 switch_i : in std_logic;
302                 -- Data bus
303                 data_i   : in std_logic_vector(31 downto 0);
304                 data_o   : out std_logic_vector(31 downto 0);
305                 -- Bus signals
306                 bls_i    : in std_logic_vector(3 downto 0)
307         );
308         end component;
309
310         -- IRC interconnect
311         component bus_irc
312         port
313         (
314                 clk_i        : in std_logic;
315                 reset_i      : in std_logic;
316                 -- Data bus
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);
321                 --
322                 bls_i        : in std_logic_vector(3 downto 0);
323                 -- Signals for IRC
324                 irc_i        : in IRC_INPUT_Array_Type(7 downto 0)
325         );
326         end component;
327
328         -- Measurement interconnect
329         component bus_measurement
330         port
331         (
332                 -- Clock
333                 clk_i     : in std_logic;
334                 -- Reset
335                 reset_i   : in std_logic;
336                 -- Chip enable
337                 ce_i      : in std_logic;
338                 -- Address
339                 address_i : in std_logic_vector(1 downto 0);
340                 -- Data bus
341                 data_i    : in std_logic_vector(31 downto 0);
342                 data_o    : out std_logic_vector(31 downto 0);
343                 -- Bus signals
344                 bls_i     : in std_logic_vector(3 downto 0)
345         );
346         end component;
347
348         -- Tumbl interconnect
349         component bus_tumbl
350         port
351         (
352                 -- Clock
353                 clk_i        : in std_logic;
354                 -- Chip enable
355                 ce_i         : in std_logic;
356                 -- Global Reset
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
367   );
368         end component;
369
370         -- Register on the bus
371         component bus_register is
372         generic
373         (
374                 -- Reset value
375                 reset_value_g : std_logic_vector(31 downto 0) := (others => '0');
376                 -- Width
377                 b0_g          : natural := 8;
378                 b1_g          : natural := 8;
379                 b2_g          : natural := 8;
380                 b3_g          : natural := 8
381         );
382         port
383         (
384                 -- Clock
385                 clk_i         : in std_logic;
386                 -- Reset
387                 reset_i       : in std_logic;
388                 -- Chip enable
389                 ce_i          : in std_logic;
390                 -- Data bus
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);
393                 -- Bus signals
394                 bls_i         : in std_logic_vector(3 downto 0)
395         );
396         end component;
397
398         -- LX Master bus interconnect
399         component bus_lxmaster
400         port
401         (
402                 clk_i        : in std_logic;
403                 reset_i      : in std_logic;
404                 -- Data bus
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);
409                 --
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
415         );
416         end component;
417
418         --------------------------------------------------------------------------------
419         -- BRAM
420         --------------------------------------------------------------------------------
421
422         component xilinx_dualport_bram_write_first
423         generic
424         (
425                 byte_width    : positive := 8;
426                 address_width : positive := 8;
427                 we_width      : positive := 4
428         );
429         port
430         (
431                 clka  : in std_logic;
432                 rsta  : in std_logic;
433                 ena   : in std_logic;
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);
438                 clkb  : in std_logic;
439                 rstb  : in std_logic;
440                 enb   : in std_logic;
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)
445         );
446         end component;
447
448         component xilinx_dualport_bram_no_change
449         generic
450         (
451                 byte_width    : positive := 8;
452                 address_width : positive := 8;
453                 we_width      : positive := 4
454         );
455         port
456         (
457                 clka  : in std_logic;
458                 rsta  : in std_logic;
459                 ena   : in std_logic;
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);
464                 clkb  : in std_logic;
465                 rstb  : in std_logic;
466                 enb   : in std_logic;
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)
471         );
472         end component;
473
474 end lx_rocon_pkg;
475
476 package body lx_rocon_pkg is
477
478 end lx_rocon_pkg;