在SOC FPGA开发中,使用GHRD(Golden Hardware Reference Design)模板确实能够快速启动项目,但现实开发中我们经常会遇到需要完全自定义硬件系统的场景。比如最近我在做一个工业控制项目,客户要求使用特定型号的DDR3内存,并且需要精简掉模板中不必要的组件,这时候就必须从零开始搭建HPS系统。
Platform Designer(原Qsys)是Intel/Altera提供的一个强大的系统集成工具,它允许我们像搭积木一样构建完整的SOC系统。与直接使用GHRD相比,手动搭建HPS系统主要有三个优势:首先是资源利用率更高,可以只添加项目必需的组件;其次是配置更灵活,每个参数都可以根据实际硬件调整;最后是学习曲线更完整,能深入理解HPS与FPGA的交互机制。
我建议在以下情况选择从零搭建:
首先打开Quartus Prime,创建一个新工程。这里有个小技巧:工程路径最好不要包含中文或空格,我遇到过因为路径问题导致后续工具链报错的坑。选择正确的器件型号非常关键,比如Cyclone V SoC 5CSXFC6D6F31C6NES。
创建完成后,通过Tools->Platform Designer打开系统设计工具。在IP Catalog中搜索"Hard Processor System",双击添加到当前系统。这时候你会看到一个红色的HPS模块出现在工作区,这表示它还没有进行任何配置。
右键点击HPS模块选择Edit,进入配置界面。第一个要注意的是Boot选项:
在FPGA Interfaces标签页中,General部分的配置会影响HPS暴露给FPGA的接口类型。比如:
这里我通常会启用所有调试接口,等系统稳定后再根据需要禁用,毕竟硬件重构比软件修改成本高得多。
AXI桥是HPS与FPGA通信的核心通道,配置不当会导致性能瓶颈。在AXI Bridge标签页中:
实际项目中,我一般会把主数据通道设为128bit,控制通道保持32bit。曾经有个图像处理项目,因为AXI位宽设错导致帧率只有预期的一半,排查了好久才发现是这个配置问题。
FPGA-to-HPS SDRAM Interface允许FPGA直接访问HPS的内存,这对数据共享非常重要。配置时需要注意:
这里有个性能优化技巧:如果FPGA需要频繁访问内存区域,可以专门分配一个独立的SDRAM接口,避免与其他主设备冲突。
在Interrupts标签页中,使能FPGA-to-HPS Interrupts后,可以配置多达64个中断信号。对于实时性要求高的外设,建议分配独立的中断号。
DMA Peripheral Request部分可以启用硬件DMA通道。一个常见的误区是以为启用越多越好,实际上每个启用的DMA通道都会占用HPS资源。我的经验法则是:只启用实际使用的通道,其他保持禁用。
Peripheral Pin Multiplexing可能是最容易出错的部分。这里需要根据实际硬件连接来配置每个外设的引脚分配。几个关键点:
我曾经遇到过一个坑:开发板的USB转串口用的是HPS_UART1,但默认配置是HPS_UART0,导致怎么也收不到数据。所以一定要对照开发板原理图检查每个外设的引脚分配。
HPS时钟系统相当复杂,包含多个PLL和时钟域。在HPS Clocks标签页中:
Input Clocks部分:
Output Clocks部分:
时钟配置的黄金法则是:先确定各个外设的时钟需求,然后反向推导PLL配置。比如:
PHY Settings是确保内存稳定工作的关键。主要参数包括:
我曾经调试过一个DDR3不稳定问题,最后发现是termination设置不对。建议先用Altera的默认设置,如果发现问题再根据内存芯片手册调整。
Memory Parameters需要严格遵循内存芯片手册:
这里有个实用技巧:可以先用Auto Configuration生成初始值,然后手动微调。记得保存不同配置的版本,方便出现问题后回退。
Board Settings补偿板级信号完整性影响:
对于开发板,通常可以使用默认设置。如果是自定义板卡,建议通过信号完整性仿真获取准确参数。
完成HPS配置后,需要添加FPGA侧的配套组件:
添加组件时要注意总线位宽匹配。比如On-chip Memory的数据位宽应该与连接的AXI总线一致,否则Platform Designer会自动插入位宽转换逻辑,增加资源消耗。
对于特殊需求,可以开发自定义组件。比如下面这个中断捕获器的Verilog代码:
verilog复制module intr_capturer #(
parameter NUM_INTR = 32
)(
input clk,
input rst_n,
input [NUM_INTR-1:0] interrupt_in,
input addr,
input read,
output [31:0] rddata
);
// 实现代码...
endmodule
在Platform Designer中创建新组件时,要注意正确设置Avalon-MM接口信号,特别是waitrequest和readdatavalid这类流控信号,否则会导致总线死锁。
将所有组件连接到HPS的AXI总线时,Platform Designer会自动插入AXI-Avalon桥接器。对于性能敏感路径,建议:
我曾经优化过一个视频处理系统,通过调整AXI总线优先级,将处理延迟降低了30%。
系统会自动分配基地址,但手动调整可以优化内存布局:
特别要注意HPS外设的地址空间不能与FPGA侧外设冲突。
点击Generate按钮后,Platform Designer会:
生成过程中要特别注意警告信息,比如时钟交叉域或地址重叠等问题。
将生成的系统集成到Quartus工程:
一个常见的错误是忘记连接hps_0_h2f_reset信号,导致HPS无法正确初始化。
全编译前建议:
编译成功后,将.sof文件下载到开发板。第一次启动建议通过JTAG调试,确认所有组件正常工作后再烧写固化。
System Console是强大的硬件调试工具,可以通过Tcl命令:
例如读取PIO状态的命令:
tcl复制master_read_32 $hps_master 0x10000040 1
对于复杂问题,可以使用Signal Tap逻辑分析仪:
配置Signal Tap时要注意采样深度和时钟的选择,确保能捕获完整的调试信息。
记得保存每个调试阶段的配置和结果,建立完整的调试日志。