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

Subversion Repositories potato

[/] [potato/] [trunk/] [example/] [toplevel.vhd] - Blame information for rev 58

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

Line No. Rev Author Line
1 7 skordal
-- Practical Test Application for the Potato Processor
2
-- (c) Kristian Klomsten Skordal 2015 <kristian.skordal@wafflemail.net>
3 12 skordal
-- Report bugs and issues on <http://opencores.org/project,potato,bugtracker>
4 7 skordal
 
5
library ieee;
6
use ieee.std_logic_1164.all;
7
 
8
entity toplevel is
9
        port(
10
                clk       : in std_logic; -- System clock, 100 MHz
11
                reset_n   : in std_logic; -- CPU reset signal, active low
12
 
13
                -- External interrupt input:
14
                external_interrupt : in std_logic;
15
 
16
                -- GPIO pins, must be inout to use with the GPIO module:
17
                switches : inout std_logic_vector(15 downto 0);
18
                leds     : inout std_logic_vector(15 downto 0);
19
 
20
                -- UART1 (host) pins:
21
                uart_txd : out std_logic;
22
                uart_rxd : in  std_logic
23
        );
24
end entity toplevel;
25
 
26
architecture behaviour of toplevel is
27
        signal system_clk : std_logic;
28
        signal timer_clk : std_logic;
29
 
30
        -- Active high reset signal:
31
        signal reset : std_logic;
32
 
33
        -- IRQs:
34
        signal irq   : std_logic_vector(7 downto 0);
35
        signal uart_irq_rts, uart_irq_recv : std_logic;
36
        signal timer_irq : std_logic;
37
 
38
        -- Processor wishbone interface:
39
        signal p_adr_out : std_logic_vector(31 downto 0);
40
        signal p_dat_out : std_logic_vector(31 downto 0);
41
        signal p_dat_in  : std_logic_vector(31 downto 0);
42
        signal p_sel_out : std_logic_vector( 3 downto 0);
43
        signal p_we_out  : std_logic;
44
        signal p_cyc_out, p_stb_out : std_logic;
45
        signal p_ack_in  : std_logic;
46
 
47
        -- Instruction memory wishbone interface:
48
        signal imem_adr_in  : std_logic_vector(12 downto 0);
49
        signal imem_dat_out : std_logic_vector(31 downto 0);
50
        signal imem_cyc_in, imem_stb_in : std_logic;
51
        signal imem_ack_out : std_logic;
52
 
53
        -- Data memory wishbone interface:
54
        signal dmem_adr_in  : std_logic_vector(12 downto 0);
55
        signal dmem_dat_in  : std_logic_vector(31 downto 0);
56
        signal dmem_dat_out : std_logic_vector(31 downto 0);
57
        signal dmem_sel_in  : std_logic_vector( 3 downto 0);
58
        signal dmem_we_in   : std_logic;
59
        signal dmem_cyc_in, dmem_stb_in : std_logic;
60
        signal dmem_ack_out : std_logic;
61
 
62
        -- GPIO module I (switches) wishbone interface:
63
        signal gpio1_adr_in  : std_logic_vector(1 downto 0);
64
        signal gpio1_dat_in  : std_logic_vector(31 downto 0);
65
        signal gpio1_dat_out : std_logic_vector(31 downto 0);
66
        signal gpio1_we_in   : std_logic;
67
        signal gpio1_cyc_in, gpio1_stb_in : std_logic;
68
        signal gpio1_ack_out : std_logic;
69
 
70
        -- GPIO module II (LEDs) wishbone interface:
71
        signal gpio2_adr_in  : std_logic_vector(1 downto 0);
72
        signal gpio2_dat_in  : std_logic_vector(31 downto 0);
73
        signal gpio2_dat_out : std_logic_vector(31 downto 0);
74
        signal gpio2_we_in   : std_logic;
75
        signal gpio2_cyc_in, gpio2_stb_in : std_logic;
76
        signal gpio2_ack_out : std_logic;
77
 
78
        -- UART module wishbone interface:
79
        signal uart_adr_in  : std_logic_vector(1 downto 0);
80
        signal uart_dat_in  : std_logic_vector(7 downto 0);
81
        signal uart_dat_out : std_logic_vector(7 downto 0);
82
        signal uart_we_in   : std_logic;
83
        signal uart_cyc_in, uart_stb_in : std_logic;
84
        signal uart_ack_out : std_logic;
85
 
86
        -- Timer module wishbone interface:
87
        signal timer_adr_in  : std_logic_vector(1 downto 0);
