紫光PGL22G FPGA上构建Cortex-M1软核系统的全流程实战指南
1. 开发环境搭建与工具链配置
在开始紫光PGL22G FPGA上的Cortex-M1软核开发前,我们需要完成开发环境的搭建。与常见的STM32开发不同,FPGA软核开发需要同时处理硬件描述和软件编程两个维度。
必备工具清单:
- Keil MDK开发环境(推荐V5.15及以上版本)
- ARM CMSIS软件包(5.6.0版本)
- 紫光PDS开发工具(2020.3版本)
- 官方评估板支持包(包含RTL设计和示例工程)
环境配置中的几个关键点需要注意:
- 安装路径避免中文字符和空格
- CMSIS软件包需通过Keil的Pack Installer获取
- PDS工具需要正确的license配置
提示:建议保持工具版本与官方测试环境一致,可减少兼容性问题
工具安装完成后,项目目录结构应如下所示:
pgr_FPGA_Cortex-M1_eval/ ├── rtl_design/ │ └── pgr_ARM_Cortex_M1_PGL22_324_eval/ └── software_design/ ├── boot/ └── module_design/2. Keil工程配置详解
2.1 工程架构解析
打开示例LED工程(位于software_design/module_design/Cortex-M1_led),我们会发现其工程结构与常规ARM工程存在显著差异:
- 启动文件:使用专用的
startup_Cortex-M1.s汇编文件 - 链接脚本:通过Keil的Target选项直接配置,而非独立的ld文件
- 外设库:基于CMSIS封装了针对FPGA的特定驱动
2.2 存储器地址配置
Cortex-M1软核的存储器配置是开发中的第一个关键点。根据是否使用Cache,存在两种配置模式:
| 配置类型 | ROM地址 | RAM地址 | 备注 |
|---|---|---|---|
| 无Cache | 0x00000000 (ITCM) | 0x20000000 (DTCM) | 直接访问模式 |
| 有Cache | 0x10000000 (ICACHE) | 0x30000000 (DCACHE) | 推荐配置 |
在Keil的Target选项中,我们需要设置:
IROM1: 0x10000000, Size: 0x1000000 IRAM1: 0x30000000, Size: 0x100000注意:ICACHE指令起始地址必须为0x10000000,DCACHE数据起始地址必须为0x30000000,超出映射范围会导致运行错误
2.3 二进制文件生成配置
FPGA软核开发需要生成特定格式的二进制文件,这通过Keil的User选项卡配置:
- Run #1命令:
fromelf.exe --bin -o cortex_M1_led.bin .\Objects\cortex_M1_led.axf- Run #2命令:
make_hex.exe cortex_M1_led.bin关键点说明:
fromelf工具路径需指向本地Keil安装目录- Run #2生成的ITCM文件在应用工程中实际不会使用
- 最终需要的只是Run #1生成的.bin文件
3. 程序烧录与硬件调试
3.1 文件转换流程
紫光PGL22G FPGA的程序烧录需要将多个文件合并转换为特定格式:
- sbit文件:FPGA配置比特流
- bin文件:应用程序二进制
- sfc文件:最终烧录到Flash的组合文件
转换参数示例:
Flash型号: W25Q128Q sbit起始地址: 0x00000000 bin起始地址: 0x000C0000 读模式: SPI X4, 24-bit address3.2 烧录步骤
- 连接JTAG调试器与开发板
- 在PDS工具中执行Boundary Scan识别设备
- 选择生成的sfc文件进行编程
- 等待Flash编程完成(约1-2分钟)
3.3 串口调试
烧录完成后,可通过串口观察程序输出:
- 波特率:115200
- 数据位:8
- 停止位:1
- 无校验
典型的成功输出如下:
PANGO Cortex-M1 Start Run... JEDEC id = 0xEF40184. 仿真与调试技巧
4.1 无Boot仿真方法
为加速开发周期,可以采用跳过Bootloader的仿真方式:
- 修改应用工程的Run #2命令:
make_hex128.exe cortex_M1_demo.bin生成三个关键文件:
- mem_addr.dat
- mem_data.dat
- mem_used.dat
将这些文件复制到RTL工程的Simulation目录
4.2 Modelsim仿真配置
仿真环境搭建步骤:
- 编译Pango仿真库(约需2分钟)
- 拷贝usim文件夹到仿真目录
- 运行sim.bat启动仿真
常见问题解决:
** Error: (vish-42) Unsupported ModelSim library format...→ 重新编译仿真库即可解决
4.3 波形分析技巧
在仿真波形中重点关注:
- HADDR信号:查看指令执行地址
- HWDATA信号:观察数据变化
- GPIO输出:验证外设行为
例如,当程序向0x70001000地址写入数据时,可以在波形中看到HADDR和HWDATA的对应变化。
5. 高级开发技巧
5.1 系统时钟配置
Cortex-M1软核默认使用DDR的axi_clk0作为系统时钟。如需改用外部PLL时钟,需修改RTL代码:
// 在cm1_option_defs.v中取消注释 #define UNCACHE5.2 外设驱动开发
开发新外设驱动时需注意:
- 在cm1_option_defs.v中启用对应模块
- 正确配置GPIO复用功能
- 处理时钟域交叉问题
以I2C驱动EEPROM为例:
// 修改页大小定义 #define I2C_PageSize 16 // 确保数据长度小于页大小 #define DATA_LEN 105.3 网络功能配置
评估板的网络接口需配置以下参数:
MAC地址配置:
#define MAC_ADDR0 0x00 #define MAC_ADDR1 0x0A #define MAC_ADDR2 0x35 #define MAC_ADDR3 0x01 #define MAC_ADDR4 0xFE #define MAC_ADDR5 0xC0IP地址配置:
#define IP_ADDR0 192 #define IP_ADDR1 168 #define IP_ADDR2 0 #define IP_ADDR3 26. 性能优化建议
6.1 Cache优化策略
- ICACHE配置:
- 建议大小:16-32KB
- 关联度:4-way
- DCACHE配置:
- 写回模式优于写通
- 合理使用Cache预取
6.2 存储器访问优化
关键技巧:
- 将频繁访问的数据放入DTCM
- 大数据块使用DMA传输
- 对齐内存访问(4字节边界)
6.3 编译优化选项
Keil中的推荐优化设置:
- Optimization Level: -O2
- One ELF Section per Function: Enabled
- Strict ANSI C: Disabled
在项目开发中,我遇到过一个典型的性能问题:当启用Cache后,某些外设寄存器访问出现异常。最终发现是因为没有正确配置Cache的Non-cacheable区域。通过在代码中关键位置添加内存屏障指令__DSB()解决了这个问题。