3. Zynq PS端外设与时钟复位配置
Zynq-7000 的 PS(Processing System)并不是“CPU 加几个外设”的简单组合,而是一个由多个时钟域、复位域、互连端口和引脚复用网络共同约束的子系统。PS 端配置的核心任务,是在 Vivado 的 Zynq Processing System IP 中,把 MIO/EMIO 引脚分配、DDR 控制器参数、时钟树、复位系统和启动模式这五件事协调成一套自洽的方案。任何一处配置冲突,都会在 FSBL 阶段或 Linux 启动早期以“卡死”“无串口输出”“DDR 校准失败”等形式暴露出来。
MIO 与 EMIO:引脚资源的两种出口
MIO(Multiplexed I/O)是 PS 内部固定的 54 个引脚,编号 MIO[0]~MIO[53],分布在 Bank0(MIO0–15,1.8V)和 Bank1(MIO16–53,1.8V/2.5V/3.3V 可选)。每个 MIO 引脚可被多个 PS 外设控制器复用,例如 UART1 可映射到 MIO48/49,也可映射到 MIO24/25;SD0 通常占用 MIO40–45;以太网 GEM0 常占用 MIO16–27。配置时必须在 I/O Peripherals 页面为每个外设选择引脚组,Vivado 会自动检查冲突——同一引脚被两个外设占用时会直接报错。
EMIO(Extended MIO)则是把 PS 外设的信号“引出”到 PL 侧,最多 64 个输入 + 64 个输出。当 MIO 引脚不够用,或需要把 UART、GPIO、中断等信号接到 PL 逻辑时使用 EMIO。EMIO 不占用物理引脚,而是通过 PL 的管脚约束再落到 FPGA 引脚上。典型场景是:PS 的 UART0 走 MIO 用于调试串口,而额外需要两路 UART 时,用 EMIO 把 UART1 引到 PL 引脚。
DDR 控制器:参数决定成败
DDR 控制器配置是 PS 配置中最“敏感”的部分。Vivado 中需要填写 DDR 颗粒型号、容量、位宽、速度等级、时序参数(tRCD、tRP、tRAS、CL 等)。这些参数必须与板上实际焊接的 DDR 颗粒数据手册一致。例如一块常见的开发板使用 MT41K256M16 颗粒,32 位总线,DDR3L-1600,则需在 DDR Configuration 中选择对应型号,Vivado 会自动填充时序。若手动填写错误,FSBL 中的 DDR 校准会失败,表现为串口输出“DDR calibration failed”或直接无输出。
DDR 控制器还涉及地址映射和 ECC 选项。Zynq 的 DDR 地址空间通常从 0x0010_0000 开始供应用程序使用,低地址保留给 OCM 和寄存器。若启用 ECC,会额外占用存储空间并降低有效带宽,需在可靠性与性能之间权衡。
时钟树与复位系统
PS 内部有三个 PLL:ARM PLL、DDR PLL、IO PLL。ARM PLL 驱动 CPU 和 L2 Cache;DDR PLL 驱动 DDR 控制器;IO PLL 驱动大部分外设控制器。Vivado 中可分别设置 CPU 频率(如 666.67 MHz)、DDR 频率(如 533.33 MHz)和外设时钟。此外,PS 还向 PL 输出四路 FCLK_CLK0~3,频率可独立设置,常用于 PL 逻辑的 AXI 总线时钟。
复位系统分为上电复位(POR)、系统复位、外设复位和 PL 复位。PS 的复位由 SLCR(System Level Control Register)管理。配置时需注意:FCLK_RESET0_N 是 PS 输出给 PL 的复位信号,低有效;PL 侧逻辑应使用该信号同步复位。若 PL 逻辑需要独立复位,可通过 EMIO 引入外部复位或使用 AXI GPIO 控制。
启动模式选择
Zynq 支持多种启动模式:QSPI Flash、NAND、NOR、SD 卡、JTAG。启动模式由 MIO[8:2] 引脚在上电复位时的电平决定。例如 MIO[8:7]=00 表示 JTAG 模式,MIO[8:7]=01 表示 QSPI,MIO[8:7]=10 表示 SD 卡。实际板级设计中,这些引脚通常通过拨码开关或电阻上下拉配置。开发阶段常用 SD 卡启动,便于快速替换 BOOT.BIN;量产阶段则固化到 QSPI Flash。
配置示例:UART0 + SD0 + DDR3 的典型参数
| 配置项 | 示例值 | 说明 |
|---|---|---|
| UART0 | MIO48/49 | 调试串口,115200-8-N-1 |
| SD0 | MIO40–45 | 4 位数据线,用于 SD 卡启动 |
| DDR 颗粒 | MT41K256M16 | DDR3L,32 位总线,1600 Mbps |
| CPU 频率 | 666.67 MHz | ARM PLL 输出 |
| DDR 频率 | 533.33 MHz | DDR PLL 输出 |
| FCLK_CLK0 | 100 MHz | PL AXI 总线时钟 |
| 启动模式 | SD 卡 | MIO[8:7]=10 |
以上参数需根据实际硬件调整。配置完成后,在 Vitis 中创建 FSBL 工程,编译并生成 BOOT.BIN,放入 SD 卡即可启动。若启动失败,可通过 JTAG 连接并检查 SLCR 寄存器中的时钟和复位状态,逐步定位问题。