OpenCores
URL https://opencores.org/ocsvn/funbase_ip_library/funbase_ip_library/trunk

Subversion Repositories funbase_ip_library

[/] [funbase_ip_library/] [trunk/] [TUT/] [ip.hwp.communication/] [hibi/] [3.0/] [vhd/] [hibiv3_r4.vhd] - Blame information for rev 145

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 145 lanttu
-------------------------------------------------------------------------------
2
-- Title      : Hibi toplevel using r4 wrappers
3
-- Project    : 
4
-------------------------------------------------------------------------------
5
-- File       : hibiv3_r4.vhd
6
-- Author     : Lasse Lehtonen, modified from Jussi Nieminen's HWTG hibi
7
--              top level
8
-- Company    : 
9
-- Last update: 2011-11-28
10
-- Platform   : 
11
-------------------------------------------------------------------------------
12
-- Description: Semi-generic toplevel, add as many agents as you like.  Just
13
--              be sure to create enough addresses in the tables (scroll down).
14
--              Every segment has equal number of wrappers and are connected
15
--              as a chain.
16
-------------------------------------------------------------------------------
17
-- Revisions  :
18
-- Date        Version  Author  Description
19
-- 2009/06/23  1.0      niemin95        Created
20
-------------------------------------------------------------------------------
21
-- Funbase IP library Copyright (C) 2011 TUT Department of Computer Systems
22
--
23
-- This file is part of HIBI
24
--
25
-- This source file may be used and distributed without
26
-- restriction provided that this copyright statement is not
27
-- removed from the file and that any derivative work contains
28
-- the original copyright notice and the associated disclaimer.
29
--
30
-- This source file is free software; you can redistribute it
31
-- and/or modify it under the terms of the GNU Lesser General
32
-- Public License as published by the Free Software Foundation;
33
-- either version 2.1 of the License, or (at your option) any
34
-- later version.
35
--
36
-- This source is distributed in the hope that it will be
37
-- useful, but WITHOUT ANY WARRANTY; without even the implied
38
-- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
39
-- PURPOSE.  See the GNU Lesser General Public License for more
40
-- details.
41
--
42
-- You should have received a copy of the GNU Lesser General
43
-- Public License along with this source; if not, download it
44
-- from http://www.opencores.org/lgpl.shtml
45
-------------------------------------------------------------------------------
46
 
47
library ieee;
48
use ieee.std_logic_1164.all;
49
use work.hibiv3_pkg.all;
50
 
51
 
52
entity hibiv3_r4 is
53
 
54
  generic (
55
    -- HIBI generics
56
    id_width_g          : integer := 4;
57
    addr_width_g        : integer := 16;
58
    data_width_g        : integer := 32;
59
    comm_width_g        : integer := 5;
60
    counter_width_g     : integer := 8;
61
    rel_agent_freq_g    : integer := 1;
62
    rel_bus_freq_g      : integer := 1;
63
    arb_type_g          : integer := 3;
64
    fifo_sel_g          : integer := 0;
65
    rx_fifo_depth_g     : integer := 4;
66
    rx_msg_fifo_depth_g : integer := 4;
67
    tx_fifo_depth_g     : integer := 4;
68
    tx_msg_fifo_depth_g : integer := 4;
69
    max_send_g          : integer := 20;
70
    n_cfg_pages_g       : integer := 1;
71
    n_time_slots_g      : integer := 0;
72
    keep_slot_g         : integer := 0;
73
    n_extra_params_g    : integer := 1;
74
 
75
    cfg_re_g            : integer := 1;
76
    cfg_we_g            : integer := 1;
77
    debug_width_g       : integer := 0;
78
 
79
    n_agents_g   : integer := 12;
80
    n_segments_g : integer := 3;
81
 
82
    separate_addr_g : integer := 0
83
    );
84
 
