从零到一:用紫光同创PGL22G FPGA搭建你的第一个片上系统(SoC)实战

张开发
2026/4/19 2:23:54 15 分钟阅读

分享文章

从零到一:用紫光同创PGL22G FPGA搭建你的第一个片上系统(SoC)实战
从零到一用紫光同创PGL22G FPGA搭建你的第一个片上系统SoC实战第一次接触FPGA和片上系统SoC开发时很多人会被复杂的工具链和抽象的概念吓退。但如果你手头有一块紫光同创PGL22G开发板15分钟就能让软核跑起来看到LED灯随你的代码闪烁——这种即时反馈的成就感正是学习嵌入式开发的最佳动力。本文将带你完整走通这个流程从工具安装到最终验证避开那些新手常踩的坑。1. 环境准备与工具链配置工欲善其事必先利其器。紫光同创PGL22G开发需要以下软件环境Pango Design Suite紫光官方FPGA开发工具支持综合、布局布线Keil MDK用于Arm Cortex-M1软核的嵌入式程序开发串口调试工具如Putty或MobaXtermRISC-V工具链可选如果选择RISC-V软核则需要安装注意Pango Design Suite需要license文件可联系紫光同创技术支持获取教育版授权。安装完成后建议按以下顺序验证环境# 检查Pango工具是否正常 pango --version # 检查Arm工具链 arm-none-eabi-gcc --version常见问题排查问题现象可能原因解决方案Pango无法识别设备驱动未安装安装Pango驱动包中的CP210x驱动Keil编译报错未正确配置设备包在Pack Installer中添加PGL22G支持下载失败板卡供电不足确保使用配套12V电源适配器2. 构建最小片上系统2.1 创建基础工程在Pango Design Suite中新建项目时关键配置如下器件选择PGL22G-6FBG484语言Verilog或VHDL根据个人偏好添加IP核Cortex-M1或RISC-V软核对于初学者建议从Cortex-M1开始因为其工具链更成熟。创建工程后需要配置以下基本组件处理器时钟通常使用板载50MHz晶振复位电路外部复位按钮调试接口SWD或JTAG2.2 连接GPIO外设在Pango的IP Integrator中添加AXI GPIO控制器并连接到处理器// 示例Verilog中实例化GPIO模块 gpio_controller gpio_inst ( .s_axi_aclk(clk_50m), .s_axi_aresetn(!reset), .gpio_io_o(led_output), .gpio_io_i(sw_input) );引脚分配需要对照开发板原理图完成。以常见的LED和按键为例信号名称FPGA引脚板载功能led_output[0]F5用户LED1sw_input[0]A8用户按键13. 编写嵌入式程序3.1 Keil工程配置新建Keil项目时需要注意设备选择Cortex-M1运行时环境勾选CMSIS-Core和Device-Startup链接脚本修改ROM/RAM大小匹配软核配置一个简单的点灯程序结构如下#include PGL22G_M1.h #define LED_PIN 0 #define SW_PIN 0 int main(void) { GPIO_InitTypeDef GPIO_InitStruct; // 启用GPIO时钟 __HAL_RCC_GPIO_CLK_ENABLE(); // 配置LED引脚为输出 GPIO_InitStruct.Pin (1 LED_PIN); GPIO_InitStruct.Mode GPIO_MODE_OUTPUT; HAL_GPIO_Init(GPIOA, GPIO_InitStruct); // 配置按键引脚为输入 GPIO_InitStruct.Pin (1 SW_PIN); GPIO_InitStruct.Mode GPIO_MODE_INPUT; HAL_GPIO_Init(GPIOB, GPIO_InitStruct); while (1) { // 读取按键状态并控制LED HAL_GPIO_WritePin(GPIOA, (1 LED_PIN), HAL_GPIO_ReadPin(GPIOB, (1 SW_PIN))); } }3.2 调试技巧遇到程序不运行时可以按以下步骤排查检查复位向量是否正确通常0x00000000确认时钟配置与硬件一致使用SWD接口读取PC寄存器值在startup.s中设置断点观察是否执行到main()提示初期调试建议关闭优化-O0并启用semihosting输出调试信息。4. 系统验证与进阶扩展4.1 功能验证流程在Pango中生成比特流文件.bit通过Programmer工具下载到FPGA在Keil中编译并下载.hex文件到软核观察LED是否随按键变化4.2 扩展思路完成基础功能后可以尝试以下进阶实验添加定时器中断实现LED闪烁通过UART打印调试信息移植FreeRTOS实现多任务添加SPI接口连接外部传感器// 示例使用HAL库实现UART输出 void debug_printf(char *str) { HAL_UART_Transmit(huart1, (uint8_t*)str, strlen(str), 1000); }开发过程中最常遇到的三个问题时钟不同步导致外设无法工作解决方案检查PLL配置和分频系数内存访问越界导致HardFault解决方案调整链接脚本中的堆栈大小外设寄存器读写无效解决方案确认外设时钟已使能当LED第一次按照预期亮起时你会意识到那些配置步骤和调试过程都是值得的。建议把这个最小系统作为模板工程保存后续项目可以直接在此基础上添加新功能。

更多文章