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

Subversion Repositories p9813_rgb_led_string_driver

[/] [p9813_rgb_led_string_driver/] [trunk/] [rtl/] [VHDL/] [bus_arbiter_pack.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 jclaytons
--------------------------------------------------------------------------
2
-- Package
3
--
4
 
5
library IEEE;
6
use IEEE.STD_LOGIC_1164.ALL;
7
use IEEE.NUMERIC_STD.ALL;
8
use IEEE.MATH_REAL.ALL;
9
 
10
package bus_arbiter_pack is
11
 
12
-- Component declarations not provided any more.
13
-- With VHDL '93 and newer, component declarations are allowed,
14
-- but not required.
15
--
16
-- Please to try direct instantiation instead, for example:
17
--
18
--   instance_name : entity work.entity_name(beh)
19
--
20
 
21
end bus_arbiter_pack;
22
 
23
-------------------------------------------------------------------------------
24
-- Bus Access Arbitration Module
25
-------------------------------------------------------------------------------
26
--
27
-- Author: John Clayton
28
-- Date  : July 13, 2011 Copied code from "bus_arbiter_4_way" to begin.
29
--                       I am hoping to derive a more parameterized
30
--                       module.
31
--         Sept 11, 2012 After much successful use in hardware, I have
32
--                       revisited this module and simplified it so that
33
--                       requests are immediately driven out to msel.
34
--                       The intent is to eliminate wasted clock cycles.
35
--         Nov. 21, 2012 I have discovered that I was using an external
36
--                       mux for the bus_cyc signal, which is fairly
37
--                       understandable, since I'm using external muxes
38
--                       for nearly everything...  However, in the case
39
--                       of the bys_cyc signal, there is an unnecessary
40
--                       "opportunity for error" since bus_cyc is always
41
--                       set to the currently selected request line. It
42
--                       occurred to me that this can be moved inside
43
--                       the module, thereby eliminating the possibility
44
--                       of connecting it up incorrectly outside the
45
--                       module.  Thus, I'm adding the cyc_o signal.
46
--         May  15, 2013 While simulating a design, I discovered that
47
--                       while one request is active, another request
48
--                       may arrive which alters the state of msel_next,
49
--                       thus altering the output msel_o.  This is a flaw
50
--                       since requesters may be depending on the value
51
--                       of msel_o in order to receive acknowledgments,
52
--                       and could therefore erroneously see a ack when
53
--                       msel_o changed.  A new statement was added to
54
--                       "lock out" changes to msel_next while the current
55
--                       request is still active.
56
--         May  23, 2013 Because accesses through multiple arbiters using
57
--                       a single cycle seemed "aggressive" I put in a
58
--                       one cycle delay here.  This arbiter has the
59
--                       advantage now of not synthesizing any latches...
60
--                       The "dataflow" version could still be used, perhaps,
61
--                       reliably with a delayed acknowledge signal!
62
--         Feb.  6, 2014 Added cyc_l for fast clearing of cyc_o.
63
--         Feb. 11, 2014 Added LOCKING generic and hold_o output, to
64
--                       permit locking the arbiter until ack_i is
65
--                       received.
66
--                 
67
--
68
-- Description
69
-------------------------------------------------------------------------------
70
-- This module is an N way request arbitration unit.  There are N high
71
-- asserted request inputs.  When any subset of these is asserted, the arbitrator
72
-- causes its "msel" (multiplexer select address) output to control muxes that
73
-- route the appropriate request to the bus.
74
--
75
-- This unit is meant to coordinate access to a single resource bus, by N requesters.
76
-- The access is not exactly fair, since there is no timeout implemented here.
77
-- Thus, a requester must implement its own timeout, and if it never receives
78
-- an acknoledge signal, and never deasserts its request line, then the bus
79
-- will be "hogged" by that requester for ever.  The purpose of this module
80
-- is not to rip away the bus from a misbehaving or irresponsible requester.
81
-- Rather, this module gives out access to the bus in turns.  Each turn must
82
-- be fairly conducted by the requester.
83
--
84
-- There is a single acknowledge signal from the single bus.  The assertion of
85
-- the ack_i signal for one sys_clk edge is sufficient to terminate the current
86
-- access cycle, and cause this unit to change the msel_o output to route signals
87
-- from the next requester to the memory bus.  This same termination condition
88
-- should be respected by all requesters using this module.
89
--
90
-- The reason that external muxes are used to send the bus signals to the RAM is
91
-- to enable other muxes to be controlled for additional processing, e.g. an
92
-- offset engine which modifies the address presented to the bus, with the offset
93
-- being different depending on which requester is using the bus.
94
--
95
-- The policy of "fairness" followed by this module is of the "round robin" type.
96
-- In other words, each request when completed, is followed by a grant to the next
97
-- request, in order 0,1,2,...N-1,0,1...  There is no requirement for the request
98
-- lines to be returned to the inactive state before they can be asserted and
99
-- recognized again as valid requests.
100
--
101
-- There is a "parking" philosophy implemented in this module, which works in the
102
-- following way:  Whenever a request is completed, if there are no other pending
103
-- requests, the msel_o output remains in its current state.  This is probably
104
-- not an important fact, except to note that the most recent requester, already
105
-- having control of the memory bus, gets its next request granted one cycle faster
106
-- than usual, since its new request doesn't need to cause any change in the muxes
107
-- to grant it access to the memory bus.
108
--
109
-- Following reset, the msel_o output is set to zero, meaning that the bus is parked
110
-- for quickest access by requester zero.  Note that it is the user's responsibility
111
-- to ensure that the connections to the external muxes are made in such a way as to
112
-- correspond to the request inputs, according to this mapping:
113
--
114
--      Request Input         Corresponding msel_o output
115
--      -------------         ---------------------------
116
--        req_i(0)                       00b
117
--        req_i(1)                       01b
118
--         .....                         ...
119
--        req_i(N-1)                     unsigned(N-1)
120
--
121
-- All storage elements within this module are clocked according to the positive edge
122
-- of the sys_clk input, qualified by the sys_clk_en input being asserted high.  In
123
-- this way, sys_clk_en can be used to run this module at slower rates than sys_clk.
124
--
125
-- The sys_rst_n input is an asynchronous reset.
126
 
127
library IEEE;
128
use IEEE.STD_LOGIC_1164.ALL;
129
use IEEE.NUMERIC_STD.ALL;
130
use IEEE.MATH_REAL.ALL;
131
 
132
entity bus_arbiter_N_way is
133
    generic(
134
      LOCKING : integer := 0; -- Nonzero to hold until ack_i is received.
135
      N_VALUE : integer := 4; -- Number of bus requestors.
136
      LOG2_N  : integer := 2  -- Bit width of msel_o
137
    );
138
    port (
139
      -- System Clock and Clock Enable
140
      sys_rst_n   : in  std_logic;
141
      sys_clk     : in  std_logic;
142
      sys_clk_en  : in  std_logic;
143
 
144
      -- Access Request Inputs
145
      req_i       : in  unsigned(N_VALUE-1 downto 0);
146
 
147
      -- Status
148
      cyc_o       : out std_logic;
149
      hold_o      : out std_logic; -- Bus lock
150
 
151
      -- Ram Access Acknowledge
152
      ack_i       : in  std_logic; -- Releases lock
153
 
154
      -- Selection (Use to control external muxes)
155
      msel_o      : out unsigned(LOG2_N-1 downto 0);
156
      msel_new_o  : out std_logic
157
    );
158
end bus_arbiter_N_way;
159
 
160
architecture beh of bus_arbiter_N_way is
161
 
162
  -- Constants
163
 
164
  -- Functions & associated types
165
 
166
  -- Signal Declarations
167
  signal msel_l        : unsigned(LOG2_N-1 downto 0);
168
  signal msel_prior    : unsigned(LOG2_N-1 downto 0);
169
  signal req_asserted  : std_logic;
170
  signal cyc_l         : std_logic;
171
  signal hold_l        : std_logic;
172
 
173
begin
174
 
175
-- Combine all incoming request signals into a single signal indicating
176
-- there is at least one request active.
177
req_asserted <= '1' when (req_i/=0) else '0';
178
 
179
process (sys_clk, sys_clk_en, sys_rst_n)
180
variable l : integer := 0;
181
variable k : integer := 0;
182
begin
183
  if (sys_rst_n='0') then
184
    msel_l     <= (others=>'0');
185
    msel_prior <= (others=>'0');
186
    cyc_l  <= '0';
187
    hold_l <= '0';
188
  elsif (sys_clk'event and sys_clk='1') then
189
    if (sys_clk_en='1') then
190
      for j in 0 to N_VALUE-1 loop
191
        l := j+to_integer(msel_l);
192
        -- Use an if statement to apply "modulo N_VALUE"
193
        if (l>=N_VALUE) then
194
          k := l-N_VALUE;
195
        else
196
          k := l;
197
        end if;
198
        if (req_i(k)='1') then
199
          msel_l <= to_unsigned(k,LOG2_N);
200
        end if;
201
      end loop;
202
      -- Lock out changes to msel_l when current request is still active
203
      if LOCKING=0 then
204
        if req_i(to_integer(msel_l))='1' then
205
          msel_l <= msel_l;
206
        end if;
207
      else
208
        if hold_l='1' and ack_i='0' then
209
          msel_l <= msel_l;
210
        end if;
211
      end if;
212
      -- Handle hold_l signal
213
      if LOCKING=1 then
214
        -- clear hold
215
        if (hold_l='1' and ack_i='1') then
216
          hold_l <= '0';
217
        end if;
218
        -- Setting hold has higher priority than clearing hold
219
        if req_i(to_integer(msel_l))='1' and (hold_l='0' or (hold_l='1' and ack_i='1')) then
220
          hold_l <= '1';
221
        end if;
222
      end if;
223
      -- Save previous msel_l value, to support msel_new_o
224
      msel_prior <= msel_l;
225
      -- Provide the currently selected request line as an
226
      -- arbiter-wide bus cycle signal
227
      cyc_l <= req_i(to_integer(msel_l));
228
    end if; -- sys_clk_en
229
  end if; -- sys_clk
230
end process;
231
 
232
msel_o <= msel_l;
233
msel_new_o <= '1' when (msel_prior/=msel_l) else '0';
234
 
235
-- Clear the bus cycle output immediately upon removal of request.
236
cyc_o <= cyc_l and req_asserted;
237
 
238
-- Provide hold output
239
hold_o <= hold_l;
240
 
241
end beh;
242
 
243
-------------------------------------------------------------------------------
244
-- Bus Access Arbitration Module - Dataflow version
245
-------------------------------------------------------------------------------
246
--
247
-- Author: John Clayton
248
-- Date  : July 13, 2011 Copied code from "bus_arbiter_4_way" to begin.
249
--                       I am hoping to derive a more parameterized
250
--                       module.
251
--         Sept 11, 2012 After much successful use in hardware, I have
252
--                       revisited this module and simplified it so that
253
--                       requests are immediately driven out to msel.
254
--                       The intent is to eliminate wasted clock cycles.
255
--         Nov. 21, 2012 I have discovered that I was using an external
256
--                       mux for the bus_cyc signal, which is fairly
257
--                       understandable, since I'm using external muxes
258
--                       for nearly everything...  However, in the case
259
--                       of the bys_cyc signal, there is an unnecessary
260
--                       "opportunity for error" since bus_cyc is always
261
--                       set to the currently selected request line. It
262
--                       occurred to me that this can be moved inside
263
--                       the module, thereby eliminating the possibility
264
--                       of connecting it up incorrectly outside the
265
--                       module.  Thus, I'm adding the cyc_o signal.
266
--         May  15, 2013 While simulating a design, I discovered that
267
--                       while one request is active, another request
268
--                       may arrive which alters the state of msel_next,
269
--                       thus altering the output msel_o.  This is a flaw
270
--                       since requesters may be depending on the value
271
--                       of msel_o in order to receive acknowledgments,
272
--                       and could therefore erroneously see a ack when
273
--                       msel_o changed.  A new statement was added to
274
--                       "lock out" changes to msel_next while the current
275
--                       request is still active.
276
--         Feb. 11, 2014 Added LOCKING generic and hold_o output, to
277
--                       permit locking the arbiter until ack_i is
278
--                       received.
279
--                 
280
--
281
-- Description
282
-------------------------------------------------------------------------------
283
-- This module is an N way request arbitration unit.  There are N high
284
-- asserted request inputs.  When any subset of these is asserted, the arbitrator
285
-- causes its "msel" (multiplexer select address) output to control muxes that
286
-- route the appropriate request to the bus.
287
--
288
-- This unit is meant to coordinate access to a single resource bus, by N requesters.
289
-- The access is not exactly fair, since there is no timeout implemented here.
290
-- Thus, a requester must implement its own timeout, and if it never receives
291
-- an acknoledge signal, and never deasserts its request line, then the bus
292
-- will be "hogged" by that requester for ever.  The purpose of this module
293
-- is not to rip away the bus from a misbehaving or irresponsible requester.
294
-- Rather, this module gives out access to the bus in turns.  Each turn must
295
-- be fairly conducted by the requester.
296
--
297
-- There is a single acknowledge signal from the single bus.  The assertion of
298
-- the ack_i signal for one sys_clk edge is sufficient to terminate the current
299
-- access cycle, and cause this unit to change the msel_o output to route signals
300
-- from the next requester to the memory bus.  This same termination condition
301
-- should be respected by all requesters using this module.
302
--
303
-- The reason that external muxes are used to send the bus signals to the RAM is
304
-- to enable other muxes to be controlled for additional processing, e.g. an
305
-- offset engine which modifies the address presented to the bus, with the offset
306
-- being different depending on which requester is using the bus.
307
--
308
-- The policy of "fairness" followed by this module is of the "round robin" type.
309
-- In other words, each request when completed, is followed by a grant to the next
310
-- request, in order 0,1,2,...N-1,0,1...  There is no requirement for the request
311
-- lines to be returned to the inactive state before they can be asserted and
312
-- recognized again as valid requests.
313
--
314
-- There is a "parking" philosophy implemented in this module, which works in the
315
-- following way:  Whenever a request is completed, if there are no other pending
316
-- requests, the msel_o output remains in its current state.  This is probably
317
-- not an important fact, except to note that the most recent requester, already
318
-- having control of the memory bus, gets its next request granted one cycle faster
319
-- than usual, since its new request doesn't need to cause any change in the muxes
320
-- to grant it access to the memory bus.
321
--
322
-- Following reset, the msel_o output is set to zero, meaning that the bus is parked
323
-- for quickest access by requester zero.  Note that it is the user's responsibility
324
-- to ensure that the connections to the external muxes are made in such a way as to
325
-- correspond to the request inputs, according to this mapping:
326
--
327
--      Request Input         Corresponding msel_o output
328
--      -------------         ---------------------------
329
--        req_i(0)                       00b
330
--        req_i(1)                       01b
331
--         .....                         ...
332
--        req_i(N-1)                     unsigned(N-1)
333
--
334
-- All storage elements within this module are clocked according to the positive edge
335
-- of the sys_clk input, qualified by the sys_clk_en input being asserted high.  In
336
-- this way, sys_clk_en can be used to run this module at slower rates than sys_clk.
337
--
338
-- The sys_rst_n input is an asynchronous reset.
339
--
340
-- This version of the bus arbiter is a "dataflow" version in the sense that the
341
-- msel_o outputs change immediately upon a request input going high, thus allowing
342
-- for a bus cycle to be arbitrated and acknowledged in fewer sys_clk periods.
343
--
344
-- However, it synthesizes a latch in the msel_next process.  If this is nettlesome,
345
-- then do not use it...
346
 
347
library IEEE;
348
use IEEE.STD_LOGIC_1164.ALL;
349
use IEEE.NUMERIC_STD.ALL;
350
use IEEE.MATH_REAL.ALL;
351
 
352
entity bus_arbiter_dataflow_N_way is
353
    generic(
354
      LOCKING : integer := 0; -- Nonzero to hold until ack_i is received.
355
      N_VALUE : integer := 4; -- Number of bus requestors.
356
      LOG2_N  : integer := 2  -- Bit width of msel_o
357
    );
358
    port (
359
      -- System Clock and Clock Enable
360
      sys_rst_n   : in  std_logic;
361
      sys_clk     : in  std_logic;
362
      sys_clk_en  : in  std_logic;
363
 
364
      -- Ram Access Request Inputs
365
      req_i       : in  unsigned(N_VALUE-1 downto 0);
366
 
367
      -- Status
368
      cyc_o       : out std_logic;
369
      hold_o      : out std_logic; -- Bus lock
370
 
371
      -- Ram Access Acknowledge
372
      ack_i       : in  std_logic; -- Releases lock
373
 
374
      -- Ram Selection (Use to control external muxes)
375
      msel_o      : out unsigned(LOG2_N-1 downto 0);
376
      msel_new_o  : out std_logic
377
    );
378
end bus_arbiter_dataflow_N_way;
379
 
380
architecture beh of bus_arbiter_dataflow_N_way is
381
 
382
  -- Constants
383
 
384
  -- Functions & associated types
385
 
386
  -- Signal Declarations
387
  -- type msel_type is integer range 0 to N_VALUE-1; -- changed to integer for the simulator...
388
  -- signal msel_l        : msel_type := 0;
389
  -- signal msel_prev     : msel_type := 0;
390
  signal msel_next     : unsigned(LOG2_N-1 downto 0);
391
  signal msel_l        : unsigned(LOG2_N-1 downto 0);
392
  signal msel_prior    : unsigned(LOG2_N-1 downto 0);
393
  signal req_asserted  : std_logic;
394
  signal hold_l        : std_logic;
395
 
396
begin
397
 
398
-- Combine all incoming request signals into a single signal indicating
399
-- there is at least one request active.
400
req_asserted <= '1' when (req_i/=0) else '0';
401
 
402
process (msel_l,req_i)
403
-- type msel_modulo_type is integer range 0 to 2*N_VALUE-1; -- changed to integer, to satisfy simulator...
404
-- variable l : msel_modulo_type := 0;
405
-- variable k : msel_type := 0;
406
variable l : integer := 0;
407
variable k : integer := 0;
408
begin
409
  -- Change mux selections based on request and ack inputs.
410
  msel_next <= msel_l; -- Default value, prevents latch formation
411
  for j in 0 to N_VALUE-1 loop
412
    l := j+to_integer(msel_l);
413
    -- Use an if statement to apply "modulo N_VALUE"
414
    if (l>=N_VALUE) then
415
      k := l-N_VALUE;
416
    else
417
      k := l;
418
    end if;
419
    if (req_i(k)='1') then
420
      msel_next <= to_unsigned(k,LOG2_N);
421
    end if;
422
  end loop;
423
  -- Lock out changes to msel_next when current request is still active
424
  if LOCKING=0 then
425
    if req_i(to_integer(msel_l))='1' then
426
      msel_next <= msel_next;
427
    end if;
428
  else
429
    if (hold_l='1' and ack_i='0') then
430
      msel_next <= msel_next;
431
    end if;
432
  end if;
433
end process;
434
 
435
process (sys_clk, sys_clk_en, sys_rst_n)
436
begin
437
  if (sys_rst_n='0') then
438
    msel_l     <= (others=>'0');
439
    msel_prior <= (others=>'0');
440
    hold_l <= '0';
441
  elsif (sys_clk'event and sys_clk='1') then
442
    if (sys_clk_en='1') then
443
      msel_prior <= msel_next;
444
      if LOCKING=0 then
445
        if req_asserted='1' then
446
          msel_l <= msel_next;
447
        end if;
448
      else
449
        if req_asserted='1' and (hold_l='0' or (hold_l='1' and ack_i='1')) then
450
          msel_l <= msel_next;
451
        end if;
452
      end if;
453
 
454
      -- Handle the hold_l signal
455
        -- clear hold
456
      if (hold_l='1' and ack_i='1') then
457
        hold_l <= '0';
458
      end if;
459
        -- Setting hold has higher priority than clearing hold
460
      if req_i(to_integer(msel_l))='1' and LOCKING=1 then
461
        if (hold_l='0' or (hold_l='1' and ack_i='1')) then
462
          hold_l <= '1';
463
        end if;
464
      end if;
465
 
466
    end if; -- sys_clk_en
467
  end if; -- sys_clk
468
end process;
469
 
470
msel_o <= msel_next;
471
msel_new_o <= '1' when (msel_prior/=msel_next) else '0';
472
 
473
-- Provide the currently selected request line as an
474
-- arbiter-wide bus cycle signal
475
cyc_o <= req_i(to_integer(msel_next));
476
 
477
hold_o <= '0';
478
 
479
end beh;
480
 
481
-------------------------------------------------------------------------------
482
-- Multiple Bus Access Request Module
483
-------------------------------------------------------------------------------
484
--
485
-- Author: John Clayton
486
-- Date  : Feb.  3, 2014 Copied code from "bus_arbiter_N_way" to begin.
487
--
488
-- Description
489
-------------------------------------------------------------------------------
490
-- This module is an N way bus request unit.  It is meant for those rare days
491
-- when a single bus cycle is issued to multiple buses, all of which must
492
-- acknowledge the cycle before the request can be considered fulfilled.
493
--
494
-- Asserting a single "master" req_i signal gives rise to the assertion of a
495
-- multiplicity of bus request req_o signals.  Each of these is then used to
496
-- generate a bus cycle, with its associated acknowledge ack_i handshake signal
497
-- in return.  When each ack_i handshake is received, the associated request
498
-- line is deasserted.  However, the main "master" acknowledge is not given
499
-- until all the ack_i inputs have been received.
500
--
501
-- This module does not implement a cycle timeout of any kind.  Therefore, if
502
-- any of the multiple requested cycles does not complete, the master cycle
503
-- will remain unacknowledged, and it can "hang" forever in this state.  You
504
-- have been warned!
505
--
506
-- This is a "dataflow" unit in the sense that asserting req_i immediately
507
-- asserts the req_o signals, without any clock delays.  The acknowledge
508
-- ack_i inputs do not, however, immediately deassert the req_o outputs.
509
-- Instead, the req_o outputs are deasserted after one clock cycle.
510
--
511
-- Isn't that just as "clear as mud?"
512
--
513
-- The sys_rst_n input is an asynchronous reset.
514
 
515
library IEEE;
516
use IEEE.STD_LOGIC_1164.ALL;
517
use IEEE.NUMERIC_STD.ALL;
518
use IEEE.MATH_REAL.ALL;
519
 
520
entity bus_requester_N_way is
521
    generic(
522
      N_VALUE : integer := 2 -- Number of bus requestors.
523
    );
524
    port (
525
      -- System Clock and Clock Enable
526
      sys_rst_n   : in  std_logic;
527
      sys_clk     : in  std_logic;
528
      sys_clk_en  : in  std_logic;
529
 
530
      -- Single "master" Bus Access Request and acknowledge
531
      req_i       : in  std_logic;
532
      ack_o       : out std_logic;
533
 
534
      -- A multiplicity of subordinate bus requests
535
      n_req_o     : out unsigned(N_VALUE-1 downto 0);
536
 
537
      -- A multiplicity of subordinate Bus Access Acknowledge signals
538
      n_ack_i     : in  unsigned(N_VALUE-1 downto 0)
539
 
540
    );
541
end bus_requester_N_way;
542
 
543
architecture beh of bus_requester_N_way is
544
 
545
  -- Constants
546
 
547
  -- Functions & associated types
548
 
549
  -- Signal Declarations
550
  signal req_l    : unsigned(N_VALUE-1 downto 0);
551
  signal req_msk  : unsigned(N_VALUE-1 downto 0);
552
 
553
begin
554
 
555
process (sys_clk, sys_clk_en, sys_rst_n)
556
variable k : integer := 0;
557
begin
558
  if (sys_rst_n='0') then
559
    req_l      <= (others=>'1');
560
  elsif (sys_clk'event and sys_clk='1') then
561
    if (sys_clk_en='1') then
562
      -- Clear internal request bits when acknowledged
563
      for k in 0 to N_VALUE-1 loop
564
        if (n_ack_i(k)='1') then
565
          req_l(k) <= '0';
566
        end if;
567
      end loop;
568
      -- Reset the internal request bits
569
      if (req_i='0') then
570
        req_l <= (others=>'1');
571
      end if;
572
    end if; -- sys_clk_en
573
  end if; -- sys_clk
574
end process;
575
 
576
n_req_gen : for i in 0 to N_VALUE-1 generate
577
  n_req_o(i) <= '1' when req_i='1' and req_l(i)='1' else '0';
578
end generate n_req_gen;
579
 
580
-- The masked version of req_l proleptically reflects the request
581
-- bits which are about to be cleared.
582
req_msk <= req_l and (not n_ack_i);
583
 
584
ack_o <= '1' when req_i='1' and req_msk=0 else '0';
585
 
586
end beh;
587
 
588
 

powered by: WebSVN 2.1.0

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