3. 开发环境与工具链搭建
Agilex 工业项目的开发环境不是“装一个 Quartus 就能开工”,而是由 FPGA 逻辑、HPS 硬核处理器、Linux 系统与交叉编译四条线并行组成。Quartus Prime Pro 负责器件适配、综合布局布线与比特流生成;Platform Designer 负责把 HPS、PCIe、以太网、TSE、I2C、SPI 等 IP 连成系统并生成地址映射;HPS 配置决定处理器启动方式、DDR 参数与外设引脚;RTL 与 HLS 流程分别承担时序敏感逻辑和算法加速;Linux 开发环境与交叉编译工具链则产出运行在 HPS 上的可执行文件;Signal Tap 与 System Console 是板级调试的两把“探针”。本节按实际工程顺序,把这条工具链串起来。
一、工具版本与安装基线
Agilex 器件必须使用 Quartus Prime Pro 版本,Standard 版不支持。安装时建议勾选器件系列(如 Agilex 7 / Agilex 5)、ModelSim-Altera 或 Questa Intel FPGA 仿真器、以及对应版本的 SoC EDS(嵌入式开发套件)。安装完成后先确认三件事:quartus_sh --version 能输出版本号;quartus_pgm -l 能列出 USB-Blaster;arm-none-linux-gnueabihf-gcc -v 能输出交叉编译器版本。三者齐备,说明逻辑侧与软件侧工具都已就位。
二、Platform Designer 中的 HPS 系统搭建
在 Platform Designer 中新建系统,第一步是添加 Agilex HPS 组件。关键配置集中在几个页签:FPGA Interfaces 决定 HPS 与 FPGA 之间的 AXI、AXI-Lite 桥是否使能;HPS Peripheral 选择 UART、I2C、SPI、SD/MMC、Ethernet 等外设;HPS Clocks 设置主时钟与各外设时钟;SDRAM 页签填写 DDR4 的容量、位宽、速率与时序参数。这些参数必须与硬件原理图和 DDR 颗粒手册一致,否则 HPS 在 U-Boot 阶段就会卡死。
随后把自定义 IP 或 Intel 标准 IP(如 TSE、DMA、PIO)挂到 HPS 的 AXI 总线上,分配基地址,避免地址重叠。连接完成后执行 Generate HDL,Platform Designer 会输出 Verilog 顶层、.qip 文件、设备树片段 .dtsi 与 hps_0.h 头文件。其中 .dtsi 与 hps_0.h 是软硬件协同的关键:前者供 Linux 识别外设,后者供应用程序通过 mmap 访问 FPGA 侧寄存器。
三、RTL 与 HLS 两条实现路径
RTL 流程适合时序严格、接口明确的逻辑,例如工业以太网的 MAC 收发、编码器计数、PWM 生成。写法上遵循同步设计、单时钟域优先、跨时钟域用双触发器或异步 FIFO 同步。综合后在 TimeQuest 中约束主时钟、输入输出延迟与虚假路径,查看 Setup/Hold 的 Slack 是否为正。
HLS 流程适合算法密集、迭代频繁的模块,例如滤波、FFT、图像预处理。用 C++ 描述算法,通过 #pragma HLS INTERFACE 指定 AXI4 或 AXI-Lite 接口,#pragma HLS PIPELINE 控制流水,再用 i++ 工具生成 RTL 并导出 IP,最后在 Platform Designer 中像普通 IP 一样例化。两条路径产出的模块最终在同一个 Quartus 工程中汇合。
四、Linux 开发环境与交叉编译
HPS 上运行的是 Linux,因此需要一套主机侧开发环境。典型做法是在 Ubuntu 主机上安装 SoC EDS,使用其提供的 arm-none-linux-gnueabihf- 工具链。交叉编译一个访问 FPGA 寄存器的程序,核心是三步:用 mmap 把 /dev/mem 映射到用户空间;按 hps_0.h 中的偏移读写寄存器;用 volatile 指针防止编译器优化。
arm-none-linux-gnueabihf-gcc hps_led.c -o hps_led -O2
scp hps_led root@192.168.1.10:/home/root/
# 板上执行
./hps_led
设备树是软硬件之间的“合同”。Platform Designer 生成的 .dtsi 需要合并进 U-Boot 与内核使用的设备树,重新编译 dtb 后随内核一起启动。若外设地址或中断号与设备树不一致,驱动会 probe 失败,表现为 dmesg 中找不到设备。
五、Signal Tap 与 System Console 调试
Signal Tap 用于观察 FPGA 内部信号。在 Quartus 中新建 .stp 文件,添加待观测节点(如 AXI 握手信号、状态机状态、FIFO 空满标志),设置采样时钟与采样深度(例如 1024 点),重新布局布线并下载 .sof。触发条件可设为“写使能上升沿且地址等于某值”,命中后即可看到波形。注意 Signal Tap 会占用逻辑与 RAM 资源,调试完成后应关闭并重新编译发布版本。
System Console 用于通过 JTAG 读写 Avalon 或 AXI 从设备寄存器,适合在没有 Linux 或驱动未就绪时验证硬件。典型命令如下:
# 在 System Console 中
set master [lindex [get_service_paths master] 0]
open_service master $master
master_write_32 $master 0x0000 0x00000001
master_read_32 $master 0x0004 1
若读回值与写入值一致,说明地址映射与总线连接正确;若读回全 0 或全 F,应检查基地址、字节使能与时钟复位。
六、工业项目中的配置要点
工业现场对可靠性和实时性要求高,工具链配置上有几个容易踩坑的点。第一,HPS 的 DDR 参数必须与颗粒手册逐项核对,尤其是 tRFC、tFAW 这类时序参数,填错会导致系统随机崩溃。第二,工业以太网若使用 TSE 或自定义 MAC,需在 Platform Designer 中确认时钟域与 PHY 接口(RGMII/SGMII)匹配,并在 TimeQuest 中对 RGMII 的收发时钟做输入输出延迟约束。第三,交叉编译时若程序要访问 FPGA 寄存器,务必用 mmap 映射 /dev/mem 并加 volatile,否则编译器优化会让读写“消失”。第四,发布版本应关闭 Signal Tap,避免额外资源占用影响时序收敛。
open("/dev/mem") 直接读写未在设备树中声明的地址。虽然有时能“跑通”,但一旦内核启用严格内存保护或地址映射变化,程序会立即崩溃。正确做法是让 Platform Designer 生成 .dtsi,在设备树中声明 reg 与 compatible,再由驱动或 UIO 暴露给用户空间。把上述流程串起来,一个最小可用的工业验证工程应能完成:Quartus 工程编译通过且时序收敛;Platform Designer 系统生成 .dtsi 与 hps_0.h;交叉编译一个读写 FPGA 寄存器的程序并在 HPS 上运行;用 System Console 读回寄存器值确认一致;用 Signal Tap 抓取一次 AXI 写事务波形。这五步都通过,说明开发环境与工具链已经具备承接后续工业通信与边缘控制开发的能力。