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

Subversion Repositories neorv32

[/] [neorv32/] [trunk/] [rtl/] [core/] [neorv32_top.vhd] - Blame information for rev 12

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

Line No. Rev Author Line
1 2 zero_gravi
-- #################################################################################################
2
-- # << NEORV32 - Processor Top Entity >>                                                          #
3
-- # ********************************************************************************************* #
4
-- # This is the top entity of the NEORV32 Processor. Instantiate this unit in your own project    #
5
-- # and define all the configuration generics according to your needs. Alternatively, you can use #
6
-- # one of the alternative top entities provided in the "rtl\top_templates" folder.               #
7
-- # Check the processor's documentary for more information: doc\NEORV32.pdf                       #
8
-- # ********************************************************************************************* #
9
-- # BSD 3-Clause License                                                                          #
10
-- #                                                                                               #
11
-- # Copyright (c) 2020, Stephan Nolting. All rights reserved.                                     #
12
-- #                                                                                               #
13
-- # Redistribution and use in source and binary forms, with or without modification, are          #
14
-- # permitted provided that the following conditions are met:                                     #
15
-- #                                                                                               #
16
-- # 1. Redistributions of source code must retain the above copyright notice, this list of        #
17
-- #    conditions and the following disclaimer.                                                   #
18
-- #                                                                                               #
19
-- # 2. Redistributions in binary form must reproduce the above copyright notice, this list of     #
20
-- #    conditions and the following disclaimer in the documentation and/or other materials        #
21
-- #    provided with the distribution.                                                            #
22
-- #                                                                                               #
23
-- # 3. Neither the name of the copyright holder nor the names of its contributors may be used to  #
24
-- #    endorse or promote products derived from this software without specific prior written      #
25
-- #    permission.                                                                                #
26
-- #                                                                                               #
27
-- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS   #
28
-- # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF               #
29
-- # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE    #
30
-- # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,     #
31
-- # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
32
-- # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED    #
33
-- # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING     #
34
-- # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED  #
35
-- # OF THE POSSIBILITY OF SUCH DAMAGE.                                                            #
36
-- # ********************************************************************************************* #
37
-- # The NEORV32 Processor - https://github.com/stnolting/neorv32              (c) Stephan Nolting #
38
-- #################################################################################################
39
 
40
library ieee;
41
use ieee.std_logic_1164.all;
42
use ieee.numeric_std.all;
43
 
44
library neorv32;
45
use neorv32.neorv32_package.all;
46
 
47
entity neorv32_top is
48
  generic (
49
    -- General --
50 12 zero_gravi
    CLOCK_FREQUENCY              : natural := 0;      -- clock frequency of clk_i in Hz
51 8 zero_gravi
    BOOTLOADER_USE               : boolean := true;   -- implement processor-internal bootloader?
52
    CSR_COUNTERS_USE             : boolean := true;   -- implement RISC-V perf. counters ([m]instret[h], [m]cycle[h], time[h])?
53 12 zero_gravi
    USER_CODE                    : std_ulogic_vector(31 downto 0) := x"00000000"; -- custom user code
54 2 zero_gravi
    -- RISC-V CPU Extensions --
55 11 zero_gravi
    CPU_EXTENSION_RISCV_C        : boolean := false;  -- implement compressed extension?
56 8 zero_gravi
    CPU_EXTENSION_RISCV_E        : boolean := false;  -- implement embedded RF extension?
57 11 zero_gravi
    CPU_EXTENSION_RISCV_M        : boolean := false;  -- implement muld/div extension?
58 8 zero_gravi
    CPU_EXTENSION_RISCV_Zicsr    : boolean := true;   -- implement CSR system?
59
    CPU_EXTENSION_RISCV_Zifencei : boolean := true;   -- implement instruction stream sync.?
60 2 zero_gravi
    -- Memory configuration: Instruction memory --
61 8 zero_gravi
    MEM_ISPACE_BASE              : std_ulogic_vector(31 downto 0) := x"00000000"; -- base address of instruction memory space
62
    MEM_ISPACE_SIZE              : natural := 16*1024; -- total size of instruction memory space in byte
63
    MEM_INT_IMEM_USE             : boolean := true;   -- implement processor-internal instruction memory
64
    MEM_INT_IMEM_SIZE            : natural := 16*1024; -- size of processor-internal instruction memory in bytes
65
    MEM_INT_IMEM_ROM             : boolean := false;  -- implement processor-internal instruction memory as ROM
66 2 zero_gravi
    -- Memory configuration: Data memory --
67 8 zero_gravi
    MEM_DSPACE_BASE              : std_ulogic_vector(31 downto 0) := x"80000000"; -- base address of data memory space
68
    MEM_DSPACE_SIZE              : natural := 8*1024; -- total size of data memory space in byte
69
    MEM_INT_DMEM_USE             : boolean := true;   -- implement processor-internal data memory
70
    MEM_INT_DMEM_SIZE            : natural := 8*1024; -- size of processor-internal data memory in bytes
71 2 zero_gravi
    -- Memory configuration: External memory interface --
72 8 zero_gravi
    MEM_EXT_USE                  : boolean := false;  -- implement external memory bus interface?
73
    MEM_EXT_REG_STAGES           : natural := 2;      -- number of interface register stages (0,1,2)
74
    MEM_EXT_TIMEOUT              : natural := 15;     -- cycles after which a valid bus access will timeout
75 2 zero_gravi
    -- Processor peripherals --
76 8 zero_gravi
    IO_GPIO_USE                  : boolean := true;   -- implement general purpose input/output port unit (GPIO)?
77
    IO_MTIME_USE                 : boolean := true;   -- implement machine system timer (MTIME)?
78
    IO_UART_USE                  : boolean := true;   -- implement universal asynchronous receiver/transmitter (UART)?
79
    IO_SPI_USE                   : boolean := true;   -- implement serial peripheral interface (SPI)?
80
    IO_TWI_USE                   : boolean := true;   -- implement two-wire interface (TWI)?
81
    IO_PWM_USE                   : boolean := true;   -- implement pulse-width modulation unit (PWM)?
82
    IO_WDT_USE                   : boolean := true;   -- implement watch dog timer (WDT)?
83
    IO_CLIC_USE                  : boolean := true;   -- implement core local interrupt controller (CLIC)?
84
    IO_TRNG_USE                  : boolean := false;  -- implement true random number generator (TRNG)?
85
    IO_DEVNULL_USE               : boolean := true    -- implement dummy device (DEVNULL)?
86 2 zero_gravi
  );
