Line 4... |
Line 4... |
-- # (c) "AXI", "AXI4" and "AXI4-Lite" are trademarks of Arm Holdings plc. #
|
-- # (c) "AXI", "AXI4" and "AXI4-Lite" are trademarks of Arm Holdings plc. #
|
-- # Note: External MTIME is not supported. #
|
-- # Note: External MTIME is not supported. #
|
-- # ********************************************************************************************* #
|
-- # ********************************************************************************************* #
|
-- # BSD 3-Clause License #
|
-- # BSD 3-Clause License #
|
-- # #
|
-- # #
|
-- # Copyright (c) 2021, Stephan Nolting. All rights reserved. #
|
-- # Copyright (c) 2022, Stephan Nolting. All rights reserved. #
|
-- # #
|
-- # #
|
-- # Redistribution and use in source and binary forms, with or without modification, are #
|
-- # Redistribution and use in source and binary forms, with or without modification, are #
|
-- # permitted provided that the following conditions are met: #
|
-- # permitted provided that the following conditions are met: #
|
-- # #
|
-- # #
|
-- # 1. Redistributions of source code must retain the above copyright notice, this list of #
|
-- # 1. Redistributions of source code must retain the above copyright notice, this list of #
|
Line 108... |
Line 108... |
IO_CFS_CONFIG : std_logic_vector(31 downto 0) := x"00000000"; -- custom CFS configuration generic
|
IO_CFS_CONFIG : std_logic_vector(31 downto 0) := x"00000000"; -- custom CFS configuration generic
|
IO_CFS_IN_SIZE : positive := 32; -- size of CFS input conduit in bits
|
IO_CFS_IN_SIZE : positive := 32; -- size of CFS input conduit in bits
|
IO_CFS_OUT_SIZE : positive := 32; -- size of CFS output conduit in bits
|
IO_CFS_OUT_SIZE : positive := 32; -- size of CFS output conduit in bits
|
IO_NEOLED_EN : boolean := true; -- implement NeoPixel-compatible smart LED interface (NEOLED)?
|
IO_NEOLED_EN : boolean := true; -- implement NeoPixel-compatible smart LED interface (NEOLED)?
|
IO_NEOLED_TX_FIFO : natural := 1; -- NEOLED TX FIFO depth, 1..32k, has to be a power of two
|
IO_NEOLED_TX_FIFO : natural := 1; -- NEOLED TX FIFO depth, 1..32k, has to be a power of two
|
IO_GPTMR_EN : boolean := false -- implement general purpose timer (GPTMR)?
|
IO_GPTMR_EN : boolean := false; -- implement general purpose timer (GPTMR)?
|
|
IO_XIP_EN : boolean := false -- implement execute in place module (XIP)?
|
);
|
);
|
port (
|
port (
|
-- ------------------------------------------------------------
|
-- ------------------------------------------------------------
|
-- AXI4-Lite-Compatible Master Interface --
|
-- AXI4-Lite-Compatible Master Interface --
|
-- ------------------------------------------------------------
|
-- ------------------------------------------------------------
|
Line 152... |
Line 153... |
jtag_tdo_o : out std_logic; -- serial data output
|
jtag_tdo_o : out std_logic; -- serial data output
|
jtag_tms_i : in std_logic := '0'; -- mode select
|
jtag_tms_i : in std_logic := '0'; -- mode select
|
-- ------------------------------------------------------------
|
-- ------------------------------------------------------------
|
-- Processor IO --
|
-- Processor IO --
|
-- ------------------------------------------------------------
|
-- ------------------------------------------------------------
|
|
-- XIP (execute in place via SPI) signals (available if IO_XIP_EN = true) --
|
|
xip_csn_o : out std_logic; -- chip-select, low-active
|
|
xip_clk_o : out std_logic; -- serial clock
|
|
xip_sdi_i : in std_logic := 'L'; -- device data input
|
|
xip_sdo_o : out std_logic; -- controller data output
|
-- GPIO (available if IO_GPIO_EN = true) --
|
-- GPIO (available if IO_GPIO_EN = true) --
|
gpio_o : out std_logic_vector(63 downto 0); -- parallel output
|
gpio_o : out std_logic_vector(63 downto 0); -- parallel output
|
gpio_i : in std_logic_vector(63 downto 0) := (others => '0'); -- parallel input
|
gpio_i : in std_logic_vector(63 downto 0) := (others => '0'); -- parallel input
|
-- primary UART0 (available if IO_UART0_EN = true) --
|
-- primary UART0 (available if IO_UART0_EN = true) --
|
uart0_txd_o : out std_logic; -- UART0 send data
|
uart0_txd_o : out std_logic; -- UART0 send data
|
Line 174... |
Line 180... |
spi_csn_o : out std_logic_vector(07 downto 0); -- SPI CS
|
spi_csn_o : out std_logic_vector(07 downto 0); -- SPI CS
|
-- TWI (available if IO_TWI_EN = true) --
|
-- TWI (available if IO_TWI_EN = true) --
|
twi_sda_io : inout std_logic; -- twi serial data line
|
twi_sda_io : inout std_logic; -- twi serial data line
|
twi_scl_io : inout std_logic; -- twi serial clock line
|
twi_scl_io : inout std_logic; -- twi serial clock line
|
-- PWM (available if IO_PWM_NUM_CH > 0) --
|
-- PWM (available if IO_PWM_NUM_CH > 0) --
|
pwm_o : out std_logic_vector(IO_PWM_NUM_CH-1 downto 0); -- pwm channels
|
pwm_o : out std_logic_vector(59 downto 0); -- pwm channels
|
-- Custom Functions Subsystem IO (available if IO_CFS_EN = true) --
|
-- Custom Functions Subsystem IO (available if IO_CFS_EN = true) --
|
cfs_in_i : in std_logic_vector(IO_CFS_IN_SIZE-1 downto 0); -- custom inputs
|
cfs_in_i : in std_logic_vector(IO_CFS_IN_SIZE-1 downto 0); -- custom inputs
|
cfs_out_o : out std_logic_vector(IO_CFS_OUT_SIZE-1 downto 0); -- custom outputs
|
cfs_out_o : out std_logic_vector(IO_CFS_OUT_SIZE-1 downto 0); -- custom outputs
|
-- NeoPixel-compatible smart LED interface (available if IO_NEOLED_EN = true) --
|
-- NeoPixel-compatible smart LED interface (available if IO_NEOLED_EN = true) --
|
neoled_o : out std_logic; -- async serial data line
|
neoled_o : out std_logic; -- async serial data line
|
-- External platform interrupts (available if XIRQ_NUM_CH > 0) --
|
-- External platform interrupts (available if XIRQ_NUM_CH > 0) --
|
xirq_i : in std_logic_vector(XIRQ_NUM_CH-1 downto 0) := (others => '0'); -- IRQ channels
|
xirq_i : in std_logic_vector(31 downto 0) := (others => '0'); -- IRQ channels
|
-- CPU Interrupts --
|
-- CPU Interrupts --
|
msw_irq_i : in std_logic := '0'; -- machine software interrupt
|
msw_irq_i : in std_logic := '0'; -- machine software interrupt
|
mext_irq_i : in std_logic := '0' -- machine external interrupt
|
mext_irq_i : in std_logic := '0' -- machine external interrupt
|
);
|
);
|
end entity;
|
end entity;
|
Line 204... |
Line 210... |
signal jtag_tck_i_int :std_ulogic;
|
signal jtag_tck_i_int :std_ulogic;
|
signal jtag_tdi_i_int :std_ulogic;
|
signal jtag_tdi_i_int :std_ulogic;
|
signal jtag_tdo_o_int :std_ulogic;
|
signal jtag_tdo_o_int :std_ulogic;
|
signal jtag_tms_i_int :std_ulogic;
|
signal jtag_tms_i_int :std_ulogic;
|
--
|
--
|
|
signal xip_csn_o_int : std_ulogic;
|
|
signal xip_clk_o_int : std_ulogic;
|
|
signal xip_sdi_i_int : std_ulogic;
|
|
signal xip_sdo_o_int : std_ulogic;
|
|
--
|
signal gpio_o_int : std_ulogic_vector(63 downto 0);
|
signal gpio_o_int : std_ulogic_vector(63 downto 0);
|
signal gpio_i_int : std_ulogic_vector(63 downto 0);
|
signal gpio_i_int : std_ulogic_vector(63 downto 0);
|
--
|
--
|
signal uart0_txd_o_int : std_ulogic;
|
signal uart0_txd_o_int : std_ulogic;
|
signal uart0_rxd_i_int : std_ulogic;
|
signal uart0_rxd_i_int : std_ulogic;
|
Line 222... |
Line 233... |
signal spi_sck_o_int : std_ulogic;
|
signal spi_sck_o_int : std_ulogic;
|
signal spi_sdo_o_int : std_ulogic;
|
signal spi_sdo_o_int : std_ulogic;
|
signal spi_sdi_i_int : std_ulogic;
|
signal spi_sdi_i_int : std_ulogic;
|
signal spi_csn_o_int : std_ulogic_vector(07 downto 0);
|
signal spi_csn_o_int : std_ulogic_vector(07 downto 0);
|
--
|
--
|
signal pwm_o_int : std_ulogic_vector(IO_PWM_NUM_CH-1 downto 0);
|
signal pwm_o_int : std_ulogic_vector(59 downto 0);
|
--
|
--
|
signal cfs_in_i_int : std_ulogic_vector(IO_CFS_IN_SIZE-1 downto 0);
|
signal cfs_in_i_int : std_ulogic_vector(IO_CFS_IN_SIZE-1 downto 0);
|
signal cfs_out_o_int : std_ulogic_vector(IO_CFS_OUT_SIZE-1 downto 0);
|
signal cfs_out_o_int : std_ulogic_vector(IO_CFS_OUT_SIZE-1 downto 0);
|
--
|
--
|
signal neoled_o_int : std_ulogic;
|
signal neoled_o_int : std_ulogic;
|
--
|
--
|
signal xirq_i_int : std_ulogic_vector(XIRQ_NUM_CH-1 downto 0);
|
signal xirq_i_int : std_ulogic_vector(31 downto 0);
|
--
|
--
|
signal msw_irq_i_int : std_ulogic;
|
signal msw_irq_i_int : std_ulogic;
|
signal mext_irq_i_int : std_ulogic;
|
signal mext_irq_i_int : std_ulogic;
|
|
|
-- internal wishbone bus --
|
-- internal wishbone bus --
|
Line 341... |
Line 352... |
IO_CFS_CONFIG => IO_CFS_CONFIG_INT, -- custom CFS configuration generic
|
IO_CFS_CONFIG => IO_CFS_CONFIG_INT, -- custom CFS configuration generic
|
IO_CFS_IN_SIZE => IO_CFS_IN_SIZE, -- size of CFS input conduit in bits
|
IO_CFS_IN_SIZE => IO_CFS_IN_SIZE, -- size of CFS input conduit in bits
|
IO_CFS_OUT_SIZE => IO_CFS_OUT_SIZE, -- size of CFS output conduit in bits
|
IO_CFS_OUT_SIZE => IO_CFS_OUT_SIZE, -- size of CFS output conduit in bits
|
IO_NEOLED_EN => IO_NEOLED_EN, -- implement NeoPixel-compatible smart LED interface (NEOLED)?
|
IO_NEOLED_EN => IO_NEOLED_EN, -- implement NeoPixel-compatible smart LED interface (NEOLED)?
|
IO_NEOLED_TX_FIFO => IO_NEOLED_TX_FIFO, -- NEOLED TX FIFO depth, 1..32k, has to be a power of two
|
IO_NEOLED_TX_FIFO => IO_NEOLED_TX_FIFO, -- NEOLED TX FIFO depth, 1..32k, has to be a power of two
|
IO_GPTMR_EN => IO_GPTMR_EN -- implement general purpose timer (GPTMR)?
|
IO_GPTMR_EN => IO_GPTMR_EN, -- implement general purpose timer (GPTMR)?
|
|
IO_XIP_EN => IO_XIP_EN -- implement execute in place module (XIP)?
|
)
|
)
|
port map (
|
port map (
|
-- Global control --
|
-- Global control --
|
clk_i => clk_i_int, -- global clock, rising edge
|
clk_i => clk_i_int, -- global clock, rising edge
|
rstn_i => rstn_i_int, -- global reset, low-active, async
|
rstn_i => rstn_i_int, -- global reset, low-active, async
|
Line 368... |
Line 380... |
wb_ack_i => wb_core.ack, -- transfer acknowledge
|
wb_ack_i => wb_core.ack, -- transfer acknowledge
|
wb_err_i => wb_core.err, -- transfer error
|
wb_err_i => wb_core.err, -- transfer error
|
-- Advanced memory control signals (available if MEM_EXT_EN = true) --
|
-- Advanced memory control signals (available if MEM_EXT_EN = true) --
|
fence_o => open, -- indicates an executed FENCE operation
|
fence_o => open, -- indicates an executed FENCE operation
|
fencei_o => open, -- indicates an executed FENCEI operation
|
fencei_o => open, -- indicates an executed FENCEI operation
|
|
-- XIP (execute in place via SPI) signals (available if IO_XIP_EN = true) --
|
|
xip_csn_o => xip_csn_o_int, -- chip-select, low-active
|
|
xip_clk_o => xip_clk_o_int, -- serial clock
|
|
xip_sdi_i => xip_sdi_i_int, -- device data input
|
|
xip_sdo_o => xip_sdo_o_int, -- controller data output
|
-- GPIO (available if IO_GPIO_EN = true) --
|
-- GPIO (available if IO_GPIO_EN = true) --
|
gpio_o => gpio_o_int, -- parallel output
|
gpio_o => gpio_o_int, -- parallel output
|
gpio_i => gpio_i_int, -- parallel input
|
gpio_i => gpio_i_int, -- parallel input
|
-- primary UART0 (available if IO_UART0_EN = true) --
|
-- primary UART0 (available if IO_UART0_EN = true) --
|
uart0_txd_o => uart0_txd_o_int, -- UART0 send data
|
uart0_txd_o => uart0_txd_o_int, -- UART0 send data
|
Line 408... |
Line 425... |
msw_irq_i => msw_irq_i_int, -- machine software interrupt
|
msw_irq_i => msw_irq_i_int, -- machine software interrupt
|
mext_irq_i => mext_irq_i_int -- machine external interrupt
|
mext_irq_i => mext_irq_i_int -- machine external interrupt
|
);
|
);
|
|
|
-- type conversion --
|
-- type conversion --
|
|
xip_csn_o <= std_logic(xip_csn_o_int);
|
|
xip_clk_o <= std_logic(xip_clk_o_int);
|
|
xip_sdi_i_int <= std_ulogic(xip_sdi_i);
|
|
xip_sdo_o <= std_logic(xip_sdo_o_int);
|
|
|
gpio_o <= std_logic_vector(gpio_o_int);
|
gpio_o <= std_logic_vector(gpio_o_int);
|
gpio_i_int <= std_ulogic_vector(gpio_i);
|
gpio_i_int <= std_ulogic_vector(gpio_i);
|
|
|
jtag_trst_i_int <= std_ulogic(jtag_trst_i);
|
jtag_trst_i_int <= std_ulogic(jtag_trst_i);
|
jtag_tck_i_int <= std_ulogic(jtag_tck_i);
|
jtag_tck_i_int <= std_ulogic(jtag_tck_i);
|