紫光PGL22G FPGA上跑Cortex-M1软核?手把手教你从Keil编译到ModelSim仿真的完整流程
紫光PGL22G FPGA上实现Cortex-M1软核开发与仿真全流程实战
在嵌入式系统开发领域,FPGA与ARM Cortex-M系列处理器的结合为开发者提供了前所未有的灵活性。紫光同创PGL22G FPGA搭载Cortex-M1软核的方案,尤其适合需要高度定制化处理的场景。本文将深入探讨从Keil工程编译到ModelSim仿真的完整开发流程,帮助开发者掌握软核开发的精髓。
1. 开发环境搭建与工程配置
1.1 硬件与软件准备
要开始Cortex-M1软核开发,首先需要准备以下工具链:
开发工具:
- Keil MDK v5.15及以上版本
- PDS (Pango Design Suite) 2020.3开发环境
- ModelSim 10.6d仿真工具
硬件资源:
- 紫光PGL22G开发板
- JTAG调试器
- USB转串口模块
软件包:
- ARM.CMSIS.5.6.0.pack固件库
- 官方提供的FPGA Cortex-M1评估包
注意:所有工具和工程文件路径应避免使用中文和空格,这是嵌入式开发的通用最佳实践。
1.2 Keil工程关键配置
在Keil环境中,内存地址配置对Cortex-M1软核运行至关重要。使用Cache的配置方案如下:
/* 使用Cache的内存配置 */ #define ROM_START 0x10000000 // ICACHE作为ROM起始地址 #define ROM_SIZE 0x1000000 // 16MB ROM空间 #define RAM_START 0x30000000 // DCACHE作为RAM起始地址 #define RAM_SIZE 0x100000 // 1MB RAM空间对应的Keil Target配置界面设置:
| 配置项 | 起始地址 | 大小 |
|---|---|---|
| IROM1 | 0x10000000 | 0x1000000 |
| IRAM1 | 0x30000000 | 0x100000 |
2. 从源码到FPGA的完整流程
2.1 应用程序编译与转换
在Keil中完成代码编写后,需要进行以下关键步骤:
配置User选项中的Post-build操作:
Run #1: $(KIEL_PATH)\ARM\ARMCC\bin\fromelf.exe --bin -o $(OutputPath)/$(TargetName).bin $(OutputPath)/$(TargetName).axf Run #2: make_hex.exe $(OutputPath)/$(TargetName).bin全编译工程后,将生成的.bin文件复制到PDS工程的
pnr/generate_bitstream目录
2.2 FPGA比特流生成与下载
在PDS环境中完成硬件设计的综合与实现:
# 典型PDS工程流程 read_verilog -lib work ../src/*.v synth_design -top M1_soc_top place_design route_design write_bitstream -file m1_soc_top.sbit将.sbit文件与应用程序.bin文件合并为.sfc文件的关键参数:
| 参数项 | 设置值 |
|---|---|
| Flash型号 | W25Q128Q |
| sbit起始地址 | 0x00000000 |
| bin文件起始地址 | 0x000C0000 |
| 读模式 | SPI X4, 24-bit地址 |
3. ModelSim仿真深度解析
3.1 仿真环境准备
进行软核仿真前,需要完成以下准备工作:
重新编译仿真库:
vlib work vmap work work vlog -work work ../rtl/*.v修改应用工程以生成仿真所需的.dat文件:
- 将User选项中的Run #2改为
make_hex128.exe $(OutputPath)/$(TargetName).bin - 全编译后会产生mem_addr.dat、mem_data.dat和mem_used.dat三个文件
- 将User选项中的Run #2改为
3.2 关键信号分析与调试
在ModelSim中,以下信号对调试至关重要:
- HADDR:AHB总线地址信号,显示处理器当前访问的地址
- HWDATA:AHB总线写数据,显示写入指定地址的数据值
- HRDATA:AHB总线读数据,显示从指定地址读取的数据值
典型调试场景示例:
initial begin $dumpfile("waveform.vcd"); $dumpvars(0, tb_top); #600000000000 $finish; // 仿真运行600ms end波形分析技巧:
- 将HADDR设置为红色便于观察
- 将HWDATA数据显示格式设为十进制
- 重点关注0x70001000等关键地址的访问
4. 高级开发技巧与问题排查
4.1 性能优化策略
针对Cortex-M1软核的特性,可以采用以下优化方法:
Cache配置优化:
// 在cm1_option_defs.v中调整Cache参数 `define ICACHE_SIZE 16 // 16KB指令Cache `define DCACHE_SIZE 16 // 16KB数据Cache `define CACHE_LINE 32 // 32字节Cache行内存访问模式优化:
- 将频繁访问的数据放在DTCM中
- 使用DMA减少CPU开销
- 合理使用数据预取
4.2 常见问题解决方案
问题1:ModelSim仿真报错"Unsupported ModelSim library format"
解决方法:
- 确认仿真库路径正确
- 重新编译仿真库
- 检查usim文件夹是否完整
问题2:应用程序无法从Flash正确加载
排查步骤:
- 确认Bootloader的itcm0~itcm3文件存在
- 检查.bin文件起始地址是否正确
- 验证Flash型号配置
问题3:外设工作异常
调试方法:
- 检查cm1_option_defs.v中相关宏是否使能
- 验证时钟配置
- 查看GPIO映射关系
5. 实际项目中的应用扩展
基于PGL22G和Cortex-M1的解决方案可扩展至多种应用场景:
- 工业控制:实现定制化PLC功能
- 物联网边缘计算:数据采集与预处理
- 电机控制:定制PWM算法实现
- 消费电子:人机界面开发
开发进阶建议:
- 利用FPGA逻辑实现硬件加速
- 开发自定义外设IP核
- 优化Bootloader实现安全启动
- 集成RTOS实现复杂任务调度
在完成基础LED控制实验后,可以尝试以下进阶实验:
- 通过AHB总线添加自定义外设
- 实现中断控制器配置
- 开发DMA传输功能
- 构建多核通信机制
