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

Subversion Repositories lxp32

[/] [lxp32/] [trunk/] [verify/] [lxp32/] [src/] [platform/] [intercon.vhd] - Blame information for rev 9

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 9 ring0_mipt
---------------------------------------------------------------------
2
-- Simple WISHBONE interconnect
3
--
4
-- Generated by wigen at 02/16/16 06:15:08
5
--
6
-- Configuration:
7
--     Number of masters:     2
8
--     Number of slaves:      4
9
--     Master address width:  32
10
--     Slave address width:   28
11
--     Port size:             32
12
--     Port granularity:      8
13
--     Entity name:           intercon
14
--     Pipelined arbiter:     no
15
--     Registered feedback:   no
16
--     Unsafe slave decoder:  no
17
--
18
-- Command line:
19
--     wigen -e intercon 2 4 32 28 32 8
20
---------------------------------------------------------------------
21
 
22
library ieee;
23
use ieee.std_logic_1164.all;
24
 
25
entity intercon is
26
        port(
27
                clk_i: in std_logic;
28
                rst_i: in std_logic;
29
 
30
                s0_cyc_i: in std_logic;
31
                s0_stb_i: in std_logic;
32
                s0_we_i: in std_logic;
33
                s0_sel_i: in std_logic_vector(3 downto 0);
34
                s0_ack_o: out std_logic;
35
                s0_adr_i: in std_logic_vector(31 downto 2);
36
                s0_dat_i: in std_logic_vector(31 downto 0);
37
                s0_dat_o: out std_logic_vector(31 downto 0);
38
 
39
                s1_cyc_i: in std_logic;
40
                s1_stb_i: in std_logic;
41
                s1_we_i: in std_logic;
42
                s1_sel_i: in std_logic_vector(3 downto 0);
43
                s1_ack_o: out std_logic;
44
                s1_adr_i: in std_logic_vector(31 downto 2);
45
                s1_dat_i: in std_logic_vector(31 downto 0);
46
                s1_dat_o: out std_logic_vector(31 downto 0);
47
 
48
                m0_cyc_o: out std_logic;
49
                m0_stb_o: out std_logic;
50
                m0_we_o: out std_logic;
51
                m0_sel_o: out std_logic_vector(3 downto 0);
52
                m0_ack_i: in std_logic;
53
                m0_adr_o: out std_logic_vector(27 downto 2);
54
                m0_dat_o: out std_logic_vector(31 downto 0);
55
                m0_dat_i: in std_logic_vector(31 downto 0);
56
 
57
                m1_cyc_o: out std_logic;
58
                m1_stb_o: out std_logic;
59
                m1_we_o: out std_logic;
60
                m1_sel_o: out std_logic_vector(3 downto 0);
61
                m1_ack_i: in std_logic;
62
                m1_adr_o: out std_logic_vector(27 downto 2);
63
                m1_dat_o: out std_logic_vector(31 downto 0);
64
                m1_dat_i: in std_logic_vector(31 downto 0);
65
 
66
                m2_cyc_o: out std_logic;
67
                m2_stb_o: out std_logic;
68
                m2_we_o: out std_logic;
69
                m2_sel_o: out std_logic_vector(3 downto 0);
70
                m2_ack_i: in std_logic;
71
                m2_adr_o: out std_logic_vector(27 downto 2);
72
                m2_dat_o: out std_logic_vector(31 downto 0);
73
                m2_dat_i: in std_logic_vector(31 downto 0);
74
 
75
                m3_cyc_o: out std_logic;
76
                m3_stb_o: out std_logic;
77
                m3_we_o: out std_logic;
78
                m3_sel_o: out std_logic_vector(3 downto 0);
79
                m3_ack_i: in std_logic;
80
                m3_adr_o: out std_logic_vector(27 downto 2);
81
                m3_dat_o: out std_logic_vector(31 downto 0);
82
                m3_dat_i: in std_logic_vector(31 downto 0)
83
        );
84
end entity;
85
 
86
architecture rtl of intercon is
87
 
88
signal request: std_logic_vector(1 downto 0);
89
signal grant_next: std_logic_vector(1 downto 0);
90
signal grant: std_logic_vector(1 downto 0);
91
signal grant_reg: std_logic_vector(1 downto 0):=(others=>'0');
92
 
93
signal select_slave: std_logic_vector(4 downto 0);
94
 
95
signal cyc_mux: std_logic;
96
signal stb_mux: std_logic;
97
signal we_mux: std_logic;
98
signal sel_mux: std_logic_vector(3 downto 0);
99
signal adr_mux: std_logic_vector(31 downto 2);
100
signal wdata_mux: std_logic_vector(31 downto 0);
101
 
102
signal ack_mux: std_logic;
103
signal rdata_mux: std_logic_vector(31 downto 0);
104
 
