]> rtime.felk.cvut.cz Git - fpga/lx-cpu1/lx-rocon.git/blob - hw/lx_rocon_pkg.vhd
Include initial stub of function generator to LX HW design.
[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                 next_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                 --
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                 next_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                 next_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;