88
        signal timer_dat_in  : std_logic_vector(31 downto 0);
89
        signal timer_dat_out : std_logic_vector(31 downto 0);
90
        signal timer_we_in   : std_logic;
91
        signal timer_cyc_in, timer_stb_in : std_logic;
92
        signal timer_ack_out : std_logic;
93
 
94
        -- Dummy module interface:
95
        signal dummy_dat_in  : std_logic_vector(31 downto 0);
96
        signal dummy_dat_out : std_logic_vector(31 downto 0);
97
        signal dummy_we_in   : std_logic;
98
        signal dummy_cyc_in, dummy_stb_in : std_logic;
99
        signal dummy_ack_out : std_logic;
100
 
101
        -- Address decoder signals:
102
        type ad_state_type is (IDLE, BUSY);
103
        signal ad_state : ad_state_type;
104
 
105
        type module_name is (
106
                        MODULE_IMEM, MODULE_DMEM,       -- Memory modules
107
                        MODULE_GPIO1, MODULE_GPIO2,     -- GPIO modules
108
                        MODULE_UART,    -- UART module
109
                        MODULE_TIMER,   -- Timer module
110
                        MODULE_DUMMY,   -- Dummy module, used for invalid addresses
111 21 skordal
                        MODULE_NONE             -- Boring no-module mode
112 7 skordal
                );
113
        signal active_module : module_name;
114
 
115
begin
116
 
117
        reset <= not reset_n;
118
        irq <= (
119
 
120
                        1 => uart_irq_rts, 2 => uart_irq_recv,
121
                        5 => timer_irq, others => '0'
122
                );
123
 
124
        clkgen: entity work.clock_generator
125
                port map(
126
                        clk => clk,
127
                        system_clk => system_clk,
128
                        timer_clk => timer_clk
129
                );
130
 
131
        processor: entity work.pp_potato
132
                port map(
133
                        clk => system_clk,
134 58 skordal
                        timer_clk => timer_clk,
135 7 skordal
                        reset => reset,
136
                        irq => irq,
137
                        fromhost_data => (others => '0'),
138
                        fromhost_updated => '0',
139
                        tohost_data => open,
140
                        tohost_updated => open,
141
                        wb_adr_out => p_adr_out,
142
                        wb_dat_out => p_dat_out,
143
                        wb_dat_in => p_dat_in,
144
                        wb_sel_out => p_sel_out,
145
                        wb_we_out => p_we_out,
146
                        wb_cyc_out => p_cyc_out,
147
                        wb_stb_out => p_stb_out,
148
                        wb_ack_in => p_ack_in
149
                );
150
 
151
        imem: entity work.imem_wrapper
152
                port map(
153
                        clk => system_clk,
154
                        reset => reset,
155
                        wb_adr_in => imem_adr_in,
156
                        wb_dat_out => imem_dat_out,
157
                        wb_cyc_in => imem_cyc_in,
158
                        wb_stb_in => imem_stb_in,
159
                        wb_ack_out => imem_ack_out
160
                );
161
 
162
        dmem: entity work.pp_soc_memory
163
                generic map(
164
                        MEMORY_SIZE => 8192
165
                ) port map(
166
                        clk => system_clk,
167
                        reset => reset,
168
                        wb_adr_in => dmem_adr_in,
169
                        wb_dat_in => dmem_dat_in,
170
                        wb_dat_out => dmem_dat_out,
171
                        wb_sel_in => dmem_sel_in,
172
                        wb_we_in => dmem_we_in,
173
                        wb_cyc_in => dmem_cyc_in,
174
                        wb_stb_in => dmem_stb_in,
175
                        wb_ack_out => dmem_ack_out
176
                );
177
 
178
        gpio1: entity work.pp_soc_gpio
179
                generic map(
180
                        NUM_GPIOS => 16
181
                ) port map(
182
                        clk => system_clk,
183
                        reset => reset,
184
                        gpio => switches,
185
                        wb_adr_in => gpio1_adr_in,
186
                        wb_dat_in => gpio1_dat_in,
187
                        wb_dat_out => gpio1_dat_out,
188
                        wb_cyc_in => gpio1_cyc_in,
189
                        wb_stb_in => gpio1_stb_in,
190
                        wb_we_in => gpio1_we_in,
191
                        wb_ack_out => gpio1_ack_out
192
                );
193
 
194
        gpio2: entity work.pp_soc_gpio
