]> rtime.felk.cvut.cz Git - fpga/lx-cpu1/lx-rocon.git/blob - hw/lx_rocon_pkg.vhd
f81465295c1d673a5baacb91b30f30b594433d2a
[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        : std_logic;
29                 index_event  : std_logic;
30                 mark         : std_logic;
31         end record;
32         --
33         type IRC_OUTPUT_Type is record
34                 count       : IRC_COUNT_OUTPUT_Type;
35                 state       : IRC_STATE_OUTPUT_Type;
36         end record;
37
38         -- Arrays
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;
43
44         -- IRC coprocessor MAIN
45         component irc_proc_main
46         generic
47         (
48                 num_irc_g  : positive := 4
49         );
50         port
51         (
52                 -- Basic input
53                 clk_i             : in std_logic;
54                 reset_i           : in std_logic;
55                 -- Signals from IRC
56                 irc_i             : in IRC_COUNT_OUTPUT_Array_Type((num_irc_g-1) downto 0);
57                 -- Index resetting
58                 irc_index_reset_o : out std_logic_vector((num_irc_g-1) downto 0);
59                 -- BRAM access
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)
66         );
67         end component;
68
69         -- IRC coprocessor INC
70         component irc_proc_inc
71         generic
72         (
73                 num_irc_g  : positive := 4
74         );
75         port
76         (
77                 -- Clock
78                 clk_i   : in std_logic;
79                 reset_i : in std_logic;
80                 -- Output
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)
83         );
84         end component;
85
86         -- IRC reader
87         component irc_reader
88         port
89         (
90                 -- Inputs
91     clk_i                : in std_logic;
92     reset_i              : in std_logic;
93     irc_i                : in IRC_INPUT_Type;
94                 -- State
95                 reset_index_event_i  : in std_logic;
96                 reset_index_event2_i : in std_logic;
97                 reset_ab_error_i     : in std_logic;
98                 -- Outputs
99     irc_o                : out IRC_OUTPUT_Type
100   );
101         end component;
102
103         -- Quadcount
104         component qcounter
105         port
106         (
107                 -- Inputs
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;
112                 -- State
113                 reset_index_event_i  : in std_logic;
114                 reset_index_event2_i : in std_logic;
115                 reset_ab_error_i     : in std_logic;
116                 -- Outputs
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
126   );
127         end component;
128
129         -- D sampler (filtered, 2 cycles)
130         component dff2
131         port
132         (
133     clk_i   : in std_logic;
134     d_i     : in std_logic;
135     q_o     : out std_logic
136   );
137   end component;
138
139         -- D sampler (filtered, 3 cycles)
140         component dff3
141         port
142         (
143     clk_i   : in std_logic;
144     d_i     : in std_logic;
145     q_o     : out std_logic
146   );
147   end component;
148
149         -- CRC8
150         component crc
151   port
152         (
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)
157   );
158         end component;
159
160         -- LX Master
161         component lxmaster_transmitter
162         port
163         (
164                 clk_i             : in std_logic;
165                 reset_i           : in std_logic;
166                 -- Transmision
167                 clock_o           : out std_logic;
168                 mosi_o            : out std_logic;
169                 sync_o            : out std_logic;
170                 -- Register
171                 register_i        : in std_logic;
172                 register_o        : out std_logic_vector(1 downto 0);
173                 register_we_i     : in std_logic;
174                 -- Watchdog
175                 wdog_i            : in std_logic;
176                 wdog_we_i         : in std_logic;
177                 -- BRAM access
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)
184         );
185         end component;
186
187         --------------------------------------------------------------------------------
188         -- TUMBL
189         --------------------------------------------------------------------------------
190
191         component lx_rocon_tumbl
192         generic
193         (
194                 IMEM_ABITS_g         : positive := 11;
195                 DMEM_ABITS_g         : positive := 12;
196                 --
197                 USE_HW_MUL_g         : boolean := true;
198                 USE_BARREL_g         : boolean := true;
199                 COMPATIBILITY_MODE_g : boolean := false
200         );
201         port
202         (
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;
209                 -- Program counter
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
232         );
233         end component;
234
235         component lx_rocon_imem
236         port
237         (
238                 -- Memory wiring for Tumbl
239                 clk_i  : in std_logic;
240                 cs_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;
245     en_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)
250         );
251         end component;
252
253         component lx_rocon_dmem
254         port
255         (
256     -- Memory wiring for Tumbl
257                 clk_i  : in std_logic;
258                 ce_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;
265     en_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)
270         );
271         end component;
272
273         component lx_rocon_gprf_abd
274         port
275         (
276                 clk_i        :  in std_logic;
277                 rst_i        :  in std_logic;
278                 clken_i      :  in std_logic;
279                 --
280                 ID2GPRF_i    :  in ID2GPRF_Type;
281                 MEM_WRB_i    :  in WRB_Type;
282                 GPRF2EX_o    :  out GPRF2EX_Type
283         );
284         end component;
285
286         --------------------------------------------------------------------------------
287         -- MEMORY BUS
288         --------------------------------------------------------------------------------
289
290         -- Measurement register
291         component measurement_register
292         generic
293         (
294                 id_g   : std_logic_vector(31 downto 0) := (others => '0')
295         );
296         port
297         (
298                 -- Clock
299                 clk_i    : in std_logic;
300                 -- Reset
301                 reset_i  : in std_logic;
302                 -- Chip enable
303                 ce_i     : in std_logic;
304                 -- Switch
305                 switch_i : in std_logic;
306                 -- Data bus
307                 data_i   : in std_logic_vector(31 downto 0);
308                 data_o   : out std_logic_vector(31 downto 0);
309                 -- Bus signals
310                 bls_i    : in std_logic_vector(3 downto 0)
311         );
312         end component;
313
314         -- IRC interconnect
315         component bus_irc
316         port
317         (
318                 clk_i        : in std_logic;
319                 reset_i      : in std_logic;
320                 -- Data bus
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);
325                 --
326                 bls_i        : in std_logic_vector(3 downto 0);
327                 -- Signals for IRC
328                 irc_i        : in IRC_INPUT_Array_Type(7 downto 0)
329         );
330         end component;
331
332         -- Measurement interconnect
333         component bus_measurement
334         port
335         (
336                 -- Clock
337                 clk_i     : in std_logic;
338                 -- Reset
339                 reset_i   : in std_logic;
340                 -- Chip enable
341                 ce_i      : in std_logic;
342                 -- Address
343                 address_i : in std_logic_vector(1 downto 0);
344                 -- Data bus
345                 data_i    : in std_logic_vector(31 downto 0);
346                 data_o    : out std_logic_vector(31 downto 0);
347                 -- Bus signals
348                 bls_i     : in std_logic_vector(3 downto 0)
349         );
350         end component;
351
352         -- Tumbl interconnect
353         component bus_tumbl
354         port
355         (
356                 -- Clock
357                 clk_i        : in std_logic;
358                 -- Chip enable
359                 ce_i         : in std_logic;
360                 -- Global Reset
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
371   );
372         end component;
373
374         -- Register on the bus
375         component bus_register is
376         generic
377         (
378                 -- Reset value
379                 reset_value_g : std_logic_vector(31 downto 0) := (others => '0');
380                 -- Width
381                 b0_g          : natural := 8;
382                 b1_g          : natural := 8;
383                 b2_g          : natural := 8;
384                 b3_g          : natural := 8
385         );
386         port
387         (
388                 -- Clock
389                 clk_i         : in std_logic;
390                 -- Reset
391                 reset_i       : in std_logic;
392                 -- Chip enable
393                 ce_i          : in std_logic;
394                 -- Data bus
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);
397                 -- Bus signals
398                 bls_i         : in std_logic_vector(3 downto 0)
399         );
400         end component;
401
402         -- LX Master bus interconnect
403         component bus_lxmaster
404         port
405         (
406                 clk_i        : in std_logic;
407                 reset_i      : in std_logic;
408                 -- Data bus
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);
413                 --
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;
419                 --
420                 clock_o      : out std_logic;
421                 mosi_o       : out std_logic;
422                 sync_o       : out std_logic
423         );
424         end component;
425
426         --------------------------------------------------------------------------------
427         -- BRAM
428         --------------------------------------------------------------------------------
429         type BRAM_type is (READ_FIRST, WRITE_FIRST, NO_CHANGE);
430
431         component xilinx_dualport_bram
432         generic
433         (
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
439         );
440         port
441         (
442                 clka  : in std_logic;
443                 rsta  : in std_logic;
444                 ena   : in std_logic;
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);
449                 clkb  : in std_logic;
450                 rstb  : in std_logic;
451                 enb   : in std_logic;
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)
456         );
457         end component;
458
459 end lx_rocon_pkg;
460
461 package body lx_rocon_pkg is
462
463 end lx_rocon_pkg;