]> rtime.felk.cvut.cz Git - fpga/lx-cpu1/lx-rocon.git/blob - hw/lx_rocon_pkg.vhd
RoCoN: correct computation of channel location for case with multiple LXPWR slaves.
[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         -- Clock Cross Domain Synchronization Elastic Buffer/FIFO
236         component lx_crosdom_ser_fifo
237         generic
238         (
239                 fifo_len_g   : positive := 8;
240                 sync_adj_g   : integer := 0
241         );
242         port
243         (
244                 -- Asynchronous clock domain interface
245                 acd_clock_i  : in std_logic;
246                 acd_miso_i   : in std_logic;
247                 acd_sync_i   : in std_logic;
248                 -- Clock
249                 clk_i        : in std_logic;
250                 reset_i      : in std_logic;
251                 -- Output synchronous with clk_i
252                 miso_o       : out std_logic;
253                 sync_o       : out std_logic;
254                 data_ready_o : out std_logic
255         );
256         end component;
257
258         --------------------------------------------------------------------------------
259         -- TUMBL
260         --------------------------------------------------------------------------------
261
262         component lx_rocon_tumbl
263         generic
264         (
265                 IMEM_ABITS_g         : positive := 11;
266                 DMEM_ABITS_g         : positive := 12;
267                 --
268                 USE_HW_MUL_g         : boolean := true;
269                 USE_BARREL_g         : boolean := true;
270                 COMPATIBILITY_MODE_g : boolean := false
271         );
272         port
273         (
274                 clk_i        :  in std_logic;
275                 rst_i        :  in std_logic;
276           halt_i       :  in std_logic;
277                 int_i        :  in std_logic;
278                 trace_i      :  in std_logic;
279                 trace_kick_i :  in std_logic;
280                 -- Program counter
281                 pc_o         : out std_logic_vector(31 downto 0);
282                 -- Internal halt (remove with trace kick)
283                 halted_o     : out std_logic;
284                 halt_code_o  : out std_logic_vector(4 downto 0);
285                 -- Internal memory (instruction)
286                 imem_clk_i   : in std_logic;
287     imem_en_i    : in std_logic;
288     imem_we_i    : in std_logic_vector(3 downto 0);
289     imem_addr_i  : in std_logic_vector(8 downto 0);
290     imem_data_i  : in std_logic_vector(31 downto 0);
291     imem_data_o  : out std_logic_vector(31 downto 0);
292                 -- Internal memory (data)
293                 dmem_clk_i   : in std_logic;
294     dmem_en_i    : in std_logic;
295     dmem_we_i    : in std_logic_vector(3 downto 0);
296     dmem_addr_i  : in std_logic_vector(9 downto 0);
297     dmem_data_i  : in std_logic_vector(31 downto 0);
298     dmem_data_o  : out std_logic_vector(31 downto 0);
299                 -- External memory bus
300                 xmemb_sel_o  : out std_logic;
301                 xmemb_i      : in DMEMB2CORE_Type;
302                 xmemb_o      : out CORE2DMEMB_Type
303         );
304         end component;
305
306         component lx_rocon_imem
307         port
308         (
309                 -- Memory wiring for Tumbl
310                 clk_i  : in std_logic;
311                 cs_i   : in std_logic;
312                 adr_i  : in std_logic_vector(10 downto 2);
313                 dat_o  : out std_logic_vector(31 downto 0);
314                 -- Memory wiring for Master CPU
315                 clk_m  : in std_logic;
316     en_m   : in std_logic;
317     we_m   : in std_logic_vector(3 downto 0);
318     addr_m : in std_logic_vector(8 downto 0);
319     din_m  : in std_logic_vector(31 downto 0);
320     dout_m : out std_logic_vector(31 downto 0)
321         );
322         end component;
323
324         component lx_rocon_dmem
325         port
326         (
327     -- Memory wiring for Tumbl
328                 clk_i  : in std_logic;
329                 ce_i   : in std_logic;
330                 adr_i  : in std_logic_vector(11 downto 2);
331                 bls_i  : in std_logic_vector(3 downto 0);
332                 dat_i  : in std_logic_vector(31 downto 0);
333                 dat_o  : out std_logic_vector(31 downto 0);
334                 -- Memory wiring for Master CPU
335                 clk_m  : in std_logic;
336     en_m   : in std_logic;
337     we_m   : in std_logic_vector(3 downto 0);
338     addr_m : in std_logic_vector(9 downto 0);
339     din_m  : in std_logic_vector(31 downto 0);
340     dout_m : out std_logic_vector(31 downto 0)
341         );
342         end component;
343
344         component lx_rocon_gprf_abd
345         port
346         (
347                 clk_i        :  in std_logic;
348                 rst_i        :  in std_logic;
349                 clken_i      :  in std_logic;
350                 --
351                 ID2GPRF_i    :  in ID2GPRF_Type;
352                 MEM_WRB_i    :  in WRB_Type;
353                 GPRF2EX_o    :  out GPRF2EX_Type
354         );
355         end component;
356
357         --------------------------------------------------------------------------------
358         -- MEMORY BUS
359         --------------------------------------------------------------------------------
360
361         -- Measurement register
362         component measurement_register
363         generic
364         (
365                 id_g   : std_logic_vector(31 downto 0) := (others => '0')
366         );
367         port
368         (
369                 -- Clock
370                 clk_i    : in std_logic;
371                 -- Reset
372                 reset_i  : in std_logic;
373                 -- Chip enable
374                 ce_i     : in std_logic;
375                 -- Switch
376                 switch_i : in std_logic;
377                 -- Data bus
378                 data_i   : in std_logic_vector(31 downto 0);
379                 data_o   : out std_logic_vector(31 downto 0);
380                 -- Bus signals
381                 bls_i    : in std_logic_vector(3 downto 0)
382         );
383         end component;
384
385         -- IRC interconnect
386         component bus_irc
387         port
388         (
389                 clk_i        : in std_logic;
390                 reset_i      : in std_logic;
391                 -- Data bus
392                 address_i    : in std_logic_vector(4 downto 0);
393                 next_ce_i    : in std_logic;
394                 data_i       : in std_logic_vector(31 downto 0);
395                 data_o       : out std_logic_vector(31 downto 0);
396                 --
397                 bls_i        : in std_logic_vector(3 downto 0);
398                 -- Signals for IRC
399                 irc_i        : in IRC_INPUT_Array_Type(7 downto 0)
400         );
401         end component;
402
403         -- Measurement interconnect
404         component bus_measurement
405         port
406         (
407                 -- Clock
408                 clk_i     : in std_logic;
409                 -- Reset
410                 reset_i   : in std_logic;
411                 -- Chip enable
412                 ce_i      : in std_logic;
413                 -- Address
414                 address_i : in std_logic_vector(1 downto 0);
415                 -- Data bus
416                 data_i    : in std_logic_vector(31 downto 0);
417                 data_o    : out std_logic_vector(31 downto 0);
418                 -- Bus signals
419                 bls_i     : in std_logic_vector(3 downto 0)
420         );
421         end component;
422
423         -- Tumbl interconnect
424         component bus_tumbl
425         port
426         (
427                 -- Clock
428                 clk_i        : in std_logic;
429                 -- Chip enable
430                 ce_i         : in std_logic;
431                 -- Global Reset
432                 reset_i      : in std_logic;
433                 -- Master CPU bus for the memory
434     bls_i        : in std_logic_vector(3 downto 0);
435     address_i    : in std_logic_vector(11 downto 0);
436     data_i       : in std_logic_vector(31 downto 0);
437     data_o       : out std_logic_vector(31 downto 0);
438                 -- Tumbl extrenal memory bus
439                 xmemb_sel_o  : out std_logic;
440                 xmemb_i      : in DMEMB2CORE_Type;
441                 xmemb_o      : out CORE2DMEMB_Type
442   );
443         end component;
444
445         -- Register on the bus
446         component bus_register is
447         generic
448         (
449                 -- Reset value
450                 reset_value_g : std_logic_vector(31 downto 0) := (others => '0');
451                 -- Width
452                 b0_g          : natural := 8;
453                 b1_g          : natural := 8;
454                 b2_g          : natural := 8;
455                 b3_g          : natural := 8
456         );
457         port
458         (
459                 -- Clock
460                 clk_i         : in std_logic;
461                 -- Reset
462                 reset_i       : in std_logic;
463                 -- Chip enable
464                 ce_i          : in std_logic;
465                 -- Data bus
466                 data_i        : in std_logic_vector((b0_g+b1_g+b2_g+b3_g-1) downto 0);
467                 data_o        : out std_logic_vector((b0_g+b1_g+b2_g+b3_g-1) downto 0);
468                 -- Bus signals
469                 bls_i         : in std_logic_vector(3 downto 0)
470         );
471         end component;
472
473         -- LX Master bus interconnect
474         component bus_lxmaster
475         port
476         (
477                 clk_i        : in std_logic;
478                 reset_i      : in std_logic;
479                 -- Data bus
480                 address_i    : in std_logic_vector(10 downto 0);
481                 next_ce_i    : in std_logic;
482                 data_i       : in std_logic_vector(15 downto 0);
483                 data_o       : out std_logic_vector(15 downto 0);
484                 --
485                 bls_i        : in std_logic_vector(1 downto 0);
486                 --
487                 rx_done_o    : out std_logic;
488                 -- Signals for LX Master
489                 clock_i      : in std_logic;
490                 miso_i       : in std_logic;
491                 sync_i       : in std_logic;
492                 --
493                 clock_o      : out std_logic;
494                 mosi_o       : out std_logic;
495                 sync_o       : out std_logic
496         );
497         end component;
498
499         --------------------------------------------------------------------------------
500         -- BRAM
501         --------------------------------------------------------------------------------
502         type BRAM_type is (READ_FIRST, WRITE_FIRST, NO_CHANGE);
503
504         component xilinx_dualport_bram
505         generic
506         (
507                 byte_width    : positive := 8;
508                 address_width : positive := 8;
509                 we_width      : positive := 4;
510                 port_a_type   : BRAM_type := READ_FIRST;
511                 port_b_type   : BRAM_type := READ_FIRST
512         );
513         port
514         (
515                 clka  : in std_logic;
516                 rsta  : in std_logic;
517                 ena   : in std_logic;
518                 wea   : in std_logic_vector((we_width-1) downto 0);
519                 addra : in std_logic_vector((address_width-1) downto 0);
520                 dina  : in std_logic_vector(((byte_width*we_width)-1) downto 0);
521                 douta : out std_logic_vector(((byte_width*we_width)-1) downto 0);
522                 clkb  : in std_logic;
523                 rstb  : in std_logic;
524                 enb   : in std_logic;
525                 web   : in std_logic_vector((we_width-1) downto 0);
526                 addrb : in std_logic_vector((address_width-1) downto 0);
527                 dinb  : in std_logic_vector(((byte_width*we_width)-1) downto 0);
528                 doutb : out std_logic_vector(((byte_width*we_width)-1) downto 0)
529         );
530         end component;
531
532 end lx_rocon_pkg;
533
534 package body lx_rocon_pkg is
535
536 end lx_rocon_pkg;