195
                generic map(
196
                        NUM_GPIOS => 16
197
                ) port map(
198
                        clk => system_clk,
199
                        reset => reset,
200
                        gpio => leds,
201
                        wb_adr_in => gpio2_adr_in,
202
                        wb_dat_in => gpio2_dat_in,
203
                        wb_dat_out => gpio2_dat_out,
204
                        wb_cyc_in => gpio2_cyc_in,
205
                        wb_stb_in => gpio2_stb_in,
206
                        wb_we_in => gpio2_we_in,
207
                        wb_ack_out => gpio2_ack_out
208
                );
209
 
210
        uart1: entity work.pp_soc_uart
211
                generic map(
212
                        FIFO_DEPTH => 64,
213 45 skordal
                        SAMPLE_CLK_DIVISOR => 27 -- For 50 MHz
214
                        --SAMPLE_CLK_DIVISOR => 33 -- For 60 MHz
215 7 skordal
                ) port map(
216
                        clk => system_clk,
217
                        reset => reset,
218
                        txd => uart_txd,
219
                        rxd => uart_rxd,
220
                        irq_send_buffer_empty => uart_irq_rts,
221
                        irq_data_received => uart_irq_recv,
222
                        wb_adr_in => uart_adr_in,
223
                        wb_dat_in => uart_dat_in,
224
                        wb_dat_out => uart_dat_out,
225
                        wb_cyc_in => uart_cyc_in,
226
                        wb_stb_in => uart_stb_in,
227
                        wb_we_in => uart_we_in,
228
                        wb_ack_out => uart_ack_out
229
                );
230
 
231
        timer1: entity work.pp_soc_timer
232
                port map(
233
                        clk => system_clk,
234
                        reset => reset,
235
                        irq => timer_irq,
236
                        wb_adr_in => timer_adr_in,
237
                        wb_dat_in => timer_dat_in,
238
                        wb_dat_out => timer_dat_out,
239
                        wb_cyc_in => timer_cyc_in,
240
                        wb_stb_in => timer_stb_in,
241
                        wb_we_in => timer_we_in,
242
                        wb_ack_out => timer_ack_out
243
                );
244
 
245
        dummy: entity work.pp_soc_dummy
246
                port map(
247
                        clk => system_clk,
248
                        reset => reset,
249
                        wb_dat_in => dummy_dat_in,
250
                        wb_dat_out => dummy_dat_out,
251
                        wb_cyc_in => dummy_cyc_in,
252
                        wb_stb_in => dummy_stb_in,
253
                        wb_we_in => dummy_we_in,
254
                        wb_ack_out => dummy_ack_out
255
                );
256
 
257
        imem_cyc_in <= p_cyc_out when active_module = MODULE_IMEM else '0';
258
        dmem_cyc_in <= p_cyc_out when active_module = MODULE_DMEM else '0';
259
        gpio1_cyc_in <= p_cyc_out when active_module = MODULE_GPIO1 else '0';
260
        gpio2_cyc_in <= p_cyc_out when active_module = MODULE_GPIO2 else '0';
261
        uart_cyc_in <= p_cyc_out when active_module = MODULE_UART else '0';
262
        timer_cyc_in <= p_cyc_out when active_module = MODULE_TIMER else '0';
263
        dummy_cyc_in <= p_cyc_out when active_module = MODULE_DUMMY else '0';
264
 
265
        imem_stb_in <= p_stb_out when active_module = MODULE_IMEM else '0';
266
        dmem_stb_in <= p_stb_out when active_module = MODULE_DMEM else '0';
267
        gpio1_stb_in <= p_stb_out when active_module = MODULE_GPIO1 else '0';
268
        gpio2_stb_in <= p_stb_out when active_module = MODULE_GPIO2 else '0';
269
        uart_stb_in <= p_stb_out when active_module = MODULE_UART else '0';
270
        timer_stb_in <= p_stb_out when active_module = MODULE_TIMER else '0';
271
        dummy_stb_in <= p_stb_out when active_module = MODULE_DUMMY else '0';
272
 
273
        imem_adr_in <= p_adr_out(12 downto 0);
274
        dmem_adr_in <= p_adr_out(12 downto 0);
275
        gpio1_adr_in <= p_adr_out(3 downto 2);
276
        gpio2_adr_in <= p_adr_out(3 downto 2);
277
        uart_adr_in <=  p_adr_out(3 downto 2);
278
        timer_adr_in <= p_adr_out(3 downto 2);
279
 
280
        dmem_dat_in <= p_dat_out;
281
        gpio1_dat_in <= p_dat_out;
282
        gpio2_dat_in <= p_dat_out;
