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

Subversion Repositories neorv32

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

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 18 zero_gravi
-- # This is the top entity of the NEORV32 PROCESSOR. Instantiate this unit in your own project    #
5 2 zero_gravi
-- # and define all the configuration generics according to your needs. Alternatively, you can use #
6 18 zero_gravi
-- # one of the alternative top entities provided in the "rtl/top_templates" folder.               #
7
-- #                                                                                               #
8 23 zero_gravi
-- # Check the processor's data sheet for more information: docs/NEORV32.pdf                       #
9 2 zero_gravi
-- # ********************************************************************************************* #
10
-- # BSD 3-Clause License                                                                          #
11
-- #                                                                                               #
12 42 zero_gravi
-- # Copyright (c) 2021, Stephan Nolting. All rights reserved.                                     #
13 2 zero_gravi
-- #                                                                                               #
14
-- # Redistribution and use in source and binary forms, with or without modification, are          #
15
-- # permitted provided that the following conditions are met:                                     #
16
-- #                                                                                               #
17
-- # 1. Redistributions of source code must retain the above copyright notice, this list of        #
18
-- #    conditions and the following disclaimer.                                                   #
19
-- #                                                                                               #
20
-- # 2. Redistributions in binary form must reproduce the above copyright notice, this list of     #
21
-- #    conditions and the following disclaimer in the documentation and/or other materials        #
22
-- #    provided with the distribution.                                                            #
23
-- #                                                                                               #
24
-- # 3. Neither the name of the copyright holder nor the names of its contributors may be used to  #
25
-- #    endorse or promote products derived from this software without specific prior written      #
26
-- #    permission.                                                                                #
27
-- #                                                                                               #
28
-- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS   #
29
-- # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF               #
30
-- # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE    #
31
-- # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,     #
32
-- # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
33
-- # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED    #
34
-- # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING     #
35
-- # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED  #
36
-- # OF THE POSSIBILITY OF SUCH DAMAGE.                                                            #
37
-- # ********************************************************************************************* #
38
-- # The NEORV32 Processor - https://github.com/stnolting/neorv32              (c) Stephan Nolting #
39
-- #################################################################################################
40
 
41
library ieee;
42
use ieee.std_logic_1164.all;
43
use ieee.numeric_std.all;
44
 
45
library neorv32;
46
use neorv32.neorv32_package.all;
47
 
48
entity neorv32_top is
49
  generic (
50
    -- General --
51 12 zero_gravi
    CLOCK_FREQUENCY              : natural := 0;      -- clock frequency of clk_i in Hz
52 44 zero_gravi
    BOOTLOADER_EN                : boolean := true;   -- implement processor-internal bootloader?
53 12 zero_gravi
    USER_CODE                    : std_ulogic_vector(31 downto 0) := x"00000000"; -- custom user code
54 49 zero_gravi
    HW_THREAD_ID                 : natural := 0;      -- hardware thread id (32-bit)
55 50 zero_gravi
 
56 2 zero_gravi
    -- RISC-V CPU Extensions --
57 39 zero_gravi
    CPU_EXTENSION_RISCV_A        : boolean := false;  -- implement atomic extension?
58 44 zero_gravi
    CPU_EXTENSION_RISCV_B        : boolean := false;  -- implement bit manipulation extensions?
59 11 zero_gravi
    CPU_EXTENSION_RISCV_C        : boolean := false;  -- implement compressed extension?
60 8 zero_gravi
    CPU_EXTENSION_RISCV_E        : boolean := false;  -- implement embedded RF extension?
61 11 zero_gravi
    CPU_EXTENSION_RISCV_M        : boolean := false;  -- implement muld/div extension?
62 15 zero_gravi
    CPU_EXTENSION_RISCV_U        : boolean := false;  -- implement user mode extension?
63 8 zero_gravi
    CPU_EXTENSION_RISCV_Zicsr    : boolean := true;   -- implement CSR system?
64 39 zero_gravi
    CPU_EXTENSION_RISCV_Zifencei : boolean := false;  -- implement instruction stream sync.?
65 50 zero_gravi
 
66 19 zero_gravi
    -- Extension Options --
67 23 zero_gravi
    FAST_MUL_EN                  : boolean := false;  -- use DSPs for M extension's multiplier
68 39 zero_gravi
    FAST_SHIFT_EN                : boolean := false;  -- use barrel shifter for shift operations
69 50 zero_gravi
 
70 15 zero_gravi
    -- Physical Memory Protection (PMP) --
71 42 zero_gravi
    PMP_NUM_REGIONS              : natural := 0;      -- number of regions (0..64)
72
    PMP_MIN_GRANULARITY          : natural := 64*1024; -- minimal region granularity in bytes, has to be a power of 2, min 8 bytes
73 50 zero_gravi
 
74 42 zero_gravi
    -- Hardware Performance Monitors (HPM) --
75 47 zero_gravi
    HPM_NUM_CNTS                 : natural := 0;      -- number of implemented HPM counters (0..29)
76 50 zero_gravi
 
77 23 zero_gravi
    -- Internal Instruction memory --
78 44 zero_gravi
    MEM_INT_IMEM_EN              : boolean := true;   -- implement processor-internal instruction memory
79 8 zero_gravi
    MEM_INT_IMEM_SIZE            : natural := 16*1024; -- size of processor-internal instruction memory in bytes
80
    MEM_INT_IMEM_ROM             : boolean := false;  -- implement processor-internal instruction memory as ROM
81 50 zero_gravi
 
82 23 zero_gravi
    -- Internal Data memory --
83 44 zero_gravi
    MEM_INT_DMEM_EN              : boolean := true;   -- implement processor-internal data memory
84 8 zero_gravi
    MEM_INT_DMEM_SIZE            : natural := 8*1024; -- size of processor-internal data memory in bytes
85 50 zero_gravi
 
86 41 zero_gravi
    -- Internal Cache memory --
87 44 zero_gravi
    ICACHE_EN                    : boolean := false;  -- implement instruction cache
88 41 zero_gravi
    ICACHE_NUM_BLOCKS            : natural := 4;      -- i-cache: number of blocks (min 1), has to be a power of 2
89
    ICACHE_BLOCK_SIZE            : natural := 64;     -- i-cache: block size in bytes (min 4), has to be a power of 2
90 45 zero_gravi
    ICACHE_ASSOCIATIVITY         : natural := 1;      -- i-cache: associativity / number of sets (1=direct_mapped), has to be a power of 2
91 50 zero_gravi
 
92 23 zero_gravi
    -- External memory interface --
93 44 zero_gravi
    MEM_EXT_EN                   : boolean := false;  -- implement external memory bus interface?
94 50 zero_gravi
 
95 2 zero_gravi
    -- Processor peripherals --
96 44 zero_gravi
    IO_GPIO_EN                   : boolean := true;   -- implement general purpose input/output port unit (GPIO)?
97
    IO_MTIME_EN                  : boolean := true;   -- implement machine system timer (MTIME)?
98 50 zero_gravi
    IO_UART0_EN                  : boolean := true;   -- implement primary universal asynchronous receiver/transmitter (UART0)?
99
    IO_UART1_EN                  : boolean := true;   -- implement secondary universal asynchronous receiver/transmitter (UART1)?
100 44 zero_gravi
    IO_SPI_EN                    : boolean := true;   -- implement serial peripheral interface (SPI)?
101
    IO_TWI_EN                    : boolean := true;   -- implement two-wire interface (TWI)?
102
    IO_PWM_EN                    : boolean := true;   -- implement pulse-width modulation unit (PWM)?
103
    IO_WDT_EN                    : boolean := true;   -- implement watch dog timer (WDT)?
104
    IO_TRNG_EN                   : boolean := false;  -- implement true random number generator (TRNG)?
105 47 zero_gravi
    IO_CFS_EN                    : boolean := false;  -- implement custom functions subsystem (CFS)?
106 49 zero_gravi
    IO_CFS_CONFIG                : std_ulogic_vector(31 downto 0) := x"00000000"; -- custom CFS configuration generic
107
    IO_NCO_EN                    : boolean := true    -- implement numerically-controlled oscillator (NCO)?
108 2 zero_gravi
  );
