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

Subversion Repositories lxp32

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

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 ring0_mipt
---------------------------------------------------------------------
2
-- LXP32 platform top-level design unit
3
--
4
-- Part of the LXP32 test platform
5
--
6
-- Copyright (c) 2016 by Alex I. Kuznetsov
7
--
8
-- A SoC-like simulation platform for the LXP32 CPU, containing
9
-- a few peripherals such as program RAM, timer and coprocessor.
10
--
11
-- Note: regardless of whether this description is synthesizable,
12
-- it was designed exclusively for simulation purposes.
13
---------------------------------------------------------------------
14
 
15
library ieee;
16
use ieee.std_logic_1164.all;
17
 
18
entity platform is
19
        generic(
20
                MODEL_LXP32C: boolean;
21
                THROTTLE_DBUS: boolean;
22
                THROTTLE_IBUS: boolean
23
        );
24
        port(
25
                clk_i: in std_logic;
26
                rst_i: in std_logic;
27
                cpu_rst_i: in std_logic;
28
 
29
                wbm_cyc_o: out std_logic;
30
                wbm_stb_o: out std_logic;
31
                wbm_we_o: out std_logic;
32
                wbm_sel_o: out std_logic_vector(3 downto 0);
33
                wbm_ack_i: in std_logic;
34
                wbm_adr_o: out std_logic_vector(27 downto 2);
35
                wbm_dat_o: out std_logic_vector(31 downto 0);
36
                wbm_dat_i: in std_logic_vector(31 downto 0);
37
 
38
                wbs_cyc_i: in std_logic;
39
                wbs_stb_i: in std_logic;
40
                wbs_we_i: in std_logic;
41
                wbs_sel_i: in std_logic_vector(3 downto 0);
42
                wbs_ack_o: out std_logic;
43
                wbs_adr_i: in std_logic_vector(31 downto 2);
44
                wbs_dat_i: in std_logic_vector(31 downto 0);
45
                wbs_dat_o: out std_logic_vector(31 downto 0);
46
 
47
                gp_io: inout std_logic_vector(31 downto 0)
48
        );
49
end entity;
50
 
51
architecture rtl of platform is
52
 
53
type wbm_type is record
54
        cyc: std_logic;
55
        stb: std_logic;
56
        we: std_logic;
57
        sel: std_logic_vector(3 downto 0);
58
        ack: std_logic;
59
        adr: std_logic_vector(31 downto 2);
60
        wdata: std_logic_vector(31 downto 0);
61
        rdata: std_logic_vector(31 downto 0);
62
end record;
63
 
64
type wbs_type is record
65
        cyc: std_logic;
66
        stb: std_logic;
67
        we: std_logic;
68
        sel: std_logic_vector(3 downto 0);
69
        ack: std_logic;
70
        adr: std_logic_vector(27 downto 2);
71
        wdata: std_logic_vector(31 downto 0);
72
        rdata: std_logic_vector(31 downto 0);
73
end record;
74
 
75
type ibus_type is record
76
        cyc: std_logic;
77
        stb: std_logic;
78
        cti: std_logic_vector(2 downto 0);
79
        bte: std_logic_vector(1 downto 0);
80
        ack: std_logic;
81
        adr: std_logic_vector(29 downto 0);
82
        dat: std_logic_vector(31 downto 0);
83
end record;
84
 
85
signal cpu_rst: std_logic;
86
signal cpu_irq: std_logic_vector(7 downto 0);
87
signal cpu_dbus: wbm_type;
88
signal cpu_ibus: ibus_type;
89
 
90
signal lli_re: std_logic;
91
signal lli_adr: std_logic_vector(29 downto 0);
92
signal lli_dat: std_logic_vector(31 downto 0);
93
signal lli_busy: std_logic;
94
 
95
signal monitor_dbus: wbm_type;
96
 
97
signal ram_wb: wbs_type;
98
 
99
signal timer_wb: wbs_type;
100
signal timer_elapsed: std_logic;
101
 
102
signal coprocessor_wb: wbs_type;
103
signal coprocessor_irq: std_logic;
104
 
105
begin
106
 
107
-- Interconnect
108
 
