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

Subversion Repositories neorv32

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

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