109
  port (
110
    -- Global control --
111 34 zero_gravi
    clk_i       : in  std_ulogic := '0'; -- global clock, rising edge
112
    rstn_i      : in  std_ulogic := '0'; -- global reset, low-active, async
113 50 zero_gravi
 
114 44 zero_gravi
    -- Wishbone bus interface (available if MEM_EXT_EN = true) --
115 36 zero_gravi
    wb_tag_o    : out std_ulogic_vector(02 downto 0); -- tag
116 34 zero_gravi
    wb_adr_o    : out std_ulogic_vector(31 downto 0); -- address
117
    wb_dat_i    : in  std_ulogic_vector(31 downto 0) := (others => '0'); -- read data
118
    wb_dat_o    : out std_ulogic_vector(31 downto 0); -- write data
119
    wb_we_o     : out std_ulogic; -- read/write
120
    wb_sel_o    : out std_ulogic_vector(03 downto 0); -- byte enable
121
    wb_stb_o    : out std_ulogic; -- strobe
122
    wb_cyc_o    : out std_ulogic; -- valid cycle
123 39 zero_gravi
    wb_lock_o   : out std_ulogic; -- locked/exclusive bus access
124 34 zero_gravi
    wb_ack_i    : in  std_ulogic := '0'; -- transfer acknowledge
125
    wb_err_i    : in  std_ulogic := '0'; -- transfer error
126 50 zero_gravi
 
127 44 zero_gravi
    -- Advanced memory control signals (available if MEM_EXT_EN = true) --
128 34 zero_gravi
    fence_o     : out std_ulogic; -- indicates an executed FENCE operation
129
    fencei_o    : out std_ulogic; -- indicates an executed FENCEI operation
130 50 zero_gravi
 
131 44 zero_gravi
    -- GPIO (available if IO_GPIO_EN = true) --
132 34 zero_gravi
    gpio_o      : out std_ulogic_vector(31 downto 0); -- parallel output
133
    gpio_i      : in  std_ulogic_vector(31 downto 0) := (others => '0'); -- parallel input
134 50 zero_gravi
 
135
    -- primary UART0 (available if IO_UART0_EN = true) --
136
    uart0_txd_o : out std_ulogic; -- UART0 send data
137
    uart0_rxd_i : in  std_ulogic := '0'; -- UART0 receive data
138
 
139
    -- secondary UART1 (available if IO_UART1_EN = true) --
140
    uart1_txd_o : out std_ulogic; -- UART1 send data
141
    uart1_rxd_i : in  std_ulogic := '0'; -- UART1 receive data
142
 
143 44 zero_gravi
    -- SPI (available if IO_SPI_EN = true) --
144 34 zero_gravi
    spi_sck_o   : out std_ulogic; -- SPI serial clock
145
    spi_sdo_o   : out std_ulogic; -- controller data out, peripheral data in
146
    spi_sdi_i   : in  std_ulogic := '0'; -- controller data in, peripheral data out
147 50 zero_gravi
    spi_csn_o   : out std_ulogic_vector(07 downto 0); -- chip-select
148
 
149 44 zero_gravi
    -- TWI (available if IO_TWI_EN = true) --
150 35 zero_gravi
    twi_sda_io  : inout std_logic; -- twi serial data line
151
    twi_scl_io  : inout std_logic; -- twi serial clock line
152 50 zero_gravi
 
153 44 zero_gravi
    -- PWM (available if IO_PWM_EN = true) --
154 34 zero_gravi
    pwm_o       : out std_ulogic_vector(03 downto 0); -- pwm channels
155 50 zero_gravi
 
156 47 zero_gravi
    -- Custom Functions Subsystem IO (available if IO_CFS_EN = true) --
157
    cfs_in_i    : in  std_ulogic_vector(31 downto 0) := (others => '0'); -- custom CFS inputs conduit
158
    cfs_out_o   : out std_ulogic_vector(31 downto 0); -- custom CFS outputs conduit
159 50 zero_gravi
 
160 49 zero_gravi
    -- NCO output (available if IO_NCO_EN = true) --
161
    nco_o       : out std_ulogic_vector(02 downto 0); -- numerically-controlled oscillator channels
162 50 zero_gravi
 
163 44 zero_gravi
    -- system time input from external MTIME (available if IO_MTIME_EN = false) --
164 40 zero_gravi
    mtime_i     : in  std_ulogic_vector(63 downto 0) := (others => '0'); -- current system time
165 50 zero_gravi
 
166 14 zero_gravi
    -- Interrupts --
167 50 zero_gravi
    soc_firq_i  : in  std_ulogic_vector(5 downto 0) := (others => '0'); -- fast interrupt channels
168 44 zero_gravi
    mtime_irq_i : in  std_ulogic := '0'; -- machine timer interrupt, available if IO_MTIME_EN = false
169 34 zero_gravi
    msw_irq_i   : in  std_ulogic := '0'; -- machine software interrupt
170
    mext_irq_i  : in  std_ulogic := '0'  -- machine external interrupt
171 2 zero_gravi
  );
172
end neorv32_top;
173
 
174
architecture neorv32_top_rtl of neorv32_top is
175
 
176 12 zero_gravi
  -- CPU boot address --
177 44 zero_gravi
  constant cpu_boot_addr_c : std_ulogic_vector(31 downto 0) := cond_sel_stdulogicvector_f(BOOTLOADER_EN, boot_rom_base_c, ispace_base_c);
178 12 zero_gravi
 
179 41 zero_gravi
  -- Bus timeout --
180
  constant bus_timeout_temp_c : natural := 2**index_size_f(bus_timeout_c); -- round to next power-of-two
181 44 zero_gravi
  constant bus_timeout_proc_c : natural := cond_sel_natural_f(ICACHE_EN, ((ICACHE_BLOCK_SIZE/4)*bus_timeout_temp_c)-1, bus_timeout_c);
182 41 zero_gravi
 
183 29 zero_gravi
  -- alignment check for internal memories --
184
  constant imem_align_check_c : std_ulogic_vector(index_size_f(MEM_INT_IMEM_SIZE)-1 downto 0) := (others => '0');
185
  constant dmem_align_check_c : std_ulogic_vector(index_size_f(MEM_INT_DMEM_SIZE)-1 downto 0) := (others => '0');
186
 
187 2 zero_gravi
  -- reset generator --
188
  signal rstn_i_sync0 : std_ulogic;
189
  signal rstn_i_sync1 : std_ulogic;
190
  signal rstn_i_sync2 : std_ulogic;
191
  signal rstn_gen     : std_ulogic_vector(3 downto 0);
192
  signal ext_rstn     : std_ulogic;
193
  signal sys_rstn     : std_ulogic;
194
  signal wdt_rstn     : std_ulogic;
195
 
196
  -- clock generator --
197
  signal clk_div    : std_ulogic_vector(11 downto 0);
198
  signal clk_div_ff : std_ulogic_vector(11 downto 0);
199
  signal clk_gen    : std_ulogic_vector(07 downto 0);
200 50 zero_gravi
  signal clk_gen_en : std_ulogic_vector(07 downto 0);
201 47 zero_gravi
  --
202 50 zero_gravi
  signal wdt_cg_en   : std_ulogic;
203
  signal uart0_cg_en : std_ulogic;
204
  signal uart1_cg_en : std_ulogic;
205
  signal spi_cg_en   : std_ulogic;
206
  signal twi_cg_en   : std_ulogic;
207
  signal pwm_cg_en   : std_ulogic;
208
  signal cfs_cg_en   : std_ulogic;
209
  signal nco_cg_en   : std_ulogic;
210 2 zero_gravi
 
211 12 zero_gravi
  -- bus interface --
212
  type bus_interface_t is record
213 11 zero_gravi
    addr   : std_ulogic_vector(data_width_c-1 downto 0); -- bus access address
214
    rdata  : std_ulogic_vector(data_width_c-1 downto 0); -- bus read data
215
    wdata  : std_ulogic_vector(data_width_c-1 downto 0); -- bus write data
216
    ben    : std_ulogic_vector(03 downto 0); -- byte enable
217
    we     : std_ulogic; -- write enable
218
    re     : std_ulogic; -- read enable
219
    cancel : std_ulogic; -- cancel current transfer
220
    ack    : std_ulogic; -- bus transfer acknowledge
221
    err    : std_ulogic; -- bus transfer error
222 12 zero_gravi
    fence  : std_ulogic; -- fence(i) instruction executed
223 35 zero_gravi
    priv   : std_ulogic_vector(1 downto 0); -- current privilege level
224 40 zero_gravi
    src    : std_ulogic; -- access source (1=instruction fetch, 0=data access)
225 39 zero_gravi
    lock   : std_ulogic; -- locked/exclusive (=atomic) access
226 11 zero_gravi
  end record;
227 41 zero_gravi
  signal cpu_i, i_cache, cpu_d, p_bus : bus_interface_t;
228 2 zero_gravi
 
229
  -- io space access --
230
  signal io_acc  : std_ulogic;
231
  signal io_rden : std_ulogic;
232
  signal io_wren : std_ulogic;
233
 
234
  -- read-back busses -
235
  signal imem_rdata     : std_ulogic_vector(data_width_c-1 downto 0);
236
  signal imem_ack       : std_ulogic;
237
  signal dmem_rdata     : std_ulogic_vector(data_width_c-1 downto 0);
238
  signal dmem_ack       : std_ulogic;
239
  signal bootrom_rdata  : std_ulogic_vector(data_width_c-1 downto 0);
240
  signal bootrom_ack    : std_ulogic;
241
  signal wishbone_rdata : std_ulogic_vector(data_width_c-1 downto 0);
242
  signal wishbone_ack   : std_ulogic;
243
  signal wishbone_err   : std_ulogic;
244
  signal gpio_rdata     : std_ulogic_vector(data_width_c-1 downto 0);
245
  signal gpio_ack       : std_ulogic;
246
  signal mtime_rdata    : std_ulogic_vector(data_width_c-1 downto 0);
247
  signal mtime_ack      : std_ulogic;
248 50 zero_gravi
  signal uart0_rdata    : std_ulogic_vector(data_width_c-1 downto 0);
249
  signal uart0_ack      : std_ulogic;
250
  signal uart1_rdata    : std_ulogic_vector(data_width_c-1 downto 0);
251
  signal uart1_ack      : std_ulogic;
252 2 zero_gravi
  signal spi_rdata      : std_ulogic_vector(data_width_c-1 downto 0);
253
  signal spi_ack        : std_ulogic;
254
  signal twi_rdata      : std_ulogic_vector(data_width_c-1 downto 0);
255
  signal twi_ack        : std_ulogic;
256
  signal pwm_rdata      : std_ulogic_vector(data_width_c-1 downto 0);
257
  signal pwm_ack        : std_ulogic;
258
  signal wdt_rdata      : std_ulogic_vector(data_width_c-1 downto 0);
259
  signal wdt_ack        : std_ulogic;
260
  signal trng_rdata     : std_ulogic_vector(data_width_c-1 downto 0);
261
  signal trng_ack       : std_ulogic;
262 47 zero_gravi
  signal cfs_rdata      : std_ulogic_vector(data_width_c-1 downto 0);
263
  signal cfs_ack        : std_ulogic;
264 49 zero_gravi
  signal nco_rdata      : std_ulogic_vector(data_width_c-1 downto 0);
265
  signal nco_ack        : std_ulogic;
