]> rtime.felk.cvut.cz Git - fpga/lx-cpu1/lx-rocon.git/blob - hw/lx_rocon_pkg.vhd
15cc6dbb6eb7a4174884bdb52763aa4d5724a44e
[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         -- Counter - divider
161         component cnt_div
162         generic (
163                 cnt_width_g : natural := 8
164         );
165         port
166         (
167                 clk_i     : in std_logic;
168                 en_i      : in std_logic;
169                 reset_i   : in std_logic;
170                 ratio_i   : in std_logic_vector(cnt_width_g-1 downto 0);
171                 q_out_o   : out std_logic
172         );
173         end component;
174
175         -- LX Master transmitter
176         component lxmaster_transmitter
177         generic (
178                 cycle_cnt_width_g : natural := 12
179         );
180         port
181         (
182                 clk_i             : in std_logic;
183                 reset_i           : in std_logic;
184                 -- Transmision
185                 clock_o           : out std_logic;
186                 mosi_o            : out std_logic;
187                 sync_o            : out std_logic;
188                 -- Register
189                 register_i        : in std_logic;
190                 register_o        : out std_logic_vector(1 downto 0);
191                 register_we_i     : in std_logic;
192                 -- Cycle period
193                 cycle_reg_i       : in std_logic_vector(cycle_cnt_width_g-1 downto 0);
194                 cycle_reg_o       : out std_logic_vector(cycle_cnt_width_g-1 downto 0);
195                 cycle_reg_we_i    : in std_logic;
196                 -- Watchdog
197                 wdog_i            : in std_logic;
198                 wdog_we_i         : in std_logic;
199                 -- BRAM access
200                 mem_clk_i         : in std_logic;
201     mem_en_i          : in std_logic;
202     mem_we_i          : in std_logic_vector(1 downto 0);
203     mem_addr_i        : in std_logic_vector(8 downto 0);
204     mem_data_i        : in std_logic_vector(15 downto 0);
205     mem_data_o        : out std_logic_vector(15 downto 0)
206         );
207         end component;
208
209         -- LX Master receiver
210         component lxmaster_receiver
211         port
212         (
213                 clk_i             : in std_logic;
214                 reset_i           : in std_logic;
215                 -- Transmision
216                 clock_i           : in std_logic;
217                 miso_i            : in std_logic;
218                 sync_i            : in std_logic;
219                 -- Receive done pulse
220                 rx_done_o         : out std_logic;
221                 -- Register
222                 register_i        : in std_logic;
223                 register_o        : out std_logic_vector(1 downto 0);
224                 register_we_i     : in std_logic;
225                 -- BRAM access
226                 mem_clk_i         : in std_logic;
227                 mem_en_i          : in std_logic;
228                 mem_we_i          : in std_logic_vector(1 downto 0);
229                 mem_addr_i        : in std_logic_vector(8 downto 0);
230                 mem_data_i        : in std_logic_vector(15 downto 0);
231                 mem_data_o        : out std_logic_vector(15 downto 0)
232         );
233         end component;
234
235         -- LX math functions approximation
236
237         component lx_fncapprox
238         port
239         (
240                 clk_i        : in std_logic;
241                 reset_i      : in std_logic;
242                 -- Data bus
243                 address_i    : in std_logic_vector(4 downto 0);
244                 ce_i         : in std_logic;
245                 data_i       : in std_logic_vector(31 downto 0);
246                 data_o       : out std_logic_vector(31 downto 0);
247                 --
248                 bls_i        : in std_logic_vector(3 downto 0)
249         );
250         end component;
251
252         -- Clock Cross Domain Synchronization Elastic Buffer/FIFO
253         component lx_crosdom_ser_fifo
254         generic
255         (
256                 fifo_len_g   : positive := 8;
257                 sync_adj_g   : integer := 0
258         );
259         port
260         (
261                 -- Asynchronous clock domain interface
262                 acd_clock_i  : in std_logic;
263                 acd_miso_i   : in std_logic;
264                 acd_sync_i   : in std_logic;
265                 -- Clock
266                 clk_i        : in std_logic;
267                 reset_i      : in std_logic;
268                 -- Output synchronous with clk_i
269                 miso_o       : out std_logic;
270                 sync_o       : out std_logic;
271                 data_ready_o : out std_logic
272         );
273         end component;
274
275         --------------------------------------------------------------------------------
276         -- TUMBL
277         --------------------------------------------------------------------------------
278
279         component lx_rocon_tumbl
280         generic
281         (
282                 IMEM_ABITS_g         : positive := 11;
283                 DMEM_ABITS_g         : positive := 12;
284                 --
285                 USE_HW_MUL_g         : boolean := true;
286                 USE_BARREL_g         : boolean := true;
287                 COMPATIBILITY_MODE_g : boolean := false
288         );
289         port
290         (
291                 clk_i        :  in std_logic;
292                 rst_i        :  in std_logic;
293           halt_i       :  in std_logic;
294                 int_i        :  in std_logic;
295                 trace_i      :  in std_logic;
296                 trace_kick_i :  in std_logic;
297                 -- Program counter
298                 pc_o         : out std_logic_vector(31 downto 0);
299                 -- Internal halt (remove with trace kick)
300                 halted_o     : out std_logic;
301                 halt_code_o  : out std_logic_vector(4 downto 0);
302                 -- Internal memory (instruction)
303                 imem_clk_i   : in std_logic;
304     imem_en_i    : in std_logic;
305     imem_we_i    : in std_logic_vector(3 downto 0);
306     imem_addr_i  : in std_logic_vector(8 downto 0);
307     imem_data_i  : in std_logic_vector(31 downto 0);
308     imem_data_o  : out std_logic_vector(31 downto 0);
309                 -- Internal memory (data)
310                 dmem_clk_i   : in std_logic;
311     dmem_en_i    : in std_logic;
312     dmem_we_i    : in std_logic_vector(3 downto 0);
313     dmem_addr_i  : in std_logic_vector(9 downto 0);
314     dmem_data_i  : in std_logic_vector(31 downto 0);
315     dmem_data_o  : out std_logic_vector(31 downto 0);
316                 -- External memory bus
317                 xmemb_sel_o  : out std_logic;
318                 xmemb_i      : in DMEMB2CORE_Type;
319                 xmemb_o      : out CORE2DMEMB_Type
320         );
321         end component;
322
323         component lx_rocon_imem
324         port
325         (
326                 -- Memory wiring for Tumbl
327                 clk_i  : in std_logic;
328                 cs_i   : in std_logic;
329                 adr_i  : in std_logic_vector(10 downto 2);
330                 dat_o  : out std_logic_vector(31 downto 0);
331                 -- Memory wiring for Master CPU
332                 clk_m  : in std_logic;
333     en_m   : in std_logic;
334     we_m   : in std_logic_vector(3 downto 0);
335     addr_m : in std_logic_vector(8 downto 0);
336     din_m  : in std_logic_vector(31 downto 0);
337     dout_m : out std_logic_vector(31 downto 0)
338         );
339         end component;
340
341         component lx_rocon_dmem
342         port
343         (
344     -- Memory wiring for Tumbl
345                 clk_i  : in std_logic;
346                 ce_i   : in std_logic;
347                 adr_i  : in std_logic_vector(11 downto 2);
348                 bls_i  : in std_logic_vector(3 downto 0);
349                 dat_i  : in std_logic_vector(31 downto 0);
350                 dat_o  : out std_logic_vector(31 downto 0);
351                 -- Memory wiring for Master CPU
352                 clk_m  : in std_logic;
353     en_m   : in std_logic;
354     we_m   : in std_logic_vector(3 downto 0);
355     addr_m : in std_logic_vector(9 downto 0);
356     din_m  : in std_logic_vector(31 downto 0);
357     dout_m : out std_logic_vector(31 downto 0)
358         );
359         end component;
360
361         component lx_rocon_gprf_abd
362         port
363         (
364                 clk_i        :  in std_logic;
365                 rst_i        :  in std_logic;
366                 clken_i      :  in std_logic;
367                 gprf_finish_wrb_mem_i :  in std_logic;
368                 --
369                 ID2GPRF_i    :  in ID2GPRF_Type;
370                 MEM_WRB_i    :  in WRB_Type;
371                 GPRF2EX_o    :  out GPRF2EX_Type
372         );
373         end component;
374
375         --------------------------------------------------------------------------------
376         -- MEMORY BUS
377         --------------------------------------------------------------------------------
378
379         -- Measurement register
380         component measurement_register
381         generic
382         (
383                 id_g   : std_logic_vector(31 downto 0) := (others => '0')
384         );
385         port
386         (
387                 -- Clock
388                 clk_i    : in std_logic;
389                 -- Reset
390                 reset_i  : in std_logic;
391                 -- Chip enable
392                 ce_i     : in std_logic;
393                 -- Switch
394                 switch_i : in std_logic;
395                 -- Data bus
396                 data_i   : in std_logic_vector(31 downto 0);
397                 data_o   : out std_logic_vector(31 downto 0);
398                 -- Bus signals
399                 bls_i    : in std_logic_vector(3 downto 0)
400         );
401         end component;
402
403         -- IRC interconnect
404         component bus_irc
405         port
406         (
407                 clk_i        : in std_logic;
408                 reset_i      : in std_logic;
409                 -- Data bus
410                 address_i    : in std_logic_vector(4 downto 0);
411                 ce_i         : in std_logic;
412                 data_i       : in std_logic_vector(31 downto 0);
413                 data_o       : out std_logic_vector(31 downto 0);
414                 --
415                 bls_i        : in std_logic_vector(3 downto 0);
416                 -- Signals for IRC
417                 irc_i        : in IRC_INPUT_Array_Type(7 downto 0)
418         );
419         end component;
420
421         -- Measurement interconnect
422         component bus_measurement
423         port
424         (
425                 -- Clock
426                 clk_i     : in std_logic;
427                 -- Reset
428                 reset_i   : in std_logic;
429                 -- Chip enable
430                 ce_i      : in std_logic;
431                 -- Address
432                 address_i : in std_logic_vector(1 downto 0);
433                 -- Data bus
434                 data_i    : in std_logic_vector(31 downto 0);
435                 data_o    : out std_logic_vector(31 downto 0);
436                 -- Bus signals
437                 bls_i     : in std_logic_vector(3 downto 0)
438         );
439         end component;
440
441         -- Tumbl interconnect
442         component bus_tumbl
443         port
444         (
445                 -- Clock
446                 clk_i        : in std_logic;
447                 -- Chip enable
448                 ce_i         : in std_logic;
449                 -- Global Reset
450                 reset_i      : in std_logic;
451                 -- Master CPU bus for the memory
452     bls_i        : in std_logic_vector(3 downto 0);
453     address_i    : in std_logic_vector(11 downto 0);
454     data_i       : in std_logic_vector(31 downto 0);
455     data_o       : out std_logic_vector(31 downto 0);
456                 -- Tumbl extrenal memory bus
457                 xmemb_sel_o  : out std_logic;
458                 xmemb_i      : in DMEMB2CORE_Type;
459                 xmemb_o      : out CORE2DMEMB_Type
460   );
461         end component;
462
463         -- Register on the bus
464         component bus_register is
465         generic
466         (
467                 -- Reset value
468                 reset_value_g : std_logic_vector(31 downto 0) := (others => '0');
469                 -- Width
470                 b0_g          : natural := 8;
471                 b1_g          : natural := 8;
472                 b2_g          : natural := 8;
473                 b3_g          : natural := 8
474         );
475         port
476         (
477                 -- Clock
478                 clk_i         : in std_logic;
479                 -- Reset
480                 reset_i       : in std_logic;
481                 -- Chip enable
482                 ce_i          : in std_logic;
483                 -- Data bus
484                 data_i        : in std_logic_vector((b0_g+b1_g+b2_g+b3_g-1) downto 0);
485                 data_o        : out std_logic_vector((b0_g+b1_g+b2_g+b3_g-1) downto 0);
486                 -- Bus signals
487                 bls_i         : in std_logic_vector(3 downto 0)
488         );
489         end component;
490
491         -- LX Master bus interconnect
492         component bus_lxmaster
493         port
494         (
495                 clk_i        : in std_logic;
496                 reset_i      : in std_logic;
497                 -- Data bus
498                 address_i    : in std_logic_vector(10 downto 0);
499                 ce_i         : in std_logic;
500                 data_i       : in std_logic_vector(15 downto 0);
501                 data_o       : out std_logic_vector(15 downto 0);
502                 --
503                 bls_i        : in std_logic_vector(1 downto 0);
504                 --
505                 rx_done_o    : out std_logic;
506                 -- Signals for LX Master
507                 clock_i      : in std_logic;
508                 miso_i       : in std_logic;
509                 sync_i       : in std_logic;
510                 --
511                 clock_o      : out std_logic;
512                 mosi_o       : out std_logic;
513                 sync_o       : out std_logic
514         );
515         end component;
516
517         --------------------------------------------------------------------------------
518         -- BRAM
519         --------------------------------------------------------------------------------
520         type BRAM_type is (READ_FIRST, WRITE_FIRST, NO_CHANGE);
521
522         component xilinx_dualport_bram
523         generic
524         (
525                 byte_width    : positive := 8;
526                 address_width : positive := 8;
527                 we_width      : positive := 4;
528                 port_a_type   : BRAM_type := READ_FIRST;
529                 port_b_type   : BRAM_type := READ_FIRST
530         );
531         port
532         (
533                 clka  : in std_logic;
534                 rsta  : in std_logic;
535                 ena   : in std_logic;
536                 wea   : in std_logic_vector((we_width-1) downto 0);
537                 addra : in std_logic_vector((address_width-1) downto 0);
538                 dina  : in std_logic_vector(((byte_width*we_width)-1) downto 0);
539                 douta : out std_logic_vector(((byte_width*we_width)-1) downto 0);
540                 clkb  : in std_logic;
541                 rstb  : in std_logic;
542                 enb   : in std_logic;
543                 web   : in std_logic_vector((we_width-1) downto 0);
544                 addrb : in std_logic_vector((address_width-1) downto 0);
545                 dinb  : in std_logic_vector(((byte_width*we_width)-1) downto 0);
546                 doutb : out std_logic_vector(((byte_width*we_width)-1) downto 0)
547         );
548         end component;
549
550 end lx_rocon_pkg;
551
552 package body lx_rocon_pkg is
553
554 end lx_rocon_pkg;