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