266 12 zero_gravi
  signal sysinfo_rdata  : std_ulogic_vector(data_width_c-1 downto 0);
267
  signal sysinfo_ack    : std_ulogic;
268 2 zero_gravi
 
269
  -- IRQs --
270 48 zero_gravi
  signal mtime_irq    : std_ulogic;
271 47 zero_gravi
  --
272 48 zero_gravi
  signal fast_irq     : std_ulogic_vector(15 downto 0);
273
  signal fast_irq_ack : std_ulogic_vector(15 downto 0);
274
  --
275 50 zero_gravi
  signal gpio_irq      : std_ulogic;
276
  signal wdt_irq       : std_ulogic;
277
  signal uart0_rxd_irq : std_ulogic;
278
  signal uart0_txd_irq : std_ulogic;
279
  signal uart1_rxd_irq : std_ulogic;
280
  signal uart1_txd_irq : std_ulogic;
281
  signal spi_irq       : std_ulogic;
282
  signal twi_irq       : std_ulogic;
283
  signal cfs_irq       : std_ulogic;
284
  signal cfs_irq_ack   : std_ulogic;
285 2 zero_gravi
 
286 11 zero_gravi
  -- misc --
287
  signal mtime_time : std_ulogic_vector(63 downto 0); -- current system time from MTIME
288 47 zero_gravi
  signal cpu_sleep  : std_ulogic; -- CPU is in sleep mode when set
289 11 zero_gravi
 
290 2 zero_gravi
begin
291
 
292
  -- Sanity Checks --------------------------------------------------------------------------
293
  -- -------------------------------------------------------------------------------------------
294 36 zero_gravi
  -- clock --
295
  assert not (CLOCK_FREQUENCY = 0) report "NEORV32 PROCESSOR CONFIG ERROR! Core clock frequency (CLOCK_FREQUENCY) not specified." severity error;
296 23 zero_gravi
  -- internal bootloader ROM --
297 44 zero_gravi
  assert not ((BOOTLOADER_EN = true) and (boot_rom_size_c > boot_rom_max_size_c)) report "NEORV32 PROCESSOR CONFIG ERROR! Boot ROM size out of range." severity error;
298
  assert not ((BOOTLOADER_EN = true) and (MEM_INT_IMEM_ROM = true)) report "NEORV32 PROCESSOR CONFIG WARNING! IMEM is configured as read-only. Bootloader will not be able to load new executables." severity warning;
299 23 zero_gravi
  -- memory system - data/instruction fetch --
300 44 zero_gravi
  assert not ((MEM_EXT_EN = false) and (MEM_INT_DMEM_EN = false)) report "NEORV32 PROCESSOR CONFIG ERROR! Core cannot fetch data without external memory interface and internal data memory." severity error;
301
  assert not ((MEM_EXT_EN = false) and (MEM_INT_IMEM_EN = false) and (BOOTLOADER_EN = false)) report "NEORV32 PROCESSOR CONFIG ERROR! Core cannot fetch instructions without external memory interface, internal data memory and bootloader." severity error;
302 36 zero_gravi
  -- memory system - size --
303 44 zero_gravi
  assert not ((MEM_INT_DMEM_EN = true) and (is_power_of_two_f(MEM_INT_IMEM_SIZE) = false)) report "NEORV32 PROCESSOR CONFIG WARNING! MEM_INT_IMEM_SIZE should be a power of 2 to allow optimal hardware mapping." severity warning;
304
  assert not ((MEM_INT_IMEM_EN = true) and (is_power_of_two_f(MEM_INT_DMEM_SIZE) = false)) report "NEORV32 PROCESSOR CONFIG WARNING! MEM_INT_DMEM_SIZE should be a power of 2 to allow optimal hardware mapping." severity warning;
305 29 zero_gravi
  -- memory system - alignment --
306
  assert not (ispace_base_c(1 downto 0) /= "00") report "NEORV32 PROCESSOR CONFIG ERROR! Instruction memory space base address must be 4-byte-aligned." severity error;
307
  assert not (dspace_base_c(1 downto 0) /= "00") report "NEORV32 PROCESSOR CONFIG ERROR! Data memory space base address must be 4-byte-aligned." severity error;
308 44 zero_gravi
  assert not ((ispace_base_c(index_size_f(MEM_INT_IMEM_SIZE)-1 downto 0) /= imem_align_check_c) and (MEM_INT_IMEM_EN = true)) report "NEORV32 PROCESSOR CONFIG ERROR! Instruction memory space base address has to be aligned to IMEM size." severity error;
309
  assert not ((dspace_base_c(index_size_f(MEM_INT_DMEM_SIZE)-1 downto 0) /= dmem_align_check_c) and (MEM_INT_DMEM_EN = true)) report "NEORV32 PROCESSOR CONFIG ERROR! Data memory space base address has to be aligned to DMEM size." severity error;
310 36 zero_gravi
  -- memory system - layout warning --
311 29 zero_gravi
  assert not (ispace_base_c /= x"00000000") report "NEORV32 PROCESSOR CONFIG WARNING! Non-default base address for instruction address space. Make sure this is sync with the software framework." severity warning;
312
  assert not (dspace_base_c /= x"80000000") report "NEORV32 PROCESSOR CONFIG WARNING! Non-default base address for data address space. Make sure this is sync with the software framework." severity warning;
313 41 zero_gravi
  -- memory system - the i-cache is intended to accelerate instruction fetch via the external memory interface only --
314 44 zero_gravi
  assert not ((ICACHE_EN = true) and (MEM_EXT_EN = false)) report "NEORV32 PROCESSOR CONFIG NOTE. Implementing i-cache without having the external memory interface implemented. The i-cache is intended to accelerate instruction fetch via the external memory interface." severity note;
315 41 zero_gravi
  -- memory system - cached instruction fetch latency check --
316 44 zero_gravi
  assert not (ICACHE_EN = true) report "NEORV32 PROCESSOR CONFIG WARNING! Implementing i-cache. Increasing bus access timeout from " & integer'image(bus_timeout_c) & " cycles to " & integer'image(bus_timeout_proc_c) & " cycles." severity warning;
317 2 zero_gravi
 
318
 
319
  -- Reset Generator ------------------------------------------------------------------------
320
  -- -------------------------------------------------------------------------------------------
321
  reset_generator_sync: process(clk_i)
322
  begin
323
    -- make sure the external reset is free of metastability and has a minimal duration of 1 clock cycle
324
    if rising_edge(clk_i) then
325
      rstn_i_sync0 <= rstn_i;
326
      rstn_i_sync1 <= rstn_i_sync0;
327
      rstn_i_sync2 <= rstn_i_sync1;
328
    end if;
329
  end process reset_generator_sync;
330
 
331
  -- keep internal reset active for at least 4 clock cycles
332
  reset_generator: process(rstn_i_sync1, rstn_i_sync2, clk_i)
333
  begin
334 23 zero_gravi
    if ((rstn_i_sync1 and rstn_i_sync2) = '0') then -- signal stable?
335 2 zero_gravi
      rstn_gen <= (others => '0');
336
    elsif rising_edge(clk_i) then
