]> rtime.felk.cvut.cz Git - fpga/lx-cpu1/lx-rocon.git/blob - hw/lx_rocon_top.vhd
RoCoN: log requested position and I component accumulator as well.
[fpga/lx-cpu1/lx-rocon.git] / hw / lx_rocon_top.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
7 library unisim;
8 use unisim.vcomponents.all;
9
10 use work.mbl_pkg.all;
11 use work.lx_rocon_pkg.all;
12
13 -- lx_rocon_top - wires the modules with the outside world
14
15 -- ======================================================
16 --  MASTER CPU EXTERNAL MEMORY BUS
17 -- ======================================================
18 --
19 -- Master cpu memory bus has the following wires:
20 --
21 -- - address[15..0]          The address, used to mark chip enable
22 -- - data_in[31..0]          The data coming to bus
23 -- - data_out[31..0]         The data coming from bus, multiplexed
24 -- - bls[3..0]               Write enable for respective bytes
25
26 entity lx_rocon_top is
27         port
28         (
29                 -- External
30                 --clk_cpu     : in std_logic;
31                 clk_50m     : in std_logic;
32                 --
33                 cs0_xc      : in std_logic;
34                 --
35                 rd          : in std_logic;
36                 bls         : in std_logic_vector(3 downto 0);
37                 address     : in std_logic_vector(15 downto 0);
38                 data        : inout std_logic_vector(31 downto 0);
39                 --
40                 irc0_a      : in std_logic;
41                 irc0_b      : in std_logic;
42                 irc0_index  : in std_logic;
43                 irc0_mark   : in std_logic;
44                 --
45                 irc1_a      : in std_logic;
46                 irc1_b      : in std_logic;
47                 irc1_index  : in std_logic;
48                 irc1_mark   : in std_logic;
49                 --
50                 irc2_a      : in std_logic;
51                 irc2_b      : in std_logic;
52                 irc2_index  : in std_logic;
53                 irc2_mark   : in std_logic;
54                 --
55                 irc3_a      : in std_logic;
56                 irc3_b      : in std_logic;
57                 irc3_index  : in std_logic;
58                 irc3_mark   : in std_logic;
59                 --
60                 irc4_a      : in std_logic;
61                 irc4_b      : in std_logic;
62                 irc4_index  : in std_logic;
63                 irc4_mark   : in std_logic;
64                 --
65                 irc5_a      : in std_logic;
66                 irc5_b      : in std_logic;
67                 irc5_index  : in std_logic;
68                 irc5_mark   : in std_logic;
69                 --
70                 irc6_a      : in std_logic;
71                 irc6_b      : in std_logic;
72                 irc6_index  : in std_logic;
73                 irc6_mark   : in std_logic;
74                 --
75                 irc7_a      : in std_logic;
76                 irc7_b      : in std_logic;
77                 irc7_index  : in std_logic;
78                 irc7_mark   : in std_logic;
79                 --
80                 init        : in std_logic;
81                 --
82                 s1_clk_in   : in std_logic;
83                 s1_miso     : in std_logic;
84                 s1_sync_in  : in std_logic;
85                 --
86                 s1_clk_out  : out std_logic;
87                 s1_mosi     : out std_logic;
88                 s1_sync_out : out std_logic;
89                 -- signal connected to external JK FF
90                 event_jk_j  : out std_logic
91         );
92 end lx_rocon_top;
93
94 architecture Behavioral of lx_rocon_top is
95
96         -- Reset signal
97         signal reset_s                  : std_logic;
98         signal init_s                   : std_logic;
99         -- Peripherals on the memory buses
100         -- Master to Tumbl DMEM / IMEM (Master)
101         signal tumbl_out_s              : std_logic_vector(31 downto 0);
102         signal tumbl_ce_s               : std_logic;
103         signal tumbl_ce_r               : std_logic;
104         -- Measurement (Master)
105         signal meas_out_s               : std_logic_vector(31 downto 0);
106         signal meas_ce_s                : std_logic;
107         signal meas_ce_r                : std_logic;
108         -- Master to Tumbl XMEM
109         signal master_tumbl_xmem_out_s  : std_logic_vector(31 downto 0);
110         signal master_tumbl_xmem_ce_s   : std_logic;
111         signal master_tumbl_xmem_ce_r   : std_logic;
112         signal master_tumbl_xmem_lock_s : std_logic;
113         -- IRC (Tumbl)
114         signal irc_proc_out_s           : std_logic_vector(31 downto 0);
115         signal irc_proc_ce_s            : std_logic;
116         signal irc_proc_ce_r            : std_logic;
117         -- LX Master (Tumbl)
118         signal lxmaster_out_s           : std_logic_vector(15 downto 0);
119         signal lxmaster_ce_s            : std_logic;
120         signal lxmaster_ce_r            : std_logic;
121         -- LX function approximation
122         signal lxfncapprox_out_s        : std_logic_vector(31 downto 0);
123         signal lxfncapprox_ce_s         : std_logic;
124         signal lxfncapprox_ce_r         : std_logic;
125         -- Signals for external bus transmission
126         signal data_i_s                 : std_logic_vector(31 downto 0);
127         signal data_o_s                 : std_logic_vector(31 downto 0);
128         -- Signals for internal transaction
129         signal last_address_s           : std_logic_vector(15 downto 0);
130         signal next_last_address_s      : std_logic_vector(15 downto 0);
131         signal next_address_hold_s      : std_logic;
132         signal address_hold_s           : std_logic;
133         signal last_rd_s                : std_logic;
134         signal next_last_rd_s           : std_logic;
135         signal last_bls_s               : std_logic_vector(3 downto 0); -- prev bls_f_s (active 1)
136         signal next_last_bls_s          : std_logic_vector(3 downto 0);
137
138         -- Reading logic for Master CPU:
139         -- Broadcast rd only till ta (transaction acknowledge)
140         -- is received, then latch the data till the state of
141         -- rd or address changes
142         --
143         -- Data latching is synchronous - it's purpose is to
144         -- provide stable data for CPU on the bus
145         signal cs0_xc_f_s          : std_logic;
146         signal rd_f_s              : std_logic; -- Filtered RD
147         signal i_rd_s              : std_logic; -- Internal bus RD (active 1)
148         signal next_last_i_rd_s    : std_logic;
149         signal last_i_rd_s         : std_logic; -- Delayed RD bus, used for latching
150         --
151         signal address_f_s         : std_logic_vector(15 downto 0); -- Filtered address
152         --
153         signal data_f_s            : std_logic_vector(31 downto 0); -- Filterred input data
154         --
155         signal data_read_s         : std_logic_vector(31 downto 0); -- Latched read data
156         signal next_data_read_s    : std_logic_vector(31 downto 0);
157
158         -- Writing logic:
159         signal bls_f_s             : std_logic_vector(3 downto 0); -- Filtered BLS (active 1)
160         signal i_bls_s             : std_logic_vector(3 downto 0); -- Internal BLS (active 1)
161         signal next_i_bls_s        : std_logic_vector(3 downto 0);
162         --
163         signal data_write_s        : std_logic_vector(31 downto 0); -- Data broadcasted to write
164         signal next_data_write_s   : std_logic_vector(31 downto 0);
165
166         -- Tumbl:
167         signal tumbl_bls_s         : std_logic_vector(3 downto 0);
168         signal tumbl_address_s     : std_logic_vector(14 downto 0);
169         signal tumbl_data_i_s      : std_logic_vector(31 downto 0);
170         --
171         signal tumbl_xmemb_o_s     : CORE2DMEMB_Type;
172         signal tumbl_xmemb_i_s     : DMEMB2CORE_Type;
173         signal tumbl_xmemb_sel_s   : std_logic;
174         -- Interrupt event sources and processing
175         signal lxmaster_rx_done_s  : std_logic;
176         signal lxmaster_rx_done_r  : std_logic;
177         signal lxmaster_rx_done_last_s : std_logic;
178         signal lxmaster_rx_done_last_r : std_logic;
179
180         -- signal s0   : std_logic;
181         -- signal s1   : std_logic;
182         -- signal s2   : std_logic;
183
184         -- XST attributes
185         attribute REGISTER_DUPLICATION : string;
186         attribute REGISTER_DUPLICATION of rd : signal is "NO";
187         attribute REGISTER_DUPLICATION of rd_f_s : signal is "NO";
188         attribute REGISTER_DUPLICATION of bls : signal is "NO";
189         attribute REGISTER_DUPLICATION of bls_f_s : signal is "NO";
190         attribute REGISTER_DUPLICATION of address : signal is "NO";
191         attribute REGISTER_DUPLICATION of address_f_s : signal is "NO";
192         attribute REGISTER_DUPLICATION of cs0_xc : signal is "NO";
193         attribute REGISTER_DUPLICATION of cs0_xc_f_s : signal is "NO";
194
195 begin
196
197 -- Tumbl coprocessor
198 memory_bus_tumbl: bus_tumbl
199         port map
200         (
201                 clk_i          => clk_50m,
202                 reset_i        => reset_s,
203                 ce_i           => tumbl_ce_s,
204                 bls_i          => i_bls_s,
205                 address_i      => address_f_s(11 downto 0),
206                 data_i         => data_i_s,
207                 data_o         => tumbl_out_s,
208                 --
209                 xmemb_o        => tumbl_xmemb_o_s,
210                 xmemb_i        => tumbl_xmemb_i_s,
211                 xmemb_sel_o    => tumbl_xmemb_sel_s
212         );
213
214 -- Measurement
215 memory_bus_measurement: bus_measurement
216         port map
217         (
218                 clk_i     => clk_50m,
219                 reset_i   => reset_s,
220                 ce_i      => meas_ce_s,
221                 address_i => address_f_s(1 downto 0),
222                 bls_i     => i_bls_s,
223                 data_i    => data_i_s,
224                 data_o    => meas_out_s
225         );
226
227 -- IRC interconnect
228 memory_bus_irc: bus_irc
229         port map
230         (
231                 reset_i        => reset_s,
232                 --
233                 clk_i          => clk_50m,
234                 address_i      => tumbl_address_s(4 downto 0),
235                 ce_i           => irc_proc_ce_s,
236                 data_i         => tumbl_data_i_s,
237                 data_o         => irc_proc_out_s,
238                 bls_i          => tumbl_bls_s,
239                 --
240                 irc_i(0).a     => irc0_a,
241                 irc_i(0).b     => irc0_b,
242                 irc_i(0).index => irc0_index,
243                 irc_i(0).mark  => irc0_mark,
244                 --
245                 irc_i(1).a     => irc1_a,
246                 irc_i(1).b     => irc1_b,
247                 irc_i(1).index => irc1_index,
248                 irc_i(1).mark  => irc1_mark,
249                 --
250                 irc_i(2).a     => irc2_a,
251                 irc_i(2).b     => irc2_b,
252                 irc_i(2).index => irc2_index,
253                 irc_i(2).mark  => irc2_mark,
254                 --
255                 irc_i(3).a     => irc3_a,
256                 irc_i(3).b     => irc3_b,
257                 irc_i(3).index => irc3_index,
258                 irc_i(3).mark  => irc3_mark,
259                 --
260                 irc_i(4).a     => irc4_a,
261                 irc_i(4).b     => irc4_b,
262                 irc_i(4).index => irc4_index,
263                 irc_i(4).mark  => irc4_mark,
264                 --
265                 irc_i(5).a     => irc5_a,
266                 irc_i(5).b     => irc5_b,
267                 irc_i(5).index => irc5_index,
268                 irc_i(5).mark  => irc5_mark,
269                 --
270                 irc_i(6).a     => irc6_a,
271                 irc_i(6).b     => irc6_b,
272                 irc_i(6).index => irc6_index,
273                 irc_i(6).mark  => irc6_mark,
274                 --
275                 irc_i(7).a     => irc7_a,
276                 irc_i(7).b     => irc7_b,
277                 irc_i(7).index => irc7_index,
278                 irc_i(7).mark  => irc7_mark
279         );
280
281 -- LX Master
282 memory_bus_lxmaster: bus_lxmaster
283         port map
284         (
285                 reset_i        => reset_s,
286                 --
287                 clk_i          => clk_50m,
288                 address_i      => tumbl_address_s(10 downto 0),
289                 ce_i           => lxmaster_ce_s,
290                 data_i         => tumbl_data_i_s(15 downto 0),
291                 data_o         => lxmaster_out_s,
292                 bls_i          => tumbl_bls_s(1 downto 0),
293                 --
294                 rx_done_o      => lxmaster_rx_done_s,
295                 --
296                 clock_i        => s1_clk_in,
297                 miso_i         => s1_miso,
298                 sync_i         => s1_sync_in,
299                 --
300                 clock_o        => s1_clk_out,
301                 mosi_o         => s1_mosi,
302                 sync_o         => s1_sync_out
303                 --
304                 -- clock_i        => s0,
305                 -- miso_i         => s1,
306                 -- sync_i         => not s2,
307                 --
308                 -- clock_o        => s0,
309                 -- mosi_o         => s1,
310                 -- sync_o         => s2
311         );
312
313         -- s1_clk_out      <= s0;
314         -- s1_mosi         <= s1;
315         -- s1_sync_out     <= s2;
316
317
318 function_approx: component lx_fncapprox
319         port map
320         (
321                 reset_i      => reset_s,
322                 clk_i        => clk_50m,
323                 -- Data bus
324                 address_i      => tumbl_address_s(4 downto 0),
325                 ce_i           => lxfncapprox_ce_s,
326                 data_i         => tumbl_data_i_s,
327                 data_o         => lxfncapprox_out_s,
328                 bls_i          => tumbl_bls_s
329         );
330
331 -- Reset
332 dff_reset: dff2
333         port map
334         (
335                 clk_i   => clk_50m,
336                 d_i     => init_s,
337                 q_o     => reset_s
338         );
339
340         -- Reset
341         init_s          <= not init;
342
343         -- Signalling
344         data_i_s        <= data_write_s;
345
346         -- Tumbl
347         tumbl_bls_s     <= i_bls_s when (master_tumbl_xmem_lock_s = '1')
348                            else tumbl_xmemb_o_s.bls when (tumbl_xmemb_sel_s = '1')
349                            else "0000";
350         tumbl_address_s <= address_f_s(14 downto 0) when (master_tumbl_xmem_lock_s = '1')
351                            else tumbl_xmemb_o_s.addr when (tumbl_xmemb_sel_s = '1')
352                            else (others => '0');
353         tumbl_data_i_s  <= data_i_s when (master_tumbl_xmem_lock_s = '1')
354                            else tumbl_xmemb_o_s.data when (tumbl_xmemb_sel_s = '1')
355                            else (others => '0');
356         --
357         tumbl_xmemb_i_s.int <= '0'; -- No interrupt
358         -- Enable clken only when available for Tumbl
359         tumbl_xmemb_i_s.bus_taken <= master_tumbl_xmem_lock_s;
360         tumbl_xmemb_i_s.bus_wait <= '0';
361
362
363
364 -- Bus update
365 memory_bus_logic:
366         process(cs0_xc_f_s, rd_f_s, last_rd_s, last_i_rd_s,
367                 bls_f_s, last_bls_s, data_f_s, data_write_s,
368                 data_o_s, data_read_s, last_address_s, address_f_s)
369         begin
370                 -- Defaults
371                 next_address_hold_s <= '0';
372
373                 -- Check if we have chip select
374                 if cs0_xc_f_s = '1' then
375
376                         -- Reading
377                         if rd_f_s = '1' then
378                                 -- Internal read
379                                 if last_rd_s = '0' or (last_address_s /= address_f_s) then
380                                         i_rd_s <= '1';
381                                         next_last_i_rd_s  <= '1';
382                                 else
383                                         i_rd_s            <= '0';
384                                         next_last_i_rd_s  <= '0';
385                                 end if;
386
387                                 if last_i_rd_s = '1' then
388                                         -- Latch data we just read - they are valid in this cycle
389                                         next_data_read_s <= data_o_s;
390                                 else
391                                         next_data_read_s <= data_read_s;
392                                 end if;
393                         else
394                         --      -- Not reading, anything goes
395                         --      data_read_s       <= (others => 'X');
396                                 next_data_read_s  <= data_read_s;
397                                 i_rd_s            <= '0';
398                                 next_last_i_rd_s  <= '0';
399                         end if;
400
401                         next_last_rd_s            <= rd_f_s;
402
403                         -- Data for write are captured only when BLS signals are stable
404                         if bls_f_s /= "0000" then
405                                 next_data_write_s <= data_f_s;
406                                 next_address_hold_s <= '1';
407                         else
408                                 next_data_write_s <= data_write_s;
409                         end if;
410
411                         if (bls_f_s /= "0000") or (rd_f_s = '1') then
412                                 next_last_address_s <= address_f_s;
413                         else
414                                 next_last_address_s <= last_address_s;
415                         end if;
416                 else
417                         next_last_rd_s <= '0';
418                         i_rd_s <= '0';
419                         next_last_i_rd_s <= '0';
420
421                         next_i_bls_s <= "0000";
422                         next_data_write_s <= data_write_s;
423                         next_data_read_s  <= data_read_s;
424                         next_last_address_s <= last_address_s;
425                 end if;
426
427                 -- Data for write are captured at/before BLS signals are negated
428                 -- and actual write cycle takes place exacly after BLS negation
429                 if ((last_bls_s and not bls_f_s) /= "0000") or
430                     ((last_bls_s /= "0000") and (cs0_xc_f_s = '0')) then
431                         next_i_bls_s <= last_bls_s;
432                         next_last_bls_s   <= "0000";
433                         next_address_hold_s <= '1';
434                 else
435                         next_i_bls_s <= "0000";
436                         if cs0_xc_f_s = '1' then
437                                 next_last_bls_s <= bls_f_s;
438                         else
439                                 next_last_bls_s <= "0000" ;
440                         end if;
441                 end if;
442
443         end process;
444
445 -- Bus update
446 memory_bus_update:
447         process
448         begin
449
450                 wait until clk_50m = '1' and clk_50m'event;
451
452                 address_hold_s <= next_address_hold_s;
453
454                 -- Synchronized external signals with main clock domain
455                 cs0_xc_f_s     <= not cs0_xc;
456                 bls_f_s        <= not bls;
457                 rd_f_s         <= not rd;
458                 data_f_s       <= data;
459                 if address_hold_s = '0' then
460                         address_f_s <= address;
461                 else
462                         address_f_s <= next_last_address_s;
463                 end if;
464
465                 -- Synchronoust state andvance to next period
466                 last_bls_s     <= next_last_bls_s;
467                 last_rd_s      <= next_last_rd_s;
468                 i_bls_s        <= next_i_bls_s;
469                 last_i_rd_s    <= next_last_i_rd_s;
470                 data_write_s   <= next_data_write_s;
471                 last_address_s <= next_last_address_s;
472                 data_read_s    <= next_data_read_s;
473
474                 -- Internal bus chipselects
475                 tumbl_ce_r <= tumbl_ce_s;
476                 meas_ce_r <= meas_ce_s;
477                 master_tumbl_xmem_ce_r <= master_tumbl_xmem_ce_s;
478                 --
479                 -- ======================================================
480                 --  TUMBL BUS
481                 -- ======================================================
482
483                 -- Just copy these to their desired next state
484                 irc_proc_ce_r <= irc_proc_ce_s;
485                 lxmaster_ce_r <= lxmaster_ce_s;
486                 lxfncapprox_ce_r <= lxfncapprox_ce_s;
487
488         end process;
489
490 -- Do the actual wiring here
491 memory_bus_wiring:
492         process(i_rd_s, i_bls_s, address_f_s, tumbl_out_s, meas_out_s, master_tumbl_xmem_out_s,
493                 tumbl_ce_r, meas_ce_r, master_tumbl_xmem_ce_r, last_i_rd_s)
494         begin
495
496                 -- Inactive by default
497                 tumbl_ce_s             <= '0';
498                 meas_ce_s              <= '0';
499                 master_tumbl_xmem_ce_s <= '0';
500                 data_o_s               <= (others => 'X');
501
502                 if i_rd_s = '1' or i_bls_s /= "0000" then
503
504                         -- Memory Map (16-bit address @ 32-bit each)
505
506                         -- Each address is seen as 32-bit entry now
507                         -- 0x0000 - 0x0FFF: Tumbl IMEM / DMEM
508                         -- 0x1FFC - 0x1FFF: Measurement
509                         -- 0x8000 - 0x8FFF: Tumbl BUS
510
511                         if address_f_s < "0001000000000000" then                  -- Tumbl
512                                 tumbl_ce_s             <= '1';
513                         elsif address_f_s(15 downto 2) = "00011111111111" then    -- Measurement
514                                 meas_ce_s              <= '1';
515                         elsif address_f_s(15) = '1' then                          -- Tumbl External BUS
516                                 master_tumbl_xmem_ce_s <= '1';
517                         end if;
518
519                 end if;
520
521                 if tumbl_ce_r = '1' then                                  -- Tumbl
522                         data_o_s <= tumbl_out_s;
523                 elsif meas_ce_r = '1' then                                -- Measurement
524                         data_o_s <= meas_out_s;
525                 elsif master_tumbl_xmem_ce_r = '1' then                   -- Tumbl External BUS
526                         data_o_s <= master_tumbl_xmem_out_s;
527                 end if;
528
529         end process;
530
531 -- If RD and BLS is not high, we must keep DATA at high impedance
532 -- or the FPGA collides with SDRAM (damaging each other)
533 memory_bus_out:
534         process(cs0_xc, rd, data_read_s)
535         begin
536
537                 -- CS0 / RD / BLS are active LOW
538                 if cs0_xc = '0' and rd = '0' then
539                         -- Don't risk flipping (between data_o_s and latched data_read_s, it's better to wait)
540                         -- Maybe check this later.
541                         -- if last_i_rd_s = '1' then
542                         --   data <= data_o_s;
543                         -- else
544                         data <= data_read_s;
545                         -- end if;
546                 else
547                         -- IMPORTANT!!!
548                         data <= (others => 'Z');
549                 end if;
550
551         end process;
552
553 -- Outputs from Tumbl (enabling and address muxing) and Master CPU
554 tumbl_bus_o:
555         process(tumbl_xmemb_sel_s, tumbl_xmemb_o_s, master_tumbl_xmem_ce_s, address_f_s, i_rd_s, i_bls_s)
556                 variable addr_v : std_logic_vector(14 downto 0); -- This space is visible by both (32-bit)
557                 variable sel_v  : std_logic;
558         begin
559
560                 -- Defaults
561                 irc_proc_ce_s             <= '0';
562                 lxmaster_ce_s             <= '0';
563                 lxfncapprox_ce_s          <= '0';
564                 master_tumbl_xmem_lock_s  <= '0';
565                 --
566                 addr_v                    := (others => '0');
567                 sel_v                     := '0';
568
569                 -- Check who is accessing
570                 if master_tumbl_xmem_ce_s = '1' and (i_rd_s = '1' or i_bls_s /= "0000") then
571                         -- Master blocks Tumbl
572                         master_tumbl_xmem_lock_s <= '1';
573                         addr_v                   := address_f_s(14 downto 0);
574                         sel_v                    := '1';
575                 else
576                         addr_v                   := tumbl_xmemb_o_s.addr;
577                         sel_v                    := '1';
578                 end if;
579
580                 if sel_v = '1' then
581                         -- IRC:       0x0800 - 0x081F (32-bit address)
582                         -- LX FNC AP: 0x0C00 - 0x0C1F (32-bit address)
583                         -- LX MASTER: 0x1000 - 0x17FF (32-bit address)
584                         if addr_v(14 downto 5) = "0001000000" then
585                                 irc_proc_ce_s     <= '1';
586                         elsif addr_v(14 downto 5) = "0001100000" then
587                                 lxfncapprox_ce_s  <= '1';
588                         elsif addr_v(14 downto 11) = "0010" then
589                                 lxmaster_ce_s     <= '1';
590                         end if;
591                 end if;
592
593         end process;
594
595 -- Inputs to Tumbl (enabling and address muxing)
596 tumbl_bus_i:
597         process(irc_proc_ce_r, irc_proc_out_s, lxmaster_ce_r, lxmaster_out_s,
598                 lxfncapprox_ce_r, lxfncapprox_out_s, tumbl_xmemb_i_s)
599         begin
600
601                 tumbl_xmemb_i_s.data  <= (others => 'X');
602
603                 -- NOTE: This is input to Tumbl EXEQ - with MUL instruction for input > 18-bit,
604                 -- (i.e. more DSPs in a sequence), this already has tough timing constraints
605                 -- and SmartXplorer has to be used with XiSE or use Synplify.
606                 if irc_proc_ce_r = '1' then
607                         tumbl_xmemb_i_s.data <= irc_proc_out_s;
608                 elsif lxmaster_ce_r = '1' then
609                         tumbl_xmemb_i_s.data(15 downto 0)  <= lxmaster_out_s;
610                         tumbl_xmemb_i_s.data(31 downto 16) <= (others => '0');
611                 elsif lxfncapprox_ce_r = '1' then
612                         tumbl_xmemb_i_s.data <= lxfncapprox_out_s;
613                 end if;
614
615                 master_tumbl_xmem_out_s <= tumbl_xmemb_i_s.data;
616
617         end process;
618
619 events_logic:
620         process(lxmaster_rx_done_r, lxmaster_rx_done_last_r)
621         begin
622                 event_jk_j <= lxmaster_rx_done_r or lxmaster_rx_done_last_r;
623                 lxmaster_rx_done_last_s <= lxmaster_rx_done_r;
624         end process;
625
626 events_update:
627         process
628         begin
629                 wait until clk_50m = '1' and clk_50m'event;
630
631                 lxmaster_rx_done_r <= lxmaster_rx_done_s;
632                 lxmaster_rx_done_last_r <= lxmaster_rx_done_last_s;
633         end process;
634
635 end Behavioral;
636