105
begin
106
 
107
-- ARBITER
108
-- Selects the active master. Masters with lower port numbers
109
-- have higher priority. Ongoing cycles are not interrupted.
110
 
111
request<=s1_cyc_i&s0_cyc_i;
112
 
113
grant_next<="01" when request(0)='1' else
114
        "10" when request(1)='1' else
115
        (others=>'0');
116
 
117
grant<=grant_reg when (request and grant_reg)/="00" else grant_next;
118
 
119
process (clk_i) is
120
begin
121
        if rising_edge(clk_i) then
122
                if rst_i='1' then
123
                        grant_reg<=(others=>'0');
124
                else
125
                        grant_reg<=grant;
126
                end if;
127
        end if;
128
end process;
129
 
130
-- MASTER->SLAVE MUX
131
 
132
cyc_mux<=(s0_cyc_i and grant(0)) or
133
        (s1_cyc_i and grant(1));
134
 
135
stb_mux<=(s0_stb_i and grant(0)) or
136
        (s1_stb_i and grant(1));
137
 
138
we_mux<=(s0_we_i and grant(0)) or
139
        (s1_we_i and grant(1));
140
 
141
sel_mux_gen: for i in sel_mux'range generate
142
        sel_mux(i)<=(s0_sel_i(i) and grant(0)) or
143
                (s1_sel_i(i) and grant(1));
144
end generate;
145
 
146
adr_mux_gen: for i in adr_mux'range generate
147
        adr_mux(i)<=(s0_adr_i(i) and grant(0)) or
148
                (s1_adr_i(i) and grant(1));
149
end generate;
150
 
151
wdata_mux_gen: for i in wdata_mux'range generate
152
        wdata_mux(i)<=(s0_dat_i(i) and grant(0)) or
153
                (s1_dat_i(i) and grant(1));
154
end generate;
155
 
156
-- MASTER->SLAVE DEMUX
157
 
158
select_slave<="00001" when adr_mux(31 downto 28)="0000" else
159
        "00010" when adr_mux(31 downto 28)="0001" else
160
        "00100" when adr_mux(31 downto 28)="0010" else
161
        "01000" when adr_mux(31 downto 28)="0011" else
162
        "10000"; -- fallback slave
163
 
164
m0_cyc_o<=cyc_mux and select_slave(0);
165
m0_stb_o<=stb_mux and select_slave(0);
166
m0_we_o<=we_mux;
167
m0_sel_o<=sel_mux;
168
m0_adr_o<=adr_mux(m0_adr_o'range);
169
m0_dat_o<=wdata_mux;
170
 
171
m1_cyc_o<=cyc_mux and select_slave(1);
172
m1_stb_o<=stb_mux and select_slave(1);
173
m1_we_o<=we_mux;
174
m1_sel_o<=sel_mux;
175
m1_adr_o<=adr_mux(m1_adr_o'range);
176
m1_dat_o<=wdata_mux;
177
 
178
m2_cyc_o<=cyc_mux and select_slave(2);
179
m2_stb_o<=stb_mux and select_slave(2);
180
m2_we_o<=we_mux;
181
m2_sel_o<=sel_mux;
182
m2_adr_o<=adr_mux(m2_adr_o'range);
183
m2_dat_o<=wdata_mux;
184
 
185
m3_cyc_o<=cyc_mux and select_slave(3);
186
m3_stb_o<=stb_mux and select_slave(3);
187
m3_we_o<=we_mux;
188
m3_sel_o<=sel_mux;
189
m3_adr_o<=adr_mux(m3_adr_o'range);
190
m3_dat_o<=wdata_mux;
191
 
192
-- SLAVE->MASTER MUX
193
 
194
ack_mux<=(m0_ack_i and select_slave(0)) or
195
        (m1_ack_i and select_slave(1)) or
196
        (m2_ack_i and select_slave(2)) or
197
        (m3_ack_i and select_slave(3)) or
198
        (cyc_mux and stb_mux and select_slave(4)); -- fallback slave
199
 
200
rdata_mux_gen: for i in rdata_mux'range generate
201
        rdata_mux(i)<=(m0_dat_i(i) and select_slave(0)) or
202
                (m1_dat_i(i) and select_slave(1)) or
203
                (m2_dat_i(i) and select_slave(2)) or
204
                (m3_dat_i(i) and select_slave(3));
205
end generate;
206
 
207
-- SLAVE->MASTER DEMUX
208
 
209
s0_ack_o<=ack_mux and grant(0);
210
s0_dat_o<=rdata_mux;
211
 
212
s1_ack_o<=ack_mux and grant(1);
213
s1_dat_o<=rdata_mux;
214
 
215
end architecture;

powered by: WebSVN 2.1.0

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