紫光PGL22G FPGA上跑Cortex-M1软核,从Keil编译到PDS烧录的完整避坑指南 紫光PGL22G FPGA上跑Cortex-M1软核从Keil编译到PDS烧录的完整避坑指南当黑金PGL22G开发板遇上ARM Cortex-M1软核一场硬件与软件的深度对话就此展开。对于初次接触紫光FPGA软核开发的工程师或学生而言从Keil工程配置到最终程序烧录的完整流程中每个环节都可能隐藏着意想不到的坑。本文将带你穿越这片技术丛林用实战经验照亮每一步操作。1. 开发环境搭建与工程初始化在开始软核之旅前需要确保工具链完整且版本匹配。以下是经过验证的开发环境组合Keil MDKV5.15.0官方测试版本ARM CMSIS5.6.0 packCortex-M1专用固件库PDS工具链2020.3紫光官方EDA工具注意不同版本工具可能存在兼容性问题建议严格按此配置官方提供的示例工程包包含两个关键压缩文件pgr_FPGA_Cortex_M1_PGL22_324_eval.rar pgr_FPGA_Cortex-M1_eval_v1_2.rar解压后需特别注意路径规范放置到无中文和空格的目录将pgr_ARM_Cortex_M1_PGL22_324_eval文件夹移动到pgr_FPGA_Cortex-M1_eval/rtl_design内最终目录结构应如下pgr_FPGA_Cortex-M1_eval └── rtl_design ├── pgr_ARM_Cortex_M1_PGL22_324_eval └── ...2. Keil工程关键配置解析LED示例工程位于software_design/module_design/Cortex-M1_led/PROJECT打开.uvprojx文件后需要特别关注三个核心配置2.1 存储器地址配置Cortex-M1软核支持两种存储模式配置类型ROM地址RAM地址使用场景无CACHE模式0x000000000x20000000简单应用带CACHE模式0x100000000x30000000性能敏感型应用对于PGL22G开发板必须使用带CACHE的配置IROM1Start0x10000000Size0x1000000IRAM1Start0x30000000Size0x1000002.2 二进制文件生成设置在User标签页配置以下关键命令Run #1: $(KEIL_PATH)\ARM\ARMCC\bin\fromelf.exe --bin -o cortex_M1_led.bin .\Objects\cortex_M1_led.axf Run #2: make_hex.exe cortex_M1_led.bin编译完成后将生成的cortex_M1_led.bin复制到pgr_ARM_Cortex_M1_PGL22_324_eval/pnr/generate_bitstream2.3 常见编译问题排查错误1Error: L6236E: No section matches selector...检查ROM/RAM地址是否与软核配置一致确认CMSIS包已正确安装错误2Undefined symbol SystemInit确认已包含startup_Cortex-M1.s启动文件检查分散加载文件(.sct)配置3. PDS工程烧录全流程3.1 生成sbit文件打开ARM_M1_SoC_Top.pds工程右键点击Generate Bitstream选择Rerun All等待编译完成约8-10分钟关键点确保pnr目录下存在itcm0~itcm3四个引导文件3.2 文件格式转换PGL22G支持两种烧录方式文件格式存储位置掉电保持适用场景.sbitFPGA内部否临时调试.sfc外部FLASH是最终产品转换步骤在PDS中选择Operations → Convert File配置FLASH参数厂家WINBOND型号W25Q128Q读模式SPI X4, 24-bit address设置文件路径sbit起始地址0x0bin文件起始地址0x000C00003.3 烧录与验证连接JTAG下载器开发板上电点击Configuration → Boundary Scan右键扫描设备加载.sfc文件选中Outer Flash右键选择Program烧录完成后通过串口助手115200bps观察输出正常应看到如下信息PANGO Cortex-M1 Start Run... JEDEC id 0xEF4018同时开发板LED应呈现规律闪烁。4. 深度调试技巧4.1 仿真环境搭建对于复杂问题硬件仿真不可或缺重新编译Modelsim库vlib work vmap work work拷贝usim文件夹到Simulation目录修改应用工程的Run #2命令make_hex128.exe cortex_M1_demo.bin将生成的mem_xxx.dat文件复制到仿真目录4.2 波形调试要点在Modelsim中重点关注以下信号HADDR指令地址总线HWDATA写入数据总线HRDATA读取数据总线典型调试流程运行sim.bat启动仿真等待软核初始化完成约600,000,000,000 fs添加关键信号到波形窗口设置触发条件捕获问题点4.3 性能优化建议通过修改cm1_option_defs.v可以启用高级功能// 启用DMA加速 #define INCLUDE_DMA 1 // 调整Cache大小 #define ICACHE_SIZE 16 #define DCACHE_SIZE 165. 实战经验分享在实际项目开发中有几点特别值得注意存储布局规划应用程序bin文件默认从0x000C0000开始存放如需更大空间需同步修改PDS工程中的Flash分区设置Keil工程中的ROM地址范围Bootloader的跳转地址中断处理优化Cortex-M1的中断向量表位于0x10000000在Keil中需正确定义// 中断向量表示例 __attribute__((section(VECTOR))) const uint32_t vector_table[] { (uint32_t)__initial_sp, (uint32_t)Reset_Handler, // ...其他中断处理函数 };电源管理技巧当系统空闲时可通过WFI指令降低功耗__WFI(); // 等待中断