283
        uart_dat_in <= p_dat_out(7 downto 0);
284
        timer_dat_in <= p_dat_out;
285
        dummy_dat_in <= p_dat_out;
286
 
287
        dmem_sel_in <= p_sel_out;
288
 
289
        gpio1_we_in <= p_we_out;
290
        gpio2_we_in <= p_we_out;
291
        dmem_we_in <= p_we_out;
292
        uart_we_in <= p_we_out;
293
        timer_we_in <= p_we_out;
294
        dummy_we_in <= p_we_out;
295
 
296
        address_decoder: process(system_clk)
297
        begin
298
                if rising_edge(system_clk) then
299
                        if reset = '1' then
300
                                ad_state <= IDLE;
301
                                active_module <= MODULE_NONE;
302
                        else
303
                                case ad_state is
304
                                        when IDLE =>
305 45 skordal
                                                if p_cyc_out = '1' then
306 7 skordal
                                                        if p_adr_out(31 downto 13) = b"0000000000000000000" then
307
                                                                active_module <= MODULE_IMEM;
308
                                                                ad_state <= BUSY;
309
                                                        elsif p_adr_out(31 downto 13) = b"0000000000000000001" then -- 0x2000
310
                                                                active_module <= MODULE_DMEM;
311
                                                                ad_state <= BUSY;
312
                                                        elsif p_adr_out(31 downto 11) = b"000000000000000001000" then -- 0x4000
313
                                                                active_module <= MODULE_GPIO1;
314
                                                                ad_state <= BUSY;
315
                                                        elsif p_adr_out(31 downto 11) = b"000000000000000001001" then -- 0x4800
316
                                                                active_module <= MODULE_GPIO2;
317
                                                                ad_state <= BUSY;
318
                                                        elsif p_adr_out(31 downto 11) = b"000000000000000001010" then -- 0x5000
319
                                                                active_module <= MODULE_UART;
320
                                                                ad_state <= BUSY;
321
                                                        elsif p_adr_out(31 downto 11) = b"000000000000000001011" then -- 0x5800
322
                                                                active_module <= MODULE_TIMER;
323
                                                                ad_state <= BUSY;
324
                                                        else
325
                                                                active_module <= MODULE_DUMMY;
326
                                                                ad_state <= BUSY;
327
                                                        end if;
328 45 skordal
                                                else
329
                                                        active_module <= MODULE_NONE;
330 7 skordal
                                                end if;
331
                                        when BUSY =>
332
                                                if p_cyc_out = '0' then
333
                                                        active_module <= MODULE_NONE;
334
                                                        ad_state <= IDLE;
335
                                                end if;
336
                                end case;
337
                        end if;
338
                end if;
339
        end process address_decoder;
340
 
341
        module_mux: process(active_module, imem_ack_out, imem_dat_out, dmem_ack_out, dmem_dat_out,
342
                gpio1_ack_out, gpio1_dat_out, gpio2_ack_out, gpio2_dat_out, uart_ack_out, uart_dat_out,
343
                timer_ack_out, timer_dat_out, dummy_ack_out, dummy_dat_out)
344
        begin
345
                case active_module is
346
                        when MODULE_IMEM =>
347
                                p_ack_in <= imem_ack_out;
348
                                p_dat_in <= imem_dat_out;
349
                        when MODULE_DMEM =>
350
                                p_ack_in <= dmem_ack_out;
351
                                p_dat_in <= dmem_dat_out;
352
                        when MODULE_GPIO1 =>
353
                                p_ack_in <= gpio1_ack_out;
354
                                p_dat_in <= gpio1_dat_out;
355
                        when MODULE_GPIO2 =>
356
                                p_ack_in <= gpio2_ack_out;
357
                                p_dat_in <= gpio2_dat_out;
358
                        when MODULE_UART =>
359
                                p_ack_in <= uart_ack_out;
360
                                p_dat_in <= (31 downto 8 => '0') & uart_dat_out;
361
                        when MODULE_TIMER =>
362
                                p_ack_in <= timer_ack_out;
363
                                p_dat_in <= timer_dat_out;
364
                        when MODULE_DUMMY =>
365
                                p_ack_in <= dummy_ack_out;
366
                                p_dat_in <= dummy_dat_out;
367
                        when MODULE_NONE =>
368
                                p_ack_in <= '0';
369
                                p_dat_in <= (others => '0');
370
                end case;
371
        end process module_mux;
372
 
373
end architecture behaviour;

powered by: WebSVN 2.1.0

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