FPGA-Core
Custom RISC-V CPU core built from scratch in SystemVerilog. Starts as RV32IM, grows to RV32IMA + Sv32 + M/S/U privilege en route to booting Linux.
Target
- Board: Digilent Arty A7 100T (xc7a100tcsg324-1)
- Toolchain: Vivado 2025.2 or later
- Language: SystemVerilog
- ISA: end target RV32IMA + Zicsr + Zifencei + M/S/U privilege + Sv32
(Linux-capable). Built incrementally — see
ROADMAP.md. - Clock: 50 MHz (100 MHz xtal ÷ 2 via MMCM)
Architecture
"Single-cycle" logical model (no pipeline registers), Harvard architecture
(separate instruction/data BRAM). The combinational ALU and a multi-cycle M
unit (DSP-based multiply, iterative divide) sit side by side; the datapath
stalls on M-unit and BRAM accesses. Inter-stage signals are typed structs in
rv32_pkg.sv — the same structs become pipeline registers when the core is
pipelined later (Phase 16, optional).
Memory Map
| Address Range | Region |
|---|---|
0x0000_0000–0x0FFF_FFFF |
reserved boot aperture (Phase 17: 16 MB SPI flash at low end) |
0x1000_0000–0x1000_0FFF |
MMIO (UART; later: timer, PLIC) |
0x2000_0000–0x2000_FFFF |
instruction BRAM (64 KB) |
0x8000_0000–0x8000_FFFF |
data BRAM (64 KB) → DRAM in Phase 17 |
Reset PC = 0x2000_0000.
UART registers (split layout):
| Address | Access | Meaning |
|---|---|---|
0x1000_0000 |
W | TX data — byte to send |
0x1000_0004 |
R | RX data — pops one byte from RX FIFO |
0x1000_0008 |
R | status — bit0 = tx_busy, bit1 = rx_valid |
Building
Requires:
- Vivado 2025.2 or later
- RISC-V GCC toolchain — multilib
riscv64-unknown-elf-gcc. March string evolves with the implementation:rv32im(Phase 8) →rv32im_zicsr_zifencei(Phase 12) →rv32ima_zicsr_zifencei(Phase 15). riscv-tests(for compliance verification from Phase 8.5)- Serial terminal (minicom/picocom/PuTTY) at 115200 8N1
FPGA sources (RTL, testbenches, constraints, BRAM init files, and the Vivado
project script) live under FPGA/. Software that runs on the core (firmware,
BIOS, kernels) lives under Software/. The Vivado project itself is not
committed — generate it from the script and then open it:
vivado -mode batch -source FPGA/vivado/create_project.tcl
# then open FPGA/vivado/FPGA-Core.xpr in the Vivado GUI
Synthesis and implementation target the xc7a100tcsg324-1. RTL sources in
FPGA/rtl/ and testbenches in FPGA/tb/ are added to the project as
references — do not let Vivado copy them in.
Roadmap
See ROADMAP.md for the full phased build plan.