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

Subversion Repositories neorv32

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

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