2. 目标硬件平台解析
在开始搭建 Quartus SoC 嵌入式 Linux 工程之前,必须先建立对目标硬件平台的清晰认识。本节以 Terasic DE10-Nano 为核心对象,它搭载 Intel Cyclone V SoC FPGA(型号 5CSEBA6U23I7),是学习 HPS+FPGA 异构开发的典型平台。理解这块板子的架构、外设、存储与启动配置,是后续生成设备树、配置 U-Boot、划分 FPGA 与 HPS 资源的前提。
一、Cyclone V SoC FPGA 的整体架构
Cyclone V SoC 芯片内部并非单一逻辑器件,而是由两大部分通过片上互联构成:左侧是 Hard Processor System(HPS),右侧是 FPGA 可编程逻辑阵列。HPS 本质上是一颗 ARM 处理器子系统,包含双核 ARM Cortex-A9、L2 Cache、SDRAM 控制器、外设控制器以及各类桥接接口;FPGA 部分则是传统的可编程逻辑资源,包含 ALM、DSP 块、M10K 存储块和 PLL。两者之间通过 AXI/Avalon 桥连接,使 HPS 可以访问 FPGA 中的 IP,FPGA 也能通过 FPGA-to-HPS 桥访问 HPS 的 SDRAM 和外设。
这种异构结构决定了开发方式:HPS 运行 Linux 操作系统,负责通用计算、网络、存储与用户交互;FPGA 负责实时性高、并行性强的逻辑,例如自定义外设、高速采集、PWM 或视频处理。二者通过 HPS-FPGA 桥交换数据,桥的位宽、时钟域和地址映射需要在 Qsys/Platform Designer 中明确配置。
二、HPS 侧关键外设与地址空间
DE10-Nano 的 HPS 外设资源在 Linux 中通过设备树描述,常见的有:两个千兆以太网控制器(GMAC0/GMAC1)、USB OTG 控制器、UART0(调试串口,115200-8N1)、I2C0~I2C3、SPI Master、SD/MMC 控制器以及 GPIO 控制器。这些外设的寄存器基地址由芯片手册固定,例如 UART0 基地址为 0xFFC02000,GMAC0 为 0xFF700000,SDMMC 为 0xFF704000。在设备树中,这些地址会以 reg 属性出现,Linux 驱动据此完成映射。
HPS 的地址空间还包含 SDRAM 区域(0x00000000 起)、片上 RAM(0xFFFF0000 附近)以及 FPGA 桥接窗口(如 0xC0000000 起的轻量级桥、0xFF200000 起的 HPS-to-FPGA 桥)。理解这些地址,是后续在 Qsys 中为自定义 IP 分配地址、在设备树中声明 compatible 与 reg 的基础。
三、FPGA 侧资源与 HPS-FPGA 桥接
FPGA 侧包含约 41K 逻辑单元、112 个 DSP 块和 5.6Mb 的 M10K 存储块,足以实现中等规模的自定义外设。在 Platform Designer 中,通常需要添加以下桥接组件:HPS-to-FPGA 主桥(HPS 作为主设备访问 FPGA 从设备)、FPGA-to-HPS 主桥(FPGA 访问 HPS SDRAM)、轻量级 HPS-to-FPGA 桥(用于低带宽控制寄存器)。每个桥都有独立的地址宽度和时钟域,配置时需注意位宽匹配与时钟交叉。
一个典型教学示例是:在 FPGA 中实现一个 PIO(并行 IO)控制器,映射到 HPS-to-FPGA 桥的 0xFF200000 地址,Linux 通过 /dev/mem 或 uio 驱动读写该地址,从而控制 LED 或读取按键。这个例子贯穿后续章节,是理解异构通信的最小闭环。
四、存储布局与启动模式配置
DE10-Nano 的启动流程由 MSEL 拨码开关决定。MSEL[4:0] 的不同组合对应不同启动源:常见配置为 MSEL=01010 时从 MicroSD 卡启动,MSEL=00000 时从 QSPI Flash 启动。上电后,芯片内部的 Boot ROM 根据 MSEL 值选择启动介质,加载 Preloader/SPL 到片上 RAM,再由 SPL 加载 U-Boot 到 DDR3,最后 U-Boot 加载 Linux 内核与设备树。
存储布局上,MicroSD 卡通常划分为两个分区:FAT32 分区存放 zImage 和 socfpga.dtb,ext4 分区存放根文件系统。QSPI Flash 则用于存放 SPL 和 U-Boot 镜像,作为备用或量产启动方式。DDR3 在运行时承载内核、根文件系统和用户程序,地址从 0x00000000 开始,Linux 通常保留低端部分给内核,高端部分供用户空间使用。
五、面向 Linux 工程的硬件检查清单
在进入 Quartus 工程创建之前,建议按以下清单核对硬件状态:确认开发板供电正常(DC 5V),MSEL 拨码与预期启动源一致,MicroSD 卡已插入且分区正确,UART-USB 线连接至电脑并识别为 /dev/ttyUSB0(Linux)或 COMx(Windows),串口终端配置为 115200-8N1。上电后,若串口输出 U-Boot 版本信息,说明 Preloader 与 U-Boot 已正常加载;若输出 Linux 内核启动日志,说明内核与设备树匹配成功。
这些检查点看似基础,却是后续调试 FPGA 桥接、设备树覆盖和驱动加载的起点。只有确认 HPS 侧 Linux 能正常启动,才能进一步验证 FPGA 侧逻辑与 HPS 的通信是否按预期工作。