1. Zynq平台MicroBlaze软核测试项目概述
在Zynq-7000 SoC平台上,我们经常需要同时利用ARM处理系统(PS)和可编程逻辑(PL)部分的资源。这次我在XC7Z020芯片上搭建了一个MicroBlaze软核处理器的测试系统,主要实现了三个核心功能:外部复位控制、串口回环测试以及按键控制LED。这个项目特别适合需要同时使用PS和PL资源的开发者参考。
MicroBlaze是Xilinx提供的一款32位RISC软核处理器,可以灵活配置在FPGA的逻辑资源中。在Zynq芯片上使用MicroBlaze的一个典型场景是:当ARM处理器需要处理复杂的操作系统任务时,可以用MicroBlaze来承担实时性要求高的控制任务,两者通过AXI总线进行通信。
2. MicroBlaze接口架构深度解析
2.1 五大关键接口功能剖析
MicroBlaze处理器通过以下五种总线接口与系统其他部分交互,每种接口都有其特定的用途和配置要求:
| 接口名称 | 全称 | 总线类型 | 主要用途 | 是否缓存 | 连接目标示例 | 典型地址范围 | 必须启用条件 |
|---|---|---|---|---|---|---|---|
| ILMB | Instruction Local Memory Bus | LMB | 从本地存储器(如BRAM)取指令 | 可配置 | axi_bram_ctrl, ILM | 0x0000_0000-0x0001_FFFF | 使用本地RAM存放代码时必须 |
| DLMB | Data Local Memory Bus | LMB | 访问本地数据存储器(变量、堆栈) | 可配置 | axi_bram_ctrl, DLM | 0x0000_0000-0x0001_FFFF | 使用本地RAM存放数据时必须 |
| M_AXI_IC | Master AXI Instruction Cache | AXI4 | 从外部存储器(如Flash、DDR)取指令 | 支持 | QSPI Flash, DDR | 0xC000_0000起 | 程序放在外部存储时需要 |
| M_AXI_DC | Master AXI Data Cache | AXI4 | 访问外部数据内存(大容量变量、堆) | 支持 | DDR, SRAM | 0x8000_0000起 | 需访问外部数据内存时需要 |
| M_AXI_DP | Master AXI Data Peripheral | AXI4 | 访问外设寄存器(MMIO) | 强制非缓存 | UART, GPIO, Timer | 0x4000_0000-0x7FFF_FFFF | 使用任何AXI外设时必须 |
关键经验:在资源有限的设计中,合理配置这些接口可以显著节省逻辑资源。例如,如果应用对性能要求不高,可以禁用缓存接口;如果代码量小,可以只使用LMB接口而不启用AXI指令接口。
2.2 接口配置实战建议
-
最小系统配置:对于简单应用,只需启用DLMB和ILMB接口,将代码和数据都放在BRAM中。这样配置最节省资源,适合控制类应用。
-
性能优化配置:如果需要运行较大程序,建议同时启用M_AXI_IC和M_AXI_DC接口,将程序放在DDR内存中,并通过缓存提高访问速度。
-
外设访问配置:M_AXI_DP接口必须启用才能访问AXI外设,注意这个接口强制为非缓存,这是为了保证外设访问的实时性。
3. Vivado Block Design实现详解
3.1 系统整体架构设计
本项目的Block Design如下图所示(图示见原文),主要包含以下关键IP核:
-
MicroBlaze处理器:配置了本地指令和数据存储器接口(ILMB/DLMB),以及AXI外设接口(M_AXI_DP)。
-
处理系统7(PS):即使不使用PS的处理功能,Zynq设计中也必须包含PS模块,本项目中PS主要提供复位信号。
-
AXI外设:
- AXI UART Lite:用于串口通信
- AXI GPIO:连接按键和LED
- AXI BRAM控制器:管理片上BRAM资源
-
时钟和复位:
- 时钟向导(Clk Wizard):生成MicroBlaze工作时钟
- 处理器系统复位:生成系统复位信号
3.2 关键IP核配置要点
3.2.1 MicroBlaze处理器配置
tcl复制set microblaze_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:microblaze:11.0 microblaze_0 ]
set_property -dict [ list \
CONFIG.C_DCACHE_ADDR_TAG {1} \
CONFIG.C_DEBUG_ENABLED {1} \
CONFIG.C_D_AXI {1} \
CONFIG.C_D_LMB {1} \
CONFIG.C_I_LMB {1} \
CONFIG.C_USE_DCACHE {1} \
CONFIG.C_USE_ICACHE {1} \
] $microblaze_0
主要参数说明:
C_DCACHE_ADDR_TAG:数据缓存地址标签位数C_DEBUG_ENABLED:启用调试接口C_D_AXI:启用数据AXI接口C_D_LMB/C_I_LMB:启用数据/指令本地内存总线C_USE_DCACHE/C_USE_ICACHE:启用数据/指令缓存
3.2.2 AXI GPIO配置
tcl复制set axi_gpio_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_gpio:2.0 axi_gpio_0 ]
set_property -dict [ list \
CONFIG.C_ALL_OUTPUTS {0} \
CONFIG.C_GPIO_WIDTH {2} \
] $axi_gpio_0
这里配置GPIO为2位宽度,同时包含输入和输出功能,用于连接按键(输入)和LED(输出)。
3.3 时钟和复位设计
系统使用50MHz外部时钟输入,通过Clk Wizard生成MicroBlaze的工作时钟:
tcl复制set clk_wiz_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:clk_wiz:6.0 clk_wiz_0 ]
set_property -dict [ list \
CONFIG.CLKIN1_JITTER_PS {200.0} \
CONFIG.MMCM_CLKFBOUT_MULT_F {20.000} \
CONFIG.MMCM_CLKIN1_PERIOD {20.000} \
CONFIG.MMCM_CLKOUT0_DIVIDE_F {10.000} \
CONFIG.PRIM_IN_FREQ {50.000} \
] $clk_wiz_0
复位系统由PS提供,通过Processor System Reset IP核生成各模块所需的复位信号。
4. 功能实现与软件设计
4.1 硬件功能实现
本项目实现了三个主要功能:
-
外部复位支持:通过PS模块的复位输出控制整个系统的复位
-
串口回环测试:发送到UART的数据会被原样返回
-
按键控制LED:当按键按下时LED亮起,否则LED熄灭
4.2 软件设计要点
在Vitis IDE中创建MicroBlaze的应用程序工程,主要实现以下功能:
c复制#include "xparameters.h"
#include "xgpio.h"
#include "xuartlite.h"
#define GPIO_DEVICE_ID XPAR_AXI_GPIO_0_DEVICE_ID
#define UART_DEVICE_ID XPAR_AXI_UARTLITE_0_DEVICE_ID
XGpio Gpio;
XUartLite Uart;
int main() {
// 初始化GPIO
XGpio_Initialize(&Gpio, GPIO_DEVICE_ID);
XGpio_SetDataDirection(&Gpio, 1, 0x1); // 通道1的第0位为输入(按键),第1位为输出(LED)
// 初始化UART
XUartLite_Initialize(&Uart, UART_DEVICE_ID);
while(1) {
// 按键控制LED
u32 buttonState = XGpio_DiscreteRead(&Gpio, 1) & 0x1;
XGpio_DiscreteWrite(&Gpio, 1, buttonState << 1);
// 串口回环
if(XUartLite_Recv(&Uart, &recvChar, 1)) {
XUartLite_Send(&Uart, &recvChar, 1);
}
}
return 0;
}
调试技巧:在初期调试时,建议先单独测试每个功能模块。例如先验证GPIO控制LED是否正常,再测试UART通信,最后整合所有功能。
5. 常见问题与解决方案
5.1 系统无法启动
现象:程序下载后MicroBlaze不运行,调试器无法连接。
可能原因及解决方案:
- 时钟未正确配置:检查Clk Wizard的输出时钟是否连接到MicroBlaze
- 复位信号异常:确保复位信号在启动后处于无效状态
- BRAM未正确初始化:确认程序已正确烧写到BRAM中
5.2 UART通信失败
现象:无法通过串口发送或接收数据。
排查步骤:
- 检查波特率设置:确保软件中的波特率与硬件配置一致
- 验证引脚分配:确认UART的TX/RX引脚已正确分配到芯片引脚
- 测试环回:短接TX和RX引脚,发送数据看是否能接收相同数据
5.3 GPIO响应异常
现象:按键按下时LED无反应或状态相反。
解决方法:
- 检查GPIO方向寄存器配置:确保输入和输出通道正确设置
- 验证物理连接:用万用表测量按键和LED的实际电路连接
- 注意按键消抖:在软件中增加简单的延时消抖逻辑
6. 性能优化与扩展建议
6.1 资源优化技巧
- 对于简单应用,可以禁用MicroBlaze的缓存单元以节省资源
- 合理配置BRAM大小,根据实际代码量调整,避免浪费
- 考虑使用共享的BRAM控制器,而不是为指令和数据分别配置
6.2 功能扩展方向
- 添加中断支持:将按键配置为中断源,提高响应效率
- 实现PS-PL通信:通过AXI总线实现MicroBlaze与ARM Cortex-A9的通信
- 增加更多外设:如定时器、PWM控制器等,构建更复杂的系统
在实际项目中,我发现Zynq平台上MicroBlaze的一个典型应用场景是作为实时协处理器,处理那些不适合在Linux环境下运行的高实时性任务。通过合理设计,可以充分发挥Zynq芯片PS和PL的协同优势。