87
  port (
88
    -- Global control --
89
    clk_i      : in  std_ulogic := '0'; -- global clock, rising edge
90
    rstn_i     : in  std_ulogic := '0'; -- global reset, low-active, async
91
    -- Wishbone bus interface (available if MEM_EXT_USE = true) --
92
    wb_adr_o   : out std_ulogic_vector(31 downto 0); -- address
93
    wb_dat_i   : in  std_ulogic_vector(31 downto 0) := (others => '0'); -- read data
94
    wb_dat_o   : out std_ulogic_vector(31 downto 0); -- write data
95
    wb_we_o    : out std_ulogic; -- read/write
96
    wb_sel_o   : out std_ulogic_vector(03 downto 0); -- byte enable
97
    wb_stb_o   : out std_ulogic; -- strobe
98
    wb_cyc_o   : out std_ulogic; -- valid cycle
99
    wb_ack_i   : in  std_ulogic := '0'; -- transfer acknowledge
100
    wb_err_i   : in  std_ulogic := '0'; -- transfer error
101 12 zero_gravi
    -- Advanced memory control signals (available if MEM_EXT_USE = true) --
102
    fence_o    : out std_ulogic; -- indicates an executed FENCE operation
103
    fencei_o   : out std_ulogic; -- indicates an executed FENCEI operation
104 2 zero_gravi
    -- GPIO (available if IO_GPIO_USE = true) --
105
    gpio_o     : out std_ulogic_vector(15 downto 0); -- parallel output
106
    gpio_i     : in  std_ulogic_vector(15 downto 0) := (others => '0'); -- parallel input
107
    -- UART (available if IO_UART_USE = true) --
108
    uart_txd_o : out std_ulogic; -- UART send data
109
    uart_rxd_i : in  std_ulogic := '0'; -- UART receive data
110
    -- SPI (available if IO_SPI_USE = true) --
111 6 zero_gravi
    spi_sck_o  : out std_ulogic; -- SPI serial clock
112
    spi_sdo_o  : out std_ulogic; -- controller data out, peripheral data in
113
    spi_sdi_i  : in  std_ulogic; -- controller data in, peripheral data out
114 2 zero_gravi
    spi_csn_o  : out std_ulogic_vector(07 downto 0); -- SPI CS
115
    -- TWI (available if IO_TWI_USE = true) --
116
    twi_sda_io : inout std_logic := 'H'; -- twi serial data line
117
    twi_scl_io : inout std_logic := 'H'; -- twi serial clock line
118
    -- PWM (available if IO_PWM_USE = true) --
119
    pwm_o      : out std_ulogic_vector(03 downto 0);  -- pwm channels
120
    -- Interrupts (available if IO_CLIC_USE = true) --
121
    ext_irq_i  : in  std_ulogic_vector(01 downto 0) := (others => '0'); -- external interrupt request
122
    ext_ack_o  : out std_ulogic_vector(01 downto 0)  -- external interrupt request acknowledge
123
  );
124
end neorv32_top;
125
 
126
architecture neorv32_top_rtl of neorv32_top is
127
 
128 12 zero_gravi
  -- CPU boot address --
129
  constant boot_addr_c : std_ulogic_vector(31 downto 0) := cond_sel_stdulogicvector_f(BOOTLOADER_USE, boot_base_c, MEM_ISPACE_BASE);
130
 
131 2 zero_gravi
  -- reset generator --
132
  signal rstn_i_sync0 : std_ulogic;
133
  signal rstn_i_sync1 : std_ulogic;
134
  signal rstn_i_sync2 : std_ulogic;
135
  signal rstn_gen     : std_ulogic_vector(3 downto 0);
136
  signal ext_rstn     : std_ulogic;
137
  signal sys_rstn     : std_ulogic;
138
  signal wdt_rstn     : std_ulogic;
139
 
140
  -- clock generator --
141
  signal clk_div    : std_ulogic_vector(11 downto 0);
142
  signal clk_div_ff : std_ulogic_vector(11 downto 0);
143
  signal clk_gen    : std_ulogic_vector(07 downto 0);
144
  signal wdt_cg_en  : std_ulogic;
145
  signal uart_cg_en : std_ulogic;
146
  signal spi_cg_en  : std_ulogic;
147
  signal twi_cg_en  : std_ulogic;
148
  signal pwm_cg_en  : std_ulogic;
149
 
150 12 zero_gravi
  -- bus interface --
151
  type bus_interface_t is record
152 11 zero_gravi
    addr   : std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
153
    rdata  : std_ulogic_vector(data_width_c-1 downto 0); -- bus read data
154
    wdata  : std_ulogic_vector(data_width_c-1 downto 0); -- bus write data
155
    ben    : std_ulogic_vector(03 downto 0); -- byte enable
156
    we     : std_ulogic; -- write enable
157
    re     : std_ulogic; -- read enable
158
    cancel : std_ulogic; -- cancel current transfer
159
    ack    : std_ulogic; -- bus transfer acknowledge
160
    err    : std_ulogic; -- bus transfer error
161 12 zero_gravi
    fence  : std_ulogic; -- fence(i) instruction executed
162 11 zero_gravi
  end record;
163 12 zero_gravi
  signal cpu_i, cpu_d, p_bus : bus_interface_t;
164 2 zero_gravi
 
165
  -- io space access --
166
  signal io_acc  : std_ulogic;
167
  signal io_rden : std_ulogic;
168
  signal io_wren : std_ulogic;
169
 
170
  -- read-back busses -
171
  signal imem_rdata     : std_ulogic_vector(data_width_c-1 downto 0);
172
  signal imem_ack       : std_ulogic;
173
  signal dmem_rdata     : std_ulogic_vector(data_width_c-1 downto 0);
174
  signal dmem_ack       : std_ulogic;
175
  signal bootrom_rdata  : std_ulogic_vector(data_width_c-1 downto 0);
176
  signal bootrom_ack    : std_ulogic;
177
  signal wishbone_rdata : std_ulogic_vector(data_width_c-1 downto 0);
178
  signal wishbone_ack   : std_ulogic;
179
  signal wishbone_err   : std_ulogic;
180
  signal gpio_rdata     : std_ulogic_vector(data_width_c-1 downto 0);
181
  signal gpio_ack       : std_ulogic;
182
  signal mtime_rdata    : std_ulogic_vector(data_width_c-1 downto 0);
183
  signal mtime_ack      : std_ulogic;
184
  signal uart_rdata     : std_ulogic_vector(data_width_c-1 downto 0);
185
  signal uart_ack       : std_ulogic;
186
  signal spi_rdata      : std_ulogic_vector(data_width_c-1 downto 0);
187
  signal spi_ack        : std_ulogic;
188
  signal twi_rdata      : std_ulogic_vector(data_width_c-1 downto 0);
189
  signal twi_ack        : std_ulogic;
190
  signal pwm_rdata      : std_ulogic_vector(data_width_c-1 downto 0);
191
  signal pwm_ack        : std_ulogic;
192
  signal wdt_rdata      : std_ulogic_vector(data_width_c-1 downto 0);
193
  signal wdt_ack        : std_ulogic;
194
  signal clic_rdata     : std_ulogic_vector(data_width_c-1 downto 0);
195
  signal clic_ack       : std_ulogic;
196
  signal trng_rdata     : std_ulogic_vector(data_width_c-1 downto 0);
197
  signal trng_ack       : std_ulogic;
198 3 zero_gravi
  signal devnull_rdata  : std_ulogic_vector(data_width_c-1 downto 0);
199
  signal devnull_ack    : std_ulogic;
200 12 zero_gravi
  signal sysinfo_rdata  : std_ulogic_vector(data_width_c-1 downto 0);
201
  signal sysinfo_ack    : std_ulogic;
202 2 zero_gravi
 
203
  -- IRQs --
204
  signal mtime_irq : std_ulogic;
205
  signal clic_irq  : std_ulogic;
206
  signal clic_xirq : std_ulogic_vector(7 downto 0);