85
  port (
86
    clk_ip  : in std_logic;
87
    clk_noc : in std_logic;
88
    rst_n   : in std_logic;
89
 
90
    agent_comm_in   : in  std_logic_vector(n_agents_g*comm_width_g-1 downto 0);
91
    agent_data_in   : in  std_logic_vector(n_agents_g*data_width_g-1 downto 0);
92
    agent_av_in     : in  std_logic_vector(n_agents_g-1 downto 0);
93
    agent_we_in     : in  std_logic_vector(n_agents_g-1 downto 0);
94
    agent_re_in     : in  std_logic_vector(n_agents_g-1 downto 0);
95
    agent_comm_out  : out std_logic_vector(n_agents_g*comm_width_g-1 downto 0);
96
    agent_data_out  : out std_logic_vector(n_agents_g*data_width_g-1 downto 0);
97
    agent_av_out    : out std_logic_vector(n_agents_g-1 downto 0);
98
    agent_full_out  : out std_logic_vector(n_agents_g-1 downto 0);
99
    agent_one_p_out : out std_logic_vector(n_agents_g-1 downto 0);
100
    agent_empty_out : out std_logic_vector(n_agents_g-1 downto 0);
101
    agent_one_d_out : out std_logic_vector(n_agents_g-1 downto 0)
102
 
103
    );
104
 
105
end hibiv3_r4;
106
 
107
 
108
 
109
architecture structural of hibiv3_r4 is
110
 
111
  -----------------------------------------------------------------------------
112
  -- HIBI ADDRESSES
113
  -----------------------------------------------------------------------------
114
 
115
  type gen_addr_array_type is array (1 to 4) of integer;
116
  type gen_addr_array_3d_type is array (0 to 2) of gen_addr_array_type;
117
  type gen_bridge_addr_array is array (0 to 1) of integer;
118
 
119
  -- addresses_c(segment index)(wrapper index in the segment)
120
  constant addresses_c : gen_addr_array_3d_type :=
