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/] [pkt_codec_mk2/] [1.0/] [vhd/] [ase_dring1_pkg.vhd] - Blame information for rev 145

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 145 lanttu
-------------------------------------------------------------------------------
2
-- Title      : Package for ase_ring1 and wrappers using it
3
-- Project    : 
4
-------------------------------------------------------------------------------
5
-- File       : ase_ring1_pkg.vhdl
6
-- Author     : Lasse Lehtonen
7
-- Company    : 
8
-- Created    : 2010-07-04
9
-- Last update: 2011-11-03
10
-- Platform   : 
11
-- Standard   : VHDL'93
12
-------------------------------------------------------------------------------
13
-- Description: 
14
-------------------------------------------------------------------------------
15
-- Copyright (c) 2010 
16
-------------------------------------------------------------------------------
17
-- Revisions  :
18
-- Date        Version  Author  Description
19
-- 2010-07-04  1.0      ase     Created
20
-------------------------------------------------------------------------------
21
 
22
library ieee;
23
use ieee.std_logic_1164.all;
24
use ieee.numeric_std.all;
25
 
26
use work.log2_pkg.all;
27
 
28
-------------------------------------------------------------------------------
29
-- PACKAGE DECLARATION
30
-------------------------------------------------------------------------------
31
package ase_dring1_pkg is
32
 
33
  -----------------------------------------------------------------------------
34
  -- HELPER FUNCTIONS
35
  -----------------------------------------------------------------------------
36
 
37
  -- Returns data_width_c wide address calculated from source and
38
  --  destination id numbers (ie. their position on the ring)
39
  function dring1_address (
40
    src_id       : in integer;
41
    dst_id       : in integer;
42
    agents_c     : in positive;
43
    data_width_c : in positive)
44
    return std_logic_vector;
45
 
46
  function dring1_address_s (
47
    constant src_id       : in integer;
48
    signal   dst_id       : in integer;
49
    constant agents_c     : in positive;
50
    constant data_width_c : in positive)
51
    return std_logic_vector;
52
 
53
end package ase_dring1_pkg;
54
 
55
-------------------------------------------------------------------------------
56
-- PACKAGE BODY
57
-------------------------------------------------------------------------------
58
package body ase_dring1_pkg is
59
 
60
  -----------------------------------------------------------------------------
61
  -- FUNCTIONS
62
  -----------------------------------------------------------------------------
63
  function dring1_address (
64
    src_id       : in integer;
65
    dst_id       : in integer;
66
    agents_c     : in positive;
67
    data_width_c : in positive)
68
    return std_logic_vector is
69
    variable retval_v     : std_logic_vector(data_width_c-1 downto 0);
70
    constant addr_width_c : positive := log2_ceil(agents_c/2);
71
    variable src_v        : integer;    --natural range 0 to agents_c-1;
72
    variable dst_v        : integer;    --natural range 0 to agents_c-1;
73
    variable tmp_v        : signed(addr_width_c+2 downto 0);
74
  begin
75
    retval_v := (others => '0');
76
    src_v    := src_id;
77
    dst_v    := dst_id;
78
    if src_v < dst_v then
79
      if dst_v - src_v <= agents_c / 2 then
80
        report "#1 src: " & integer'image(src_id) & " dst: "
81
          & integer'image(dst_id) severity note;
82
        retval_v(addr_width_c)            := '0';
83
        retval_v(addr_width_c-1 downto 0) :=
84
          std_logic_vector(to_signed
85
                           (2**addr_width_c - (dst_v - src_v), addr_width_c+3)
86
                           (addr_width_c-1 downto 0));
87
      else
88
        report "#2 src: " & integer'image(src_id) & " dst: "
89
          & integer'image(dst_id) severity note;
90
        retval_v(addr_width_c)            := '1';
91
        retval_v(addr_width_c-1 downto 0) :=
92
          std_logic_vector(to_signed(
93
            2**addr_width_c - (agents_c - dst_v + src_v), addr_width_c+3)
94
                           (addr_width_c-1 downto 0));
95
      end if;
96
    else
97
      if src_v - dst_v <= agents_c / 2 then
98
        report "#3 src: " & integer'image(src_id) & " dst: "
99
          & integer'image(dst_id) severity note;
100
        retval_v(addr_width_c)            := '1';
101
        retval_v(addr_width_c-1 downto 0) :=
102
          std_logic_vector(to_signed
103
                           (2**addr_width_c - (src_v - dst_v), addr_width_c+3)
104
                           (addr_width_c-1 downto 0));
105
      else
106
        report "#4 src: " & integer'image(src_id) & " dst: "
107
          & integer'image(dst_id) severity note;
108
        retval_v(addr_width_c) := '0';
109
        tmp_v := to_signed(
110
          2**addr_width_c - (agents_c - src_v + dst_v), addr_width_c+3);
111
        report "#4 tmpv: " & integer'image(to_integer(tmp_v));
112
        retval_v(addr_width_c-1 downto 0) := std_logic_vector(tmp_v(addr_width_c-1 downto 0));
113
        report "#4 resv: " &
114
          integer'image(2**addr_width_c - (agents_c - src_v + dst_v))
115
          severity note;
116
      end if;
117
    end if;
118
    report "RESULT: " & integer'image(to_integer(unsigned(retval_v)))
119
      severity note;
120
    return retval_v;
121
  end function dring1_address;
122
 
123
 
124
  function dring1_address_s (
125
    constant src_id       : in integer;
126
    signal   dst_id       : in integer;
127
    constant agents_c     : in positive;
128
    constant data_width_c : in positive)
129
    return std_logic_vector is
130
    variable retval_v     : std_logic_vector(data_width_c-1 downto 0);
131
    constant addr_width_c : positive := log2_ceil(agents_c/2);
132
    variable src_v        : integer;    --natural range 0 to agents_c-1;
133
    variable dst_v        : integer;    --natural range 0 to agents_c-1;
134
  begin
135
    retval_v := (others => '0');
136
    src_v    := src_id;
137
    dst_v    := dst_id;
138
    if src_v < dst_v then
139
      if dst_v - src_v <= agents_c / 2 then
140
        retval_v(addr_width_c)            := '0';
141
        retval_v(addr_width_c-1 downto 0) :=
142
          std_logic_vector(to_unsigned
143
                           (2**addr_width_c - dst_v - src_v, addr_width_c));
144
      else
145
        retval_v(addr_width_c)            := '1';
146
        retval_v(addr_width_c-1 downto 0) :=
147
          std_logic_vector(to_unsigned(
148
            2**addr_width_c - agents_c - dst_v + src_v, addr_width_c));
149
      end if;
150
    else
151
      if src_v - dst_v <= agents_c / 2 then
152
        retval_v(addr_width_c)            := '1';
153
        retval_v(addr_width_c-1 downto 0) :=
154
          std_logic_vector(to_unsigned
155
                           (2**addr_width_c - src_v - dst_v, addr_width_c));
156
      else
157
        retval_v(addr_width_c)            := '0';
158
        retval_v(addr_width_c-1 downto 0) :=
159
          std_logic_vector(to_unsigned(
160
            2**addr_width_c - agents_c - src_v + dst_v, addr_width_c));
161
      end if;
162
    end if;
163
    return retval_v;
164
  end function dring1_address_s;
165
 
166
end package body ase_dring1_pkg;

powered by: WebSVN 2.1.0

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