在 Xilinx SDK 中使用 Zynq 的外设(比如 UART、SPI、I2C、GPIO 等),整体流程分为 硬件设计阶段 和 软件开发阶段。
🧱 一、硬件设计阶段(Vivado)
-
创建工程并选择 Zynq 器件型号(如 xc7z020)。
-
添加 Zynq Processing System IP
- 在 Block Design 中添加
Zynq7 Processing System
- 点击 “Run Block Automation”,自动连接部分默认接口
- 在 Block Design 中添加
-
添加你需要的外设 IP(如 AXI GPIO、AXI UARTLite 等)
- 并连接到 Zynq 的 AXI 接口或 MIO 管脚上(比如 UART0/1、I2C0/1 可直接接到 MIO)
-
配置 Zynq PS 外设
- 双击 Zynq PS IP 进入配置界面,启用所需的外设(如 UART1、SPI0 等)
- 映射到对应的 MIO/EMIO 接口
-
连接外设至 PS
- 比如 AXI GPIO → AXI interconnect → Zynq GP port
- 或直接连接到 EMIO/MIO(不走 AXI)
-
设置地址空间
- 点击 “Address Editor”,确认所有 IP 均分配了地址
-
验证并生成 Bitstream
- 点击 “Validate Design” → “Generate Bitstream”
-
Export Hardware 到 SDK
- File → Export → Export Hardware(勾选 Include bitstream)
- File → Launch SDK(或使用 Vitis)
💻 二、软件开发阶段(SDK / Vitis)
-
新建应用工程(Application Project)
- 选择 BSP(Board Support Package)平台:基于你刚才导出的
hardware_platform.hdf
- 创建新工程时可以选择模板(如 Hello World、Peripheral Test 等)
- 选择 BSP(Board Support Package)平台:基于你刚才导出的
-
BSP 配置
- 打开
system.mss
或platform.spr
- 检查是否包含你要用的驱动(如
xgpio
,xuartps
,xiicps
等)
- 打开
-
使用外设的 API 进行编程
-
例如使用 GPIO:
#include "xgpio.h" XGpio gpio; XGpio_Initialize(&gpio, XPAR_AXI_GPIO_0_DEVICE_ID); XGpio_SetDataDirection(&gpio, 1, 0x0); // 设置为输出 XGpio_DiscreteWrite(&gpio, 1, 0xFF); // 输出数据
-
使用 UART(PS 侧):
#include "xuartps.h" XUartPs uart; XUartPs_Config *cfg = XUartPs_LookupConfig(XPAR_XUARTPS_1_DEVICE_ID); XUartPs_CfgInitialize(&uart, cfg, cfg->BaseAddress); XUartPs_Send(&uart, (u8 *)"Hello", 5);
-
-
编译并下载程序
- 点击 “Program FPGA” → 下载 Bitstream
- 点击 “Run → Launch on Hardware”(或使用调试模式)
✅ 常见注意点
- PS 内部外设(如 UART0/1, I2C0/1) 使用 MIO 直接连接,不需 AXI
- PL 外设(如 AXI GPIO、AXI Timer) 需通过 AXI 总线与 PS 通信
- BSP 中驱动缺失时 可在
system.mss
中“右键 → Add Drivers” - 外设初始化函数的参数 要匹配地址定义(来自
xparameters.h
)