]> rtime.felk.cvut.cz Git - fpga/lx-cpu1/lx-rocon.git/blob - hw/lx_rocon_pkg.vhd
Provide output event indication end of reception from LXPWR.
[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 transmitter
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         -- LX Master receiver
188         component lxmaster_receiver
189         port
190         (
191                 clk_i             : in std_logic;
192                 reset_i           : in std_logic;
193                 -- Transmision
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;
199                 -- Register
200                 register_i        : in std_logic;
201                 register_o        : out std_logic_vector(1 downto 0);
202                 register_we_i     : in std_logic;
203                 -- BRAM access
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)
210         );
211         end component;
212
213         -- Clock Cross Domain Synchronization Elastic Buffer/FIFO
214         component lx_crosdom_ser_fifo
215         generic
216         (
217                 fifo_len_g   : positive := 8;
218                 sync_adj_g   : integer := 0
219         );
220         port
221         (
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;
226                 -- Clock
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
233         );
234         end component;
235
236         --------------------------------------------------------------------------------
237         -- TUMBL
238         --------------------------------------------------------------------------------
239
240         component lx_rocon_tumbl
241         generic
242         (
243                 IMEM_ABITS_g         : positive := 11;
244                 DMEM_ABITS_g         : positive := 12;
245                 --
246                 USE_HW_MUL_g         : boolean := true;
247                 USE_BARREL_g         : boolean := true;
248                 COMPATIBILITY_MODE_g : boolean := false
249         );
250         port
251         (
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;
258                 -- Program counter
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
281         );
282         end component;
283
284         component lx_rocon_imem
285         port
286         (
287                 -- Memory wiring for Tumbl
288                 clk_i  : in std_logic;
289                 cs_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;
294     en_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)
299         );
300         end component;
301
302         component lx_rocon_dmem
303         port
304         (
305     -- Memory wiring for Tumbl
306                 clk_i  : in std_logic;
307                 ce_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;
314     en_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)
319         );
320         end component;
321
322         component lx_rocon_gprf_abd
323         port
324         (
325                 clk_i        :  in std_logic;
326                 rst_i        :  in std_logic;
327                 clken_i      :  in std_logic;
328                 --
329                 ID2GPRF_i    :  in ID2GPRF_Type;
330                 MEM_WRB_i    :  in WRB_Type;
331                 GPRF2EX_o    :  out GPRF2EX_Type
332         );
333         end component;
334
335         --------------------------------------------------------------------------------
336         -- MEMORY BUS
337         --------------------------------------------------------------------------------
338
339         -- Measurement register
340         component measurement_register
341         generic
342         (
343                 id_g   : std_logic_vector(31 downto 0) := (others => '0')
344         );
345         port
346         (
347                 -- Clock
348                 clk_i    : in std_logic;
349                 -- Reset
350                 reset_i  : in std_logic;
351                 -- Chip enable
352                 ce_i     : in std_logic;
353                 -- Switch
354                 switch_i : in std_logic;
355                 -- Data bus
356                 data_i   : in std_logic_vector(31 downto 0);
357                 data_o   : out std_logic_vector(31 downto 0);
358                 -- Bus signals
359                 bls_i    : in std_logic_vector(3 downto 0)
360         );
361         end component;
362
363         -- IRC interconnect
364         component bus_irc
365         port
366         (
367                 clk_i        : in std_logic;
368                 reset_i      : in std_logic;
369                 -- Data bus
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);
374                 --
375                 bls_i        : in std_logic_vector(3 downto 0);
376                 -- Signals for IRC
377                 irc_i        : in IRC_INPUT_Array_Type(7 downto 0)
378         );
379         end component;
380
381         -- Measurement interconnect
382         component bus_measurement
383         port
384         (
385                 -- Clock
386                 clk_i     : in std_logic;
387                 -- Reset
388                 reset_i   : in std_logic;
389                 -- Chip enable
390                 ce_i      : in std_logic;
391                 -- Address
392                 address_i : in std_logic_vector(1 downto 0);
393                 -- Data bus
394                 data_i    : in std_logic_vector(31 downto 0);
395                 data_o    : out std_logic_vector(31 downto 0);
396                 -- Bus signals
397                 bls_i     : in std_logic_vector(3 downto 0)
398         );
399         end component;
400
401         -- Tumbl interconnect
402         component bus_tumbl
403         port
404         (
405                 -- Clock
406                 clk_i        : in std_logic;
407                 -- Chip enable
408                 ce_i         : in std_logic;
409                 -- Global Reset
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
420   );
421         end component;
422
423         -- Register on the bus
424         component bus_register is
425         generic
426         (
427                 -- Reset value
428                 reset_value_g : std_logic_vector(31 downto 0) := (others => '0');
429                 -- Width
430                 b0_g          : natural := 8;
431                 b1_g          : natural := 8;
432                 b2_g          : natural := 8;
433                 b3_g          : natural := 8
434         );
435         port
436         (
437                 -- Clock
438                 clk_i         : in std_logic;
439                 -- Reset
440                 reset_i       : in std_logic;
441                 -- Chip enable
442                 ce_i          : in std_logic;
443                 -- Data bus
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);
446                 -- Bus signals
447                 bls_i         : in std_logic_vector(3 downto 0)
448         );
449         end component;
450
451         -- LX Master bus interconnect
452         component bus_lxmaster
453         port
454         (
455                 clk_i        : in std_logic;
456                 reset_i      : in std_logic;
457                 -- Data bus
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);
462                 --
463                 bls_i        : in std_logic_vector(1 downto 0);
464                 --
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;
470                 --
471                 clock_o      : out std_logic;
472                 mosi_o       : out std_logic;
473                 sync_o       : out std_logic
474         );
475         end component;
476
477         --------------------------------------------------------------------------------
478         -- BRAM
479         --------------------------------------------------------------------------------
480         type BRAM_type is (READ_FIRST, WRITE_FIRST, NO_CHANGE);
481
482         component xilinx_dualport_bram
483         generic
484         (
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
490         );
491         port
492         (
493                 clka  : in std_logic;
494                 rsta  : in std_logic;
495                 ena   : in std_logic;
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);
500                 clkb  : in std_logic;
501                 rstb  : in std_logic;
502                 enb   : in std_logic;
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)
507         );
508         end component;
509
510 end lx_rocon_pkg;
511
512 package body lx_rocon_pkg is
513
514 end lx_rocon_pkg;