337
      rstn_gen <= rstn_gen(rstn_gen'left-1 downto 0) & '1';
338
    end if;
339
  end process reset_generator;
340
 
341
  ext_rstn <= rstn_gen(rstn_gen'left); -- the beautified external reset signal
342 23 zero_gravi
  sys_rstn <= ext_rstn and wdt_rstn;   -- system reset - can also be triggered by watchdog
343 2 zero_gravi
 
344
 
345
  -- Clock Generator ------------------------------------------------------------------------
346
  -- -------------------------------------------------------------------------------------------
347
  clock_generator: process(sys_rstn, clk_i)
348
  begin
349
    if (sys_rstn = '0') then
350
      clk_div    <= (others => '0');
351
      clk_div_ff <= (others => '0');
352 50 zero_gravi
      clk_gen_en <= (others => '0');
353 2 zero_gravi
    elsif rising_edge(clk_i) then
354 23 zero_gravi
      -- fresh clocks anyone? --
355 50 zero_gravi
      clk_gen_en(0) <= wdt_cg_en;
356
      clk_gen_en(1) <= uart0_cg_en;
357
      clk_gen_en(2) <= uart1_cg_en;
358
      clk_gen_en(3) <= spi_cg_en;
359
      clk_gen_en(4) <= twi_cg_en;
360
      clk_gen_en(5) <= pwm_cg_en;
361
      clk_gen_en(6) <= cfs_cg_en;
362
      clk_gen_en(7) <= nco_cg_en;
363
      if (or_all_f(clk_gen_en) = '1') then
364 23 zero_gravi
        clk_div <= std_ulogic_vector(unsigned(clk_div) + 1);
365 2 zero_gravi
      end if;
366 23 zero_gravi
      clk_div_ff <= clk_div;
367 2 zero_gravi
    end if;
368
  end process clock_generator;
369
 
370 23 zero_gravi
  -- clock enables: rising edge detectors --
371
  clock_generator_edge: process(clk_i)
372
  begin
373
    if rising_edge(clk_i) then
374
      clk_gen(clk_div2_c)    <= clk_div(0)  and (not clk_div_ff(0));  -- CLK/2
375
      clk_gen(clk_div4_c)    <= clk_div(1)  and (not clk_div_ff(1));  -- CLK/4
376
      clk_gen(clk_div8_c)    <= clk_div(2)  and (not clk_div_ff(2));  -- CLK/8
377
      clk_gen(clk_div64_c)   <= clk_div(5)  and (not clk_div_ff(5));  -- CLK/64
378
      clk_gen(clk_div128_c)  <= clk_div(6)  and (not clk_div_ff(6));  -- CLK/128
379
      clk_gen(clk_div1024_c) <= clk_div(9)  and (not clk_div_ff(9));  -- CLK/1024
380
      clk_gen(clk_div2048_c) <= clk_div(10) and (not clk_div_ff(10)); -- CLK/2048
381
      clk_gen(clk_div4096_c) <= clk_div(11) and (not clk_div_ff(11)); -- CLK/4096
382
    end if;
383
  end process clock_generator_edge;
384 2 zero_gravi
 
385
 
386 45 zero_gravi
  -- CPU Core -------------------------------------------------------------------------------
387 2 zero_gravi
  -- -------------------------------------------------------------------------------------------
388
  neorv32_cpu_inst: neorv32_cpu
389
  generic map (
390
    -- General --
391 41 zero_gravi
    HW_THREAD_ID                 => HW_THREAD_ID,        -- hardware thread id
392
    CPU_BOOT_ADDR                => cpu_boot_addr_c,     -- cpu boot address
393
    BUS_TIMEOUT                  => bus_timeout_proc_c,  -- cycles after an UNACKNOWLEDGED bus access triggers a bus fault exception
394 2 zero_gravi
    -- RISC-V CPU Extensions --
395 39 zero_gravi
    CPU_EXTENSION_RISCV_A        => CPU_EXTENSION_RISCV_A,        -- implement atomic extension?
396 44 zero_gravi
    CPU_EXTENSION_RISCV_B        => CPU_EXTENSION_RISCV_B,        -- implement bit manipulation extensions?
397 8 zero_gravi
    CPU_EXTENSION_RISCV_C        => CPU_EXTENSION_RISCV_C,        -- implement compressed extension?
398
    CPU_EXTENSION_RISCV_E        => CPU_EXTENSION_RISCV_E,        -- implement embedded RF extension?
399
    CPU_EXTENSION_RISCV_M        => CPU_EXTENSION_RISCV_M,        -- implement muld/div extension?
400 15 zero_gravi
    CPU_EXTENSION_RISCV_U        => CPU_EXTENSION_RISCV_U,        -- implement user mode extension?
401 8 zero_gravi
    CPU_EXTENSION_RISCV_Zicsr    => CPU_EXTENSION_RISCV_Zicsr,    -- implement CSR system?
402
    CPU_EXTENSION_RISCV_Zifencei => CPU_EXTENSION_RISCV_Zifencei, -- implement instruction stream sync.?
403 19 zero_gravi
    -- Extension Options --
404 41 zero_gravi
    FAST_MUL_EN                  => FAST_MUL_EN,         -- use DSPs for M extension's multiplier
405
    FAST_SHIFT_EN                => FAST_SHIFT_EN,       -- use barrel shifter for shift operations
406 15 zero_gravi
    -- Physical Memory Protection (PMP) --
407 42 zero_gravi
    PMP_NUM_REGIONS              => PMP_NUM_REGIONS,     -- number of regions (0..64)
408
    PMP_MIN_GRANULARITY          => PMP_MIN_GRANULARITY, -- minimal region granularity in bytes, has to be a power of 2, min 8 bytes
409
    -- Hardware Performance Monitors (HPM) --
410 47 zero_gravi
    HPM_NUM_CNTS                 => HPM_NUM_CNTS         -- number of implemented HPM counters (0..29)
411 2 zero_gravi
  )
412
  port map (
413
    -- global control --
414 12 zero_gravi
    clk_i          => clk_i,        -- global clock, rising edge
415
    rstn_i         => sys_rstn,     -- global reset, low-active, async
416 47 zero_gravi
    sleep_o        => cpu_sleep,    -- cpu is in sleep mode when set
417 12 zero_gravi
    -- instruction bus interface --
418
    i_bus_addr_o   => cpu_i.addr,   -- bus access address
419
    i_bus_rdata_i  => cpu_i.rdata,  -- bus read data
420
    i_bus_wdata_o  => cpu_i.wdata,  -- bus write data
421
    i_bus_ben_o    => cpu_i.ben,    -- byte enable
422
    i_bus_we_o     => cpu_i.we,     -- write enable
423
    i_bus_re_o     => cpu_i.re,     -- read enable
424
    i_bus_cancel_o => cpu_i.cancel, -- cancel current bus transaction
425
    i_bus_ack_i    => cpu_i.ack,    -- bus transfer acknowledge
426
    i_bus_err_i    => cpu_i.err,    -- bus transfer error
427
    i_bus_fence_o  => cpu_i.fence,  -- executed FENCEI operation
428 35 zero_gravi
    i_bus_priv_o   => cpu_i.priv,   -- privilege level
429 39 zero_gravi
    i_bus_lock_o   => cpu_i.lock,   -- locked/exclusive access
430 12 zero_gravi
    -- data bus interface --
431
    d_bus_addr_o   => cpu_d.addr,   -- bus access address
432
    d_bus_rdata_i  => cpu_d.rdata,  -- bus read data
433
    d_bus_wdata_o  => cpu_d.wdata,  -- bus write data
434
    d_bus_ben_o    => cpu_d.ben,    -- byte enable
435
    d_bus_we_o     => cpu_d.we,     -- write enable
436
    d_bus_re_o     => cpu_d.re,     -- read enable
437
    d_bus_cancel_o => cpu_d.cancel, -- cancel current bus transaction
438
    d_bus_ack_i    => cpu_d.ack,    -- bus transfer acknowledge
439
    d_bus_err_i    => cpu_d.err,    -- bus transfer error
440
    d_bus_fence_o  => cpu_d.fence,  -- executed FENCE operation
441 35 zero_gravi
    d_bus_priv_o   => cpu_d.priv,   -- privilege level
442 39 zero_gravi
    d_bus_lock_o   => cpu_d.lock,   -- locked/exclusive access
443 11 zero_gravi
    -- system time input from MTIME --
444 12 zero_gravi
    time_i         => mtime_time,   -- current system time
445 14 zero_gravi
    -- interrupts (risc-v compliant) --
446
    msw_irq_i      => msw_irq_i,    -- machine software interrupt
447
    mext_irq_i     => mext_irq_i,   -- machine external interrupt request
448
    mtime_irq_i    => mtime_irq,    -- machine timer interrupt
449
    -- fast interrupts (custom) --
450 47 zero_gravi
    firq_i         => fast_irq,     -- fast interrupt trigger
451
    firq_ack_o     => fast_irq_ack  -- fast interrupt acknowledge mask
452 2 zero_gravi
  );
453
 
454 36 zero_gravi
  -- misc --
455 40 zero_gravi
  cpu_i.src <= '1'; -- initialized but unused
456
  cpu_d.src <= '0'; -- initialized but unused
457 36 zero_gravi
 
458 14 zero_gravi
  -- advanced memory control --
459
  fence_o  <= cpu_d.fence; -- indicates an executed FENCE operation
460
  fencei_o <= cpu_i.fence; -- indicates an executed FENCEI operation
461 2 zero_gravi
 
462 47 zero_gravi
  -- fast interrupts - processor-internal --
463 50 zero_gravi
  fast_irq(00) <= wdt_irq;       -- HIGHEST PRIORITY - watchdog timeout
464
  fast_irq(01) <= cfs_irq;       -- custom functions subsystem
465
  fast_irq(02) <= uart0_rxd_irq; -- primary UART (UART0) data received
466
  fast_irq(03) <= uart0_txd_irq; -- primary UART (UART0) sending done
467
  fast_irq(04) <= uart1_rxd_irq; -- secondary UART (UART1) data received
468
  fast_irq(05) <= uart1_txd_irq; -- secondary UART (UART1) sending done
469
  fast_irq(06) <= spi_irq;       -- SPI transmission done
470
  fast_irq(07) <= twi_irq;       -- TWI transmission done
471
  fast_irq(08) <= gpio_irq;      -- GPIO pin-change
472
  fast_irq(09) <= '0';           -- reserved
473 14 zero_gravi
 
474 48 zero_gravi
  -- fast interrupts - platform level (for custom use) --
475 50 zero_gravi
  fast_irq(10) <= soc_firq_i(0);
476
  fast_irq(11) <= soc_firq_i(1);
477
  fast_irq(12) <= soc_firq_i(2);
478
  fast_irq(13) <= soc_firq_i(3);
479
  fast_irq(14) <= soc_firq_i(4);
480
  fast_irq(15) <= soc_firq_i(5);
481 14 zero_gravi
 
482 48 zero_gravi
  -- IRQ acknowledge --
483
  cfs_irq_ack <= fast_irq_ack(2);
484
 
485
 
486 41 zero_gravi
  -- CPU Instruction Cache ------------------------------------------------------------------
487
  -- -------------------------------------------------------------------------------------------
488
  neorv32_icache_inst_true:
489 44 zero_gravi
  if (ICACHE_EN = true) generate
490 45 zero_gravi
    neorv32_icache_inst: neorv32_icache
491 41 zero_gravi
    generic map (
492 47 zero_gravi
      ICACHE_NUM_BLOCKS => ICACHE_NUM_BLOCKS,   -- number of blocks (min 2), has to be a power of 2
493
      ICACHE_BLOCK_SIZE => ICACHE_BLOCK_SIZE,   -- block size in bytes (min 4), has to be a power of 2
494
      ICACHE_NUM_SETS   => ICACHE_ASSOCIATIVITY -- associativity / number of sets (1=direct_mapped), has to be a power of 2
495 41 zero_gravi
    )
496
    port map (
497
      -- global control --
498
      clk_i         => clk_i,          -- global clock, rising edge
499
      rstn_i        => sys_rstn,       -- global reset, low-active, async
500
      clear_i       => cpu_i.fence,    -- cache clear
501
      -- host controller interface --
502
      host_addr_i   => cpu_i.addr,     -- bus access address
503
      host_rdata_o  => cpu_i.rdata,    -- bus read data
504
      host_wdata_i  => cpu_i.wdata,    -- bus write data
505
      host_ben_i    => cpu_i.ben,      -- byte enable
506
      host_we_i     => cpu_i.we,       -- write enable
507
      host_re_i     => cpu_i.re,       -- read enable
508
      host_cancel_i => cpu_i.cancel,   -- cancel current bus transaction
509
      host_lock_i   => cpu_i.lock,     -- locked/exclusive access
510
      host_ack_o    => cpu_i.ack,      -- bus transfer acknowledge
511
      host_err_o    => cpu_i.err,      -- bus transfer error
512
      -- peripheral bus interface --
513
      bus_addr_o    => i_cache.addr,   -- bus access address
514
      bus_rdata_i   => i_cache.rdata,  -- bus read data
515
      bus_wdata_o   => i_cache.wdata,  -- bus write data
516
      bus_ben_o     => i_cache.ben,    -- byte enable
517
      bus_we_o      => i_cache.we,     -- write enable
518
      bus_re_o      => i_cache.re,     -- read enable
519
      bus_cancel_o  => i_cache.cancel, -- cancel current bus transaction
520
      bus_lock_o    => i_cache.lock,   -- locked/exclusive access
521
      bus_ack_i     => i_cache.ack,    -- bus transfer acknowledge
522
      bus_err_i     => i_cache.err     -- bus transfer error
523
    );
524
  end generate;
525
 
526
  neorv32_icache_inst_false:
527 44 zero_gravi
  if (ICACHE_EN = false) generate
528 41 zero_gravi
    i_cache.addr   <= cpu_i.addr;
529
    cpu_i.rdata    <= i_cache.rdata;
530
    i_cache.wdata  <= cpu_i.wdata;
531
    i_cache.ben    <= cpu_i.ben;
532
    i_cache.we     <= cpu_i.we;
533
    i_cache.re     <= cpu_i.re;
534
    i_cache.cancel <= cpu_i.cancel;
535
    i_cache.lock   <= cpu_i.lock;
536
    cpu_i.ack      <= i_cache.ack;
537
    cpu_i.err      <= i_cache.err;
538
  end generate;
539
 
540
 
541 45 zero_gravi
  -- CPU Bus Switch -------------------------------------------------------------------------
542 12 zero_gravi
  -- -------------------------------------------------------------------------------------------
543
  neorv32_busswitch_inst: neorv32_busswitch
544
  generic map (
545
    PORT_CA_READ_ONLY => false, -- set if controller port A is read-only
546
    PORT_CB_READ_ONLY => true   -- set if controller port B is read-only
547
  )
548
  port map (
549
    -- global control --
550 41 zero_gravi
    clk_i           => clk_i,          -- global clock, rising edge
551
    rstn_i          => sys_rstn,       -- global reset, low-active, async
552 12 zero_gravi
    -- controller interface a --
553 41 zero_gravi
    ca_bus_addr_i   => cpu_d.addr,     -- bus access address
554
    ca_bus_rdata_o  => cpu_d.rdata,    -- bus read data
555
    ca_bus_wdata_i  => cpu_d.wdata,    -- bus write data
556
    ca_bus_ben_i    => cpu_d.ben,      -- byte enable
557
    ca_bus_we_i     => cpu_d.we,       -- write enable
558
    ca_bus_re_i     => cpu_d.re,       -- read enable
559
    ca_bus_cancel_i => cpu_d.cancel,   -- cancel current bus transaction
560
    ca_bus_lock_i   => cpu_d.lock,     -- locked/exclusive access
561
    ca_bus_ack_o    => cpu_d.ack,      -- bus transfer acknowledge
562
    ca_bus_err_o    => cpu_d.err,      -- bus transfer error
563 12 zero_gravi
    -- controller interface b --
564 41 zero_gravi
    cb_bus_addr_i   => i_cache.addr,   -- bus access address
565
    cb_bus_rdata_o  => i_cache.rdata,  -- bus read data
566
    cb_bus_wdata_i  => i_cache.wdata,  -- bus write data
567
    cb_bus_ben_i    => i_cache.ben,    -- byte enable
568
    cb_bus_we_i     => i_cache.we,     -- write enable
569
    cb_bus_re_i     => i_cache.re,     -- read enable
570
    cb_bus_cancel_i => i_cache.cancel, -- cancel current bus transaction
571
    cb_bus_lock_i   => i_cache.lock,   -- locked/exclusive access
572
    cb_bus_ack_o    => i_cache.ack,    -- bus transfer acknowledge
573
    cb_bus_err_o    => i_cache.err,    -- bus transfer error
574 12 zero_gravi
    -- peripheral bus --
575 41 zero_gravi
    p_bus_src_o     => p_bus.src,      -- access source: 0 = A (data), 1 = B (instructions)
576
    p_bus_addr_o    => p_bus.addr,     -- bus access address
577
    p_bus_rdata_i   => p_bus.rdata,    -- bus read data
578
    p_bus_wdata_o   => p_bus.wdata,    -- bus write data
579
    p_bus_ben_o     => p_bus.ben,      -- byte enable
580
    p_bus_we_o      => p_bus.we,       -- write enable
581
    p_bus_re_o      => p_bus.re,       -- read enable
582
    p_bus_cancel_o  => p_bus.cancel,   -- cancel current bus transaction
583
    p_bus_lock_o    => p_bus.lock,     -- locked/exclusive access
584
    p_bus_ack_i     => p_bus.ack,      -- bus transfer acknowledge
585
    p_bus_err_i     => p_bus.err       -- bus transfer error
586 12 zero_gravi
  );
587 2 zero_gravi
 
588 49 zero_gravi
  -- processor bus: CPU transfer data input --
589 50 zero_gravi
  p_bus.rdata <= (imem_rdata or dmem_rdata or bootrom_rdata) or wishbone_rdata or (gpio_rdata or mtime_rdata or uart0_rdata or uart1_rdata or
590 49 zero_gravi
                 spi_rdata or twi_rdata or pwm_rdata or wdt_rdata or trng_rdata or cfs_rdata or nco_rdata or sysinfo_rdata);
591 2 zero_gravi
 
592 49 zero_gravi
  -- processor bus: CPU transfer ACK input --
593 50 zero_gravi
  p_bus.ack <= (imem_ack or dmem_ack or bootrom_ack) or wishbone_ack or (gpio_ack or mtime_ack or uart0_ack or uart1_ack or
594 49 zero_gravi
               spi_ack or twi_ack or pwm_ack or wdt_ack or trng_ack or cfs_ack or nco_ack or sysinfo_ack);
595 12 zero_gravi
 
596 49 zero_gravi
  -- processor bus: CPU transfer data bus error input --
597 50 zero_gravi
  p_bus.err <= wishbone_err;
598 12 zero_gravi
 
599 36 zero_gravi
  -- current CPU privilege level --
600
  p_bus.priv <= cpu_i.priv; -- cpu_i.priv == cpu_d.priv
601 12 zero_gravi
 
602 36 zero_gravi
 
603 2 zero_gravi
  -- Processor-Internal Instruction Memory (IMEM) -------------------------------------------
604
  -- -------------------------------------------------------------------------------------------
605
  neorv32_int_imem_inst_true:
606 44 zero_gravi
  if (MEM_INT_IMEM_EN = true) generate
607 2 zero_gravi
    neorv32_int_imem_inst: neorv32_imem
608
    generic map (
609 23 zero_gravi
      IMEM_BASE      => imem_base_c,       -- memory base address
610 2 zero_gravi
      IMEM_SIZE      => MEM_INT_IMEM_SIZE, -- processor-internal instruction memory size in bytes
611
      IMEM_AS_ROM    => MEM_INT_IMEM_ROM,  -- implement IMEM as read-only memory?
612 45 zero_gravi
      BOOTLOADER_EN  => BOOTLOADER_EN      -- implement and use bootloader?
613 2 zero_gravi
    )
614
    port map (
615 12 zero_gravi
      clk_i  => clk_i,       -- global clock line
616
      rden_i => p_bus.re,    -- read enable
617
      wren_i => p_bus.we,    -- write enable
618
      ben_i  => p_bus.ben,   -- byte write enable
619
      addr_i => p_bus.addr,  -- address
620
      data_i => p_bus.wdata, -- data in
621
      data_o => imem_rdata,  -- data out
622
      ack_o  => imem_ack     -- transfer acknowledge
623 2 zero_gravi
    );
624
  end generate;
625
 
626
  neorv32_int_imem_inst_false:
627 44 zero_gravi
  if (MEM_INT_IMEM_EN = false) generate
628 2 zero_gravi
    imem_rdata <= (others => '0');
629
    imem_ack   <= '0';
630
  end generate;
631
 
632
 
633
  -- Processor-Internal Data Memory (DMEM) --------------------------------------------------
634
  -- -------------------------------------------------------------------------------------------
635
  neorv32_int_dmem_inst_true:
636 44 zero_gravi
  if (MEM_INT_DMEM_EN = true) generate
637 2 zero_gravi
    neorv32_int_dmem_inst: neorv32_dmem
638
    generic map (
639 23 zero_gravi
      DMEM_BASE => dmem_base_c,      -- memory base address
640 2 zero_gravi
      DMEM_SIZE => MEM_INT_DMEM_SIZE -- processor-internal data memory size in bytes
641
    )
642
    port map (
643 12 zero_gravi
      clk_i  => clk_i,       -- global clock line
644
      rden_i => p_bus.re,    -- read enable
645
      wren_i => p_bus.we,    -- write enable
646
      ben_i  => p_bus.ben,   -- byte write enable
647
      addr_i => p_bus.addr,  -- address
648
      data_i => p_bus.wdata, -- data in
649
      data_o => dmem_rdata,  -- data out
650
      ack_o  => dmem_ack     -- transfer acknowledge
651 2 zero_gravi
    );
652
  end generate;
653
 
654
  neorv32_int_dmem_inst_false:
655 44 zero_gravi
  if (MEM_INT_DMEM_EN = false) generate
656 2 zero_gravi
    dmem_rdata <= (others => '0');
657
    dmem_ack   <= '0';
658
  end generate;
659
 
660
 
661
  -- Processor-Internal Bootloader ROM (BOOTROM) --------------------------------------------
662
  -- -------------------------------------------------------------------------------------------
663
  neorv32_boot_rom_inst_true:
664 44 zero_gravi
  if (BOOTLOADER_EN = true) generate
665 2 zero_gravi
    neorv32_boot_rom_inst: neorv32_boot_rom
666 23 zero_gravi
    generic map (
667
      BOOTROM_BASE => boot_rom_base_c, -- boot ROM base address
668
      BOOTROM_SIZE => boot_rom_size_c  -- processor-internal boot TOM memory size in bytes
669
    )
670 2 zero_gravi
    port map (
671
      clk_i  => clk_i,         -- global clock line
672 12 zero_gravi
      rden_i => p_bus.re,      -- read enable
673
      addr_i => p_bus.addr,    -- address
674 2 zero_gravi
      data_o => bootrom_rdata, -- data out
675
      ack_o  => bootrom_ack    -- transfer acknowledge
676
    );
677
  end generate;
678
 
679
  neorv32_boot_rom_inst_false:
680 44 zero_gravi
  if (BOOTLOADER_EN = false) generate
681 2 zero_gravi
    bootrom_rdata <= (others => '0');
682
    bootrom_ack   <= '0';
683
  end generate;
684
 
685
 
686
  -- External Wishbone Gateway (WISHBONE) ---------------------------------------------------
687
  -- -------------------------------------------------------------------------------------------
688
  neorv32_wishbone_inst_true:
689 44 zero_gravi
  if (MEM_EXT_EN = true) generate
690 2 zero_gravi
    neorv32_wishbone_inst: neorv32_wishbone
691
    generic map (
692 45 zero_gravi
      WB_PIPELINED_MODE => wb_pipe_mode_c,    -- false: classic/standard wishbone mode, true: pipelined wishbone mode
693 23 zero_gravi
      -- Internal instruction memory --
694 45 zero_gravi
      MEM_INT_IMEM_EN   => MEM_INT_IMEM_EN,   -- implement processor-internal instruction memory
695
      MEM_INT_IMEM_SIZE => MEM_INT_IMEM_SIZE, -- size of processor-internal instruction memory in bytes
696 23 zero_gravi
      -- Internal data memory --
697 45 zero_gravi
      MEM_INT_DMEM_EN   => MEM_INT_DMEM_EN,   -- implement processor-internal data memory
698
      MEM_INT_DMEM_SIZE => MEM_INT_DMEM_SIZE  -- size of processor-internal data memory in bytes
699 2 zero_gravi
    )
700
    port map (
701
      -- global control --
702 39 zero_gravi
      clk_i     => clk_i,          -- global clock line
703
      rstn_i    => sys_rstn,       -- global reset line, low-active
704 2 zero_gravi
      -- host access --
705 39 zero_gravi
      src_i     => p_bus.src,      -- access type (0: data, 1:instruction)
706
      addr_i    => p_bus.addr,     -- address
707
      rden_i    => p_bus.re,       -- read enable
708
      wren_i    => p_bus.we,       -- write enable
709
      ben_i     => p_bus.ben,      -- byte write enable
710
      data_i    => p_bus.wdata,    -- data in
711
      data_o    => wishbone_rdata, -- data out
712
      cancel_i  => p_bus.cancel,   -- cancel current transaction
713
      lock_i    => p_bus.lock,     -- locked/exclusive bus access
714
      ack_o     => wishbone_ack,   -- transfer acknowledge
715
      err_o     => wishbone_err,   -- transfer error
716
      priv_i    => p_bus.priv,     -- current CPU privilege level
717 2 zero_gravi
      -- wishbone interface --
718 39 zero_gravi
      wb_tag_o  => wb_tag_o,       -- tag
719
      wb_adr_o  => wb_adr_o,       -- address
720
      wb_dat_i  => wb_dat_i,       -- read data
721
      wb_dat_o  => wb_dat_o,       -- write data
722
      wb_we_o   => wb_we_o,        -- read/write
723
      wb_sel_o  => wb_sel_o,       -- byte enable
724
      wb_stb_o  => wb_stb_o,       -- strobe
725
      wb_cyc_o  => wb_cyc_o,       -- valid cycle
726
      wb_lock_o => wb_lock_o,      -- locked/exclusive bus access
727
      wb_ack_i  => wb_ack_i,       -- transfer acknowledge
728
      wb_err_i  => wb_err_i        -- transfer error
729 2 zero_gravi
    );
730
  end generate;
731
 
732
  neorv32_wishbone_inst_false:
733 44 zero_gravi
  if (MEM_EXT_EN = false) generate
734 2 zero_gravi
    wishbone_rdata <= (others => '0');
735
    wishbone_ack   <= '0';
736
    wishbone_err   <= '0';
737
    --
738 39 zero_gravi
    wb_adr_o  <= (others => '0');
739
    wb_dat_o  <= (others => '0');
740
    wb_we_o   <= '0';
741
    wb_sel_o  <= (others => '0');
742
    wb_stb_o  <= '0';
743
    wb_cyc_o  <= '0';
744
    wb_lock_o <= '0';
745
    wb_tag_o  <= (others => '0');
746 2 zero_gravi
  end generate;
747
 
748
 
749
  -- IO Access? -----------------------------------------------------------------------------
750
  -- -------------------------------------------------------------------------------------------
751 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';
752 40 zero_gravi
  io_rden <= io_acc and p_bus.re and (not p_bus.src); -- PMA: no_execute for IO region
753 47 zero_gravi
  -- the default NEORV32 peripheral/IO devices in the IO area can only be written in word mode (reduces HW complexity)
754
  io_wren <= io_acc and p_bus.we and and_all_f(p_bus.ben) and (not p_bus.src); -- PMA: write32 only, no_execute for IO region
755 2 zero_gravi
 
756
 
757 47 zero_gravi
  -- Custom Functions Subsystem (CFS) -------------------------------------------------------
758
  -- -------------------------------------------------------------------------------------------
759
  neorv32_cfs_inst_true:
760
  if (IO_CFS_EN = true) generate
761
    neorv32_cfs_inst: neorv32_cfs
762
    generic map (
763
      CFS_CONFIG => IO_CFS_CONFIG     -- custom CFS configuration generic
764
    )
765
    port map (
766
      -- host access --
767
      clk_i       => clk_i,           -- global clock line
768
      rstn_i      => sys_rstn,        -- global reset line, low-active, use as async
769
      addr_i      => p_bus.addr,      -- address
770
      rden_i      => io_rden,         -- read enable
771
      wren_i      => io_wren,         -- byte write enable
772
      data_i      => p_bus.wdata,     -- data in
773
      data_o      => cfs_rdata,       -- data out
774
      ack_o       => cfs_ack,         -- transfer acknowledge
775
      -- clock generator --
776
      clkgen_en_o => cfs_cg_en,       -- enable clock generator
777
      clkgen_i    => clk_gen,         -- "clock" inputs
778
      -- CPU state --
779
      sleep_i     => cpu_sleep,       -- set if cpu is in sleep mode
780
      -- interrupt --
781
      irq_o       => cfs_irq,         -- interrupt request
782 48 zero_gravi
      irq_ack_i   => cfs_irq_ack,     -- interrupt acknowledge
783 47 zero_gravi
      -- custom io (conduit) --
784
      cfs_in_i    => cfs_in_i,        -- custom inputs
785
      cfs_out_o   => cfs_out_o        -- custom outputs
786
    );
787
  end generate;
788
 
789
  neorv32_cfs_inst_false:
790
  if (IO_CFS_EN = false) generate
791
    cfs_rdata <= (others => '0');
792
    cfs_ack   <= '0';
793
    cfs_cg_en <= '0';
794
    cfs_irq   <= '0';
795
    cfs_out_o <= (others => '0');
796
  end generate;
797
 
798
 
799 2 zero_gravi
  -- General Purpose Input/Output Port (GPIO) -----------------------------------------------
800
  -- -------------------------------------------------------------------------------------------
801
  neorv32_gpio_inst_true:
802 44 zero_gravi
  if (IO_GPIO_EN = true) generate
803 2 zero_gravi
    neorv32_gpio_inst: neorv32_gpio
804
    port map (
805
      -- host access --
806 12 zero_gravi
      clk_i  => clk_i,       -- global clock line
807
      addr_i => p_bus.addr,  -- address
808
      rden_i => io_rden,     -- read enable
809
      wren_i => io_wren,     -- write enable
810
      data_i => p_bus.wdata, -- data in
811
      data_o => gpio_rdata,  -- data out
812
      ack_o  => gpio_ack,    -- transfer acknowledge
813 2 zero_gravi
      -- parallel io --
814
      gpio_o => gpio_o,
815
      gpio_i => gpio_i,
816
      -- interrupt --
817 12 zero_gravi
      irq_o  => gpio_irq     -- pin-change interrupt
818 2 zero_gravi
    );
819
  end generate;
820
 
821
  neorv32_gpio_inst_false:
822 44 zero_gravi
  if (IO_GPIO_EN = false) generate
823 2 zero_gravi
    gpio_rdata <= (others => '0');
824
    gpio_ack   <= '0';
825
    gpio_o     <= (others => '0');
826
    gpio_irq   <= '0';
827
  end generate;
828
 
829
 
830
  -- Watch Dog Timer (WDT) ------------------------------------------------------------------
831
  -- -------------------------------------------------------------------------------------------
832
  neorv32_wdt_inst_true:
833 44 zero_gravi
  if (IO_WDT_EN = true) generate
834 2 zero_gravi
    neorv32_wdt_inst: neorv32_wdt
835
    port map (
836
      -- host access --
837 12 zero_gravi
      clk_i       => clk_i,       -- global clock line
838
      rstn_i      => ext_rstn,    -- global reset line, low-active
839
      rden_i      => io_rden,     -- read enable
840
      wren_i      => io_wren,     -- write enable
841
      addr_i      => p_bus.addr,  -- address
842
      data_i      => p_bus.wdata, -- data in
843
      data_o      => wdt_rdata,   -- data out
844
      ack_o       => wdt_ack,     -- transfer acknowledge
845 2 zero_gravi
      -- clock generator --
846 12 zero_gravi
      clkgen_en_o => wdt_cg_en,   -- enable clock generator
847 2 zero_gravi
      clkgen_i    => clk_gen,
848
      -- timeout event --
849 12 zero_gravi
      irq_o       => wdt_irq,     -- timeout IRQ
850
      rstn_o      => wdt_rstn     -- timeout reset, low_active, use it as async!
851 2 zero_gravi
    );
852
  end generate;
853
 
854
  neorv32_wdt_inst_false:
855 44 zero_gravi
  if (IO_WDT_EN = false) generate
856 2 zero_gravi
    wdt_rdata <= (others => '0');
857
    wdt_ack   <= '0';
858
    wdt_irq   <= '0';
859
    wdt_rstn  <= '1';
860
    wdt_cg_en <= '0';
861
  end generate;
862
 
863
 
864
  -- Machine System Timer (MTIME) -----------------------------------------------------------
865
  -- -------------------------------------------------------------------------------------------
866
  neorv32_mtime_inst_true:
867 44 zero_gravi
  if (IO_MTIME_EN = true) generate
868 2 zero_gravi
    neorv32_mtime_inst: neorv32_mtime
869
    port map (
870
      -- host access --
871 12 zero_gravi
      clk_i     => clk_i,       -- global clock line
872
      rstn_i    => sys_rstn,    -- global reset, low-active, async
873
      addr_i    => p_bus.addr,  -- address
874
      rden_i    => io_rden,     -- read enable
875
      wren_i    => io_wren,     -- write enable
876
      data_i    => p_bus.wdata, -- data in
877
      data_o    => mtime_rdata, -- data out
878
      ack_o     => mtime_ack,   -- transfer acknowledge
879 11 zero_gravi
      -- time output for CPU --
880 12 zero_gravi
      time_o    => mtime_time,  -- current system time
881 2 zero_gravi
      -- interrupt --
882 12 zero_gravi
      irq_o     => mtime_irq    -- interrupt request
883 2 zero_gravi
    );
884
  end generate;
885
 
886
  neorv32_mtime_inst_false:
887 44 zero_gravi
  if (IO_MTIME_EN = false) generate
888 2 zero_gravi
    mtime_rdata <= (others => '0');
889 40 zero_gravi
    mtime_time  <= mtime_i; -- use external machine timer time signal
890 2 zero_gravi
    mtime_ack   <= '0';
891 34 zero_gravi
    mtime_irq   <= mtime_irq_i; -- use external machine timer interrupt
892 2 zero_gravi
  end generate;
893
 
894
 
895 50 zero_gravi
  -- Universal Asynchronous Receiver/Transmitter 0, Primary UART (UART0) --------------------
896 2 zero_gravi
  -- -------------------------------------------------------------------------------------------
897 50 zero_gravi
  neorv32_uart0_inst_true:
898
  if (IO_UART0_EN = true) generate
899
    neorv32_uart0_inst: neorv32_uart
900
    generic map (
901
      UART_PRIMARY => true -- true = primary UART (UART0), false = secondary UART (UART1)
902
    )
903 2 zero_gravi
    port map (
904
      -- host access --
905 48 zero_gravi
      clk_i       => clk_i,        -- global clock line
906
      addr_i      => p_bus.addr,   -- address
907
      rden_i      => io_rden,      -- read enable
908
      wren_i      => io_wren,      -- write enable
909
      data_i      => p_bus.wdata,  -- data in
910 50 zero_gravi
      data_o      => uart0_rdata,  -- data out
911
      ack_o       => uart0_ack,    -- transfer acknowledge
912 2 zero_gravi
      -- clock generator --
913 50 zero_gravi
      clkgen_en_o => uart0_cg_en,  -- enable clock generator
914 2 zero_gravi
      clkgen_i    => clk_gen,
915
      -- com lines --
916 50 zero_gravi
      uart_txd_o  => uart0_txd_o,
917
      uart_rxd_i  => uart0_rxd_i,
918 2 zero_gravi
      -- interrupts --
919 50 zero_gravi
      irq_rxd_o   => uart0_rxd_irq, -- uart data received interrupt
920
      irq_txd_o   => uart0_txd_irq  -- uart transmission done interrupt
921 2 zero_gravi
    );
922
  end generate;
923
 
924 50 zero_gravi
  neorv32_uart0_inst_false:
925
  if (IO_UART0_EN = false) generate
926
    uart0_rdata   <= (others => '0');
927
    uart0_ack     <= '0';
928
    uart0_txd_o   <= '0';
929
    uart0_cg_en   <= '0';
930
    uart0_rxd_irq <= '0';
931
    uart0_txd_irq <= '0';
932 2 zero_gravi
  end generate;
933
 
934
 
935 50 zero_gravi
  -- Universal Asynchronous Receiver/Transmitter 1, Secondary UART (UART1) ------------------
936
  -- -------------------------------------------------------------------------------------------
937
  neorv32_uart1_inst_true:
938
  if (IO_UART1_EN = true) generate
939
    neorv32_uart1_inst: neorv32_uart
940
    generic map (
941
      UART_PRIMARY => false -- true = primary UART (UART0), false = secondary UART (UART1)
942
    )
943
    port map (
944
      -- host access --
945
      clk_i       => clk_i,        -- global clock line
946
      addr_i      => p_bus.addr,   -- address
947
      rden_i      => io_rden,      -- read enable
948
      wren_i      => io_wren,      -- write enable
949
      data_i      => p_bus.wdata,  -- data in
950
      data_o      => uart1_rdata,  -- data out
951
      ack_o       => uart1_ack,    -- transfer acknowledge
952
      -- clock generator --
953
      clkgen_en_o => uart1_cg_en,  -- enable clock generator
954
      clkgen_i    => clk_gen,
955
      -- com lines --
956
      uart_txd_o  => uart1_txd_o,
957
      uart_rxd_i  => uart1_rxd_i,
958
      -- interrupts --
959
      irq_rxd_o   => uart1_rxd_irq, -- uart data received interrupt
960
      irq_txd_o   => uart1_txd_irq  -- uart transmission done interrupt
961
    );
962
  end generate;
963
 
964
  neorv32_uart1_inst_false:
965
  if (IO_UART1_EN = false) generate
966
    uart1_rdata   <= (others => '0');
967
    uart1_ack     <= '0';
968
    uart1_txd_o   <= '0';
969
    uart1_cg_en   <= '0';
970
    uart1_rxd_irq <= '0';
971
    uart1_txd_irq <= '0';
972
  end generate;
973
 
974
 
975 2 zero_gravi
  -- Serial Peripheral Interface (SPI) ------------------------------------------------------
976
  -- -------------------------------------------------------------------------------------------
977
  neorv32_spi_inst_true:
978 44 zero_gravi
  if (IO_SPI_EN = true) generate
979 2 zero_gravi
    neorv32_spi_inst: neorv32_spi
980
    port map (
981
      -- host access --
982 12 zero_gravi
      clk_i       => clk_i,       -- global clock line
983
      addr_i      => p_bus.addr,  -- address
984
      rden_i      => io_rden,     -- read enable
985
      wren_i      => io_wren,     -- write enable
986
      data_i      => p_bus.wdata, -- data in
987
      data_o      => spi_rdata,   -- data out
988
      ack_o       => spi_ack,     -- transfer acknowledge
989 2 zero_gravi
      -- clock generator --
990 12 zero_gravi
      clkgen_en_o => spi_cg_en,   -- enable clock generator
991 2 zero_gravi
      clkgen_i    => clk_gen,
992
      -- com lines --
993 12 zero_gravi
      spi_sck_o   => spi_sck_o,   -- SPI serial clock
994
      spi_sdo_o   => spi_sdo_o,   -- controller data out, peripheral data in
995
      spi_sdi_i   => spi_sdi_i,   -- controller data in, peripheral data out
996
      spi_csn_o   => spi_csn_o,   -- SPI CS
997 2 zero_gravi
      -- interrupt --
998 48 zero_gravi
      irq_o       => spi_irq      -- transmission done interrupt
999 2 zero_gravi
    );
1000
  end generate;
1001
 
1002
  neorv32_spi_inst_false:
1003 44 zero_gravi
  if (IO_SPI_EN = false) generate
1004 2 zero_gravi
    spi_rdata  <= (others => '0');
1005
    spi_ack    <= '0';
1006 6 zero_gravi
    spi_sck_o  <= '0';
1007
    spi_sdo_o  <= '0';
1008 2 zero_gravi
    spi_csn_o  <= (others => '1'); -- CSn lines are low-active
1009
    spi_cg_en  <= '0';
1010
    spi_irq    <= '0';
1011
  end generate;
1012
 
1013
 
1014
  -- Two-Wire Interface (TWI) ---------------------------------------------------------------
1015
  -- -------------------------------------------------------------------------------------------
1016
  neorv32_twi_inst_true:
1017 44 zero_gravi
  if (IO_TWI_EN = true) generate
1018 2 zero_gravi
    neorv32_twi_inst: neorv32_twi
1019
    port map (
1020
      -- host access --
1021 12 zero_gravi
      clk_i       => clk_i,       -- global clock line
1022
      addr_i      => p_bus.addr,  -- address
1023
      rden_i      => io_rden,     -- read enable
1024
      wren_i      => io_wren,     -- write enable
1025
      data_i      => p_bus.wdata, -- data in
1026
      data_o      => twi_rdata,   -- data out
1027
      ack_o       => twi_ack,     -- transfer acknowledge
1028 2 zero_gravi
      -- clock generator --
1029 12 zero_gravi
      clkgen_en_o => twi_cg_en,   -- enable clock generator
1030 2 zero_gravi
      clkgen_i    => clk_gen,
1031
      -- com lines --
1032 12 zero_gravi
      twi_sda_io  => twi_sda_io,  -- serial data line
1033
      twi_scl_io  => twi_scl_io,  -- serial clock line
1034 2 zero_gravi
      -- interrupt --
1035 48 zero_gravi
      irq_o       => twi_irq      -- transfer done IRQ
1036 2 zero_gravi
    );
1037
  end generate;
1038
 
1039
  neorv32_twi_inst_false:
1040 44 zero_gravi
  if (IO_TWI_EN = false) generate
1041 2 zero_gravi
    twi_rdata  <= (others => '0');
1042
    twi_ack    <= '0';
1043 35 zero_gravi
--  twi_sda_io <= 'Z';
1044
--  twi_scl_io <= 'Z';
1045 2 zero_gravi
    twi_cg_en  <= '0';
1046
    twi_irq    <= '0';
1047
  end generate;
1048
 
1049
 
1050
  -- Pulse-Width Modulation Controller (PWM) ------------------------------------------------
1051
  -- -------------------------------------------------------------------------------------------
1052
  neorv32_pwm_inst_true:
1053 44 zero_gravi
  if (IO_PWM_EN = true) generate
1054 2 zero_gravi
    neorv32_pwm_inst: neorv32_pwm
1055
    port map (
1056
      -- host access --
1057 12 zero_gravi
      clk_i       => clk_i,       -- global clock line
1058
      addr_i      => p_bus.addr,  -- address
1059
      rden_i      => io_rden,     -- read enable
1060
      wren_i      => io_wren,     -- write enable
1061
      data_i      => p_bus.wdata, -- data in
1062
      data_o      => pwm_rdata,   -- data out
1063
      ack_o       => pwm_ack,     -- transfer acknowledge
1064 2 zero_gravi
      -- clock generator --
1065 12 zero_gravi
      clkgen_en_o => pwm_cg_en,   -- enable clock generator
1066 2 zero_gravi
      clkgen_i    => clk_gen,
1067
      -- pwm output channels --
1068
      pwm_o       => pwm_o
1069
    );
1070
  end generate;
1071
 
1072
  neorv32_pwm_inst_false:
1073 44 zero_gravi
  if (IO_PWM_EN = false) generate
1074 2 zero_gravi
    pwm_rdata <= (others => '0');
1075
    pwm_ack   <= '0';
1076
    pwm_cg_en <= '0';
1077
    pwm_o     <= (others => '0');
1078
  end generate;
1079
 
1080
 
1081 49 zero_gravi
  -- Numerically-Controlled Oscillator (NCO) ------------------------------------------------
1082
  -- -------------------------------------------------------------------------------------------
1083
  neorv32_nco_inst_true:
1084
  if (IO_NCO_EN = true) generate
1085
    neorv32_nco_inst: neorv32_nco
1086
    port map (
1087
      -- host access --
1088
      clk_i       => clk_i,       -- global clock line
1089
      addr_i      => p_bus.addr,  -- address
1090
      rden_i      => io_rden,     -- read enable
1091
      wren_i      => io_wren,     -- write enable
1092
      data_i      => p_bus.wdata, -- data in
1093
      data_o      => nco_rdata,   -- data out
1094
      ack_o       => nco_ack,     -- transfer acknowledge
1095
      -- clock generator --
1096
      clkgen_en_o => nco_cg_en,   -- enable clock generator
1097
      clkgen_i    => clk_gen,
1098
      -- NCO output --
1099
      nco_o       => nco_o
1100
    );
1101
  end generate;
1102
 
1103
  neorv32_nco_inst_false:
1104
  if (IO_NCO_EN = false) generate
1105
    nco_rdata <= (others => '0');
1106
    nco_ack   <= '0';
1107
    nco_cg_en <= '0';
1108
    nco_o     <= (others => '0');
1109
  end generate;
1110
 
1111
 
1112 2 zero_gravi
  -- True Random Number Generator (TRNG) ----------------------------------------------------
1113
  -- -------------------------------------------------------------------------------------------
1114
  neorv32_trng_inst_true:
1115 44 zero_gravi
  if (IO_TRNG_EN = true) generate
1116 2 zero_gravi
    neorv32_trng_inst: neorv32_trng
1117
    port map (
1118
      -- host access --
1119 12 zero_gravi
      clk_i  => clk_i,       -- global clock line
1120
      addr_i => p_bus.addr,  -- address
1121
      rden_i => io_rden,     -- read enable
1122
      wren_i => io_wren,     -- write enable
1123
      data_i => p_bus.wdata, -- data in
1124
      data_o => trng_rdata,  -- data out
1125
      ack_o  => trng_ack     -- transfer acknowledge
1126 2 zero_gravi
    );
1127
  end generate;
1128
 
1129
  neorv32_trng_inst_false:
1130 44 zero_gravi
  if (IO_TRNG_EN = false) generate
1131 2 zero_gravi
    trng_rdata <= (others => '0');
1132
    trng_ack   <= '0';
1133
  end generate;
1134
 
1135
 
1136 12 zero_gravi
  -- System Configuration Information Memory (SYSINFO) --------------------------------------
1137
  -- -------------------------------------------------------------------------------------------
1138
  neorv32_sysinfo_inst: neorv32_sysinfo
1139
  generic map (
1140
    -- General --
1141 45 zero_gravi
    CLOCK_FREQUENCY      => CLOCK_FREQUENCY,      -- clock frequency of clk_i in Hz
1142
    BOOTLOADER_EN        => BOOTLOADER_EN,        -- implement processor-internal bootloader?
1143
    USER_CODE            => USER_CODE,            -- custom user code
1144 23 zero_gravi
    -- internal Instruction memory --
1145 45 zero_gravi
    MEM_INT_IMEM_EN      => MEM_INT_IMEM_EN,      -- implement processor-internal instruction memory
1146
    MEM_INT_IMEM_SIZE    => MEM_INT_IMEM_SIZE,    -- size of processor-internal instruction memory in bytes
1147
    MEM_INT_IMEM_ROM     => MEM_INT_IMEM_ROM,     -- implement processor-internal instruction memory as ROM
1148 23 zero_gravi
    -- Internal Data memory --
1149 45 zero_gravi
    MEM_INT_DMEM_EN      => MEM_INT_DMEM_EN,      -- implement processor-internal data memory
1150
    MEM_INT_DMEM_SIZE    => MEM_INT_DMEM_SIZE,    -- size of processor-internal data memory in bytes
1151 41 zero_gravi
    -- Internal Cache memory --
1152 45 zero_gravi
    ICACHE_EN            => ICACHE_EN,            -- implement instruction cache
1153
    ICACHE_NUM_BLOCKS    => ICACHE_NUM_BLOCKS,    -- i-cache: number of blocks (min 2), has to be a power of 2
1154
    ICACHE_BLOCK_SIZE    => ICACHE_BLOCK_SIZE,    -- i-cache: block size in bytes (min 4), has to be a power of 2
1155
    ICACHE_ASSOCIATIVITY => ICACHE_ASSOCIATIVITY, -- i-cache: associativity (min 1), has to be a power 2
1156 23 zero_gravi
    -- External memory interface --
1157 45 zero_gravi
    MEM_EXT_EN           => MEM_EXT_EN,           -- implement external memory bus interface?
1158 12 zero_gravi
    -- Processor peripherals --
1159 45 zero_gravi
    IO_GPIO_EN           => IO_GPIO_EN,           -- implement general purpose input/output port unit (GPIO)?
1160
    IO_MTIME_EN          => IO_MTIME_EN,          -- implement machine system timer (MTIME)?
1161 50 zero_gravi
    IO_UART0_EN          => IO_UART0_EN,          -- implement primary universal asynchronous receiver/transmitter (UART0)?
1162
    IO_UART1_EN          => IO_UART1_EN,          -- implement secondary universal asynchronous receiver/transmitter (UART1)?
1163 45 zero_gravi
    IO_SPI_EN            => IO_SPI_EN,            -- implement serial peripheral interface (SPI)?
1164
    IO_TWI_EN            => IO_TWI_EN,            -- implement two-wire interface (TWI)?
1165
    IO_PWM_EN            => IO_PWM_EN,            -- implement pulse-width modulation unit (PWM)?
1166
    IO_WDT_EN            => IO_WDT_EN,            -- implement watch dog timer (WDT)?
1167
    IO_TRNG_EN           => IO_TRNG_EN,           -- implement true random number generator (TRNG)?
1168 49 zero_gravi
    IO_CFS_EN            => IO_CFS_EN,            -- implement custom functions subsystem (CFS)?
1169
    IO_NCO_EN            => IO_NCO_EN             -- implement numerically-controlled oscillator (NCO)?
1170 12 zero_gravi
  )
1171
  port map (
1172
    -- host access --
1173
    clk_i  => clk_i,         -- global clock line
1174
    addr_i => p_bus.addr,    -- address
1175
    rden_i => io_rden,       -- read enable
1176
    data_o => sysinfo_rdata, -- data out
1177
    ack_o  => sysinfo_ack    -- transfer acknowledge
1178
  );
1179
 
1180
 
1181 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.