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

Subversion Repositories neorv32

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

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

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