109
intercon_inst: entity work.intercon(rtl)
110
        port map(
111
                clk_i=>clk_i,
112
                rst_i=>rst_i,
113
 
114
                s0_cyc_i=>wbs_cyc_i,
115
                s0_stb_i=>wbs_stb_i,
116
                s0_we_i=>wbs_we_i,
117
                s0_sel_i=>wbs_sel_i,
118
                s0_ack_o=>wbs_ack_o,
119
                s0_adr_i=>wbs_adr_i,
120
                s0_dat_i=>wbs_dat_i,
121
                s0_dat_o=>wbs_dat_o,
122
 
123
                s1_cyc_i=>monitor_dbus.cyc,
124
                s1_stb_i=>monitor_dbus.stb,
125
                s1_we_i=>monitor_dbus.we,
126
                s1_sel_i=>monitor_dbus.sel,
127
                s1_ack_o=>monitor_dbus.ack,
128
                s1_adr_i=>monitor_dbus.adr,
129
                s1_dat_i=>monitor_dbus.wdata,
130
                s1_dat_o=>monitor_dbus.rdata,
131
 
132
                m0_cyc_o=>ram_wb.cyc,
133
                m0_stb_o=>ram_wb.stb,
134
                m0_we_o=>ram_wb.we,
135
                m0_sel_o=>ram_wb.sel,
136
                m0_ack_i=>ram_wb.ack,
137
                m0_adr_o=>ram_wb.adr,
138
                m0_dat_o=>ram_wb.wdata,
139
                m0_dat_i=>ram_wb.rdata,
140
 
141
                m1_cyc_o=>wbm_cyc_o,
142
                m1_stb_o=>wbm_stb_o,
143
                m1_we_o=>wbm_we_o,
144
                m1_sel_o=>wbm_sel_o,
145
                m1_ack_i=>wbm_ack_i,
146
                m1_adr_o=>wbm_adr_o,
147
                m1_dat_o=>wbm_dat_o,
148
                m1_dat_i=>wbm_dat_i,
149
 
150
                m2_cyc_o=>timer_wb.cyc,
151
                m2_stb_o=>timer_wb.stb,
152
                m2_we_o=>timer_wb.we,
153
                m2_sel_o=>timer_wb.sel,
154
                m2_ack_i=>timer_wb.ack,
155
                m2_adr_o=>timer_wb.adr,
156
                m2_dat_o=>timer_wb.wdata,
157
                m2_dat_i=>timer_wb.rdata,
158
 
159
                m3_cyc_o=>coprocessor_wb.cyc,
160
                m3_stb_o=>coprocessor_wb.stb,
161
                m3_we_o=>coprocessor_wb.we,
162
                m3_sel_o=>coprocessor_wb.sel,
163
                m3_ack_i=>coprocessor_wb.ack,
164
                m3_adr_o=>coprocessor_wb.adr,
165
                m3_dat_o=>coprocessor_wb.wdata,
166
                m3_dat_i=>coprocessor_wb.rdata
167
        );
168
 
169
-- CPU
170
 
171
cpu_rst<=cpu_rst_i or rst_i;
172
 
173
-- Note: we connect the timer IRQ to 2 CPU channels to test
174
-- handling of simultaneously arriving interrupt requests.
175
 
176
cpu_irq<="00000"&coprocessor_irq&timer_elapsed&timer_elapsed;
177
 
178
gen_lxp32u: if not MODEL_LXP32C generate
179
        lxp32u_top_inst: entity work.lxp32u_top(rtl)
180
                generic map(
181
                        DBUS_RMW=>false,
182
                        DIVIDER_EN=>true,
183
                        MUL_ARCH=>"dsp",
184
                        START_ADDR=>(others=>'0')
185
                )
186
                port map(
187
                        clk_i=>clk_i,
188
                        rst_i=>cpu_rst,
189
 
190
                        lli_re_o=>lli_re,
191
                        lli_adr_o=>lli_adr,
192
                        lli_dat_i=>lli_dat,
193
                        lli_busy_i=>lli_busy,
194
 
195
                        dbus_cyc_o=>cpu_dbus.cyc,
196
                        dbus_stb_o=>cpu_dbus.stb,
197
                        dbus_we_o=>cpu_dbus.we,
198
                        dbus_sel_o=>cpu_dbus.sel,
199
                        dbus_ack_i=>cpu_dbus.ack,
200
                        dbus_adr_o=>cpu_dbus.adr,
201
                        dbus_dat_o=>cpu_dbus.wdata,
202
                        dbus_dat_i=>cpu_dbus.rdata,
203
 
204
                        irq_i=>cpu_irq
205
                );
206
end generate;
207
 
208
gen_lxp32c: if MODEL_LXP32C generate
209
        lxp32c_top_inst: entity work.lxp32c_top(rtl)
210
                generic map(
211
                        DBUS_RMW=>false,
212
                        DIVIDER_EN=>true,
213
                        IBUS_BURST_SIZE=>16,
214
                        IBUS_PREFETCH_SIZE=>32,
215
                        MUL_ARCH=>"dsp",
216
                        START_ADDR=>(others=>'0')
217
                )
218
                port map(
219
                        clk_i=>clk_i,
220
                        rst_i=>cpu_rst,
221
 
222
                        ibus_cyc_o=>cpu_ibus.cyc,
223
                        ibus_stb_o=>cpu_ibus.stb,
224
                        ibus_cti_o=>cpu_ibus.cti,
225
                        ibus_bte_o=>cpu_ibus.bte,
226
                        ibus_ack_i=>cpu_ibus.ack,
227
                        ibus_adr_o=>cpu_ibus.adr,
228
                        ibus_dat_i=>cpu_ibus.dat,
229
 
230
                        dbus_cyc_o=>cpu_dbus.cyc,
231
                        dbus_stb_o=>cpu_dbus.stb,
232
                        dbus_we_o=>cpu_dbus.we,
233
                        dbus_sel_o=>cpu_dbus.sel,
234
                        dbus_ack_i=>cpu_dbus.ack,
235
                        dbus_adr_o=>cpu_dbus.adr,
236
                        dbus_dat_o=>cpu_dbus.wdata,
237
                        dbus_dat_i=>cpu_dbus.rdata,
238
 
239
                        irq_i=>cpu_irq
240
                );
