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/] [address_lut.vhd] - Blame information for rev 147

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 145 lanttu
-------------------------------------------------------------------------------
2
-- Title      : Address look-up table
3
-- Project    : 
4
-------------------------------------------------------------------------------
5
-- File       : address_lut.vhd
6
-- Author     : Lasse Lehtonen
7
-- Company    : 
8
-- Created    : 2011-01-12
9 147 lanttu
-- Last update: 2012-05-04
10 145 lanttu
-- Platform   : 
11
-- Standard   : VHDL'93
12
-------------------------------------------------------------------------------
13
-- Description: Converts memory mapped I/O address to NoC address
14
-------------------------------------------------------------------------------
15
-- Copyright (c) 2011 
16
-------------------------------------------------------------------------------
17
-- Revisions  :
18
-- Date        Version  Author  Description
19
-- 2011-01-12  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.ase_noc_pkg.all;
27
use work.ase_mesh1_pkg.all;
28
use work.ase_dring1_pkg.all;
29 147 lanttu
use work.fh_mesh_pkg.all;
30 145 lanttu
 
31
entity address_lut is
32
 
33
  generic (
34
    my_id_g        : natural;
35
    data_width_g   : positive;
36
    address_mode_g : natural;
37
    cols_g         : positive;
38
    rows_g         : positive;
39
    agent_ports_g  : positive;
40
    agents_g       : positive;
41 147 lanttu
    noc_type_g     : natural;
42
    len_width_g    : natural);          -- 2012-05-04
43 145 lanttu
 
44
  port (
45
    addr_in  : in  std_logic_vector(data_width_g-1 downto 0);
46 147 lanttu
    len_in   : in  std_logic_vector(len_width_g-1 downto 0);  -- 2012-05-04
47 145 lanttu
    addr_out : out std_logic_vector(data_width_g-1 downto 0));
48
 
49
end entity address_lut;
50
 
51
 
52
 
53
architecture rtl of address_lut is
54
 
55
  -- How many different address ranges there are
56
  constant n_addr_ranges_c : positive := 32;
57
  constant mesh_ids_c      : positive := cols_g*rows_g*agent_ports_g;
58
 
59
  signal noc_target : integer;
60
 
61
 
62
  type addr_range_type is array (0 to 2) of unsigned(data_width_g-1 downto 0);
63
  type addr_lut_type is array (0 to n_addr_ranges_c-1) of addr_range_type;
64
 
65
  function addr_gen (
66 147 lanttu
    constant target : natural;
67
    length : integer)
68 145 lanttu
    return unsigned is
69
    variable retval : unsigned(data_width_g-1 downto 0);
70
  begin
71
    if noc_type_g = 0 then
72
      retval := unsigned(ase_noc_address(my_id_g, target, cols_g, rows_g,
73
                                         agent_ports_g, data_width_g));
74
      return retval;
75
    end if;
76
    if noc_type_g = 1 then
77
      retval := unsigned(ase_mesh1_address(my_id_g, target, rows_g, cols_g,
78
                                           data_width_g));
79
      return retval;
80
    end if;
81
    if noc_type_g = 2 then
82
      retval := unsigned(dring1_address(my_id_g, target, agents_g,
83
                                        data_width_g));
84
      return retval;
85
    end if;
86 147 lanttu
    if noc_type_g = 3 then
87
      retval := unsigned(fh_mesh_address(my_id_g, target, rows_g, cols_g,
88
                                        data_width_g, len_width_g,
89
                                         length));
90
      return retval;
91
    end if;
92 145 lanttu
  end addr_gen;
93
 
94
  function addr_gen_s (
95 147 lanttu
    signal target : integer;
96
    length : integer)
97 145 lanttu
    return std_logic_vector is
98
    variable retval : std_logic_vector(data_width_g-1 downto 0);
99
  begin
100
    if noc_type_g = 0 then
101
      retval := ase_noc_address_s(my_id_g, target, cols_g, rows_g,
102
                                  agent_ports_g, data_width_g);
103
      return retval;
104
    end if;
105
    if noc_type_g = 1 then
106 147 lanttu
      retval := ase_mesh1_address(my_id_g, target, rows_g, cols_g,
107 145 lanttu
                                   data_width_g);
108
      return retval;
109
    end if;
110
    if noc_type_g = 2 then
111 147 lanttu
      retval := dring1_address(my_id_g, target, agents_g, data_width_g);
112 145 lanttu
      return retval;
113
    end if;
114 147 lanttu
    if noc_type_g = 3 then
115
      retval := fh_mesh_address(my_id_g, target, rows_g, cols_g,
116
                                data_width_g, len_width_g, length);
117
      return retval;
118
    end if;
119 145 lanttu
  end addr_gen_s;
120
 
121
  -- First  = address range's minimum address
122
  -- Second = address range's maximum address
123
  -- Third  = corresponding network address
124
 
