1. 课程导入与开发环境搭建
PolarFire SoC 是 Microchip 推出的混合架构 FPGA 器件,它在同一颗芯片上集成了 FPGA 可编程逻辑(Fabric)与一个基于 RISC-V 指令集的五核处理器子系统(MSS)。理解这套架构,是后续所有实时控制开发工作的起点。与传统的“FPGA + 外挂 CPU”方案不同,PolarFire SoC 的处理器子系统与可编程逻辑之间通过高带宽的 AXI 总线矩阵直接耦合,使得确定性实时控制回路可以部分放在硬件逻辑中执行,部分放在 RISC-V 核上调度,从而兼顾硬实时响应与软件灵活性。
1.1 PolarFire SoC 架构概览
从开发者的视角看,PolarFire SoC 可以划分为四个关键层次。最底层是 FPGA Fabric,包含逻辑单元、DSP 切片、块 RAM 以及高速收发器,负责实现自定义的 PWM 生成、编码器接口、ADC 采样时序等对时间敏感的功能。其上是处理器子系统 MSS,内含一个 E51 监控核(Monitor Core)和四个 U54 应用核(Application Cores),五核均为 64 位 RISC-V,支持 RV64GC 指令集与 Linux 运行能力。E51 核通常用于启动管理、系统监控和实时任务,U54 核可运行 Linux 或裸机实时程序。
第三层是存储与互连资源。MSS 内部集成了 L2 缓存、DDR 控制器、eNVM 非易失存储以及多个 AXI 主从端口,Fabric 与 MSS 之间通过 AXI 交换网络通信,开发者可以用 Libero 的 SmartDesign 工具把自定义 IP 挂载到这条总线上。第四层是外设与 I/O,包括 GPIO、UART、SPI、I2C、CAN、以太网 MAC 以及用于实时控制的 PWM、QSPI 等接口。对于电机控制、数字电源、工业伺服等场景,PolarFire SoC 的典型用法是:在 Fabric 中实现电流环和 PWM 调制,在 U54 核上运行速度环与通信协议栈,E51 核负责安全监控与故障保护。
1.2 实时控制应用场景
PolarFire SoC 在实时控制领域的典型应用包括三相电机磁场定向控制(FOC)、数字电源的电压电流双环控制、工业机器人的多轴伺服同步,以及光伏逆变器的并网控制。这些场景的共同特征是:控制周期通常在 10 μs 到 100 μs 之间,要求采样、计算、PWM 更新在严格的时间窗口内完成,且抖动必须可控。以 FOC 为例,一个完整的电流环周期包含 ADC 触发采样、Clarke/Park 变换、PI 调节、反 Park 变换和 SVPWM 更新,若全部在软件中执行,U54 核在 600 MHz 主频下大约需要 2~3 μs;若把 Park 变换和 PI 调节放入 Fabric 硬件加速,软件只需处理外环和通信,控制周期可压缩到 5 μs 以内。这种软硬件协同的划分方式,正是 PolarFire SoC 区别于普通 MCU 的核心价值。
1.3 工具链安装:Libero SoC 与 SoftConsole
开发 PolarFire SoC 需要两套工具协同工作。Libero SoC 负责 FPGA 逻辑设计、约束、综合、布局布线和比特流生成,同时提供 SmartDesign 用于搭建 MSS 与 Fabric 的互连。SoftConsole 则是基于 Eclipse 的 RISC-V 软件开发环境,用于编写、编译和调试运行在 E51/U54 核上的 C/C++ 程序。两者通过 Libero 生成的硬件描述文件(.xml 或 .hdf)关联,SoftConsole 导入该文件后即可获得正确的内存映射和外设地址。
安装顺序建议如下:先安装 Libero SoC(当前主流版本为 2024.1 或更高),安装时勾选 PolarFire SoC 器件支持包和 ModelSim 仿真器;再安装 SoftConsole,注意选择与 Libero 版本匹配的发行版,避免 RISC-V 工具链版本冲突。安装完成后,需要配置许可证(License),Libero 的免费 Silver 许可证即可支持 PolarFire SoC 的基本开发,但部分高级 IP 需要完整许可证。验证安装是否成功的方法:打开 Libero,新建一个 PolarFire SoC 工程,确认器件列表中能看到 MPFS250T 等型号;打开 SoftConsole,确认能创建 RISC-V 裸机工程并成功编译。
C:\Microchip\ 或 /opt/microchip/ 下。1.4 首个 Hello World 工程创建与调试
第一个工程的目标是:在 PolarFire SoC 的 U54 核上运行裸机程序,通过 UART 输出 “Hello PolarFire SoC”,并用 SoftConsole 的调试器观察变量和寄存器。具体步骤如下。
第一步,在 Libero 中创建工程。选择器件型号 MPFS250T,工程名设为 hello_pf_soc。在 SmartDesign 中拖入 MSS 组件,使用默认配置即可,但需要确认 UART0 已使能并映射到合适的引脚。生成设计后,Libero 会输出一个 .xml 硬件描述文件,记录 MSS 的地址映射和中断分配。
第二步,在 SoftConsole 中新建工程。选择 “Microchip RISC-V Bare Metal C Project”,导入上一步生成的 .xml 文件。SoftConsole 会自动生成链接脚本和启动代码,其中栈指针、堆区和各外设基地址均已根据硬件描述配置好。此时工程结构中会出现 src/、platform/ 和 hdr/ 等目录。
第三步,编写主程序。在 main.c 中调用 Microchip 提供的 HAL 库函数初始化 UART 并输出字符串。示例代码如下:
#include "mss_uart.h"
#include "core_uart_apb.h"
#define UART0_BASE 0x20100000UL
int main(void)
{
MSS_UART_init(&g_mss_uart0,
UART0_BASE,
MSS_UART_115200_BAUD,
MSS_UART_DATA_8_BITS | MSS_UART_NO_PARITY | MSS_UART_ONE_STOP_BIT);
MSS_UART_polled_tx_string(&g_mss_uart0,
(const uint8_t *)"Hello PolarFire SoC\r\n");
while (1) {
/* 保持运行,便于调试器观察 */
}
return 0;
}
第四步,编译并下载。点击 Build 后,SoftConsole 会调用 RISC-V GCC 生成 .elf 文件。通过 FlashPro 或 JTAG 将程序下载到 eNVM 或 DDR 中运行。若使用调试模式,SoftConsole 会在 main 函数入口处暂停,此时可以单步执行,观察 g_mss_uart0 结构体中的波特率分频值是否正确,并在串口终端(如 PuTTY,115200-8-N-1)中确认输出内容。
第五步,结果判断。如果串口终端显示 “Hello PolarFire SoC”,说明工具链、硬件描述导入、UART 初始化和下载流程全部正确。如果无输出,按以下顺序排查:确认 UART0 引脚约束是否与开发板原理图一致;用示波器测量 UART TX 引脚是否有波形;检查波特率分频寄存器是否被正确写入;确认程序确实运行到了 MSS_UART_polled_tx_string 调用处,而非卡在启动代码的异常处理中。