
1. 紫光FPGA与Cortex-M1 SoC开发入门第一次接触紫光FPGA和Cortex-M1软核时我完全被这个组合的潜力震撼到了。PGL22G开发板搭配ARM Cortex-M1软核就像给硬件开发者发了一把瑞士军刀 - 既有FPGA的灵活性又有ARM生态的成熟工具链。这个组合特别适合需要定制化硬件加速的场景比如边缘计算、工业控制等领域。我手头的PGL22G开发板是紫光同创的中端FPGA产品逻辑单元足够运行一个完整的Cortex-M1系统。与传统的MCU开发不同这种软核方案最吸引人的地方在于你可以根据需求调整处理器配置甚至自定义外设。比如在做LED控制实验时我们可以自由定义GPIO数量和中断处理方式这在固定架构的MCU上是无法实现的。2. 开发环境搭建与工程准备2.1 必备软件安装搭建开发环境是第一步也是新手最容易踩坑的地方。我建议严格按照以下顺序安装软件Keil MDK 5.15官方测试版本ARM.CMSIS.5.6.0.packCortex-M1专用固件库PDS 2020.3紫光官方开发工具特别要注意的是PDS的安装路径不能包含中文或空格。我曾在安装时用了桌面文件夹结果编译时各种诡异错误排查了半天才发现是路径问题。安装完成后建议先运行PDS自带的License配置工具确保所有功能都能正常使用。2.2 工程文件准备从钉钉群下载的两个压缩包需要特别注意解压方式pgr_FPGA_Cortex_M1_PGL22_324_eval.rar pgr_FPGA_Cortex-M1_eval_v1_2.rar解压后需要将第一个文件夹放入第二个文件夹的rtl_design目录中。正确的目录结构应该是pgr_FPGA_Cortex-M1_eval └── rtl_design └── pgr_ARM_Cortex_M1_PGL22_324_eval这个步骤看似简单但如果放错位置后续的工程文件引用都会出错。我第一次操作时就因为漏看了文档说明导致PDS工程无法正常打开。3. Keil工程配置与bin文件生成3.1 打开LED示例工程LED控制示例位于software_design/module_design/Cortex-M1_led目录下。用Keil打开PROJECT子目录中的cortex_M1_led.uvprojx文件时可能会遇到找不到设备的问题。这是因为需要先安装CMSIS包并在Project - Manage - Project Items中确认设备选型为Cortex-M1。3.2 内存地址配置技巧Cortex-M1的内存配置有两种模式无Cache模式ITCM作为ROM(0x00000000)DTCM作为RAM(0x20000000)带Cache模式ICACHE作为ROM(0x10000000)DCACHE作为RAM(0x30000000)我们的工程使用带Cache模式因此需要在Keil的Target选项中设置IROM1: 0x10000000, 0x1000000IRAM1: 0x30000000, 0x100000这里有个容易忽略的细节ICACHE指令起始地址必须为0x10000000DDR颗粒映射范围不能超过16MB(0x1000000)。如果设置超出这个范围编译虽然能通过但运行时会出现难以调试的内存错误。3.3 bin文件生成配置生成bin文件需要配置User选项卡中的Run#1和Run#2Run#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.binRun#1负责将axf转换为bin文件路径需要根据实际Keil安装位置调整。Run#2则会生成后续仿真需要的ITCM文件虽然在本实验中我们用不到但保留这个步骤可以保持工程模板的一致性。全编译后在PROJECT目录下会生成cortex_M1_led.bin文件。这个文件需要复制到PDS工程的pnr/generate_bitstream目录下为后续的比特流生成做准备。4. PDS工程配置与烧录4.1 生成比特流文件打开PDS工程后右击Flow栏中的Generate Bitstream选择Rerun All。这个过程可能需要10分钟左右取决于电脑性能。我第一次运行时因为没耐心等待中途停止了进程结果导致后续步骤全都失败。生成完成后在generate_bitstream目录下会得到m1_soc_top.sbit文件。这个文件不能直接使用因为掉电会丢失不包含我们的应用程序4.2 转换为sfc文件我们需要将sbit文件与bin文件合并为sfc格式。在PDS中选择Operations - Convert File关键配置如下Flash型号WINBOND W25Q128Q读模式SPI X4, 24-bit addresssbit起始地址0bin文件起始地址000C0000这个转换过程实际上是将FPGA配置数据和应用程序代码打包成一个完整的镜像。000C0000这个地址是PGL22G平台的应用代码固定加载地址修改它会导致引导失败。4.3 烧录到Flash连接好JTAG下载器后单击Configuration - Boundary Scan右键扫描设备选择生成的sfc文件右键Outer Flash选择Program烧录完成后重启开发板就能看到LED开始闪烁。如果没反应首先检查串口输出波特率115200常见的错误包括Flash型号选错bin文件地址配置错误JTAG连接不稳定5. ModelSim仿真技巧5.1 仿真环境准备无Boot仿真可以跳过实际的Flash加载过程大幅提高仿真效率。准备工作包括重新编译仿真库Tools - Compile Simulation Libraries将usim文件夹复制到Simulation目录修改应用工程生成mem文件5.2 生成mem文件关键步骤是修改应用工程的Run#2配置make_hex128.exe cortex_M1_demo.bin这会生成三个mem文件mem_addr.datmem_data.datmem_used.dat将它们复制到Simulation目录后运行sim.bat即可开始仿真。仿真初期需要耐心等待软核启动在我的电脑上大约需要仿真600,000,000,000 fs才能看到有效波形。5.3 波形分析技巧在ModelSim中重点关注以下信号HADDR地址总线HWDATA写入数据HRDATA读取数据通过设置HADDR为红色HWDATA显示为十进制可以清晰观察到0x70001000地址的数据自增过程。这个地址对应着我们测试代码中的TEST_ADDR变量。6. 常见问题排查6.1 ModelSim仿真失败如果遇到Unsupported ModelSim library format错误通常是仿真库版本不匹配。解决方法删除现有的usim文件夹重新编译仿真库确保ModelSim路径设置正确6.2 程序运行异常当程序运行不符合预期时建议检查ROM/RAM地址设置是否正确bin文件是否放到了正确位置sfc转换时的地址配置串口输出是否有错误信息6.3 硬件连接问题JTAG连接不稳定是常见问题可以尝试更换USB接口检查线缆连接重启PDS软件重新插拔开发板电源记得在每次烧录前最好先执行一次Boundary Scan确保JTAG链路正常。