125
  constant addr_lut_c : addr_lut_type :=
126
    (
127 147 lanttu
      (x"00000000", x"00FFFFFF", addr_gen(0,8)),
128
      (x"01000000", x"01FFFFFF", addr_gen(1,8)),
129
      (x"02000000", x"02FFFFFF", addr_gen(2,8)),
130
      (x"03000000", x"03FFFFFF", addr_gen(3,8)),
131
      (x"04000000", x"04FFFFFF", addr_gen(4,8)),
132
      (x"05000000", x"05FFFFFF", addr_gen(5,8)),
133
      (x"06000000", x"06FFFFFF", addr_gen(6,8)),
134
      (x"07000000", x"07FFFFFF", addr_gen(7,8)),
135
      (x"08000000", x"08FFFFFF", addr_gen(8,8)),
136
      (x"09000000", x"09FFFFFF", addr_gen(9,8)),
137
      (x"0A000000", x"0AFFFFFF", addr_gen(10,8)),
138
      (x"0B000000", x"0BFFFFFF", addr_gen(11,8)),
139
      (x"0C000000", x"0CFFFFFF", addr_gen(12,8)),
140
      (x"0D000000", x"0DFFFFFF", addr_gen(13,8)),
141
      (x"0E000000", x"0EFFFFFF", addr_gen(14,8)),
142
      (x"0F000000", x"0FFFFFFF", addr_gen(15,8)),
143
      (x"10000000", x"10FFFFFF", addr_gen(16,8)),
144
      (x"11000000", x"11FFFFFF", addr_gen(17,8)),
145
      (x"12000000", x"12FFFFFF", addr_gen(18,8)),
146
      (x"13000000", x"13FFFFFF", addr_gen(19,8)),
147
      (x"14000000", x"14FFFFFF", addr_gen(20,8)),
148
      (x"15000000", x"15FFFFFF", addr_gen(21,8)),
149
      (x"16000000", x"16FFFFFF", addr_gen(22,8)),
150
      (x"17000000", x"17FFFFFF", addr_gen(23,8)),
151
      (x"18000000", x"18FFFFFF", addr_gen(24,8)),
152
      (x"19000000", x"19FFFFFF", addr_gen(25,8)),
153
      (x"1A000000", x"1AFFFFFF", addr_gen(26,8)),
154
      (x"1B000000", x"1BFFFFFF", addr_gen(27,8)),
155
      (x"1C000000", x"1CFFFFFF", addr_gen(28,8)),
156
      (x"1D000000", x"1DFFFFFF", addr_gen(29,8)),
157
      (x"1E000000", x"1EFFFFFF", addr_gen(30,8)),
158
      (x"1F000000", x"1FFFFFFF", addr_gen(31,8))
159 145 lanttu
      );
160
 
161
--  constant addr_lut_c : addr_lut_type :=
162
--    (
163
--      (x"0000", x"0FFF", addr_gen(0)),
164
--      (x"1000", x"1FFF", addr_gen(1)),
165
--      (x"2000", x"2FFF", addr_gen(2)),
166
--      (x"3000", x"3FFF", addr_gen(3))
167
--      );
168
 
169
begin  -- architecture rtl
170
 
171
  -----------------------------------------------------------------------------
172
  -- MEMORY MAPPED ADDRESSES
173
  -----------------------------------------------------------------------------
174
  use_mem_addr_gen : if address_mode_g = 2 generate
175
 
176
    translate_p : process (addr_in) is
177
    begin  -- process  translate_p
178
 
179
      addr_out <= (others => '1');
180
 
181
      for i in 0 to n_addr_ranges_c-1 loop
182
 
183
        if unsigned(addr_in) >= addr_lut_c(i)(0)
184
          and unsigned(addr_in) <= addr_lut_c(i)(1) then
185
 
186
          addr_out <= std_logic_vector(addr_lut_c(i)(2));
187
        end if;
188
 
189
      end loop;  -- i
190
 
191
    end process translate_p;
192
 
193
  end generate use_mem_addr_gen;
194
 
195
  -----------------------------------------------------------------------------
196
  -- INTEGER ADDRESSES
197
  -----------------------------------------------------------------------------
198
  use_int_addr_gen : if address_mode_g = 1 generate
199
 
200
    noc_target <= to_integer(unsigned(addr_in(data_width_g-2 downto 0)));
201 147 lanttu
    addr_out   <= addr_gen_s(noc_target, to_integer(unsigned(len_in)));
202 145 lanttu
 
203
  end generate use_int_addr_gen;
204
 
205
  -----------------------------------------------------------------------------
206
  -- NO ADDRESS TRANSLATION
207
  -----------------------------------------------------------------------------
208
  no_translation_g : if address_mode_g = 0 generate
209
 
210
    addr_out <= addr_in;
211
 
212
  end generate no_translation_g;
213
 
214
end architecture rtl;

powered by: WebSVN 2.1.0

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