207
  signal clic_xack : std_ulogic_vector(7 downto 0);
208
  signal gpio_irq  : std_ulogic;
209
  signal wdt_irq   : std_ulogic;
210
  signal uart_irq  : std_ulogic;
211
  signal spi_irq   : std_ulogic;
212
  signal twi_irq   : std_ulogic;
213
 
214 11 zero_gravi
  -- misc --
215
  signal mtime_time : std_ulogic_vector(63 downto 0); -- current system time from MTIME
216
 
217 2 zero_gravi
begin
218
 
219
  -- Sanity Checks --------------------------------------------------------------------------
220
  -- -------------------------------------------------------------------------------------------
221
  sanity_check: process(clk_i)
222
  begin
223
    if rising_edge(clk_i) then
224
      -- internal bootloader memory --
225
      if (BOOTLOADER_USE = true) and (boot_size_c > boot_max_size_c) then
226
        assert false report "NEORV32 CONFIG ERROR! Boot ROM size out of range." severity error;
227
      end if;
228
 
229
      -- memory system - data/instruction fetch --
230
      if (MEM_EXT_USE = false) then
231
        if (MEM_INT_DMEM_USE = false) then
232
          assert false report "NEORV32 CONFIG ERROR! Core cannot fetch data without external memory interface and internal data memory." severity error;
233
        end if;
234
        if (MEM_INT_IMEM_USE = false) and (BOOTLOADER_USE = false) then
235
          assert false report "NEORV32 CONFIG ERROR! Core cannot fetch instructions without external memory interface, internal data memory and bootloader." severity error;
236
        end if;
237
      end if;
238
 
239 12 zero_gravi
      -- memory system --
240 2 zero_gravi
      if (MEM_INT_IMEM_USE = true) and (MEM_INT_IMEM_SIZE > MEM_ISPACE_SIZE) then
241
        assert false report "NEORV32 CONFIG ERROR! Internal instruction memory (IMEM) cannot be greater than total instruction address space." severity error;
242
      end if;
243
      if (MEM_INT_DMEM_USE = true) and (MEM_INT_DMEM_SIZE > MEM_DSPACE_SIZE) then
244
        assert false report "NEORV32 CONFIG ERROR! Internal data memory (DMEM) cannot be greater than total data address space." severity error;
245
      end if;
246 12 zero_gravi
      if (MEM_EXT_TIMEOUT < 1) then
247
        assert false report "NEORV32 CONFIG ERROR! Invalid bus timeout. Processor-internal components have 1 cycle delay." severity error;
248 2 zero_gravi
      end if;
249
 
250
      -- clock --
251
      if (CLOCK_FREQUENCY = 0) then
252
        assert false report "NEORV32 CONFIG ERROR! Core clock frequency (CLOCK_FREQUENCY) not specified." severity error;
253
      end if;
254
 
255
      -- CSR system not implemented --
256
      if (CPU_EXTENSION_RISCV_Zicsr = false) then
257 12 zero_gravi
        assert false report "NEORV32 CONFIG WARNING! No exception/interrupt/machine features available when CPU_EXTENSION_RISCV_Zicsr = false." severity warning;
258 2 zero_gravi
      end if;
259
      -- core local interrupt controller --
260
      if (CPU_EXTENSION_RISCV_Zicsr = false) and (IO_CLIC_USE = true) then
261
        assert false report "NEORV32 CONFIG ERROR! Core local interrupt controller (CLIC) cannot be used without >Zicsr< CPU extension." severity error;
262
      end if;
263
 
264
      -- memory layout notifier --
265
      if (MEM_ISPACE_BASE /= x"00000000") then
266 12 zero_gravi
        assert false report "NEORV32 CONFIG WARNING! Non-default base address for instruction address space. Make sure this is sync with the software framwork." severity warning;
267 2 zero_gravi
      end if;
268
      if (MEM_DSPACE_BASE /= x"80000000") then
269 12 zero_gravi
        assert false report "NEORV32 CONFIG WARNING! Non-default base address for data address space. Make sure this is sync with the software framwork." severity warning;
270 2 zero_gravi
      end if;
271
    end if;
272
  end process sanity_check;
273
 
274
 
275
  -- Reset Generator ------------------------------------------------------------------------
276
  -- -------------------------------------------------------------------------------------------
277
  reset_generator_sync: process(clk_i)
278
  begin
279
    -- make sure the external reset is free of metastability and has a minimal duration of 1 clock cycle
280
    if rising_edge(clk_i) then
281
      rstn_i_sync0 <= rstn_i;
282
      rstn_i_sync1 <= rstn_i_sync0;
283
      rstn_i_sync2 <= rstn_i_sync1;
284
    end if;
285
  end process reset_generator_sync;
286
 
287
  -- keep internal reset active for at least 4 clock cycles
288
  reset_generator: process(rstn_i_sync1, rstn_i_sync2, clk_i)
289
  begin
290
    if ((rstn_i_sync1 or rstn_i_sync2) = '0') then -- signal stable somehow?
291
      rstn_gen <= (others => '0');
292
    elsif rising_edge(clk_i) then
