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

Subversion Repositories neorv32

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

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

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