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

Subversion Repositories neorv32

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

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