Zephyr 在 LiteX VexRiscv FPGA 软核 SoC 上的移植实践与启动指南
发布时间:2026/9/17 0:44:19 作者:尧图编辑部 阅读量:1,286

Zephyr 在 LiteX VexRiscv FPGA 软核 SoC 上的移植实践与启动指南【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyrLiteX VexRiscv 是一套基于 FPGA 的可综合软核 SoC 参考设计处理器核采用 SpinalHDL 编写的 32 位 RISC-V 实现 VexRiscv片上外设与互联由 LiteX/Migen 工具链自动生成。本文以 Zephyr 仓库中的 litex_vexriscv 板级支持文档 为核心完整讲解该板卡的硬件背景、支持的 Zephyr 功能、两种比特流bitstream生成路径litex-hub 参考平台与官方 LiteX SoC Builder以及从构建 Zephyr 应用、烧录 FPGA 到串口引导启动的完整实战流程并结合仓库源码给出底层实现依据。1. 平台背景LiteX 与 VexRiscv1.1 LiteX SoC 构建框架LiteX 是基于 Migen / MiSoC SoC builder 发展而来的开源 SoC 生成框架。它提供了一系列开箱即用的系统组件——总线、流stream、互联interconnect、通用核core以及 CPU 封装wrapper开发者可以像写软件一样用 Python 描述硬件快速拼装出面向不同厂商 FPGA 芯片的完整 SoC。LiteX 还内置了设计集成、仿真与构建机制这是它能同时支持 ArtyXilinx 系与 SDI-MIPI 桥Lattice 系等多款芯片的关键原因。1.2 VexRiscv 处理器核VexRiscv 是一个用 SpinalHDL 编写的 32 位 RISC-V CPU 实现支持 M、C、A 三组 RISC-V 指令集扩展并针对 FPGA 做了大量优化包括多级流水线与数据缓存。项目还提供 JTAG、MMU、MUL/DIV 等大量可选扩展用于按需定制处理器配置。在 Zephyr 的 SoC 级设备树 dts/riscv/riscv32-litex-vexriscv.dtsi 中可以看到本平台 CPU 的具体实例化参数cpu0: cpu0 { clock-frequency 100000000; compatible litex,vexriscv-standard, spinalhdl,vexriscv, riscv; device_type cpu; reg 0; riscv,isa-base rv32i; riscv,isa-extensions i, m, zicsr, zifencei; status okay; };即1 GHz 主频时钟源配置100 MHz、RV32IM 基础指令集加上 Zicsr控制与状态寄存器与 Zifencei指令栅栏扩展中断控制器为 LiteX 自有的 VexRiscv INTClitex,vexriscv-intc0最大优先级 7。1.3 目标硬件平台litex_vexriscv板级配置面向以下两类硬件Digilent Arty A7-35T / A7-100T 开发板Xilinx Artix-7 系 FPGA 开发板是 LiteX 社区最常用的目标平台之一SDI-MIPI Video ConverterAntmicro 出品基于 Lattice 系 FPGA 的视频桥接板卡。两条平台的比特流分别通过开源工具链获得Arty 使用F4PGASymbiFlow工具链SDI-MIPI 使用oxideYosys nextpnr工具链。也就是说整个链路硬件生成 工具链 RTOS全部开源。2. 支持的 Zephyr 功能特性根据板级元数据 boards/enjoydigital/litex_vexriscv/litex_vexriscv.yaml 的声明该板卡在 Zephyr 中支持的硬件功能如下类别说明架构riscvRV32RAM256 KiBram: 262144外设GPIO、UART、SPI、SDHCSD 卡、I2S、I2C、以太网netif:eth、看门狗工具链zephyr即 Zephyr SDK 内置 GCC测试排除bluetooth、xip板上无蓝牙与 XIP 支持twister 测试会忽略相关标签厂商litexenjoydigital 维护板级目录板级默认配置 litex_vexriscv_defconfig 开启了以下内核选项CONFIG_CONSOLEy CONFIG_SERIALy CONFIG_UART_CONSOLEy CONFIG_GPIOy CONFIG_CLOCK_CONTROLy CONFIG_HEAP_MEM_POOL_SIZE4096同时在 Kconfig.defconfig 中默认使能了以太网驱动configdefault ETH_DRIVER这意味着拿到比特流后即可直接体验串口控制台与网络功能。3. 比特流生成Bitstream generation要在 VexRiscv CPU 上运行 Zephyr第一步是在 FPGA 上加载包含 VexRiscv 软核与 LiteX 外设的比特流。官方文档提供两条路径。3.1 路径一Zephyr on LiteX VexRiscv 参考平台推荐litex-hub/zephyr-on-litex-vexriscv 是社区维护的一站式参考平台它保证所有寄存器地址与 Zephyr 设备树完全对齐本文所述板卡的全部驱动都是基于该平台验证的因此强烈建议优先采用这条路径。Step 1克隆仓库并更新子模块git clone https://github.com/litex-hub/zephyr-on-litex-vexriscv.git cd zephyr-on-litex-vexriscv git submodule update --init --recursive目标为Digilent Arty A7-35时需要先按 F4PGA 官方教程安装 F4PGA 工具链目标为SDI-MIPI Video Converter时需要按 prjoxide 指南安装 oxideYosys nextpnr工具链。Step 2安装系统依赖并运行安装脚本apt-get install build-essential bzip2 python3 python3-dev python3-pip ./install.shStep 3将 LiteX 加入 PATHsource ./initStep 4配置 F4PGA 环境仅 Arty A7-35export F4PGA_INSTALL_DIR~/opt/f4pga export FPGA_FAMxc7 export PATH$F4PGA_INSTALL_DIR/$FPGA_FAM/install/bin:$PATH; source $F4PGA_INSTALL_DIR/$FPGA_FAM/conda/etc/profile.d/conda.sh conda activate $FPGA_FAMStep 5生成各目标比特流Arty A7-35TSymbiFlow/F4PGA 工具链./make.py --boardarty --varianta7-35 --build --toolchainsymbiflowArty A7-100T./make.py --boardarty --varianta7-100 --build --toolchainsymbiflowSDI-MIPI Video Converteroxide 工具链./make.py --boardsdi_mipi_bridge --build --toolchainoxide3.2 路径二官方 LiteX SoC Builder也可以直接用官方 LiteX 仓库生成比特流此时必须额外生成一份 dts overlay供 Zephyr 使用。Step 1安装 Migen/LiteX 及 LiteX coreswget https://raw.githubusercontent.com/enjoy-digital/litex/master/litex_setup.py chmod x litex_setup.py ./litex_setup.py --init --install --user (--user to install to user directory) --config(minimal, standard, full)其中--config可选择minimal、standard、full三档安装规模。Step 2安装 RISC-V 工具链pip3 install meson ninja ./litex_setup.py --gccriscvStep 3构建目标以 Arty 为例./litex-boards/litex_boards/targets/digilent_arty.py --build --timer-uptime --csr-json csr.json--timer-uptime启用 LiteX 的 uptime 定时器对应设备树中litex,timer0的uptime_cycles寄存器用于 Zephyr 内核时钟--csr-json导出 CSR 寄存器布局。Step 4生成 dts 与 config overlay./litex/litex/tools/litex_json2dts_zephyr.py --dts overlay.dts --config overlay.config csr.jsonlitex_json2dts_zephyr.py会把上一步导出的csr.json翻译为 Zephyr 可消费的设备树 overlayoverlay.dts与 Kconfig overlayoverlay.config这一步正是“官方 LiteX 路径需要额外生成 overlay”的原因所在。4. 构建 Zephyr 应用litex_vexriscv板卡的 Zephyr 应用构建方式与普通板卡一致只需将BOARD变量设为litex_vexriscvwest build -b litex_vexriscv path/to/app如果比特流是用官方 LiteX SoC Builder生成的非参考平台由于寄存器布局是自定义的需要额外传入-DDTC_OVERLAY_FILE指向第 3.2 节生成的设备树 overlaywest build -b litex_vexriscv path/to/app -DDTC_OVERLAY_FILEpath/to/overlay.dts构建产物中的zephyr.bin即最终需要加载到板上的固件镜像。5. 烧录比特流与引导启动5.1 烧录比特流Digilent Arty A7两种工具任选其一xc3sprog -c nexys4 digilent_arty.bitopenFPGALoader -b arty_a7_100t digilent_arty.bitSDI-MIPI Video Converter使用 ecpprog面向 Lattice ECP5 系ecpprog -S antmicro_sdi_mipi_video_converter.bit5.2 通过串口引导 ZephyrLiteX BIOS 支持从串口接收内核镜像引导。使用litex_termttyUSBX替换为实际串口设备名litex_term /dev/ttyUSBX --speed 115200 --kernel zephyr.bin--speed 115200与板级设备树中uart0的current-speed 115200一致见 litex_vexriscv.dts串口被同时指定为 Zephyr 控制台zephyr,console与 shell 串口zephyr,shell-uart。启动后即可在终端中看到 Zephyr 的启动日志并进入 shell。上图左侧为 Digilent Arty FPGA 开发板实物右侧为 LiteX BIOS 的串口启动输出可见 VexRiscv CPU 时钟、ROM/SRAM/MAIN-RAM 容量以及 Boot from serial 的引导提示——与上述litex_term引导流程完全对应。6. 源码级解读板级设备树与外设驱动板级设备树 boards/enjoydigital/litex_vexriscv/litex_vexriscv.dts 声明了该参考平台的完整外设集合与寄存器地址是理解驱动实现的最佳入口外设节点compatible基地址关键寄存器reg-namesuart0litex,uart0xe0001800rxtx、txfull、rxempty、ev_status/pending/enable、txempty、rxfulltimer0litex,timer00xe0002800load、reload、en、value、uptime_latch、uptime_cycleseth0/mdio0litex,liteeth/litex,liteeth-mdio0xe0009800/0xe0008000rx_slot、tx_start、buffers 等缓冲区映射于0xb0000000spi0litex,spi0xe0002000control、status、mosi、miso、cs、loopbackspi1litex,spi-litespi0xe000c000带flash_mmap映射0x60000000的 SPI NOR 闪存sdhc0litex,mmc0xe000e800PHY 层与 DMAblock2mem/mem2block寄存器i2c0/i2c1litex,i2c/litex,litei2c0xe0005000/0xe000d800write/read 与 master_* 寄存器组gpio_out/gpio_inlitex,gpio0xe0005800/0xe0006000各 4 路 GPIO输入侧带中断mode、edge、ev_pendingi2s_rx/i2s_txlitex,i2s0xe000a800/0xe000b000256 深度 FIFO映射于0xb1xxxxxx/0xb2xxxxxxwdt0litex,watchdog0xe000d000control、cycles、remainingprbs0熵源litex,prbs0xe0006800被chosen/zephyr,entropy引用内存节点ram0位于0x40000000、大小 256 MiBreg 0x40000000 0x10000000并被chosen/zephyr,sram引用。所有外设集中映射在0xe0000000段符合 LiteX 默认 CSR 布局。上述 compatible 在仓库驱动目录中均有对应实现共 30 余个 LiteX 驱动文件例如串口轮询收发见 drivers/serial/uart_litex.cuart_litex_poll_out通过轮询txfull寄存器等待发送缓冲空位再写入rxtx寄存器uart_litex_poll_in同理读取rxempty内核定时器见 drivers/timer/litex_timer.c其余如 drivers/gpio/gpio_litex.c、drivers/ethernet/eth_litex_liteeth.c、drivers/sdhc/sdhc_litex_litesdcard.c、drivers/clock_control/clock_control_litex.c、drivers/i2s/i2s_litex.c 等分别对应设备树中的各外设节点。从源码结构可以推断Zephyr 对 LiteX 的适配采用了“SoC 级 dtsi 定义 CPU/中断控制器 板级 dts 声明外设寄存器 每类外设一个独立驱动”的分层结构这套结构让同一套 LiteX 生成的 SoC寄存器布局一致可以快速复用到不同 FPGA 载体上——这正是 LiteX 软核 SoC 方案在 Zephyr 生态中的典型价值硬件可软件化生成固件可标准化复用。7. 常见问题与注意事项寄存器地址对不齐如果使用官方 LiteX SoC Builder 自定义配置务必用litex_json2dts_zephyr.py生成 overlay 并在west build时通过-DDTC_OVERLAY_FILE传入否则驱动访问的寄存器地址与硬件不符外设将无法工作工具链选择Arty 与 SDI-MIPI 分别依赖 symbiflowF4PGA与 oxide 工具链不可混用参考平台的make.py --toolchain参数需与所装工具链一致串口速度litex_term --speed 115200必须与设备树current-speed 115200、以及比特流中 UART 波特率配置保持一致构建环境./install.sh与source ./init需要在参考平台仓库根目录执行且建议在干净的 Linux 环境如容器/虚拟机中操作避免与系统 Python 包冲突测试范围twister 测试框架下该板卡会忽略bluetooth与xip两类标签涉及这些特性的用例不会在该板上运行。8. 参考资料板级文档boards/enjoydigital/litex_vexriscv/doc/index.rst板级元数据与配置litex_vexriscv.yaml、litex_vexriscv_defconfig、board.yml板级设备树boards/enjoydigital/litex_vexriscv/litex_vexriscv.dtsSoC 级设备树dts/riscv/riscv32-litex-vexriscv.dtsiLiteX 驱动实现drivers/serial/uart_litex.c、drivers/timer/litex_timer.c 及 drivers 下各*litex*驱动文件【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考