121
    ((16#00000010#, 16#00000030#, 16#00000050#, 16#00000070#),
122
     (16#00000110#, 16#00000130#, 16#00000150#, 16#00000170#),
123
     (16#00000310#, 16#00000330#, 16#00000350#, 16#00000370#));
124
 
125
  constant bridge_a_addr_base_c : gen_bridge_addr_array :=
126
    (16#00000000#, 16#00000000#);
127
  constant bridge_a_addr_limit_c : gen_bridge_addr_array :=
128
    (16#000000FF#, 16#000001FF#);
129
  constant bridge_b_addr_base_c : gen_bridge_addr_array :=
130
    (16#00000000#, 16#00000000#);
131
  constant bridge_b_addr_limit_c : gen_bridge_addr_array :=
132
    (16#000000FF#, 16#000001FF#);
133
 
134
  constant bridge_a_id_min_c : gen_bridge_addr_array :=
135
    (1, 1);
136
  constant bridge_a_id_max_c : gen_bridge_addr_array :=
137
    (5, 11);
138
  constant bridge_b_id_min_c : gen_bridge_addr_array :=
139
    (1, 1);
140
  constant bridge_b_id_max_c : gen_bridge_addr_array :=
141
    (5, 11);
142
 
143
  constant bridge_a_inv_addr_c : gen_bridge_addr_array :=
144
    (1, 1);
145
  constant bridge_b_inv_addr_c : gen_bridge_addr_array :=
146
    (0, 0);
147
 
148
 
149
 
150
 
151
 
152
 
153
 
154
  -----------------------------------------------------------------------------
155
  -- 
156
  -----------------------------------------------------------------------------
157
 
158
  -- purpose: to resolve the number of agents in each segment
159
  function n_agents_in_segment (
160
    constant segment, n_segments, wrappers_per_seg : integer)
161
    return integer is
162
  begin  -- n_agents_in_segment
163
 
164
    if n_segments = 1 then
165
      return wrappers_per_seg;
166
    elsif segment = 0 or segment = n_segments - 1 then
167
      -- end segment, only one bridge
168
      return wrappers_per_seg + 1;
169
    else
170
      -- middle segment
171
      return wrappers_per_seg + 2;
172
    end if;
173
 
174
  end n_agents_in_segment;
175
 
176
  function priority_a (
177
    constant segment, n_segments, wrappers_per_seg : integer)
178
    return integer is
179
  begin
180
 
181
    if n_segments = 1 then
182
      return 0;
183
    elsif segment = 0 or segment = n_segments - 1 then
184
      -- end segment, only one bridge
185
      return wrappers_per_seg + 1;
186
    else
187
      -- middle segment
188
      return wrappers_per_seg + 2;
189
    end if;
190
 
191
  end priority_a;
192
 
193
  function priority_b (
194
    constant segment, n_segments, wrappers_per_seg : integer)
195
    return integer is
196
  begin
197
 
198
    if n_segments = 1 then
199
      return 0;
200
    elsif segment = 0 or segment = n_segments - 1 then
201
      -- end segment, only one bridge
202
      return wrappers_per_seg + 1;
203
    else
204
      -- middle segment
205
      return wrappers_per_seg + 1;
206
    end if;
207
 
208
  end priority_b;
209
 
210
  function id_agent (
211
    constant segment, n_segments, wrappers_per_seg : integer)
212
    return integer is
213
  begin
214
 
215
    if n_segments = 1 then
216
      return 1;
217
    elsif segment = 0 then
218
      -- first segment
219
      return 1;
220
    elsif segment = n_segments - 1 then
221
      -- last segment
222
      return segment*(wrappers_per_seg+2);
223
    else
224
      -- middle segment
225
      return segment*(wrappers_per_seg+2);
226
    end if;
227
 
228
  end id_agent;
229
 
230
  function id_a (
231
    constant segment, n_segments, wrappers_per_seg : integer)
232
    return integer is
233
  begin
234
 
235
    if n_segments = 1 then
236
      return 0;
237
    elsif segment = 0 then
238
      -- first segment
239
      return wrappers_per_seg + 1;
240
    elsif segment = n_segments - 1 then
241
      -- last segment
242
      return 0;
243
    else
244
      -- middle segment
245
      return segment*(wrappers_per_seg+2)+wrappers_per_seg;
246
    end if;
247
 
248
  end id_a;
249
 
250
  function id_b (
251
    constant segment, n_segments, wrappers_per_seg : integer)
252
    return integer is
253
  begin
254
 
255
    if n_segments = 1 then
256
      return 0;
257
    elsif segment = 0 then
258
      -- first segment
259
      return 0;
260
    elsif segment = n_segments - 1 then
261
      return segment*(wrappers_per_seg+2)+wrappers_per_seg;
262
    else
263
      -- middle segment
264
      return segment*(wrappers_per_seg+2)+wrappers_per_seg+1;
265
    end if;
266
 
267
  end id_b;
268
 
269
 
270
  constant wrappers_per_segment_c : integer := n_agents_g / n_segments_g;
271
 
272
  type bus_data_segments_array is array (0 to n_segments_g-1) of
273
    std_logic_vector(data_width_g-1 downto 0);
274
  type bus_comm_segments_array is array (0 to n_segments_g-1) of
275
    std_logic_vector(comm_width_c-1 downto 0);
276
 
277
  signal bus_wra_data : bus_data_segments_array;
278
  signal bus_wra_comm : bus_comm_segments_array;
279
  signal bus_wra_av   : std_logic_vector(n_segments_g-1 downto 0);
280
  signal bus_wra_full : std_logic_vector(n_segments_g-1 downto 0);
281
  signal bus_wra_lock : std_logic_vector(n_segments_g-1 downto 0);
282
 
283
  -- +1, because there might be bridges in the segment. This is not optimal,
284
  -- but much easier and extra signals should be optimized away in synthesis
285
  type data_to_bus_type is array (0 to wrappers_per_segment_c+1) of
286
    std_logic_vector(data_width_g-1 downto 0);
287
  type comm_to_bus_type is array (0 to wrappers_per_segment_c+1) of
288
    std_logic_vector(comm_width_c-1 downto 0);
289
 
290
  type data_segments_array is array (0 to n_segments_g-1) of data_to_bus_type;
291
  type comm_segments_array is array (0 to n_segments_g-1) of comm_to_bus_type;
292
  type cntr_segments_array is array (0 to n_segments_g-1) of std_logic_vector
293
    (wrappers_per_segment_c + 1 downto 0);
294
 
295
  signal wra_bus_data : data_segments_array;
296
  signal wra_bus_comm : comm_segments_array;
297
  signal wra_bus_av   : cntr_segments_array;
298
  signal wra_bus_full : cntr_segments_array;
299
  signal wra_bus_lock : cntr_segments_array;
300
 
301
-------------------------------------------------------------------------------
302
begin  -- structural
303
-------------------------------------------------------------------------------
304
 
305
  -- if there is more than 1 segment, wrappers must distribute evenly
306
  assert n_segments_g = 1 or n_agents_g mod n_segments_g = 0
307
    report "With more than one segment wrappers distribute evenly"
308
    severity failure;
309
 
310
 
311
  segments : for seg in 0 to n_segments_g-1 generate
312
 
313
    wrappers : for wra in 0 to wrappers_per_segment_c-1 generate
314
 
315
      wrapper : entity work.hibi_wrapper_r4
316
        generic map (
317
          id_g                => id_agent
318
          (seg, n_segments_g, wrappers_per_segment_c) + wra,
319
          addr_g              => addresses_c(seg)(wra + 1),
320
          inv_addr_en_g       => 0,
321
          id_width_g          => id_width_g,
322
          addr_width_g        => addr_width_g,
323
          data_width_g        => data_width_g,
324
          separate_addr_g     => separate_addr_g,
325
          comm_width_g        => comm_width_g,
326
          counter_width_g     => counter_width_g,
327
          rel_agent_freq_g    => rel_agent_freq_g,
328
          rel_bus_freq_g      => rel_bus_freq_g,
329
          arb_type_g          => arb_type_g,
330
          fifo_sel_g          => fifo_sel_g,
331
          rx_fifo_depth_g     => rx_fifo_depth_g,
332
          rx_msg_fifo_depth_g => rx_msg_fifo_depth_g,
333
          tx_fifo_depth_g     => tx_fifo_depth_g,
334
          tx_msg_fifo_depth_g => tx_msg_fifo_depth_g,
335
          prior_g             => wra + 1,
336
          max_send_g          => max_send_g,
337
          -- n_agents_g should be num of ips + num of bridges in the segment
338
          n_agents_g          => n_agents_in_segment
339
          (seg, n_segments_g, wrappers_per_segment_c),
340
          n_cfg_pages_g       => n_cfg_pages_g,
341
          n_time_slots_g      => n_time_slots_g,
342
          keep_slot_g         => keep_slot_g,
343
          n_extra_params_g    => n_extra_params_g,
344
 
345
          cfg_re_g            => cfg_re_g,
346
          cfg_we_g            => cfg_we_g,
347
          debug_width_g       => debug_width_g
348
          )
349
        port map (
350
          bus_clk         => clk_noc,
351
          agent_clk       => clk_ip,
352
          bus_sync_clk    => clk_noc,
353
          agent_sync_clk  => clk_ip,
354
          rst_n           => rst_n,
355
          bus_comm_in     => bus_wra_comm(seg),
356
          bus_data_in     => bus_wra_data(seg),
357
          bus_full_in     => bus_wra_full(seg),
358
          bus_lock_in     => bus_wra_lock(seg),
359
          bus_av_in       => bus_wra_av(seg),
360
          agent_comm_in   => agent_comm_in((seg*wrappers_per_segment_c+wra+1)*
361
                                           comm_width_g-1 downto
362
                                           (seg*wrappers_per_segment_c+wra)*
363
                                           comm_width_g),
364
          agent_data_in   => agent_data_in((seg*wrappers_per_segment_c+wra+1)*
365
                                           data_width_g-1 downto
366
                                           (seg*wrappers_per_segment_c+wra)*
367
                                           data_width_g),
368
          agent_av_in     => agent_av_in(seg*wrappers_per_segment_c+wra),
369
          agent_we_in     => agent_we_in(seg*wrappers_per_segment_c+wra),
370
          agent_re_in     => agent_re_in(seg*wrappers_per_segment_c+wra),
371
          bus_comm_out    => wra_bus_comm(seg)(wra),
372
          bus_data_out    => wra_bus_data(seg)(wra),
373
          bus_full_out    => wra_bus_full(seg)(wra),
374
          bus_lock_out    => wra_bus_lock(seg)(wra),
375
          bus_av_out      => wra_bus_av(seg)(wra),
376
          agent_comm_out  => agent_comm_out((seg*wrappers_per_segment_c+wra+1)*
377
                                            comm_width_g-1 downto
378
                                            (seg*wrappers_per_segment_c+wra)*
379
                                            comm_width_g),
380
          agent_data_out  => agent_data_out((seg*wrappers_per_segment_c+wra+1)*
381
                                            data_width_g-1 downto
382
                                            (seg*wrappers_per_segment_c+wra)*
383
                                            data_width_g),
384
          agent_av_out    => agent_av_out(seg*wrappers_per_segment_c+wra),
385
          agent_full_out  => agent_full_out(seg*wrappers_per_segment_c+wra),
386
          agent_one_p_out => agent_one_p_out(seg*wrappers_per_segment_c+wra),
387
          agent_empty_out => agent_empty_out(seg*wrappers_per_segment_c+wra),
388
          agent_one_d_out => agent_one_d_out(seg*wrappers_per_segment_c+wra)
389
          -- synthesis translate_off
390
          ,
391
          debug_out       => open,
392
          debug_in        => (others => '0')
393
          -- synthesis translate_on
394
          );
395
 
396
 
397
    end generate wrappers;
398
 
399
 
400
    bridge_needed : if seg > 0 generate
401
 
402
      i_bridge : entity work.hibi_bridge
403
        generic map (
404
          a_id_g                =>
405
          id_a(seg-1, n_segments_g, wrappers_per_segment_c),
406
          a_addr_g              => bridge_a_addr_base_c(seg-1),
407
          a_inv_addr_en_g       => bridge_a_inv_addr_c(seg-1),
408
          a_id_width_g          => id_width_g,
409
          a_addr_width_g        => addr_width_g,
410
          a_data_width_g        => data_width_g,
411
          a_separate_addr_g     => separate_addr_g,
412
          a_comm_width_g        => comm_width_g,
413
          a_counter_width_g     => counter_width_g,
414
          a_rx_fifo_depth_g     => rx_fifo_depth_g,
415
          a_tx_fifo_depth_g     => tx_fifo_depth_g,
416
          a_rx_msg_fifo_depth_g => rx_msg_fifo_depth_g,
417
          a_tx_msg_fifo_depth_g => tx_msg_fifo_depth_g,
418
          a_arb_type_g          => arb_type_g,
419
          a_fifo_sel_g          => fifo_sel_g,
420
 
421
          a_debug_width_g       => debug_width_g,
422
          a_prior_g             =>
423
          priority_a(seg-1, n_segments_g, wrappers_per_segment_c),
424
          a_max_send_g          => max_send_g,
425
          a_n_agents_g          =>
426
          n_agents_in_segment(seg-1, n_segments_g, wrappers_per_segment_c),
427
          a_n_cfg_pages_g       => n_cfg_pages_g,
428
          a_n_time_slots_g      => n_time_slots_g,
429
          a_n_extra_params_g    => n_extra_params_g,
430
          a_cfg_re_g            => cfg_re_g,
431
          a_cfg_we_g            => cfg_we_g,
432
 
433
          b_id_g                =>
434
          id_b(seg, n_segments_g, wrappers_per_segment_c),
435
          b_addr_g              => bridge_b_addr_base_c(seg-1),
436
          b_inv_addr_en_g       => bridge_b_inv_addr_c(seg-1),
437
          b_id_width_g          => id_width_g,
438
          b_addr_width_g        => addr_width_g,
439
          b_data_width_g        => data_width_g,
440
          b_separate_addr_g     => separate_addr_g,
441
          b_comm_width_g        => comm_width_g,
442
          b_counter_width_g     => counter_width_g,
443
          b_rx_fifo_depth_g     => rx_fifo_depth_g,
444
          b_tx_fifo_depth_g     => tx_fifo_depth_g,
445
          b_rx_msg_fifo_depth_g => rx_msg_fifo_depth_g,
446
          b_tx_msg_fifo_depth_g => tx_msg_fifo_depth_g,
447
          b_arb_type_g          => arb_type_g,
448
          b_fifo_sel_g          => fifo_sel_g,
449
 
450
          b_debug_width_g       => debug_width_g,
451
          b_prior_g             =>
452
          priority_b(seg, n_segments_g, wrappers_per_segment_c),
453
          b_max_send_g          => max_send_g,
454
          b_n_agents_g          =>
455
          n_agents_in_segment(seg, n_segments_g, wrappers_per_segment_c),
456
          b_n_cfg_pages_g       => n_cfg_pages_g,
457
          b_n_time_slots_g      => n_time_slots_g,
458
          b_n_extra_params_g    => n_extra_params_g,
459
          b_cfg_re_g            => cfg_re_g,
460
          b_cfg_we_g            => cfg_we_g,
461
 
462
          a_id_min_g     => bridge_a_id_min_c(seg-1),
463
          a_id_max_g     => bridge_a_id_max_c(seg-1),
464
          a_addr_limit_g => bridge_a_addr_limit_c(seg-1),
465
 
466
          b_id_min_g     => bridge_b_id_min_c(seg-1),
467
          b_id_max_g     => bridge_b_id_max_c(seg-1),
468
          b_addr_limit_g => bridge_b_addr_limit_c(seg-1)
469
 
470
          )
471
        port map (
472
          a_clk          => clk_noc,
473
          a_rst_n        => rst_n,
474
          b_clk          => clk_noc,
475
          b_rst_n        => rst_n,
476
          a_bus_av_in    => bus_wra_av(seg-1),
477
          a_bus_data_in  => bus_wra_data(seg-1),
478
          a_bus_comm_in  => bus_wra_comm(seg-1),
479
          a_bus_full_in  => bus_wra_full(seg-1),
480
          a_bus_lock_in  => bus_wra_lock(seg-1),
481
          b_bus_av_in    => bus_wra_av(seg),
482
          b_bus_data_in  => bus_wra_data(seg),
483
          b_bus_comm_in  => bus_wra_comm(seg),
484
          b_bus_full_in  => bus_wra_full(seg),
485
          b_bus_lock_in  => bus_wra_lock(seg),
486
          a_bus_av_out   => wra_bus_av(seg-1)(wrappers_per_segment_c),
487
          a_bus_data_out => wra_bus_data(seg-1)(wrappers_per_segment_c),
488
          a_bus_comm_out => wra_bus_comm(seg-1)(wrappers_per_segment_c),
489
          a_bus_lock_out => wra_bus_lock(seg-1)(wrappers_per_segment_c),
490
          a_bus_full_out => wra_bus_full(seg-1)(wrappers_per_segment_c),
491
          b_bus_av_out   => wra_bus_av(seg)(wrappers_per_segment_c+1),
492
          b_bus_data_out => wra_bus_data(seg)(wrappers_per_segment_c+1),
493
          b_bus_comm_out => wra_bus_comm(seg)(wrappers_per_segment_c+1),
494
          b_bus_lock_out => wra_bus_lock(seg)(wrappers_per_segment_c+1),
495
          b_bus_full_out => wra_bus_full(seg)(wrappers_per_segment_c+1)
496
                        -- synthesis translate_off
497
          ,
498
          a_debug_out    => open,
499
          a_debug_in     => (others => '0'),
500
          b_debug_out    => open,
501
          b_debug_in     => (others => '0')
502
          -- synthesis translate_on
503
          );
504
 
505
      -- nullify extra signals
506
      nullify_first_seg : if seg = 1 generate
507
        -- no b-side on the first segment
508
        wra_bus_av(seg-1)(wrappers_per_segment_c+1)   <= '0';
509
        wra_bus_full(seg-1)(wrappers_per_segment_c+1) <= '0';
510
        wra_bus_lock(seg-1)(wrappers_per_segment_c+1) <= '0';
511
        wra_bus_comm(seg-1)(wrappers_per_segment_c+1) <= (others => '0');
512
        wra_bus_data(seg-1)(wrappers_per_segment_c+1) <= (others => '0');
513
      end generate nullify_first_seg;
514
 
515
      nullify_last_seg : if seg = n_segments_g-1 generate
516
        -- no a-side here
517
        wra_bus_av(seg)(wrappers_per_segment_c)   <= '0';
518
        wra_bus_full(seg)(wrappers_per_segment_c) <= '0';
519
        wra_bus_lock(seg)(wrappers_per_segment_c) <= '0';
520
        wra_bus_comm(seg)(wrappers_per_segment_c) <= (others => '0');
521
        wra_bus_data(seg)(wrappers_per_segment_c) <= (others => '0');
522
      end generate nullify_last_seg;
523
 
524
    end generate bridge_needed;
525
 
526
 
527
    no_bridges : if n_segments_g = 1 generate
528
 
529
      -- no bridges, nullify extra all signals
530
      wra_bus_av(seg)(wrappers_per_segment_c)     <= '0';
531
      wra_bus_full(seg)(wrappers_per_segment_c)   <= '0';
532
      wra_bus_lock(seg)(wrappers_per_segment_c)   <= '0';
533
      wra_bus_comm(seg)(wrappers_per_segment_c)   <= (others => '0');
534
      wra_bus_data(seg)(wrappers_per_segment_c)   <= (others => '0');
535
      wra_bus_av(seg)(wrappers_per_segment_c+1)   <= '0';
536
      wra_bus_full(seg)(wrappers_per_segment_c+1) <= '0';
537
      wra_bus_lock(seg)(wrappers_per_segment_c+1) <= '0';
538
      wra_bus_comm(seg)(wrappers_per_segment_c+1) <= (others => '0');
539
      wra_bus_data(seg)(wrappers_per_segment_c+1) <= (others => '0');
540
 
541
    end generate no_bridges;
542
 
543
 
544
  end generate segments;
545
 
546
 
547
  -- making the bus
548
  form_bus : process (wra_bus_data, wra_bus_comm, wra_bus_av,
549
                      wra_bus_full, wra_bus_lock)
550
    variable tmp_data_v : bus_data_segments_array;
551
    variable tmp_comm_v : bus_comm_segments_array;
552
    variable tmp_av_v   : std_logic_vector(n_segments_g-1 downto 0);
553
    variable tmp_full_v : std_logic_vector(n_segments_g-1 downto 0);
554
    variable tmp_lock_v : std_logic_vector(n_segments_g-1 downto 0);
555
  begin  -- process form_bus
556
 
557
    for seg in 0 to n_segments_g-1 loop
558
 
559
      tmp_data_v(seg) := wra_bus_data(seg)(0);
560
      tmp_comm_v(seg) := wra_bus_comm(seg)(0);
561
      tmp_av_v(seg)   := wra_bus_av(seg)(0);
562
      tmp_full_v(seg) := wra_bus_full(seg)(0);
563
      tmp_lock_v(seg) := wra_bus_lock(seg)(0);
564
 
565
      for n in 1 to wrappers_per_segment_c+1 loop
566
 
567
        tmp_data_v(seg) := wra_bus_data(seg)(n) or tmp_data_v(seg);
568
        tmp_comm_v(seg) := wra_bus_comm(seg)(n) or tmp_comm_v(seg);
569
        tmp_av_v(seg)   := wra_bus_av(seg)(n) or tmp_av_v(seg);
570
        tmp_full_v(seg) := wra_bus_full(seg)(n) or tmp_full_v(seg);
571
        tmp_lock_v(seg) := wra_bus_lock(seg)(n) or tmp_lock_v(seg);
572
 
573
      end loop;  -- n
574
 
575
      bus_wra_data(seg) <= tmp_data_v(seg);
576
      bus_wra_comm(seg) <= tmp_comm_v(seg);
577
      bus_wra_av(seg)   <= tmp_av_v(seg);
578
      bus_wra_full(seg) <= tmp_full_v(seg);
579
      bus_wra_lock(seg) <= tmp_lock_v(seg);
580
 
581
    end loop;  -- seg
582
 
583
  end process form_bus;
584
 
585
end structural;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.