Line 134... |
Line 134... |
cfs_in_i : in std_ulogic_vector(31 downto 0) := (others => '0'); -- custom CFS inputs conduit
|
cfs_in_i : in std_ulogic_vector(31 downto 0) := (others => '0'); -- custom CFS inputs conduit
|
cfs_out_o : out std_ulogic_vector(31 downto 0); -- custom CFS outputs conduit
|
cfs_out_o : out std_ulogic_vector(31 downto 0); -- custom CFS outputs conduit
|
-- system time input from external MTIME (available if IO_MTIME_EN = false) --
|
-- system time input from external MTIME (available if IO_MTIME_EN = false) --
|
mtime_i : in std_ulogic_vector(63 downto 0) := (others => '0'); -- current system time
|
mtime_i : in std_ulogic_vector(63 downto 0) := (others => '0'); -- current system time
|
-- Interrupts --
|
-- Interrupts --
|
soc_firq_i : in std_ulogic_vector(3 downto 0) := (others => '0'); -- fast interrupt channels
|
soc_firq_i : in std_ulogic_vector(7 downto 0) := (others => '0'); -- fast interrupt channels
|
mtime_irq_i : in std_ulogic := '0'; -- machine timer interrupt, available if IO_MTIME_EN = false
|
mtime_irq_i : in std_ulogic := '0'; -- machine timer interrupt, available if IO_MTIME_EN = false
|
msw_irq_i : in std_ulogic := '0'; -- machine software interrupt
|
msw_irq_i : in std_ulogic := '0'; -- machine software interrupt
|
mext_irq_i : in std_ulogic := '0' -- machine external interrupt
|
mext_irq_i : in std_ulogic := '0' -- machine external interrupt
|
);
|
);
|
end neorv32_top;
|
end neorv32_top;
|
Line 233... |
Line 233... |
signal sysinfo_ack : std_ulogic;
|
signal sysinfo_ack : std_ulogic;
|
|
|
-- IRQs --
|
-- IRQs --
|
signal mtime_irq : std_ulogic;
|
signal mtime_irq : std_ulogic;
|
--
|
--
|
signal fast_irq : std_ulogic_vector(7 downto 0);
|
signal fast_irq : std_ulogic_vector(15 downto 0);
|
signal fast_irq_ack : std_ulogic_vector(7 downto 0);
|
signal fast_irq_ack : std_ulogic_vector(15 downto 0);
|
|
--
|
signal gpio_irq : std_ulogic;
|
signal gpio_irq : std_ulogic;
|
signal wdt_irq : std_ulogic;
|
signal wdt_irq : std_ulogic;
|
signal uart_irq : std_ulogic;
|
signal uart_rxd_irq : std_ulogic;
|
|
signal uart_txd_irq : std_ulogic;
|
signal spi_irq : std_ulogic;
|
signal spi_irq : std_ulogic;
|
signal twi_irq : std_ulogic;
|
signal twi_irq : std_ulogic;
|
signal cfs_irq : std_ulogic;
|
signal cfs_irq : std_ulogic;
|
|
signal cfs_irq_ack : std_ulogic;
|
|
|
-- misc --
|
-- misc --
|
signal mtime_time : std_ulogic_vector(63 downto 0); -- current system time from MTIME
|
signal mtime_time : std_ulogic_vector(63 downto 0); -- current system time from MTIME
|
signal cpu_sleep : std_ulogic; -- CPU is in sleep mode when set
|
signal cpu_sleep : std_ulogic; -- CPU is in sleep mode when set
|
|
|
Line 410... |
Line 413... |
-- advanced memory control --
|
-- advanced memory control --
|
fence_o <= cpu_d.fence; -- indicates an executed FENCE operation
|
fence_o <= cpu_d.fence; -- indicates an executed FENCE operation
|
fencei_o <= cpu_i.fence; -- indicates an executed FENCEI operation
|
fencei_o <= cpu_i.fence; -- indicates an executed FENCEI operation
|
|
|
-- fast interrupts - processor-internal --
|
-- fast interrupts - processor-internal --
|
fast_irq(0) <= wdt_irq; -- highest priority, watchdog timeout interrupt
|
fast_irq(00) <= wdt_irq; -- HIGHEST PRIORITY - watchdog timeout
|
fast_irq(1) <= gpio_irq or cfs_irq; -- GPIO input pin-change interrupt or custom CFS interrupt
|
fast_irq(01) <= '0'; -- reserved
|
fast_irq(2) <= uart_irq; -- UART TX done or RX complete interrupt
|
fast_irq(02) <= cfs_irq; -- custom functions subsystem
|
fast_irq(3) <= spi_irq or twi_irq; -- lowest priority, can be triggered by SPI or TWI
|
fast_irq(03) <= uart_rxd_irq; -- UART data received
|
-- fast interrupts - platform level (for cutsom use) --
|
fast_irq(04) <= uart_txd_irq; -- UART transmission done
|
fast_irq(4) <= soc_firq_i(0);
|
fast_irq(05) <= spi_irq; -- SPI transmission done
|
fast_irq(5) <= soc_firq_i(1);
|
fast_irq(06) <= twi_irq; -- TWI transmission done
|
fast_irq(6) <= soc_firq_i(2);
|
fast_irq(07) <= gpio_irq; -- GPIO pin-change
|
fast_irq(7) <= soc_firq_i(3);
|
|
|
-- fast interrupts - platform level (for custom use) --
|
|
fast_irq(08) <= soc_firq_i(0);
|
|
fast_irq(09) <= soc_firq_i(1);
|
|
fast_irq(10) <= soc_firq_i(2);
|
|
fast_irq(11) <= soc_firq_i(3);
|
|
fast_irq(12) <= soc_firq_i(4);
|
|
fast_irq(13) <= soc_firq_i(5);
|
|
fast_irq(14) <= soc_firq_i(6);
|
|
fast_irq(15) <= soc_firq_i(7);
|
|
|
|
-- IRQ acknowledge --
|
|
cfs_irq_ack <= fast_irq_ack(2);
|
|
|
|
|
-- CPU Instruction Cache ------------------------------------------------------------------
|
-- CPU Instruction Cache ------------------------------------------------------------------
|
-- -------------------------------------------------------------------------------------------
|
-- -------------------------------------------------------------------------------------------
|
neorv32_icache_inst_true:
|
neorv32_icache_inst_true:
|
Line 718... |
Line 733... |
clkgen_i => clk_gen, -- "clock" inputs
|
clkgen_i => clk_gen, -- "clock" inputs
|
-- CPU state --
|
-- CPU state --
|
sleep_i => cpu_sleep, -- set if cpu is in sleep mode
|
sleep_i => cpu_sleep, -- set if cpu is in sleep mode
|
-- interrupt --
|
-- interrupt --
|
irq_o => cfs_irq, -- interrupt request
|
irq_o => cfs_irq, -- interrupt request
|
irq_ack_i => fast_irq_ack(1), -- interrupt acknowledge
|
irq_ack_i => cfs_irq_ack, -- interrupt acknowledge
|
-- custom io (conduit) --
|
-- custom io (conduit) --
|
cfs_in_i => cfs_in_i, -- custom inputs
|
cfs_in_i => cfs_in_i, -- custom inputs
|
cfs_out_o => cfs_out_o -- custom outputs
|
cfs_out_o => cfs_out_o -- custom outputs
|
);
|
);
|
end generate;
|
end generate;
|
Line 853... |
Line 868... |
clkgen_i => clk_gen,
|
clkgen_i => clk_gen,
|
-- com lines --
|
-- com lines --
|
uart_txd_o => uart_txd_o,
|
uart_txd_o => uart_txd_o,
|
uart_rxd_i => uart_rxd_i,
|
uart_rxd_i => uart_rxd_i,
|
-- interrupts --
|
-- interrupts --
|
uart_irq_o => uart_irq -- uart rx/tx interrupt
|
irq_rxd_o => uart_rxd_irq, -- uart data received interrupt
|
|
irq_txd_o => uart_txd_irq -- uart transmission done interrupt
|
);
|
);
|
end generate;
|
end generate;
|
|
|
neorv32_uart_inst_false:
|
neorv32_uart_inst_false:
|
if (IO_UART_EN = false) generate
|
if (IO_UART_EN = false) generate
|
uart_rdata <= (others => '0');
|
uart_rdata <= (others => '0');
|
uart_ack <= '0';
|
uart_ack <= '0';
|
uart_txd_o <= '0';
|
uart_txd_o <= '0';
|
uart_cg_en <= '0';
|
uart_cg_en <= '0';
|
uart_irq <= '0';
|
uart_rxd_irq <= '0';
|
|
uart_txd_irq <= '0';
|
end generate;
|
end generate;
|
|
|
|
|
-- Serial Peripheral Interface (SPI) ------------------------------------------------------
|
-- Serial Peripheral Interface (SPI) ------------------------------------------------------
|
-- -------------------------------------------------------------------------------------------
|
-- -------------------------------------------------------------------------------------------
|
Line 890... |
Line 907... |
spi_sck_o => spi_sck_o, -- SPI serial clock
|
spi_sck_o => spi_sck_o, -- SPI serial clock
|
spi_sdo_o => spi_sdo_o, -- controller data out, peripheral data in
|
spi_sdo_o => spi_sdo_o, -- controller data out, peripheral data in
|
spi_sdi_i => spi_sdi_i, -- controller data in, peripheral data out
|
spi_sdi_i => spi_sdi_i, -- controller data in, peripheral data out
|
spi_csn_o => spi_csn_o, -- SPI CS
|
spi_csn_o => spi_csn_o, -- SPI CS
|
-- interrupt --
|
-- interrupt --
|
spi_irq_o => spi_irq -- transmission done interrupt
|
irq_o => spi_irq -- transmission done interrupt
|
);
|
);
|
end generate;
|
end generate;
|
|
|
neorv32_spi_inst_false:
|
neorv32_spi_inst_false:
|
if (IO_SPI_EN = false) generate
|
if (IO_SPI_EN = false) generate
|
Line 927... |
Line 944... |
clkgen_i => clk_gen,
|
clkgen_i => clk_gen,
|
-- com lines --
|
-- com lines --
|
twi_sda_io => twi_sda_io, -- serial data line
|
twi_sda_io => twi_sda_io, -- serial data line
|
twi_scl_io => twi_scl_io, -- serial clock line
|
twi_scl_io => twi_scl_io, -- serial clock line
|
-- interrupt --
|
-- interrupt --
|
twi_irq_o => twi_irq -- transfer done IRQ
|
irq_o => twi_irq -- transfer done IRQ
|
);
|
);
|
end generate;
|
end generate;
|
|
|
neorv32_twi_inst_false:
|
neorv32_twi_inst_false:
|
if (IO_TWI_EN = false) generate
|
if (IO_TWI_EN = false) generate
|