本文旨在分享在 AMD Versal™ 自适应 SoC 上进行 eMMC 烧录、启动设置及问题排查的实用技巧与排查指南。在提交服务申请前,建议先按此清单逐项检查,或许能快速定位问题根源。
你的 eMMC 器件真的被支持吗?
对于遵循正式行业规范(如 eMMC)的闪存器件,AMD 通常基于规范版本来提供支持,而非枚举每个具体的制造商、系列或部件号。这为设计初期的器件选型和后期的长期维护提供了更大的灵活性。
下表摘自 UG908 文档,明确了 Versal 器件所支持的 eMMC 规格。Versal 的 eMMC 接口支持在 1.8V 电压下的 eMMC 规范版本 4.51。
UG908 相关章节: https://docs.amd.com/r/en-US/ug908-vivado-programming-debugging/Versal-Configuration-Memory-Devices

与 AMD UltraScale+™ MPSoC 等前代架构不同,Versal 器件不再内置 NAND 接口。eMMC1 模式取代了 NAND,在提供相近性能的同时,有效减少了所需的引脚数量。

此外,需要注意一份 设计咨询答复记录 ,其中描述了一个在某些 eMMC 器件上观察到的问题:这些器件要求 CMD6 R1b 繁忙时间大于 1 ms,从而导致主启动失败。
设计咨询答复记录 (DAAR) :
https://docs.amd.com/r/en-US/000034596/000034596-Design-Advisory-for-Zynq-UltraScale-MPSoC/RFSoC-and-Versal-Primary-Boot-failure-with-some-eMMC-parts
尽管目前尚未在 Versal 器件中报告因此问题导致的操作失败,但了解其存在并查阅 Versal 相关的勘误表文档仍然是十分重要的。
你的硬件设计过关了吗?
接下来需要检查 PCB 及开发板硬件设计。
使用 AMD 参考板/评估板:
如果你正在使用 AMD 的官方参考板,那么以下的大部分建议已在设计中得到体现。建议运行 BEAM/BIT 工具来验证开发板的硬件完整性。具体操作请参阅相关产品指南。完成此步骤后,可跳至下一部分。
使用定制开发板:
UG863 文档中“SD/SDIO/eMMC”章节下的“eMMC”部分,包含了针对 Versal 器件的 PCB 布局、设计考量以及静态时序分析(STA)的指南与公式。请确保你的定制 PCB 严格遵循 UG863 中的建议,这些建议有助于最大化接口性能。
UG863: https://docs.amd.com/r/en-US/ug863-versal-pcb-design/SD/SDIO/eMMC
进行静态时序分析时,需参考对应器件系列数据手册(DS956-DS959)中“PMC eMMC 控制器接口”章节的时序要求。DH0092 文档的“数据手册”部分列出了所有可用的 Versal 子系列,请务必选择与你的器件匹配的数据手册。同时,也应参考 eMMC 闪存器件自身的数据手册,确保时序约束得到满足。
DH0092: https://docs.amd.com/v/u/en-US/dh0092-versal-boot-config
PCB 走线延迟取决于板材和线宽。一个关键点是,为了确保信号完整性,必须避免在 Versal 器件近端或远端产生信号反射。可以在 eMMC 的时钟、命令和数据线路上靠近 Versal SoC 的位置放置 30 欧姆的串联终端电阻。
从信号完整性角度出发,务必进行 IBIS 模型仿真验证。时钟与数据的信号完整性对 eMMC 正常工作至关重要,尤其是在高速运行模式下。
Versal 自适应 SoC 包含两个 SD_eMMC 控制器,它们可用于 SD 或 eMMC 模式(二者互斥)。其中,SD_eMMC1 控制器用于 eMMC v4.51 启动模式。在此模式下,BootROM 会根据 REF_CLK 频率,以 8.7 MHz 至 19.3 MHz 之间的 eMMC1 器件时钟频率运行。eMMC1 启动模式支持 1.8V 电压以及 1 位、4 位和 8 位数据接口,时钟频率最高可达 200 MHz。BootROM 会使用自动总线宽度检测功能来确定初始启动的数据总线宽度,检测顺序依次为 8 位、4 位,最后是 1 位。
eMMC 控制器支持三种操作模式:
- 25 MHz 下的传统 MMC 速度模式
- 50 MHz 下的高速 SDR 模式和 DDR 模式
- 200 MHz 下的 HS200 模式,最高数据速率可达 1600 Mb/s
请参考 AM011 文档中的 MIO 连接选项表,确保遵循正确的配置。若将 eMMC 设为主启动设备,必须使用 PMC MIO Bank 500 的 MIO 0-11 引脚。
请注意,SD_eMMC0 控制器不支持 eMMC 主启动。
AM011: https://docs.amd.com/r/en-US/am011-versal-acap-trm/PMC-MIO-Pin-Tables
软件配置检查:MIO、复位与时钟
MIO 配置
在 Vivado 或相关设计工具中,确保已选中 SD1/eMMC1 作为启动模式,并且总线位置(Bus Location)已设置为 PMC MIO 0-11 用于启动。


复位配置
控制器可以通过 PMC 复位控制器进行硬件复位,也可以通过写入其软件复位寄存器来复位。PMC 复位会影响整个控制器,将所有寄存器恢复为默认值。
此外,可以通过设置 powercontrol [emmc_hwreset] 寄存器位来复位连接的 eMMC 卡本身。

时钟配置
SD/eMMC 控制器从 PMC 时钟控制器接收三个系统时钟:
SDx_REF_CLK:为 DIV_CLK 模块和控制器提供时钟的参考时钟。
SD_DLL_REF_CLK:为 SD DLL 模块提供时钟的参考时钟。
PMC_IRO_CLK:为 AXI DMA 和编程接口提供时钟。
控制器逻辑始终由一个 10 位分频器输出的 DIV_CLK 提供时钟,而该分频器则由 SDx_REF_CLK 参考时钟驱动。
控制器支持广泛的 I/O 时钟频率,其整体时钟架构如下所示:

根据所需的 I/O 时钟频率,控制器会从以下两个源中选择一个来驱动 I/O 接口时钟 SDx_CLK:来自时钟分频器的 DIV_CLK,或三个 DLL 模块时钟之一。
控制器的 I/O 时钟模式总结如下表:

- 传统 MMC 速度与默认 MMC 速度相关。
- 默认情况下,eMMC 仅以传统 MMC 速度模式启动。软件驱动程序可以切换到高速模式(HS-SDR, HS-DDR, HS-200)以获得更高的吞吐量。
- 上表中的吞吐量基于 8 位 I/O 接口宽度计算。
MIO 默认设置
在 Versal 器件中,用于 eMMC 的 MIO 引脚具有以下默认设置,这些设置可在 Vivado™ Design Suite 中进行修改:
- 默认驱动强度 (12 mA)
- 默认斜率 (slow)
- 默认弱上拉 (enabled)
- Schmitt 触发器输入已启用

通过以上对器件支持、硬件设计和软件配置的逐项排查,大部分常见的 eMMC 启动问题都能被定位。扎实的计算机体系结构与硬件调试知识是解决此类嵌入式系统问题的基石。如果你在排查后仍有疑问,欢迎在相关的技术社区深入交流。