293
      rstn_gen <= rstn_gen(rstn_gen'left-1 downto 0) & '1';
294
    end if;
295
  end process reset_generator;
296
 
297
  ext_rstn <= rstn_gen(rstn_gen'left); -- the beautified external reset signal
298
  sys_rstn <= ext_rstn and wdt_rstn; -- system reset - can also be triggered by watchdog
299
 
300
 
301
  -- Clock Generator ------------------------------------------------------------------------
302
  -- -------------------------------------------------------------------------------------------
303
  clock_generator: process(sys_rstn, clk_i)
304
  begin
305
    if (sys_rstn = '0') then
306
      clk_div    <= (others => '0');
307
      clk_div_ff <= (others => '0');
308
    elsif rising_edge(clk_i) then
309
      -- anybody wanting some fresh clocks? --
310
      if ((wdt_cg_en or uart_cg_en or spi_cg_en or twi_cg_en or pwm_cg_en) = '1') then
311
        clk_div    <= std_ulogic_vector(unsigned(clk_div) + 1);
312
        clk_div_ff <= clk_div;
313
      end if;
314
    end if;
315
  end process clock_generator;
316
 
317
  -- clock enable select: rising edge detectors --
318
  clk_gen(clk_div2_c)    <= clk_div(0)  and (not clk_div_ff(0));  -- CLK/2
319
  clk_gen(clk_div4_c)    <= clk_div(1)  and (not clk_div_ff(1));  -- CLK/4
320
  clk_gen(clk_div8_c)    <= clk_div(2)  and (not clk_div_ff(2));  -- CLK/8
321
  clk_gen(clk_div64_c)   <= clk_div(5)  and (not clk_div_ff(5));  -- CLK/64
322
  clk_gen(clk_div128_c)  <= clk_div(6)  and (not clk_div_ff(6));  -- CLK/128
323
  clk_gen(clk_div1024_c) <= clk_div(9)  and (not clk_div_ff(9));  -- CLK/1024
324
  clk_gen(clk_div2048_c) <= clk_div(10) and (not clk_div_ff(10)); -- CLK/2048
325
  clk_gen(clk_div4096_c) <= clk_div(11) and (not clk_div_ff(11)); -- CLK/4096
326
 
327
 
328
  -- CPU ------------------------------------------------------------------------------------
329
  -- -------------------------------------------------------------------------------------------
330
  neorv32_cpu_inst: neorv32_cpu
331
  generic map (
332
    -- General --
333 12 zero_gravi
    CSR_COUNTERS_USE             => CSR_COUNTERS_USE, -- implement RISC-V perf. counters ([m]instret[h], [m]cycle[h], time[h])?
334
    HW_THREAD_ID                 => (others => '0'),  -- hardware thread id
335
    CPU_BOOT_ADDR                => boot_addr_c,      -- cpu boot address
336 2 zero_gravi
    -- RISC-V CPU Extensions --
337 8 zero_gravi
    CPU_EXTENSION_RISCV_C        => CPU_EXTENSION_RISCV_C,        -- implement compressed extension?
338
    CPU_EXTENSION_RISCV_E        => CPU_EXTENSION_RISCV_E,        -- implement embedded RF extension?
339
    CPU_EXTENSION_RISCV_M        => CPU_EXTENSION_RISCV_M,        -- implement muld/div extension?
340
    CPU_EXTENSION_RISCV_Zicsr    => CPU_EXTENSION_RISCV_Zicsr,    -- implement CSR system?
341
    CPU_EXTENSION_RISCV_Zifencei => CPU_EXTENSION_RISCV_Zifencei, -- implement instruction stream sync.?
342 2 zero_gravi
    -- Memory configuration: External memory interface --
343 12 zero_gravi
    MEM_EXT_TIMEOUT              => MEM_EXT_TIMEOUT   -- cycles after which a valid bus access will timeout
344 2 zero_gravi
  )
345
  port map (
346
    -- global control --
347 12 zero_gravi
    clk_i          => clk_i,        -- global clock, rising edge
348
    rstn_i         => sys_rstn,     -- global reset, low-active, async
349
    -- instruction bus interface --
350
    i_bus_addr_o   => cpu_i.addr,   -- bus access address
351
    i_bus_rdata_i  => cpu_i.rdata,  -- bus read data
352
    i_bus_wdata_o  => cpu_i.wdata,  -- bus write data
353
    i_bus_ben_o    => cpu_i.ben,    -- byte enable
354
    i_bus_we_o     => cpu_i.we,     -- write enable
355
    i_bus_re_o     => cpu_i.re,     -- read enable
356
    i_bus_cancel_o => cpu_i.cancel, -- cancel current bus transaction
357
    i_bus_ack_i    => cpu_i.ack,    -- bus transfer acknowledge
358
    i_bus_err_i    => cpu_i.err,    -- bus transfer error
359
    i_bus_fence_o  => cpu_i.fence,  -- executed FENCEI operation
360
    -- data bus interface --
361
    d_bus_addr_o   => cpu_d.addr,   -- bus access address
362
    d_bus_rdata_i  => cpu_d.rdata,  -- bus read data
363
    d_bus_wdata_o  => cpu_d.wdata,  -- bus write data
364
    d_bus_ben_o    => cpu_d.ben,    -- byte enable
365
    d_bus_we_o     => cpu_d.we,     -- write enable
366
    d_bus_re_o     => cpu_d.re,     -- read enable
367
    d_bus_cancel_o => cpu_d.cancel, -- cancel current bus transaction
368
    d_bus_ack_i    => cpu_d.ack,    -- bus transfer acknowledge
369
    d_bus_err_i    => cpu_d.err,    -- bus transfer error
370
    d_bus_fence_o  => cpu_d.fence,  -- executed FENCE operation
371 11 zero_gravi
    -- system time input from MTIME --
372 12 zero_gravi
    time_i         => mtime_time,   -- current system time
373 2 zero_gravi
    -- external interrupts --
374 12 zero_gravi
    msw_irq_i      => '0',          -- software interrupt
375
    clic_irq_i     => clic_irq,     -- CLIC interrupt request
376
    mtime_irq_i    => mtime_irq     -- machine timer interrupt
377 2 zero_gravi
  );
378
 
379
 
380 12 zero_gravi
  -- CPU Crossbar Switch --------------------------------------------------------------------
381
  -- -------------------------------------------------------------------------------------------
382
  neorv32_busswitch_inst: neorv32_busswitch
383
  generic map (
384
    PORT_CA_READ_ONLY => false, -- set if controller port A is read-only
385
    PORT_CB_READ_ONLY => true   -- set if controller port B is read-only
386
  )
387
  port map (
388
    -- global control --
389
    clk_i           => clk_i,        -- global clock, rising edge
390
    rstn_i          => sys_rstn,     -- global reset, low-active, async
391
    -- controller interface a --
392
    ca_bus_addr_i   => cpu_d.addr,   -- bus access address
393
    ca_bus_rdata_o  => cpu_d.rdata,  -- bus read data
394
    ca_bus_wdata_i  => cpu_d.wdata,  -- bus write data
395
    ca_bus_ben_i    => cpu_d.ben,    -- byte enable
396
    ca_bus_we_i     => cpu_d.we,     -- write enable
397
    ca_bus_re_i     => cpu_d.re,     -- read enable
398
    ca_bus_cancel_i => cpu_d.cancel, -- cancel current bus transaction
399
    ca_bus_ack_o    => cpu_d.ack,    -- bus transfer acknowledge
400
    ca_bus_err_o    => cpu_d.err,    -- bus transfer error
401
    -- controller interface b --
402
    cb_bus_addr_i   => cpu_i.addr,   -- bus access address
403
    cb_bus_rdata_o  => cpu_i.rdata,  -- bus read data
404
    cb_bus_wdata_i  => cpu_i.wdata,  -- bus write data
405
    cb_bus_ben_i    => cpu_i.ben,    -- byte enable
406
    cb_bus_we_i     => cpu_i.we,     -- write enable
407
    cb_bus_re_i     => cpu_i.re,     -- read enable
408
    cb_bus_cancel_i => cpu_i.cancel, -- cancel current bus transaction
409
    cb_bus_ack_o    => cpu_i.ack,    -- bus transfer acknowledge
410
    cb_bus_err_o    => cpu_i.err,    -- bus transfer error
411
    -- peripheral bus --
412
    p_bus_addr_o    => p_bus.addr,   -- bus access address
413
    p_bus_rdata_i   => p_bus.rdata,  -- bus read data
414
    p_bus_wdata_o   => p_bus.wdata,  -- bus write data
415
    p_bus_ben_o     => p_bus.ben,    -- byte enable
416
    p_bus_we_o      => p_bus.we,     -- write enable
417
    p_bus_re_o      => p_bus.re,     -- read enable
418
    p_bus_cancel_o  => p_bus.cancel, -- cancel current bus transaction
419
    p_bus_ack_i     => p_bus.ack,    -- bus transfer acknowledge
420
    p_bus_err_i     => p_bus.err     -- bus transfer error
421
  );
422 2 zero_gravi
 
423 12 zero_gravi
  -- advanced memory control --
424
  fence_o  <= cpu_d.fence; -- indicates an executed FENCE operation
425
  fencei_o <= cpu_i.fence; -- indicates an executed FENCEI operation
426 2 zero_gravi
 
427 12 zero_gravi
  -- process bus: CPU data input --
428
  p_bus.rdata <= (imem_rdata or dmem_rdata or bootrom_rdata) or wishbone_rdata or (gpio_rdata or mtime_rdata or uart_rdata or
429
                 spi_rdata or twi_rdata or pwm_rdata or wdt_rdata or clic_rdata or trng_rdata or devnull_rdata or sysinfo_rdata);
430 2 zero_gravi
 
431 12 zero_gravi
  -- process bus: CPU data ACK input --
432
  p_bus.ack <= (imem_ack or dmem_ack or bootrom_ack) or wishbone_ack or (gpio_ack or mtime_ack or uart_ack or
433
               spi_ack or twi_ack or pwm_ack or wdt_ack or clic_ack or trng_ack or devnull_ack or sysinfo_ack);
434
 
435
  -- process bus: CPU data bus error input --
436
  p_bus.err <= wishbone_err;
437
 
438
 
439 2 zero_gravi
  -- Processor-Internal Instruction Memory (IMEM) -------------------------------------------
440
  -- -------------------------------------------------------------------------------------------
441
  neorv32_int_imem_inst_true:
442
  if (MEM_INT_IMEM_USE = true) generate
443
    neorv32_int_imem_inst: neorv32_imem
444
    generic map (
445
      IMEM_BASE      => MEM_ISPACE_BASE,   -- memory base address
446
      IMEM_SIZE      => MEM_INT_IMEM_SIZE, -- processor-internal instruction memory size in bytes
447
      IMEM_AS_ROM    => MEM_INT_IMEM_ROM,  -- implement IMEM as read-only memory?
448
      BOOTLOADER_USE => BOOTLOADER_USE     -- implement and use bootloader?
449
    )
450
    port map (
451 12 zero_gravi
      clk_i  => clk_i,       -- global clock line
452
      rden_i => p_bus.re,    -- read enable
453
      wren_i => p_bus.we,    -- write enable
454
      ben_i  => p_bus.ben,   -- byte write enable
455
      upen_i => '1',         -- update enable
456
      addr_i => p_bus.addr,  -- address
457
      data_i => p_bus.wdata, -- data in
458
      data_o => imem_rdata,  -- data out
459
      ack_o  => imem_ack     -- transfer acknowledge
460 2 zero_gravi
    );
461
  end generate;
462
 
463
  neorv32_int_imem_inst_false:
464
  if (MEM_INT_IMEM_USE = false) generate
465
    imem_rdata <= (others => '0');
466
    imem_ack   <= '0';
467
  end generate;
468
 
469
 
470
  -- Processor-Internal Data Memory (DMEM) --------------------------------------------------
471
  -- -------------------------------------------------------------------------------------------
472
  neorv32_int_dmem_inst_true:
473
  if (MEM_INT_DMEM_USE = true) generate
474
    neorv32_int_dmem_inst: neorv32_dmem
475
    generic map (
476
      DMEM_BASE => MEM_DSPACE_BASE,  -- memory base address
477
      DMEM_SIZE => MEM_INT_DMEM_SIZE -- processor-internal data memory size in bytes
478
    )
479
    port map (
480 12 zero_gravi
      clk_i  => clk_i,       -- global clock line
481
      rden_i => p_bus.re,    -- read enable
482
      wren_i => p_bus.we,    -- write enable
483
      ben_i  => p_bus.ben,   -- byte write enable
484
      addr_i => p_bus.addr,  -- address
485
      data_i => p_bus.wdata, -- data in
486
      data_o => dmem_rdata,  -- data out
487
      ack_o  => dmem_ack     -- transfer acknowledge
488 2 zero_gravi
    );
489
  end generate;
490
 
491
  neorv32_int_dmem_inst_false:
492
  if (MEM_INT_DMEM_USE = false) generate
493
    dmem_rdata <= (others => '0');
494
    dmem_ack   <= '0';
495
  end generate;
496
 
497
 
498
  -- Processor-Internal Bootloader ROM (BOOTROM) --------------------------------------------
499
  -- -------------------------------------------------------------------------------------------
500
  neorv32_boot_rom_inst_true:
501
  if (BOOTLOADER_USE = true) generate
502
    neorv32_boot_rom_inst: neorv32_boot_rom
503
    port map (
504
      clk_i  => clk_i,         -- global clock line
505 12 zero_gravi
      rden_i => p_bus.re,      -- read enable
506
      addr_i => p_bus.addr,    -- address
507 2 zero_gravi
      data_o => bootrom_rdata, -- data out
508
      ack_o  => bootrom_ack    -- transfer acknowledge
509
    );
510
  end generate;
511
 
512
  neorv32_boot_rom_inst_false:
513
  if (BOOTLOADER_USE = false) generate
514
    bootrom_rdata <= (others => '0');
515
    bootrom_ack   <= '0';
516
  end generate;
517
 
518
 
519
  -- External Wishbone Gateway (WISHBONE) ---------------------------------------------------
520
  -- -------------------------------------------------------------------------------------------
521
  neorv32_wishbone_inst_true:
522
  if (MEM_EXT_USE = true) generate
523
    neorv32_wishbone_inst: neorv32_wishbone
524
    generic map (
525
      INTERFACE_REG_STAGES => MEM_EXT_REG_STAGES, -- number of interface register stages (0,1,2)
526
      -- Memory configuration: Instruction memory --
527 12 zero_gravi
      MEM_ISPACE_BASE      => MEM_ISPACE_BASE,    -- base address of instruction memory space
528
      MEM_ISPACE_SIZE      => MEM_ISPACE_SIZE,    -- total size of instruction memory space in byte
529
      MEM_INT_IMEM_USE     => MEM_INT_IMEM_USE,   -- implement processor-internal instruction memory
530
      MEM_INT_IMEM_SIZE    => MEM_INT_IMEM_SIZE,  -- size of processor-internal instruction memory in bytes
531 2 zero_gravi
      -- Memory configuration: Data memory --
532 12 zero_gravi
      MEM_DSPACE_BASE      => MEM_DSPACE_BASE,    -- base address of data memory space
533
      MEM_DSPACE_SIZE      => MEM_DSPACE_SIZE,    -- total size of data memory space in byte
534
      MEM_INT_DMEM_USE     => MEM_INT_DMEM_USE,   -- implement processor-internal data memory
535
      MEM_INT_DMEM_SIZE    => MEM_INT_DMEM_SIZE   -- size of processor-internal data memory in bytes
536 2 zero_gravi
    )
537
    port map (
538
      -- global control --
539
      clk_i    => clk_i,          -- global clock line
540
      rstn_i   => sys_rstn,       -- global reset line, low-active
541
      -- host access --
542 12 zero_gravi
      addr_i   => p_bus.addr,     -- address
543
      rden_i   => p_bus.re,       -- read enable
544
      wren_i   => p_bus.we,       -- write enable
545
      ben_i    => p_bus.ben,      -- byte write enable
546
      data_i   => p_bus.wdata,    -- data in
547 2 zero_gravi
      data_o   => wishbone_rdata, -- data out
548 12 zero_gravi
      cancel_i => p_bus.cancel,   -- cancel current transaction
549 2 zero_gravi
      ack_o    => wishbone_ack,   -- transfer acknowledge
550
      err_o    => wishbone_err,   -- transfer error
551
      -- wishbone interface --
552
      wb_adr_o => wb_adr_o,       -- address
553
      wb_dat_i => wb_dat_i,       -- read data
554
      wb_dat_o => wb_dat_o,       -- write data
555
      wb_we_o  => wb_we_o,        -- read/write
556
      wb_sel_o => wb_sel_o,       -- byte enable
557
      wb_stb_o => wb_stb_o,       -- strobe
558
      wb_cyc_o => wb_cyc_o,       -- valid cycle
559
      wb_ack_i => wb_ack_i,       -- transfer acknowledge
560
      wb_err_i => wb_err_i        -- transfer error
561
    );
562
  end generate;
563
 
564
  neorv32_wishbone_inst_false:
565
  if (MEM_EXT_USE = false) generate
566
    wishbone_rdata <= (others => '0');
567
    wishbone_ack   <= '0';
568
    wishbone_err   <= '0';
569
    --
570
    wb_adr_o <= (others => '0');
571
    wb_dat_o <= (others => '0');
572
    wb_we_o  <= '0';
573
    wb_sel_o <= (others => '0');
574
    wb_stb_o <= '0';
575
    wb_cyc_o <= '0';
576
  end generate;
577
 
578
 
579
  -- IO Access? -----------------------------------------------------------------------------
580
  -- -------------------------------------------------------------------------------------------
581 12 zero_gravi
  io_acc  <= '1' when (p_bus.addr(data_width_c-1 downto index_size_f(io_size_c)) = io_base_c(data_width_c-1 downto index_size_f(io_size_c))) else '0';
582
  io_rden <= io_acc and p_bus.re;
583
  io_wren <= io_acc and p_bus.we;
584 2 zero_gravi
 
585
 
586
  -- General Purpose Input/Output Port (GPIO) -----------------------------------------------
587
  -- -------------------------------------------------------------------------------------------
588
  neorv32_gpio_inst_true:
589
  if (IO_GPIO_USE = true) generate
590
    neorv32_gpio_inst: neorv32_gpio
591
    port map (
592
      -- host access --
593 12 zero_gravi
      clk_i  => clk_i,       -- global clock line
594
      addr_i => p_bus.addr,  -- address
595
      rden_i => io_rden,     -- read enable
596
      wren_i => io_wren,     -- write enable
597
      ben_i  => p_bus.ben,   -- byte write enable
598
      data_i => p_bus.wdata, -- data in
599
      data_o => gpio_rdata,  -- data out
600
      ack_o  => gpio_ack,    -- transfer acknowledge
601 2 zero_gravi
      -- parallel io --
602
      gpio_o => gpio_o,
603
      gpio_i => gpio_i,
604
      -- interrupt --
605 12 zero_gravi
      irq_o  => gpio_irq     -- pin-change interrupt
606 2 zero_gravi
    );
607
  end generate;
608
 
609
  neorv32_gpio_inst_false:
610
  if (IO_GPIO_USE = false) generate
611
    gpio_rdata <= (others => '0');
612
    gpio_ack   <= '0';
613
    gpio_o     <= (others => '0');
614
    gpio_irq   <= '0';
615
  end generate;
616
 
617
 
618
  -- Core-Local Interrupt Controller (CLIC) -------------------------------------------------
619
  -- -------------------------------------------------------------------------------------------
620
  neorv32_clic_inst_true:
621
  if (IO_CLIC_USE = true) generate
622
    neorv32_clic_inst: neorv32_clic
623
    port map (
624
      -- host access --
625 12 zero_gravi
      clk_i     => clk_i,       -- global clock line
626
      rden_i    => io_rden,     -- read enable
627
      wren_i    => io_wren,     -- write enable
628
      ben_i     => p_bus.ben,   -- byte write enable
629
      addr_i    => p_bus.addr,  -- address
630
      data_i    => p_bus.wdata, -- data in
631
      data_o    => clic_rdata,  -- data out
632
      ack_o     => clic_ack,    -- transfer acknowledge
633 2 zero_gravi
      -- cpu interrupt --
634 12 zero_gravi
      cpu_irq_o => clic_irq,    -- trigger CPU's external IRQ
635 2 zero_gravi
      -- external interrupt lines --
636 12 zero_gravi
      ext_irq_i => clic_xirq,   -- IRQ, triggering on HIGH level
637
      ext_ack_o => clic_xack    -- acknowledge
638 2 zero_gravi
    );
639
  end generate;
640
 
641
  -- CLIC interrupt channels and priority --
642
  clic_xirq(0) <= wdt_irq; -- highest priority
643
  clic_xirq(1) <= '0'; -- reserved
644
  clic_xirq(2) <= gpio_irq;
645
  clic_xirq(3) <= uart_irq;
646
  clic_xirq(4) <= spi_irq;
647
  clic_xirq(5) <= twi_irq;
648
  clic_xirq(6) <= ext_irq_i(0);
649
  clic_xirq(7) <= ext_irq_i(1); -- lowest priority
650
 
651 4 zero_gravi
  -- external interrupt request acknowledge --
652
  ext_ack_o(0) <= clic_xack(6);
653
  ext_ack_o(1) <= clic_xack(7);
654 2 zero_gravi
 
655
  neorv32_clic_inst_false:
656
  if (IO_CLIC_USE = false) generate
657
    clic_rdata <= (others => '0');
658
    clic_ack   <= '0';
659
    clic_irq   <= '0';
660
    clic_xack  <= (others => '0');
661
  end generate;
662
 
663
 
664
  -- Watch Dog Timer (WDT) ------------------------------------------------------------------
665
  -- -------------------------------------------------------------------------------------------
666
  neorv32_wdt_inst_true:
667
  if (IO_WDT_USE = true) generate
668
    neorv32_wdt_inst: neorv32_wdt
669
    port map (
670
      -- host access --
671 12 zero_gravi
      clk_i       => clk_i,       -- global clock line
672
      rstn_i      => ext_rstn,    -- global reset line, low-active
673
      rden_i      => io_rden,     -- read enable
674
      wren_i      => io_wren,     -- write enable
675
      ben_i       => p_bus.ben,   -- byte write enable
676
      addr_i      => p_bus.addr,  -- address
677
      data_i      => p_bus.wdata, -- data in
678
      data_o      => wdt_rdata,   -- data out
679
      ack_o       => wdt_ack,     -- transfer acknowledge
680 2 zero_gravi
      -- clock generator --
681 12 zero_gravi
      clkgen_en_o => wdt_cg_en,   -- enable clock generator
682 2 zero_gravi
      clkgen_i    => clk_gen,
683
      -- timeout event --
684 12 zero_gravi
      irq_o       => wdt_irq,     -- timeout IRQ
685
      rstn_o      => wdt_rstn     -- timeout reset, low_active, use it as async!
686 2 zero_gravi
    );
687
  end generate;
688
 
689
  neorv32_wdt_inst_false:
690
  if (IO_WDT_USE = false) generate
691
    wdt_rdata <= (others => '0');
692
    wdt_ack   <= '0';
693
    wdt_irq   <= '0';
694
    wdt_rstn  <= '1';
695
    wdt_cg_en <= '0';
696
  end generate;
697
 
698
 
699
  -- Machine System Timer (MTIME) -----------------------------------------------------------
700
  -- -------------------------------------------------------------------------------------------
701
  neorv32_mtime_inst_true:
702
  if (IO_MTIME_USE = true) generate
703
    neorv32_mtime_inst: neorv32_mtime
704
    port map (
705
      -- host access --
706 12 zero_gravi
      clk_i     => clk_i,       -- global clock line
707
      rstn_i    => sys_rstn,    -- global reset, low-active, async
708
      addr_i    => p_bus.addr,  -- address
709
      rden_i    => io_rden,     -- read enable
710
      wren_i    => io_wren,     -- write enable
711
      ben_i     => p_bus.ben,   -- byte write enable
712
      data_i    => p_bus.wdata, -- data in
713
      data_o    => mtime_rdata, -- data out
714
      ack_o     => mtime_ack,   -- transfer acknowledge
715 11 zero_gravi
      -- time output for CPU --
716 12 zero_gravi
      time_o    => mtime_time,  -- current system time
717 2 zero_gravi
      -- interrupt --
718 12 zero_gravi
      irq_o     => mtime_irq    -- interrupt request
719 2 zero_gravi
    );
720
  end generate;
721
 
722
  neorv32_mtime_inst_false:
723
  if (IO_MTIME_USE = false) generate
724
    mtime_rdata <= (others => '0');
725 11 zero_gravi
    mtime_time  <= (others => '0');
726 2 zero_gravi
    mtime_ack   <= '0';
727
    mtime_irq   <= '0';
728
  end generate;
729
 
730
 
731
  -- Universal Asynchronous Receiver/Transmitter (UART) -------------------------------------
732
  -- -------------------------------------------------------------------------------------------
733
  neorv32_uart_inst_true:
734
  if (IO_UART_USE = true) generate
735
    neorv32_uart_inst: neorv32_uart
736
    port map (
737
      -- host access --
738 12 zero_gravi
      clk_i       => clk_i,       -- global clock line
739
      addr_i      => p_bus.addr,  -- address
740
      rden_i      => io_rden,     -- read enable
741
      wren_i      => io_wren,     -- write enable
742
      ben_i       => p_bus.ben,   -- byte write enable
743
      data_i      => p_bus.wdata, -- data in
744
      data_o      => uart_rdata,  -- data out
745
      ack_o       => uart_ack,    -- transfer acknowledge
746 2 zero_gravi
      -- clock generator --
747 12 zero_gravi
      clkgen_en_o => uart_cg_en,  -- enable clock generator
748 2 zero_gravi
      clkgen_i    => clk_gen,
749
      -- com lines --
750
      uart_txd_o  => uart_txd_o,
751
      uart_rxd_i  => uart_rxd_i,
752
      -- interrupts --
753 12 zero_gravi
      uart_irq_o  => uart_irq     -- uart rx/tx interrupt
754 2 zero_gravi
    );
755
  end generate;
756
 
757
  neorv32_uart_inst_false:
758
  if (IO_UART_USE = false) generate
759
    uart_rdata <= (others => '0');
760
    uart_ack   <= '0';
761
    uart_txd_o <= '0';
762
    uart_cg_en <= '0';
763
    uart_irq   <= '0';
764
  end generate;
765
 
766
 
767
  -- Serial Peripheral Interface (SPI) ------------------------------------------------------
768
  -- -------------------------------------------------------------------------------------------
769
  neorv32_spi_inst_true:
770
  if (IO_SPI_USE = true) generate
771
    neorv32_spi_inst: neorv32_spi
772
    port map (
773
      -- host access --
774 12 zero_gravi
      clk_i       => clk_i,       -- global clock line
775
      addr_i      => p_bus.addr,  -- address
776
      rden_i      => io_rden,     -- read enable
777
      wren_i      => io_wren,     -- write enable
778
      ben_i       => p_bus.ben,   -- byte write enable
779
      data_i      => p_bus.wdata, -- data in
780
      data_o      => spi_rdata,   -- data out
781
      ack_o       => spi_ack,     -- transfer acknowledge
782 2 zero_gravi
      -- clock generator --
783 12 zero_gravi
      clkgen_en_o => spi_cg_en,   -- enable clock generator
784 2 zero_gravi
      clkgen_i    => clk_gen,
785
      -- com lines --
786 12 zero_gravi
      spi_sck_o   => spi_sck_o,   -- SPI serial clock
787
      spi_sdo_o   => spi_sdo_o,   -- controller data out, peripheral data in
788
      spi_sdi_i   => spi_sdi_i,   -- controller data in, peripheral data out
789
      spi_csn_o   => spi_csn_o,   -- SPI CS
790 2 zero_gravi
      -- interrupt --
791 12 zero_gravi
      spi_irq_o   => spi_irq      -- transmission done interrupt
792 2 zero_gravi
    );
793
  end generate;
794
 
795
  neorv32_spi_inst_false:
796
  if (IO_SPI_USE = false) generate
797
    spi_rdata  <= (others => '0');
798
    spi_ack    <= '0';
799 6 zero_gravi
    spi_sck_o  <= '0';
800
    spi_sdo_o  <= '0';
801 2 zero_gravi
    spi_csn_o  <= (others => '1'); -- CSn lines are low-active
802
    spi_cg_en  <= '0';
803
    spi_irq    <= '0';
804
  end generate;
805
 
806
 
807
  -- Two-Wire Interface (TWI) ---------------------------------------------------------------
808
  -- -------------------------------------------------------------------------------------------
809
  neorv32_twi_inst_true:
810
  if (IO_TWI_USE = true) generate
811
    neorv32_twi_inst: neorv32_twi
812
    port map (
813
      -- host access --
814 12 zero_gravi
      clk_i       => clk_i,       -- global clock line
815
      addr_i      => p_bus.addr,  -- address
816
      rden_i      => io_rden,     -- read enable
817
      wren_i      => io_wren,     -- write enable
818
      ben_i       => p_bus.ben,   -- byte write enable
819
      data_i      => p_bus.wdata, -- data in
820
      data_o      => twi_rdata,   -- data out
821
      ack_o       => twi_ack,     -- transfer acknowledge
822 2 zero_gravi
      -- clock generator --
823 12 zero_gravi
      clkgen_en_o => twi_cg_en,   -- enable clock generator
824 2 zero_gravi
      clkgen_i    => clk_gen,
825
      -- com lines --
826 12 zero_gravi
      twi_sda_io  => twi_sda_io,  -- serial data line
827
      twi_scl_io  => twi_scl_io,  -- serial clock line
828 2 zero_gravi
      -- interrupt --
829 12 zero_gravi
      twi_irq_o   => twi_irq      -- transfer done IRQ
830 2 zero_gravi
    );
831
  end generate;
832
 
833
  neorv32_twi_inst_false:
834
  if (IO_TWI_USE = false) generate
835
    twi_rdata  <= (others => '0');
836
    twi_ack    <= '0';
837
--  twi_sda_io <= 'H';
838
--  twi_scl_io <= 'H';
839
    twi_cg_en  <= '0';
840
    twi_irq    <= '0';
841
  end generate;
842
 
843
 
844
  -- Pulse-Width Modulation Controller (PWM) ------------------------------------------------
845
  -- -------------------------------------------------------------------------------------------
846
  neorv32_pwm_inst_true:
847
  if (IO_PWM_USE = true) generate
848
    neorv32_pwm_inst: neorv32_pwm
849
    port map (
850
      -- host access --
851 12 zero_gravi
      clk_i       => clk_i,       -- global clock line
852
      addr_i      => p_bus.addr,  -- address
853
      rden_i      => io_rden,     -- read enable
854
      wren_i      => io_wren,     -- write enable
855
      ben_i       => p_bus.ben,   -- byte write enable
856
      data_i      => p_bus.wdata, -- data in
857
      data_o      => pwm_rdata,   -- data out
858
      ack_o       => pwm_ack,     -- transfer acknowledge
859 2 zero_gravi
      -- clock generator --
860 12 zero_gravi
      clkgen_en_o => pwm_cg_en,   -- enable clock generator
861 2 zero_gravi
      clkgen_i    => clk_gen,
862
      -- pwm output channels --
863
      pwm_o       => pwm_o
864
    );
865
  end generate;
866
 
867
  neorv32_pwm_inst_false:
868
  if (IO_PWM_USE = false) generate
869
    pwm_rdata <= (others => '0');
870
    pwm_ack   <= '0';
871
    pwm_cg_en <= '0';
872
    pwm_o     <= (others => '0');
873
  end generate;
874
 
875
 
876
  -- True Random Number Generator (TRNG) ----------------------------------------------------
877
  -- -------------------------------------------------------------------------------------------
878
  neorv32_trng_inst_true:
879
  if (IO_TRNG_USE = true) generate
880
    neorv32_trng_inst: neorv32_trng
881
    port map (
882
      -- host access --
883 12 zero_gravi
      clk_i  => clk_i,       -- global clock line
884
      addr_i => p_bus.addr,  -- address
885
      rden_i => io_rden,     -- read enable
886
      wren_i => io_wren,     -- write enable
887
      ben_i  => p_bus.ben,   -- byte write enable
888
      data_i => p_bus.wdata, -- data in
889
      data_o => trng_rdata,  -- data out
890
      ack_o  => trng_ack     -- transfer acknowledge
891 2 zero_gravi
    );
892
  end generate;
893
 
894
  neorv32_trng_inst_false:
895
  if (IO_TRNG_USE = false) generate
896
    trng_rdata <= (others => '0');
897
    trng_ack   <= '0';
898
  end generate;
899
 
900
 
901 3 zero_gravi
  -- Dummy Device (DEVNULL) -----------------------------------------------------------------
902
  -- -------------------------------------------------------------------------------------------
903
  neorv32_devnull_inst_true:
904
  if (IO_DEVNULL_USE = true) generate
905
    neorv32_devnull_inst: neorv32_devnull
906
    port map (
907
      -- host access --
908
      clk_i  => clk_i,         -- global clock line
909 12 zero_gravi
      addr_i => p_bus.addr,    -- address
910 3 zero_gravi
      rden_i => io_rden,       -- read enable
911
      wren_i => io_wren,       -- write enable
912 12 zero_gravi
      ben_i  => p_bus.ben,     -- byte write enable
913
      data_i => p_bus.wdata,   -- data in
914 3 zero_gravi
      data_o => devnull_rdata, -- data out
915
      ack_o  => devnull_ack    -- transfer acknowledge
916
    );
917
  end generate;
918 12 zero_gravi
 
919 3 zero_gravi
  neorv32_devnull_inst_false:
920
  if (IO_DEVNULL_USE = false) generate
921
    devnull_rdata <= (others => '0');
922
    devnull_ack   <= '0';
923
  end generate;
924
 
925
 
926 12 zero_gravi
  -- System Configuration Information Memory (SYSINFO) --------------------------------------
927
  -- -------------------------------------------------------------------------------------------
928
  neorv32_sysinfo_inst: neorv32_sysinfo
929
  generic map (
930
    -- General --
931
    CLOCK_FREQUENCY   => CLOCK_FREQUENCY,   -- clock frequency of clk_i in Hz
932
    BOOTLOADER_USE    => BOOTLOADER_USE,    -- implement processor-internal bootloader?
933
    USER_CODE         => USER_CODE,         -- custom user code
934
    -- Memory configuration: Instruction memory --
935
    MEM_ISPACE_BASE   => MEM_ISPACE_BASE,   -- base address of instruction memory space
936
    MEM_ISPACE_SIZE   => MEM_ISPACE_SIZE,   -- total size of instruction memory space in byte
937
    MEM_INT_IMEM_USE  => MEM_INT_IMEM_USE,  -- implement processor-internal instruction memory
938
    MEM_INT_IMEM_SIZE => MEM_INT_IMEM_SIZE, -- size of processor-internal instruction memory in bytes
939
    MEM_INT_IMEM_ROM  => MEM_INT_IMEM_ROM,  -- implement processor-internal instruction memory as ROM
940
    -- Memory configuration: Data memory --
941
    MEM_DSPACE_BASE   => MEM_DSPACE_BASE,   -- base address of data memory space
942
    MEM_DSPACE_SIZE   => MEM_DSPACE_SIZE,   -- total size of data memory space in byte
943
    MEM_INT_DMEM_USE  => MEM_INT_DMEM_USE,  -- implement processor-internal data memory
944
    MEM_INT_DMEM_SIZE => MEM_INT_DMEM_SIZE, -- size of processor-internal data memory in bytes
945
    -- Memory configuration: External memory interface --
946
    MEM_EXT_USE       => MEM_EXT_USE,       -- implement external memory bus interface?
947
    -- Processor peripherals --
948
    IO_GPIO_USE       => IO_GPIO_USE,       -- implement general purpose input/output port unit (GPIO)?
949
    IO_MTIME_USE      => IO_MTIME_USE,      -- implement machine system timer (MTIME)?
950
    IO_UART_USE       => IO_UART_USE,       -- implement universal asynchronous receiver/transmitter (UART)?
951
    IO_SPI_USE        => IO_SPI_USE,        -- implement serial peripheral interface (SPI)?
952
    IO_TWI_USE        => IO_TWI_USE,        -- implement two-wire interface (TWI)?
953
    IO_PWM_USE        => IO_PWM_USE,        -- implement pulse-width modulation unit (PWM)?
954
    IO_WDT_USE        => IO_WDT_USE,        -- implement watch dog timer (WDT)?
955
    IO_CLIC_USE       => IO_CLIC_USE,       -- implement core local interrupt controller (CLIC)?
956
    IO_TRNG_USE       => IO_TRNG_USE,       -- implement true random number generator (TRNG)?
957
    IO_DEVNULL_USE    => IO_DEVNULL_USE     -- implement dummy device (DEVNULL)?
958
  )
959
  port map (
960
    -- host access --
961
    clk_i  => clk_i,         -- global clock line
962
    addr_i => p_bus.addr,    -- address
963
    rden_i => io_rden,       -- read enable
964
    data_o => sysinfo_rdata, -- data out
965
    ack_o  => sysinfo_ack    -- transfer acknowledge
966
  );
967
 
968
 
969 2 zero_gravi
end neorv32_top_rtl;

powered by: WebSVN 2.1.0

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