深入Platform Designer:手把手教你为DE10-Standard SoC添加自定义PIO外设(以七段数码管为例)
深入Platform Designer手把手教你为DE10-Standard SoC添加自定义PIO外设以七段数码管为例在嵌入式系统开发中FPGA与处理器的协同工作能力为设计带来了极大的灵活性。DE10-Standard开发板搭载的Cyclone V SoC芯片完美融合了FPGA的可编程逻辑与ARM硬核处理器的强大计算能力而Platform Designer原Qsys则是连接两者的关键桥梁。本文将从一个实际案例出发详细讲解如何通过Platform Designer为现有SoC系统添加新的PIO外设并以七段数码管控制为例揭示FPGA与HPS之间通过内存映射进行通信的核心机制。1. 理解SoC系统中的PIO外设架构1.1 SoC系统中的FPGA与HPS分工Cyclone V SoC芯片内部包含两个主要部分FPGA现场可编程门阵列和HPS硬核处理器系统。FPGA负责实现可定制的数字逻辑电路而HPS则运行Linux操作系统处理复杂计算任务。两者通过AXI总线进行高速数据交互这种架构既保留了处理器的通用性又发挥了FPGA的并行计算优势。在DE10-Standard开发板上FPGA端已经预配置了LED、按键等基础外设但实际项目中我们经常需要扩展更多自定义外设。七段数码管作为常见的显示设备其控制逻辑正好适合作为PIO外设的典型案例。1.2 Platform Designer中的关键组件Platform Designer作为Quartus Prime中的系统集成工具主要负责管理SoC系统中各组件间的连接关系。在添加新外设时需要特别关注以下核心组件AXI桥接器包括fpga_only_master和mm_bridge负责FPGA与HPS之间的数据传输PIO IP核可编程输入输出接口用于连接外部设备时钟与复位网络确保各组件同步工作地址空间分配为每个外设分配唯一的地址范围提示在Platform Designer中master表示主设备slave表示从设备。FPGA既可以作为主设备访问HPS资源也可以作为从设备被HPS控制。2. 准备开发环境与工程文件2.1 硬件与软件需求开始前请确保已准备好以下环境DE10-Standard开发板及配套电源安装Quartus Prime 18.1标准版含SoC EDS组件串口调试工具如MobaXterm预装Linux系统的SD卡2.2 获取并配置黄金参考工程友晶科技提供的DE10-Standard黄金参考工程已经配置好了基础外设我们可以在此基础上进行扩展从官网下载DE10-Standard_v.1.3.0_SystemCD压缩包解压到纯英文路径如D:\DE10_Standard打开Quartus工程文件Demonstration/SoC_FPGA/DE10_Standard_GHRD.qpf# 工程目录结构示例 DE10_Standard_GHRD/ ├── output_files/ ├── soc_system/ ├── software/ └── DE10_Standard_GHRD.qpf2.3 验证基础功能在开始修改前建议先编译并运行原始工程确认LED控制功能正常全编译Quartus工程生成预装载文件(.sof和.rbf)更新SD卡中的系统文件通过串口终端运行HPS_FPGA_LED测试程序3. 添加七段数码管PIO外设3.1 分析现有系统架构打开Platform Designer界面可以看到原始系统已包含三个PIO组件组件名称类型位宽连接方式led_pio输出10mm_bridge.m0, fpga_masterbutton_pio输入4mm_bridge.m0, fpga_masterswitch_pio输入10mm_bridge.m0, fpga_master顶层Verilog文件中已定义但未实例化的数码管信号module DE10_Standard_GHRD ( // 已定义但未使用的数码管信号 output wire [6:0] HEX0, output wire [6:0] HEX1, // ...其他HEX信号 );3.2 创建数码管PIO组件在Platform Designer中添加新的PIO组件在IP Catalog中搜索PIO双击PIO (Parallel I/O) Intel FPGA IP配置参数Width: 7对应数码管的7个段Direction: Output重命名为hex0_pio关键配置界面如下PIO Configuration ├── Basic │ ├── Width: 7 │ └── Direction: Output └── Input Options ├── Synchronous: Yes └── Edge Capture: No3.3 连接系统总线新添加的PIO需要正确连接到系统总线时钟连接hex0_pio.clk → clk_0.clk复位连接hex0_pio.reset → clk_0.clk_reset数据连接hex0_pio.s0 → mm_bridge_0.m0主设备连接hex0_pio.s0 → fpga_only_master.master注意AXI总线连接必须确保主从关系正确fpga_only_master作为主设备mm_bridge作为中间桥梁PIO作为从设备。3.4 分配地址空间完成连接后需要为hex0_pio分配地址空间点击菜单System → Assign Base Addresses系统会自动分配基地址和结束地址记录分配的地址范围如0x10010000-0x1001000f地址分配后Platform Designer中的显示示例组件BaseEndhex0_pio0x100100000x1001000fled_pio0x100000000x1000000f3.5 生成HDL文件完成所有配置后点击Generate → Generate HDL等待生成过程完成约1-2分钟点击Generate → Show Instantiation Template获取实例化代码生成的实例化模板示例hex0_pio hex0_pio ( .clk (clk_clk), // input, width 1, clk.clk .reset_n (reset_reset_n), // input, width 1, reset.reset_n .address (mm_bridge_0_m0_address), // input, width 8, s0.address .write_n (mm_bridge_0_m0_write), // input, width 1, .write_n .writedata (mm_bridge_0_m0_writedata), // input, width 32, .writedata .read_n (mm_bridge_0_m0_read), // input, width 1, .read_n .readdata (mm_bridge_0_m0_readdata), // output, width 32, .readdata .out_port (hex0_pio_external_connection_export) // output, width 7, external_connection.export );4. 更新硬件设计文件4.1 修改顶层Verilog文件将Platform Designer生成的实例化代码整合到顶层设计中打开DE10_Standard_GHRD.v文件在soc_system实例化部分添加hex0_pio连接将external_connection映射到HEX0端口修改后的代码片段soc_system u0 ( // 已有连接... .hex0_pio_external_connection_export (HEX0), // 新增数码管连接 // 其他连接... );4.2 全编译工程完成代码修改后保存所有文件CtrlS执行全编译Processing → Start Compilation检查编译报告中的警告和错误编译成功后在output_files目录下会生成新的.sof和.rbf文件。5. 更新软件环境5.1 生成硬件头文件SoC系统需要硬件描述头文件来访问FPGA外设打开SoC EDS Command Shell导航到工程目录执行头文件生成脚本cd /d D:\DE10_Standard\Demonstration\SoC_FPGA\DE10_Standard_GHRD ./generate_hps_qsys_header.sh生成的头文件hps_0.h中包含关键宏定义#define HEX0_PIO_BASE 0x10010000 #define HEX0_PIO_SPAN 16 #define HEX0_PIO_WIDTH 75.2 修改应用程序代码创建或修改HPS应用程序来控数码管在software目录下创建新工程编写控制代码通过内存映射访问PIO示例控制代码片段#include stdio.h #include stdlib.h #include unistd.h #include hps_0.h // 数码管段码定义共阴极 const unsigned char seg_code[10] { 0x3F, // 0 0x06, // 1 0x5B, // 2 0x4F, // 3 0x66, // 4 0x6D, // 5 0x7D, // 6 0x07, // 7 0x7F, // 8 0x6F // 9 }; void display_number(int num) { volatile unsigned int *hex0 (unsigned int *)(VIRTUAL_ADDRESS_BASE HEX0_PIO_BASE); *hex0 seg_code[num % 10]; }5.3 编译并部署应用程序编写Makefile文件在SoC EDS Command Shell中执行make将生成的二进制文件复制到SD卡make clean make cp HPS_FPGA_HEX /media/sd_card/6. 系统集成与测试6.1 更新SD卡系统文件确保SD卡包含最新的硬件配置将新生成的soc_system.dtb和soc_system.rbf复制到SD卡FAT分区将应用程序二进制文件复制到相同分区安全弹出SD卡并插入开发板6.2 运行测试程序通过串口终端操作开发板连接串口终端如MobaXterm挂载SD卡分区运行测试程序mount /dev/mmcblk0p1 /mnt cd /mnt ./HPS_FPGA_HEX6.3 验证功能程序运行后开发板上的七段数码管应显示0-9的循环计数。如果显示异常可检查Platform Designer中的PIO位宽设置顶层文件的信号连接HPS应用程序中的段码定义地址映射是否正确7. 进阶应用与优化7.1 扩展多位数码管控制基于相同的原理可以扩展控制多个数码管在Platform Designer中添加多个PIO实例hex1_pio, hex2_pio等更新顶层文件连接修改应用程序实现多位数显示多位显示的关键在于动态扫描技术需要在HPS程序中快速切换各数码管的显示内容。7.2 优化性能考虑在实际应用中需要考虑以下优化点总线带宽多个PIO外设共享AXI总线带宽需合理分配地址空间中断支持为PIO添加中断功能提高响应速度时钟域交叉如果外设工作在不同时钟域需要添加适当的同步逻辑7.3 调试技巧开发过程中常用的调试方法Signal Tap逻辑分析捕获FPGA内部信号HPS printf调试通过串口输出调试信息内存监视通过/dev/mem直接查看外设寄存器值// 内存监视示例 void monitor_pio(void) { volatile unsigned int *hex0 (unsigned int *)(VIRTUAL_ADDRESS_BASE HEX0_PIO_BASE); printf(HEX0 current value: 0x%x\n, *hex0); }通过Platform Designer扩展自定义PIO外设是SoC开发中的核心技能。从简单的七段数码管控制入手开发者可以逐步掌握更复杂的外设集成技术最终实现完整的定制化嵌入式系统。