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 工程生成的 .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,设备树绑定也相应更新。