4. Platform Designer构建HPS系统
在Quartus SoC嵌入式Linux工程中,Platform Designer(旧称Qsys)承担着“把HPS硬核、SDRAM控制器、外设与FPGA逻辑连成一张可寻址系统”的职责。本节围绕一个典型Cyclone V SoC(如5CSX/5CSE系列)的HPS系统展开:添加HPS组件、配置SDRAM、挂接UART/SPI/I2C/Ethernet/SD-MMC外设,并建立FPGA-to-HPS与HPS-to-FPGA桥接。理解这些配置项与地址映射,是后续生成设备树、编写驱动和启动Linux的前提。
一、添加HPS组件与理解其内部结构
在Platform Designer中新建系统后,从IP Catalog搜索“Arria V/Cyclone V Hard Processor System”并添加。HPS组件并非一个黑盒,它内部包含MPU子系统、SDRAM控制器、片上RAM、外设I/O、DMA控制器、FPGA桥以及时钟/复位管理。双击HPS组件进入参数界面,需要逐页确认:General页选择器件系列与HPS时钟频率;FPGA Interfaces页决定是否启用FPGA-to-HPS、HPS-to-FPGA和轻量级HPS-to-FPGA桥;Peripheral Pins页把外设信号引出到HPS专用引脚或FPGA引脚;SDRAM页配置存储控制器。
一个关键概念是“HPS专用I/O”与“FPGA引脚复用”。UART、I2C、SPI、SD/MMC、Ethernet的引脚在SoC芯片上通常有固定位置,若选择HPS专用引脚,则这些信号不占用FPGA逻辑资源,也不出现在FPGA的引脚分配中;若选择FPGA引脚,则信号需经FPGA fabric引出,灵活性更高但占用逻辑与引脚资源。教学示例中,我们让UART0走HPS专用引脚用于Linux控制台,I2C0与SPI0走HPS专用引脚连接板载EEPROM与传感器,Ethernet与SD/MMC也使用HPS专用引脚,以贴近常见开发板设计。
二、配置SDRAM控制器
HPS的SDRAM控制器支持DDR2、DDR3、DDR3L、LPDDR2等类型。配置时需与开发板实际内存颗粒一致,否则U-Boot阶段就会因内存训练失败而无法启动。主要参数包括:Memory Type(如DDR3)、Data Width(常见32位或16位)、Row/Column/Bank地址位宽、Chip Select数量、时序参数(tRCD、tRP、tRAS、CL、CWL等)。这些参数通常由开发板厂商提供,或依据内存颗粒数据手册计算。
以一条常见DDR3配置为例:容量1GB、位宽32位、行地址14位、列地址10位、Bank地址3位、CL=7、tRCD=7、tRP=7。Platform Designer会根据这些值生成SDRAM控制器的初始化寄存器序列,并在后续由U-Boot的SPL/preloader执行内存校准。配置完成后,HPS的SDRAM地址空间通常映射到0x0000_0000起始的物理地址,Linux内核通过设备树中的memory节点描述其大小。
三、外设接口配置
HPS外设通过Peripheral Pins页逐项启用。UART用于串口控制台与调试,通常启用UART0,波特率115200、8N1;SPI可连接Flash、ADC或显示屏,需设置主/从模式、时钟极性/相位、片选数量;I2C用于EEPROM、PMIC、传感器,需设置总线速率(100kHz或400kHz);Ethernet(EMAC)需配置PHY接口类型(RGMII/MII)、MDIO地址与PHY时钟;SD/MMC用于eMMC或SD卡启动,需选择总线宽度(4位或8位)与电压模式。
这些外设在HPS内部都有固定的寄存器基地址,例如UART0通常位于0xFFC0_2000附近,I2C0位于0xFFC0_4000附近,SD/MMC位于0xFF70_4000附近。Platform Designer不会改变这些硬核地址,但会在生成系统时把它们写入地址映射表,供后续设备树与驱动使用。若外设信号选择走FPGA引脚,则还需在FPGA侧添加相应的引脚约束与IO标准。
四、FPGA-to-HPS与HPS-to-FPGA桥接
桥接是HPS与FPGA逻辑协同工作的核心。HPS-to-FPGA桥让HPS(MPU或DMA)访问FPGA中的Avalon-MM从设备,例如自定义寄存器、DMA缓冲或视频流水线;FPGA-to-HPS桥则让FPGA逻辑访问HPS的SDRAM或片上RAM,常用于FPGA采集数据后直接写入DDR。轻量级HPS-to-FPGA桥(Lightweight)提供32位、低延迟通道,适合访问控制寄存器;完整HPS-to-FPGA桥支持更高带宽与突发传输,适合大数据量场景。
在Platform Designer中,桥接表现为HPS组件上的master/slave接口。将FPGA侧自定义IP的Avalon-MM slave接口连接到HPS的“hps_0.h2f_axi_master”或“hps_0.h2f_lw_axi_master”,即可建立HPS-to-FPGA通路;将FPGA侧master接口连接到“hps_0.f2h_axi_slave”,即可建立FPGA-to-HPS通路。连接后必须在Address Map页为每个从设备分配基地址,避免地址重叠。
五、地址映射与系统生成
所有连接完成后,进入Address Map页。Platform Designer会为每个从设备分配基地址与地址范围。需要重点检查三类冲突:HPS内部外设地址与FPGA从设备地址是否重叠;多个FPGA从设备之间是否重叠;桥接地址范围是否超出HPS可访问窗口。典型分配如下:HPS-to-FPGA轻量级桥基地址0xFF20_0000,范围64KB;HPS-to-FPGA完整桥基地址0xC000_0000,范围256MB;FPGA-to-HPS桥让FPGA访问SDRAM的0x0000_0000。这些地址必须与后续设备树中的reg属性一致,否则驱动会读写到错误位置。
生成系统时,Platform Designer会输出Verilog/VHDL顶层、Qsys系统文件(.qsys)以及用于U-Boot的硬件描述文件(如.sopcinfo)。在Quartus中例化该顶层并完成引脚分配、时序约束后,即可编译生成.sof。随后用SoC EDS工具将.sof转换为preloader所需的.rbf,并生成设备树源文件。至此,HPS系统在硬件层面构建完成,下一步是让U-Boot与Linux识别这些外设与内存。
六、配置检查清单
| 检查项 | 典型值/要求 | 判断依据 |
|---|---|---|
| SDRAM类型与位宽 | DDR3 / 32bit / 1GB | 与开发板内存颗粒一致 |
| UART0 | 115200 8N1,HPS专用引脚 | 串口可打印preloader日志 |
| I2C0速率 | 100kHz或400kHz | EEPROM可被i2cdetect识别 |
| SD/MMC总线宽度 | 4bit或8bit | SD卡可被U-Boot读取 |
| H2F LW基地址 | 0xFF20_0000,64KB | 与设备树reg一致 |
| F2H桥 | 使能,访问SDRAM | FPGA可写入DDR并被Linux读取 |
完成上述配置后,建议先在Platform Designer中执行“Generate HDL”,检查是否有未连接接口或地址冲突警告;再在Quartus中编译,确认时序收敛。只有硬件系统稳定,后续的preloader、U-Boot与Linux内核才能在此基础上正确初始化内存与外设。