紫光PGL22G FPGA上实现Cortex-M1软核开发的完整实战指南
在嵌入式开发领域,FPGA与ARM Cortex-M系列处理器的结合正开辟出一条全新的技术路径。紫光同创的PGL22G FPGA搭载Cortex-M1软核解决方案,为开发者提供了灵活可定制的嵌入式系统开发平台。本文将带领您从零开始,完整走通在紫光FPGA上实现Cortex-M1软核开发的整个流程,涵盖环境搭建、工程配置、程序烧录到最终验证的全套实践步骤。
1. 开发环境准备与工程初始化
1.1 必备工具与材料清单
在开始实际操作前,我们需要确保所有开发工具和材料准备就绪。以下是经过验证的推荐配置清单:
开发工具:
- Keil MDK开发环境(建议V5.15.0版本)
- ARM CMSIS软件包(5.6.0版本)
- PDS开发工具(2020.3版本)
硬件资源:
- 紫光PGL22G开发板
- JTAG调试器(如J-Link或板载调试器)
- USB转串口模块(用于调试输出)
工程文件:
- pgr_FPGA_Cortex_M1_PGL22_324_eval.rar(官方评估板设计)
- pgr_FPGA_Cortex-M1_eval_v1_2.rar(配套软件资源)
提示:所有文件路径应避免使用中文和空格,这是避免后续编译问题的关键前提。
1.2 工程目录结构配置
解压下载的资源包后,需要按照特定结构组织工程目录:
pgr_FPGA_Cortex-M1_eval/ ├── rtl_design/ │ └── pgr_ARM_Cortex_M1_PGL22_324_eval/ # 核心RTL设计 └── software_design/ ├── boot/ # 引导程序 └── module_design/ # 应用模块设计这种结构确保了工具链能够正确找到所有依赖文件。特别需要注意的是,pgr_ARM_Cortex_M1_PGL22_324_eval文件夹必须放置在rtl_design目录下,这是PDS工程预期的默认位置。
2. Keil工程配置与应用程序编译
2.1 创建LED控制工程
LED闪烁是最基础的硬件验证程序,我们将以此为例演示完整的开发流程。在software_design/module_design/Cortex-M1_led/PROJECT目录下,可以找到预配置的Keil工程文件cortex_M1_led.uvprojx。
打开工程后,首先需要检查目标设备设置:
Target Device: ARMCM1这个设置表明我们使用的是ARM Cortex-M1核心,而不是常见的Cortex-M3或M4。这是整个工程配置的基础。
2.2 存储器地址配置关键
Cortex-M1软核在PGL22G FPGA上的存储器映射有两种模式:
| 模式类型 | ROM地址 | RAM地址 | 特点描述 |
|---|---|---|---|
| 无Cache | 0x00000000 | 0x20000000 | 直接访问ITCM/DTCM |
| 有Cache | 0x10000000 | 0x30000000 | 通过ICACHE/DCACHE访问 |
我们的工程采用带Cache的配置,因此需要在Keil的Target选项中设置:
IROM1:
- Start: 0x10000000
- Size: 0x1000000 (16MB)
IRAM1:
- Start: 0x30000000
- Size: 0x100000 (1MB)
注意:ICACHE指令起始地址必须配置为0x10000000,DCACHE数据起始地址必须为0x30000000,这是由硬件架构决定的固定映射关系。
2.3 生成二进制文件的配置技巧
为了将Keil编译输出的AXF文件转换为可直接烧录的BIN格式,需要在User配置中添加以下命令:
Run #1: D:\Keil_v5\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这里有几个关键点需要注意:
fromelf.exe路径需要根据实际Keil安装位置调整- Run #1负责生成应用工程的BIN文件
- Run #2是为引导工程生成ITCM文件(本示例中直接使用官方提供的预编译文件)
2.4 编译与输出验证
完成上述配置后,点击Keil工具栏的"Rebuild All"按钮开始编译。成功编译后,在工程目录的PROJECT文件夹下应该能看到生成的cortex_M1_led.bin文件。
为确保生成的BIN文件有效,可以检查其大小是否合理(通常LED示例程序应该在几KB到几十KB之间)。将生成的BIN文件复制到PDS工程的pnr/generate_bitstream目录下,为后续的烧录步骤做好准备。
3. PDS工程配置与比特流生成
3.1 打开官方参考设计
在rtl_design/pgr_ARM_Cortex_M1_PGL22_324_eval/pnr目录下,找到并打开ARM_M1_SoC_Top.pds工程文件。这是官方提供的完整SoC设计,包含了Cortex-M1软核、外设控制器和存储器接口等所有必要组件。
首次打开工程时,PDS需要一些时间解析和加载所有设计文件。在工程完全加载后,您将看到完整的设计层次结构:
ARM_M1_SoC_Top ├── Cortex_M1_wrapper ├── DDR3_controller ├── GPIO_controller └── System_interconnect3.2 生成比特流文件
在PDS界面左侧的Flow面板中,右键点击"Generate Bitstream"选项,选择"Rerun All"开始综合和实现过程。这个过程可能需要较长时间(通常在5-15分钟之间,取决于电脑性能)。
比特流生成过程中有几个关键阶段需要关注:
- 综合(Synthesis):将RTL代码转换为门级网表
- 布局布线(Place & Route):在FPGA物理资源上实现设计
- 时序收敛(Timing Closure):确保设计满足所有时序要求
- 比特流生成(Bitstream Generation):产生可配置FPGA的最终文件
提示:如果遇到时序违例警告,可以尝试调整PDS的布局布线策略或优化RTL代码。
成功生成比特流后,会在generate_bitstream目录下产生m1_soc_top.sbit文件,这是可以直接下载到FPGA的配置文件。
4. 程序烧录与硬件验证
4.1 连接开发板硬件
在烧录程序前,需要正确连接开发板:
- 使用JTAG接口连接开发板与电脑
- 确保开发板供电正常(通常通过USB或外部电源)
- 连接串口调试工具(如CP2102等USB转串口芯片)
硬件连接示意图:
[PC] -- JTAG --> [开发板] -- UART -->4.2 转换文件格式
PGL22G FPGA支持两种程序存储方式:
| 文件格式 | 存储位置 | 掉电保持 | 特点 |
|---|---|---|---|
| .sbit | FPGA | 否 | 直接配置,速度快 |
| .sfc | Flash | 是 | 持久存储,启动加载 |
我们需要将.sbit文件与应用程序的.bin文件合并转换为.sfc格式。在PDS中选择"Operations"→"Convert File",配置如下参数:
- Flash型号:W25Q128Q(根据实际板载Flash选择)
- sbit文件:起始地址0x00000000
- bin文件:起始地址0x000C0000,使能加载
点击OK后,工具会自动生成最终的.sfc文件,包含了FPGA配置和应用程序代码。
4.3 烧录Flash与验证
通过PDS的编程界面完成Flash烧录:
- 进入"Configuration"界面
- 执行"Boundary Scan"识别JTAG链
- 右键选择"Scan outer Flash"识别外部Flash器件
- 选择生成的.sfc文件进行编程
烧录完成后,重启开发板,通过串口终端(波特率115200)应该能看到如下启动信息:
PANGO Cortex-M1 Start Run... JEDEC id = 0xEF4018同时,开发板上的LED应该开始有规律地闪烁,这表明我们的Cortex-M1软核已经成功运行应用程序。
5. 深入理解与进阶调试
5.1 软核启动流程解析
Cortex-M1在PGL22G上的完整启动过程可分为三个阶段:
- FPGA配置阶段:上电后,FPGA从Flash加载配置比特流
- Bootloader阶段:ITCM中的引导程序将应用程序从Flash复制到DDR
- 应用程序阶段:CPU跳转到DDR中的应用程序开始执行
这种设计使得应用程序可以很大(受DDR容量限制,而非片上存储器限制),同时保持了启动的灵活性。
5.2 常见问题排查指南
在实际开发中,可能会遇到以下典型问题:
编译错误:
- 检查Keil的ARMCC编译器版本
- 确认CMSIS包版本匹配
- 验证所有文件路径无中文和空格
烧录失败:
- 确认JTAG连接可靠
- 检查Flash型号选择是否正确
- 验证供电稳定充足
程序不运行:
- 检查串口是否有启动输出
- 确认.bin文件烧录地址正确
- 验证复位电路工作正常
5.3 性能优化建议
为了获得更好的Cortex-M1软核性能,可以考虑以下优化方向:
Cache配置优化:
- 调整ICACHE/DCACHE大小
- 优化内存访问模式
时钟系统优化:
- 提高系统时钟频率
- 优化时钟分配网络
存储器接口优化:
- 使用突发传输模式
- 合理设置存储器时序参数
通过本文的实践,我们不仅完成了基础的LED控制程序,还建立了完整的紫光FPGA Cortex-M1开发流程。这套方法同样适用于更复杂的应用开发,如传感器接口、通信协议实现等。在实际项目中,建议先从官方示例工程入手,逐步增加自定义功能模块,这种渐进式的开发方式能有效降低初期开发风险。