DE1-SoC实战指南:在Qsys/Platform中集成GHRD工程与扩展SPI外设——(de1教程2.5节)

张开发
2026/4/12 0:01:15 15 分钟阅读

分享文章

DE1-SoC实战指南:在Qsys/Platform中集成GHRD工程与扩展SPI外设——(de1教程2.5节)
1. 理解GHRD工程与Qsys平台第一次接触DE1-SoC开发板时最让我头疼的就是如何在HPS和FPGA之间建立高效通信。直到发现了GHRDGolden Hardware Reference Design工程这个宝藏它就像乐高套装里的基础底板提供了完整的硬件参考设计框架。GHRD工程预置了HPS与FPGA的AXI总线连接、时钟网络和复位系统省去了从零搭建的麻烦。在Quartus Prime环境中Platform Designer旧称Qsys是构建片上系统的核心工具。我习惯把它想象成硬件版的IDE通过图形化界面拖拽IP核就能完成复杂系统搭建。最近用Quartus 21.1版本时发现Platform Designer的自动连线功能比早期版本智能不少能自动识别匹配的接口类型。为什么选择GHRD作为起点实测发现直接从空白工程开始搭建HPS-FPGA系统光是调试AXI桥接就会消耗大量时间。而GHRD已经验证过的H2F_LW_AXI_Master连接方案相当于帮我们趟平了最复杂的部分。记得有次为了调试自定义DMA控制器用GHRD工程只花了半天就实现了数据互通自己从头搭建却折腾了整整一周。2. 导入GHRD工程到Platform Designer从友晶官网下载的GHRD压缩包通常包含这些关键文件soc_system.qsysQsys系统描述文件soc_system_top.vVerilog顶层模块hps_isw_handoffHPS初始化配置具体操作步骤在Quartus中新建工程时建议直接选择GHRD工程目录作为工作目录双击soc_system.qsys文件会自动启动Platform Designer导入后先别急着修改我习惯先点击System - Report - System Contents生成系统报告遇到过的一个典型坑点不同Quartus版本间的兼容性问题。有次用17.1版本打开21.1创建的工程结果AXI总线时钟域显示异常。后来发现需要在Project - Archive Project时勾选Save file copies in archive才能完整保存所有依赖文件。3. 扩展SPI外设的完整流程3.1 添加SPI IP核在Platform Designer左侧的IP Catalog面板搜索SPI会看到两个关键IPSPI (3-wire)标准三线制接口SPI (4-wire)带片选信号的完整接口以4线制为例双击添加后需要配置这些参数Clock Divider根据外设速度需求设置DE1-SoC的FPGA时钟通常50MHz给SPI Flash配置分频值8得到6.25MHzData Width8位模式最常用Shift DirectionMSB-first符合大多数器件规范连线技巧将clock_source连接到clk_0.clk50MHz主时钟reset_source接clk_0.clk_resetspi_0.irq连接到hps_0.f2h_irq0实现中断功能3.2 总线连接与地址分配SPI控制器作为从设备需要挂载到AXI总线上。DE1-SoC推荐使用轻量级总线H2F_LW_AXI_Master在Connections标签页找到hps_0.h2f_lw_axi_master将其与spi_0.axi_interface连线右键点击连线选择Set Clock指定clk_0.clk地址冲突是常见问题我的解决流程1. 锁定已有IP的基地址点击地址栏的锁图标 2. 菜单选择System - Assign Base Addresses 3. 检查spi_0的地址范围是否与其它设备重叠3.3 导出接口与顶层修改在Export列双击spi_0.external接口重命名为spi_0_export便于识别。生成系统时要注意点击Generate - Generate HDL生成硬件描述文件使用Show Instantiation Template查看端口列表在Quartus中打开soc_system_top.v添加如下信号output wire spi_0_MISO, input wire spi_0_MOSI, input wire spi_0_SCLK, input wire spi_0_SS_n4. 引脚分配与硬件验证4.1 物理引脚映射在Pin Planner中分配SPI信号时建议选择GPIO Header上的引脚spi_0_MISO- PIN_AG12 (GPIO1[24])spi_0_MOSI- PIN_AF12 (GPIO1[25])spi_0_SCLK- PIN_AF13 (GPIO1[26])spi_0_SS_n- PIN_AG13 (GPIO1[27])电平标准设置为3.3V LVTTL特别要注意DE1-SoC的FPGA Bank 3和Bank 7支持不同电压标准。曾经因为没注意这个细节导致SPI Flash无法正常通信。4.2 硬件测试方法编译生成sof文件后可以通过以下方式验证JTAG直接下载使用SignalTap II逻辑分析仪抓取SPI波形HPS控制测试编写Linux应用程序通过/dev/mem直接访问AXI寄存器示波器测量观察SCLK和MOSI信号时序一个实用的调试技巧在Quartus中设置虚拟管脚(Virtual Pin)保留信号方便后期用SignalTap调试set_instance_assignment -name VIRTUAL_PIN ON -to spi_0_*5. 系统集成与性能优化5.1 时钟域交叉处理当SPI设备需要不同时钟频率时建议在Platform Designer中添加PLL核生成所需时钟使用Clock Bridge隔离时钟域对AXI总线添加Pipeline阶段改善时序实测数据表明在100MHz主频下添加两级寄存器可将SPI时序裕量从-0.5ns提升到2.1ns。5.2 中断优化配置多个外设共享中断线时需要在HPS侧配置中断控制器在hps_0配置页使能f2h_irq0设置SPI中断优先级高于UARTLinux设备树中需要声明中断号spi0x1000 { interrupts 0 55 4; };5.3 批量数据传输技巧通过DMA提升SPI传输效率添加DMA Controller IP核配置Memory Mapped to Stream模式连接SPI的data_from_cpu和data_to_cpu端口在DE1-SoC上实测DMA传输比CPU轮询方式快15倍以上尤其适合大数据块操作。不过要注意配置正确的FIFO深度我一般设置为传输数据量的1.5倍。6. 常见问题排查指南问题1SPI时钟无输出检查clk_0是否连接到SPI控制器验证reset_source是否保持低电平确认AXI总线arready和awready信号是否拉高问题2Linux系统无法识别设备检查设备树是否包含SPI节点使用devmem2 0xffc25080读取AXI寄存器值确认spidev驱动已编译进内核问题3数据传输错误用示波器检查信号完整性调整SPI模式(CPOL/CPHA)设置在Platform Designer中增加AXI总线超时值有次遇到特别诡异的问题SPI只能在低温下工作。后来发现是PCB走线过长导致信号反射通过降低时钟频率到1MHz解决。这个案例告诉我硬件调试永远不能只看软件层面。

更多文章