241
 
242
        ibus_adapter_inst: entity work.ibus_adapter(rtl)
243
                port map(
244
                        clk_i=>clk_i,
245
                        rst_i=>rst_i,
246
 
247
                        ibus_cyc_i=>cpu_ibus.cyc,
248
                        ibus_stb_i=>cpu_ibus.stb,
249
                        ibus_cti_i=>cpu_ibus.cti,
250
                        ibus_bte_i=>cpu_ibus.bte,
251
                        ibus_ack_o=>cpu_ibus.ack,
252
                        ibus_adr_i=>cpu_ibus.adr,
253
                        ibus_dat_o=>cpu_ibus.dat,
254
 
255
                        lli_re_o=>lli_re,
256
                        lli_adr_o=>lli_adr,
257
                        lli_dat_i=>lli_dat,
258
                        lli_busy_i=>lli_busy
259
                );
260
end generate;
261
 
262
-- DBUS monitor
263
 
264
dbus_monitor_inst: entity work.dbus_monitor(rtl)
265
        generic map(
266
                THROTTLE=>THROTTLE_DBUS
267
        )
268
        port map(
269
                clk_i=>clk_i,
270
                rst_i=>rst_i,
271
 
272
                wbs_cyc_i=>cpu_dbus.cyc,
273
                wbs_stb_i=>cpu_dbus.stb,
274
                wbs_we_i=>cpu_dbus.we,
275
                wbs_sel_i=>cpu_dbus.sel,
276
                wbs_ack_o=>cpu_dbus.ack,
277
                wbs_adr_i=>cpu_dbus.adr,
278
                wbs_dat_i=>cpu_dbus.wdata,
279
                wbs_dat_o=>cpu_dbus.rdata,
280
 
281
                wbm_cyc_o=>monitor_dbus.cyc,
282
                wbm_stb_o=>monitor_dbus.stb,
283
                wbm_we_o=>monitor_dbus.we,
284
                wbm_sel_o=>monitor_dbus.sel,
285
                wbm_ack_i=>monitor_dbus.ack,
286
                wbm_adr_o=>monitor_dbus.adr,
287
                wbm_dat_o=>monitor_dbus.wdata,
288
                wbm_dat_i=>monitor_dbus.rdata
289
        );
290
 
291
-- Program RAM
292
 
293
program_ram_inst: entity work.program_ram(rtl)
294
        generic map(
295
                THROTTLE=>THROTTLE_IBUS
296
        )
297
        port map(
298
                clk_i=>clk_i,
299
                rst_i=>rst_i,
300
 
301
                wbs_cyc_i=>ram_wb.cyc,
302
                wbs_stb_i=>ram_wb.stb,
303
                wbs_we_i=>ram_wb.we,
304
                wbs_sel_i=>ram_wb.sel,
305
                wbs_ack_o=>ram_wb.ack,
306
                wbs_adr_i=>ram_wb.adr,
307
                wbs_dat_i=>ram_wb.wdata,
308
                wbs_dat_o=>ram_wb.rdata,
309
 
310
                lli_re_i=>lli_re,
311
                lli_adr_i=>lli_adr,
312
                lli_dat_o=>lli_dat,
313
                lli_busy_o=>lli_busy
314
        );
315
 
316
-- Timer
317
 
318
timer_inst: entity work.timer(rtl)
319
        port map(
320
                clk_i=>clk_i,
321
                rst_i=>rst_i,
322
 
323
                wbs_cyc_i=>timer_wb.cyc,
324
                wbs_stb_i=>timer_wb.stb,
325
                wbs_we_i=>timer_wb.we,
326
                wbs_sel_i=>timer_wb.sel,
327
                wbs_ack_o=>timer_wb.ack,
328
                wbs_adr_i=>timer_wb.adr,
329
                wbs_dat_i=>timer_wb.wdata,
330
                wbs_dat_o=>timer_wb.rdata,
331
 
332
                elapsed_o=>timer_elapsed
333
        );
334
 
335
-- Coprocessor
336
 
337
coprocessor_inst: entity work.coprocessor(rtl)
338
        port map(
339
                clk_i=>clk_i,
340
                rst_i=>rst_i,
341
 
342
                wbs_cyc_i=>coprocessor_wb.cyc,
343
                wbs_stb_i=>coprocessor_wb.stb,
344
                wbs_we_i=>coprocessor_wb.we,
345
                wbs_sel_i=>coprocessor_wb.sel,
346
                wbs_ack_o=>coprocessor_wb.ack,
347
                wbs_adr_i=>coprocessor_wb.adr,
348
                wbs_dat_i=>coprocessor_wb.wdata,
349
                wbs_dat_o=>coprocessor_wb.rdata,
350
 
351
                irq_o=>coprocessor_irq
352
        );
353
 
354
end architecture;

powered by: WebSVN 2.1.0

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