FPGA软核处理器搭建:在Artix-7上运行MicroBlaze的完整流程
Artix-7作为Xilinx 7系列中的低成本主力器件,本身不含硬核处理器。要让它"跑程序",唯一的途径是例化MicroBlaze软核——这是Xilinx针对嵌入式应用优化的软处理器,具有免版税、低功耗、可配置的特性。在Artix-7 XC7A200T上,最精简的Microcontroller配置仅需约1900逻辑单元(占芯片1%),可运行在204MHz。本文以Digilent Arty A7-35T开发板为例,梳理从Vivado硬件搭建到Vitis软件调试的完整流程。
一、为什么需要Vivado+Vitis协同
MicroBlaze开发是一个硬件+软件的协同过程:Vivado负责搭建处理器系统(MicroBlaze核、时钟、存储器、UART等外设的AXI互联),生成比特流;Vitis则基于Vivado导出的XSA文件,创建板级支持包(BSP),编写和调试C程序。两者缺一不可,就像建筑师先搭框架、装修队再做内装。
二、Vivado硬件系统搭建
1. 创建工程与Block Design
新建RTL工程,选择Arty A7-35板卡。在IP Integrator中点击Create Block Design,命名design_1。
2. 添加MicroBlaze核
点击"+"添加IP,搜索MicroBlaze并双击。新手建议直接从Run Block Automation开始,Local Memory选择64KB,其余默认。Artix-7上MicroBlaze的三种典型配置:
配置 频率 逻辑单元 用途
Microcontroller 204MHz 1900 裸机确定性控制
Real-Time 172MHz 4000 FreeRTOS实时系统
Application 146MHz 7000 Linux等操作系统
3. 时钟配置(关键步骤)
Arty A7板载100MHz单端晶振。删除Block Design中默认的diff_clock_rtl差分时钟端口,双击clk_wiz_1,将CLK_IN1设置为板上的"sys clock"(即100MHz单端时钟)。再次运行Connection Automation完成时钟网络连线。
4. 添加UART外设
点击"+"搜索AXI Uartlite,双击添加。UART是调试信息的"生命线",务必添加。运行Connection Automation,工具会自动完成AXI总线互联、地址映射。
5. 生成顶层封装
在Sources选项卡中右击design_1.bd,选择Create HDL Wrapper。Vivado会自动生成一个Verilog顶层文件,把Block Design"包装"成可综合的传统HDL模块。
6. 生成比特流
点击Generate Bitstream,弹出框选择Yes运行综合与实现。根据CPU核心数设置并行任务数。Arty A7-35T上完整MicroBlaze系统综合实现约需5-10分钟。
三、导出硬件到Vitis
在Vivado菜单File → Export → Export Hardware,点击Next,务必勾选"Include bitstream",这将生成包含比特流、存储器映射、时钟配置的.xsa文件。这个XSA文件就是Vivado与Vitis之间的"桥梁"。
四、Vitis软件开发
1. 启动Vitis
Vivado菜单Tools → Launch Vitis IDE。Vitis启动后,指定工作空间路径。
2. 创建平台组件
Embedded Development → New Platform Component,浏览选择导出的.xsa文件,设置操作系统为standalone,处理器选择microblaze_0。平台组件相当于BSP,封装了所有硬件寄存器地址和驱动。
3. 创建应用工程
New → Application Project,选择上一步创建的平台组件。Vitis提供了丰富的模板,新手建议选择Hello World,它已经包含了基本的串口打印框架。
4. 编写和扩展代码
Hello World模板生成的main函数如下:
#include "xil_printf.h"
int main() {
init_platform();
print("Hello World\n\r");
print("Successfully ran Hello World application");
cleanup_platform();
return 0;
}
可以在此基础上扩展,例如添加GPIO控制板载LED:
#include "xgpio.h"
#include "xparameters.h"
#define LED_CHANNEL 1
XGpio Gpio;
int main() {
XGpio_Initialize(&Gpio, XPAR_AXI_GPIO_0_DEVICE_ID);
XGpio_SetDataDirection(&Gpio, LED_CHANNEL, 0x00); // 设置为输出
while(1) {
XGpio_DiscreteWrite(&Gpio, LED_CHANNEL, 0x01);
usleep(500000);
XGpio_DiscreteWrite(&Gpio, LED_CHANNEL, 0x00);
usleep(500000);
}
}
五、下载与调试
1. JTAG下载(开发阶段)
右击应用工程 → Debug As → Launch Hardware (Single Application Debug)。Vivado先下载.bit到FPGA,Vitis再下载.elf到MicroBlaze的指令存储器(通常是BRAM)。Vitis会自动在main函数第一行设置断点。
2. 串口观察
打开Vitis Serial Terminal,点击"+"连接Arty A7的串口(波特率9600,由Vivado中UART IP配置决定),即可看到"Hello World"输出。
3. 脱离JTAG的独立运行
若要从QSPI Flash独立启动,需要将比特流和应用程序固话到Flash。典型流程是:.bit中包含Bootloader并初始化到BRAM,上电后MicroBlaze从BRAM地址0x0执行Bootloader,Bootloader通过AXI总线读取QSPI Flash中存储的应用程序镜像(SREC或BIN格式),将其搬运到DDR的指定地址,最后跳转执行。这一过程可借助XSCT工具完成。
六、新手踩坑提醒
⚠️ 坑1:忘记勾选"Include bitstream"——导出的XSA不含比特流,Vitis无法下载硬件配置。
⚠️ 坑2:时钟配置错误——Artix-7 MIG等IP对参考时钟有严格要求(如DDR3 MIG的clk_ref_i必须200MHz),需通过Clocking Wizard正确生成。
⚠️ 坑3:复位极性——多数Artix-7开发板使用低电平复位,但部分板卡可能相反,需根据原理图确认。
⚠️ 坑4:地址映射冲突——运行Validate Design检查AXI互联,确保所有外设地址不重叠。
写在最后
在Artix-7上运行MicroBlaze,本质是"用逻辑资源换处理器"——付出1900个LUT的代价,换来一个204MHz、可运行C程序的完整嵌入式系统。从Vivado的Block Design图形化搭建,到Vitis的C程序开发,整套流程已经高度自动化:Run Block Automation完成MicroBlaze核配置,Run Connection Automation完成AXI总线互联,Export Hardware打通软硬件桥梁,Vitis平台组件生成BSP——开发者真正需要手动关心的,只剩时钟方案、外设选择和应用程序逻辑。当你在串口终端看到"Hello World"的那一刻,一个全新的FPGA软核开发世界就此打开。接下来,无论是跑FreeRTOS、上DDR3大内存、还是挂载自定义AXI IP做硬件加速,都在这套基础架构上自然延伸。





