@ -0,0 +1,119 @@ | |||||
-- ################################################################################################# | |||||
-- # << 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 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 | |||||
); | |||||
end entity; | |||||
architecture rtl of neorv32_aes is | |||||
-- configuration -- | |||||
constant f_clock_c : natural := 26_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_con_pwm : std_logic_vector(2 downto 0); | |||||
begin | |||||
PLL : CC_PLL | |||||
generic map ( | |||||
REF_CLK => "10", | |||||
OUT_CLK => "26", | |||||
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 | |||||
); | |||||
s_rst_n <= s_pll_lock and s_cfg_end and rst_n_i; | |||||
-- The core of the problem ---------------------------------------------------------------- | |||||
-- ------------------------------------------------------------------------------------------- | |||||
neorv32_inst: entity work.neorv32_ProcessorTop_Minimal | |||||
generic map ( | |||||
CLOCK_FREQUENCY => f_clock_c -- clock frequency of s_pll_clk in Hz | |||||
) | |||||
port map ( | |||||
-- Global control -- | |||||
clk_i => std_ulogic(s_pll_clk), | |||||
rstn_i => std_ulogic(s_rst_n), | |||||
-- PWM (to on-board RGB LED) -- | |||||
pwm_o => s_con_pwm | |||||
); | |||||
-- IO Connection -------------------------------------------------------------------------- | |||||
-- ------------------------------------------------------------------------------------------- | |||||
led_n_o(4 downto 0) <= (others => '1'); | |||||
led_n_o(7 downto 5) <= s_con_pwm; | |||||
uart_tx_o <= uart_rx_i; | |||||
end architecture; |
@ -0,0 +1,110 @@ | |||||
DESIGN_NAME := neorv32_aes | |||||
NEORV32_CORE_DIR := ../../neorv32/rtl/core | |||||
NEORV32_PKG := $(NEORV32_CORE_DIR)/neorv32_package.vhd | |||||
NEORV32_APP_SRC := $(NEORV32_CORE_DIR)/neorv32_application_image.vhd | |||||
NEORV32_TEMPLATES := ../../neorv32/rtl/processor_templates | |||||
NEORV32_MEM_ENTITIES := \ | |||||
$(NEORV32_CORE_DIR)/neorv32_dmem.entity.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_imem.entity.vhd | |||||
NEORV32_MEM_SRC := \ | |||||
$(NEORV32_CORE_DIR)/mem/neorv32_imem.default.vhd \ | |||||
$(NEORV32_CORE_DIR)/mem/neorv32_dmem.default.vhd | |||||
NEORV32_CORE_SRC := \ | |||||
$(NEORV32_CORE_DIR)/neorv32_bootloader_image.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_boot_rom.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_bus_keeper.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_busswitch.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_cfs.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_cpu.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_cpu_alu.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_cpu_bus.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_cpu_control.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_cpu_cp_bitmanip.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_cpu_cp_cfu.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_cpu_cp_fpu.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_cpu_cp_muldiv.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_cpu_cp_shifter.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_cpu_decompressor.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_cpu_regfile.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_debug_dm.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_debug_dtm.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_fifo.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_gpio.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_gptmr.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_icache.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_mtime.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_neoled.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_onewire.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_pwm.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_slink.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_spi.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_sysinfo.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_top.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_trng.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_twi.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_uart.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_wdt.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_wishbone.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_xip.vhd \ | |||||
$(NEORV32_CORE_DIR)/neorv32_xirq.vhd | |||||
NEORV32_SRC := ${NEORV32_PKG} ${NEORV32_APP_SRC} ${NEORV32_MEM_ENTITIES} \ | |||||
${NEORV32_MEM_SRC} ${NEORV32_CORE_SRC} | |||||
WORK_FILES := $(NEORV32_TEMPLATES)/neorv32_ProcessorTop_Minimal*.vhd ../rtl/${DESIGN_NAME}.vhd | |||||
GM_FILES := ../../lib/rtl_components.vhd | |||||
GHDL_FLAGS := --std=08 --workdir=build -Pbuild | |||||
YOSYSPIPE := -nomx8 -retime | |||||
PNRFLAGS := -om 3 | |||||
PNRTOOL := $(shell which p_r) | |||||
.PHONY: all syn imp prog syn_sim imp_sim | |||||
all: imp | |||||
syn: ${DESIGN_NAME}.v | |||||
imp: ${DESIGN_NAME}.bit | |||||
build/work-obj08.cf: ${WORK_FILES} build/gatemate-obj08.cf build/neorv32-obj08.cf | |||||
ghdl -a ${GHDL_FLAGS} --work=work ${WORK_FILES} | |||||
build/neorv32-obj08.cf: build/gatemate-obj08.cf ${NEORV32_SRC} | |||||
ghdl -a $(GHDL_FLAGS) --work=neorv32 ${NEORV32_SRC} | |||||
build/gatemate-obj08.cf: ${GM_FILES} | |||||
mkdir -p build | |||||
ghdl -a ${GHDL_FLAGS} --work=gatemate ${GM_FILES} | |||||
# Synthesis target for implementation | |||||
${DESIGN_NAME}.v: build/work-obj08.cf | |||||
yosys -m ghdl -p 'ghdl ${GHDL_FLAGS} --warn-no-binding --no-formal ${DESIGN_NAME}; synth_gatemate -top $(DESIGN_NAME) ${YOSYSPIPE} -vlog $@' \ | |||||
2>&1 | tee build/yosys-report.txt | |||||
# Implementation target for FPGA | |||||
${DESIGN_NAME}.bit: ${DESIGN_NAME}.v ${DESIGN_NAME}.ccf | |||||
cd build && \ | |||||
${PNRTOOL} -i ../${DESIGN_NAME}.v -o $@ --ccf ../${DESIGN_NAME}.ccf $(PNRFLAGS) \ | |||||
2>&1 | tee p_r-report.txt && \ | |||||
mv ${DESIGN_NAME}*.bit ../$@ | |||||
# Post-synthesis simulation target | |||||
syn_sim: ${DESIGN_NAME}.v | |||||
iverilog -g2012 -o tb_${DESIGN_NAME}_syn.vvp ${DESIGN_NAME}.v tb_${DESIGN_NAME}.v /usr/local/share/yosys/gatemate/cells_sim.v | |||||
vvp -N tb_${DESIGN_NAME}_syn.vvp -fst | |||||
# Post-implementation simulation target | |||||
imp_sim: ${DESIGN_NAME}.bit | |||||
iverilog -g2012 -o tb_${DESIGN_NAME}_imp.vvp build/${DESIGN_NAME}_00.v tb_${DESIGN_NAME}.v /opt/cc-toolchain-linux/bin/p_r/cpelib.v | |||||
vvp -N tb_${DESIGN_NAME}_imp.vvp -fst | |||||
# FPGA FW load per JTAG | |||||
prog: ${DESIGN_NAME}.bit | |||||
openFPGALoader -b gatemate_evb_jtag $< | |||||
clean : | |||||
echo "# Cleaning files" | |||||
rm -rf build ${DESIGN_NAME}.v ${DESIGN_NAME}_sim.v ${DESIGN_NAME}.vhd ${DESIGN_NAME}.bit *.vvp *.fst |
@ -0,0 +1,25 @@ | |||||
# Configuration for the Gatemate eval board | |||||
Pin_in "clk_i" Loc = "IO_SB_A8" | SCHMITT_TRIGGER=true; | |||||
Pin_in "rst_n_i" Loc = "IO_EB_B0"; # SW3 | |||||
Pin_out "led_n_o[0]" Loc = "IO_EB_B1"; # LED D1 | |||||
Pin_out "led_n_o[1]" Loc = "IO_EB_B2"; # LED D2 | |||||
Pin_out "led_n_o[2]" Loc = "IO_EB_B3"; # LED D3 | |||||
Pin_out "led_n_o[3]" Loc = "IO_EB_B4"; # LED D4 | |||||
Pin_out "led_n_o[4]" Loc = "IO_EB_B5"; # LED D5 | |||||
Pin_out "led_n_o[5]" Loc = "IO_EB_B6"; # LED D6 | |||||
Pin_out "led_n_o[6]" Loc = "IO_EB_B7"; # LED D7 | |||||
Pin_out "led_n_o[7]" Loc = "IO_EB_B8"; # LED D8 | |||||
Pin_in "uart_rx_i" Loc = "IO_NB_A1"; # PMODA IO3 | |||||
Pin_out "uart_tx_o" Loc = "IO_NB_A0"; # PMODA IO1 | |||||
Pin_out "debug_o[0]" Loc = "IO_NB_A4"; | |||||
Pin_out "debug_o[1]" Loc = "IO_NB_A5"; | |||||
Pin_out "debug_o[2]" Loc = "IO_NB_A6"; | |||||
Pin_out "debug_o[3]" Loc = "IO_NB_A7"; | |||||
Pin_out "debug_o[4]" Loc = "IO_NB_B4"; | |||||
Pin_out "debug_o[5]" Loc = "IO_NB_B5"; | |||||
Pin_out "debug_o[6]" Loc = "IO_NB_B6"; | |||||
Pin_out "debug_o[7]" Loc = "IO_NB_B7"; |