1. 课程导入与开发环境总览

Quartus SoC 嵌入式 Linux 工程的核心,是把 FPGA 逻辑设计与 ARM 处理器上的 Linux 软件系统放进同一颗芯片里协同工作。以 Intel Cyclone V SoC(如 5CSXFC6D6F31C6)为例,芯片内部同时存在 HPS(Hard Processor System,双核 Cortex-A9 + 外设控制器)和 FPGA 逻辑阵列,两者通过 AXI/Avalon 桥、FPGA-to-HPS 与 HPS-to-FPGA 互联。理解这套工程,关键不是先背工具名,而是先建立"软硬件协同设计"的思维:硬件提供可编程的接口与加速逻辑,软件提供操作系统、驱动与应用,二者通过寄存器映射、中断、DMA 和时钟复位域相互约束。

一个完整的 Quartus SoC 嵌入式 Linux 工程,通常包含四个可独立交付又必须版本对齐的产物:硬件平台(Quartus 工程 + HPS 配置 + 引脚约束,输出 .sof/.rbf 与 .sopcinfo)、引导链(Preloader/U-Boot,负责时钟、DDR、引脚复用初始化并加载内核)、Linux 内核与设备树(.dtb 描述 HPS 外设与 FPGA 侧 IP 的地址、中断、时钟)、根文件系统(Buildroot 或 Yocto 生成的 rootfs,含驱动模块与应用程序)。四者中任何一处的地址、时钟或版本不匹配,都会表现为"能启动但外设不工作"或"根本进不了内核"。

工具链的分工需要先厘清。Quartus Prime(Standard/Pro)负责综合、布局布线、时序分析与编程文件生成;SoC EDS(SoC Embedded Design Suite)提供 ARM 交叉工具链、Preloader 生成器(bsp-editor)、Device Tree Generator 以及调试用的 DS-5 或 GDB 环境;U-Boot 负责第二阶段引导与镜像加载;Linux 内核提供 HPS 驱动框架;Buildroot/Yocto 负责 rootfs 与交叉编译环境。版本匹配是新手最容易踩的坑:Quartus 版本决定 SoC EDS 版本,SoC EDS 版本决定可用的 U-Boot 与内核基线,内核版本又决定设备树绑定格式与 Buildroot 的配置选项。例如 Quartus Prime 20.1 通常搭配 SoC EDS 20.1、U-Boot 2019.04 基线、Linux 5.4 LTS 与 Buildroot 2020.02,若把内核换成 6.x,设备树中的部分属性名与驱动匹配方式可能变化,需要同步调整。

下面这张图给出从硬件设计到系统启动的软硬件协同关系与数据流,重点标出各产物之间的依赖与版本传递路径,便于在后续章节中对照定位。

Quartus SoC 嵌入式 Linux 工程:软硬件协同与版本传递 硬件平台(Quartus Prime) • HPS 配置:DDR、时钟、引脚复用 • FPGA IP:PIO / SPI / DMA / 自定义 • 约束:.sdc 时序、.qsf 引脚 • 输出:.sof / .rbf / .sopcinfo • 版本:Quartus 20.1 引导链(SoC EDS + U-Boot) • bsp-editor 生成 Preloader • 初始化 DDR / 时钟 / 引脚 • U-Boot 2019.04 加载内核 • 输出:preloader-mkpimage.bin • 版本:SoC EDS 20.1 内核与设备树(Linux) • Linux 5.4 LTS 基线 • .dts 描述 HPS 外设与 FPGA IP • 地址 / 中断 / 时钟绑定 • 输出:zImage + .dtb • 版本:与 U-Boot 对齐 根文件系统(Buildroot / Yocto) • 交叉工具链与库 • 驱动模块 .ko 与应用程序 • 输出:rootfs.ext4 / .jffs2 • 版本:Buildroot 2020.02 目标板(Cyclone V SoC) • HPS:双核 Cortex-A9 • FPGA:逻辑阵列 + 桥接 • 启动介质:SD / QSPI • 串口:UART0 115200 .sopcinfo 加载 挂载 部署 版本传递:Quartus → SoC EDS → U-Boot → Linux → Buildroot 协同要点:地址映射一致、时钟复位域匹配、中断号对齐、设备树与硬件描述同步

从图中可以看到,硬件平台是整条链的源头:Quartus 工程生成的 .sopcinfo 文件描述了 HPS 与 FPGA 侧 IP 的地址、中断和时钟信息,SoC EDS 的 Device Tree Generator 会据此生成设备树骨架,Preloader 也依赖 HPS 配置导出的 XML。因此,先定硬件、再定软件基线是推荐顺序。若先选内核再改硬件,往往需要手工修补设备树,容易遗漏中断号或时钟域。

实际动手时,建议按以下顺序建立工程目录,避免文件散落:

soc_linux_project/
├── hw/                 # Quartus 工程:.qpf .qsf .sdc
│   └── output_files/   # .sof .rbf .sopcinfo
├── boot/               # Preloader + U-Boot
│   ├── preloader/
│   └── u-boot/
├── kernel/             # Linux 源码 + .dts
├── rootfs/             # Buildroot 输出
└── scripts/            # 烧写与部署脚本

版本匹配可以用一条经验规则快速检查:Quartus 主版本号 = SoC EDS 主版本号;U-Boot 与内核基线以 SoC EDS 发布说明为准;Buildroot 选择与内核同期的 LTS 版本。以 Quartus 20.1 为例,SoC EDS 20.1 自带 U-Boot 2019.04 与 Linux 5.4 的补丁基线,Buildroot 2020.02 可稳定配合。若使用 Quartus 21.3,则对应 SoC EDS 21.3、U-Boot 2021.07 与 Linux 5.10,设备树绑定也相应更新。

首次搭建时,先用厂商提供的 GHRD(Golden Hardware Reference Design)跑通"Preloader → U-Boot → 内核 → 串口登录"全流程,再替换为自己的 FPGA IP。这样能把硬件问题与软件问题分开定位。