| @ -0,0 +1,169 @@ | |||
| -- ################################################################################################# | |||
| -- # << NEORV32 - Example setup including the bootloader, for the Gatemate (c) Eval Board >> # | |||
| -- # ********************************************************************************************* # | |||
| -- # BSD 3-Clause License # | |||
| -- # # | |||
| -- # Copyright (c) 2022, Torsten Meissner. All rights reserved. # | |||
| -- # # | |||
| -- # Redistribution and use in source and binary forms, with or without modification, are # | |||
| -- # permitted provided that the following conditions are met: # | |||
| -- # # | |||
| -- # 1. Redistributions of source code must retain the above copyright notice, this list of # | |||
| -- # conditions and the following disclaimer. # | |||
| -- # # | |||
| -- # 2. Redistributions in binary form must reproduce the above copyright notice, this list of # | |||
| -- # conditions and the following disclaimer in the documentation and/or other materials # | |||
| -- # provided with the distribution. # | |||
| -- # # | |||
| -- # 3. Neither the name of the copyright holder nor the names of its contributors may be used to # | |||
| -- # endorse or promote products derived from this software without specific prior written # | |||
| -- # permission. # | |||
| -- # # | |||
| -- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS # | |||
| -- # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # | |||
| -- # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # | |||
| -- # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # | |||
| -- # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # | |||
| -- # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED # | |||
| -- # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # | |||
| -- # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED # | |||
| -- # OF THE POSSIBILITY OF SUCH DAMAGE. # | |||
| -- # ********************************************************************************************* # | |||
| -- # The NEORV32 Processor - https://github.com/stnolting/neorv32 (c) Stephan Nolting # | |||
| -- ################################################################################################# | |||
| library ieee; | |||
| use ieee.std_logic_1164.all; | |||
| use ieee.numeric_std.all; | |||
| library neorv32; | |||
| use neorv32.neorv32_package.all; | |||
| library gatemate; | |||
| use gatemate.components.all; | |||
| entity neorv32_aes is | |||
| port ( | |||
| -- Clock and Reset inputs | |||
| clk_i : in std_logic; -- 10 MHz clock | |||
| rst_n_i : in std_logic; -- SW3 button | |||
| -- LED outputs | |||
| led_n_o : out std_logic_vector(7 downto 0); | |||
| -- UART0 | |||
| -- uart_rx_i : in std_logic; -- PMODA IO | |||
| -- uart_tx_o : out std_logic -- PMODA IO | |||
| debug_o : out std_logic_vector(15 downto 0) | |||
| ); | |||
| end entity; | |||
| architecture rtl of neorv32_aes is | |||
| -- configuration -- | |||
| constant f_clock_c : natural := 10_000_000; -- clock frequency in Hz | |||
| -- Globals | |||
| signal s_pll_lock : std_logic; | |||
| signal s_pll_clk : std_logic; | |||
| signal s_cfg_end : std_logic; | |||
| signal s_rst_n : std_logic; | |||
| signal s_rst_debounced : std_logic; | |||
| signal s_con_gpio : std_ulogic_vector(63 downto 0); | |||
| signal s_debug : std_logic_vector(63 downto 0); | |||
| begin | |||
| PLL : CC_PLL | |||
| generic map ( | |||
| REF_CLK => "10", | |||
| OUT_CLK => "10", | |||
| PERF_MD => "SPEED" | |||
| ) | |||
| port map ( | |||
| CLK_REF => clk_i, | |||
| USR_CLK_REF => '0', | |||
| CLK_FEEDBACK => '0', | |||
| USR_LOCKED_STDY_RST => '0', | |||
| USR_PLL_LOCKED_STDY => open, | |||
| USR_PLL_LOCKED => s_pll_lock, | |||
| CLK0 => s_pll_clk, | |||
| CLK90 => open, | |||
| CLK180 => open, | |||
| CLK270 => open, | |||
| CLK_REF_OUT => open | |||
| ); | |||
| cfg_end : CC_CFG_END | |||
| port map ( | |||
| CFG_END => s_cfg_end | |||
| ); | |||
| rst_debounce : block is | |||
| signal s_rst_d : std_logic_vector(29 downto 0); | |||
| begin | |||
| process (s_pll_clk, rst_n_i) is | |||
| begin | |||
| if (not rst_n_i) then | |||
| s_rst_d <= (others => '0'); | |||
| elsif (rising_edge(s_pll_clk)) then | |||
| s_rst_d <= s_rst_d(s_rst_d'left-1 downto 0) & rst_n_i; | |||
| end if; | |||
| end process; | |||
| s_rst_debounced <= and s_rst_d; | |||
| end block rst_debounce; | |||
| s_rst_n <= s_pll_lock and s_cfg_end and s_rst_debounced; | |||
| -- The core of the problem ---------------------------------------------------------------- | |||
| -- ------------------------------------------------------------------------------------------- | |||
| neorv32_inst: entity neorv32.neorv32_top | |||
| generic map ( | |||
| CLOCK_FREQUENCY => f_clock_c, -- clock frequency of s_pll_clk in Hz | |||
| INT_BOOTLOADER_EN => false, -- boot configuration: true = boot explicit bootloader; false = boot from int/ext (I)MEM | |||
| -- RISC-V CPU Extensions -- | |||
| CPU_EXTENSION_RISCV_C => false, -- implement compressed extension? | |||
| CPU_EXTENSION_RISCV_M => true, -- implement mul/div extension? | |||
| CPU_EXTENSION_RISCV_Zicsr => true, -- implement CSR system? | |||
| CPU_EXTENSION_RISCV_Zicntr => true, -- implement base counters? | |||
| -- Tuning Options -- | |||
| FAST_MUL_EN => false, | |||
| FAST_SHIFT_EN => false, | |||
| -- Internal Instruction memory -- | |||
| MEM_INT_IMEM_EN => true, -- implement processor-internal instruction memory | |||
| MEM_INT_IMEM_SIZE => 4*1024, --16*1024, -- size of processor-internal instruction memory in bytes | |||
| -- Internal Data memory -- | |||
| MEM_INT_DMEM_EN => true, -- implement processor-internal data memory | |||
| MEM_INT_DMEM_SIZE => 8*1024, -- size of processor-internal data memory in bytes | |||
| -- Processor peripherals -- | |||
| IO_GPIO_EN => true, -- implement general purpose input/output port unit (GPIO)? | |||
| IO_MTIME_EN => true, -- implement machine system timer (MTIME)? | |||
| IO_UART0_EN => false, -- implement primary universal asynchronous receiver/transmitter (UART0)? | |||
| IO_CFS_EN => false, -- implement custom functions subsystem (CFS)? | |||
| IO_AES_EN => true -- implement AES(128) custom function? | |||
| ) | |||
| port map ( | |||
| -- Global control -- | |||
| clk_i => std_ulogic(s_pll_clk), | |||
| rstn_i => std_ulogic(s_rst_n), | |||
| -- GPIO | |||
| gpio_o => s_con_gpio, | |||
| -- primary UART0 | |||
| uart0_txd_o => open, -- uart_tx_o, | |||
| uart0_rxd_i => '1', -- uart_rx_i, | |||
| -- debug | |||
| debug_o => s_debug | |||
| ); | |||
| debug_o <= s_debug(15 downto 0); | |||
| -- p_r ERROR when connecting uart_rx_i & yosys option -retime (with both Yosys inferred & instantiated CC_BRAM_40K or CC_BRAM_40K memory) | |||
| -- FATAL ERROR: RAM 4070 Output DOA[6] not used but Input DIA[6] used! | |||
| -- program finished with exit code: 2 | |||
| -- IO Connection -------------------------------------------------------------------------- | |||
| led_n_o <= not std_logic_vector(s_con_gpio(7 downto 0)); | |||
| end architecture; | |||