是否有通过 JTAG 对连接到 FPGA 的闪存进行编程的标准方法?

电器工程 FPGA 闪光 标记
2022-01-11 06:46:34

我有一个带有 JTAG 连接的 FPGA 系统,对于生产,我需要使用 JTAG 对连接到 FPGA 的 FPGA 配置闪存进行编程。

JTAG 连接是标准 IEEE 1149.1,FPGA 编程应该可以使用标准 IEEE 1532。

但是,我还没有找到一种标准方法来对连接到 FPGA 的 FPGA 配置闪存进行编程。

那么,是否有通过 JTAG 对连接到 FPGA 的闪存进行编程的标准方法?

3个回答

真正的问题是配置闪存有很多种。

普通 NOR 闪存(通常是 25xxx 部件)根本没有 JTAG,所以没有运气。

所谓的“平台闪存”(至少 Xilinx 是这样称呼的)是 JTAG 连接的,但协议取决于制造商(实际上我不知道除了 Xilinx 以外的其他人是否这样做)。恕我直言,平台闪存对于它的功能来说太贵了。

至少在 Altera 上,通常的方法是通过 JTAG 在 FPGA 上加载一个临时比特流,该比特流通过 SPI 与 NOR 存储器通信。除非您将 FPGA 系列称为“标准”,否则它不是标准的。

简而言之:没有标准方式,因为没有带有 JTAG 端口的标准闪存

至少对于赛灵思来说,闪存编程分两个阶段进行:

  • 使用 JTAG-SPI 桥加载一个 mini-config
  • 使用桥接的特定 TAP 命令对 SPI 进行编程

您的 JTAG 主机需要了解此流程,包括正确访问闪存的驱动程序。

实际上,仅提供一台为此过程安装了 Vivado(或任何工具)实验室版本的 PC 可能更容易。或者,在将设备焊接到电路板上之前对其进行预编程。(根据经验,这种方法对生产来说是最具成本效益的。)

另一种选择是使用直接连接到闪存引脚的 SPI 编程器。

如果可能,您的系统应该提供一种使用嵌入式 SPI 控制器在现场重新编程的方法。如果您必须重新编程比特流,这可以使您不必召回电路板。如果您的系统具有速度相当快的接口,例如 USB 或 PCI Express,这将比使用 JTAG 更快。

由 FPGA 工具生成并由边界扫描工具执行的 SVF 或 XSVF 与您将获得的“标准”差不多。但我认为这适用于通过 JTAG 闪烁几乎任何东西。JTAG 没有对边界扫描之外的任何东西进行标准化,因此任何具有非易失性存储器的设备都将有自己的方法来访问该存储器以进行编程。

问题是这里涉及到许多混杂因素,而且非常依赖于设备和配置。

一些具有集成闪存的 FPGA 可以通过 JTAG 相对直接地进行编程,如果它们通过 JTAG 提供对配置闪存的直接访问。这种设备在这方面可能是最简单的,但这种设备并不是特别常见,如果您的边界扫描软件不知道如何使用,您可能不得不使用 SVF/XSVF 或类似设备与 FPGA 对话。

更常见的情况是具有外部配置闪存的 FPGA,由于各种原因,大多数 FPGA 不提供从 JTAG 对配置闪存的直接访问。相反,闪存几乎总是通过将设计加载到 FPGA 上进行“间接”编程,FPGA 提供了 JTAG 接口和闪存芯片之间的桥梁。所以在这种情况下,它变成了一个两步过程:通过 JTAG 配置 FPGA,然后写入配置闪存。我认为大多数 FPGA 工具将能够使用原始 JTAG 命令导出 SVF/XSVF 来执行此操作。另一个需要考虑的因素是硬件安全组件,例如英特尔 FPGA 上的安全设备管理器 (SDM),可能会使刷写过程变得更加复杂。

另一种可能的选择是通过边界扫描对闪存进行编程。我认为某些软件基本上能够通过边界扫描寄存器对闪存接口进行位敲击。它非常慢,但它确实绕过了将配置加载到 FPGA 以将 JTAG 链连接到闪存接口的需要。我认为 openocd 可以支持几种闪存芯片,有效地独立于它所连接的设备,只要它支持这些引脚中的 JTAG 边界扫描。

不过,另一个需要考虑的潜在问题是:JTAG 真的是最合适的方法吗?例如,由于 JTAG 扫描链的速度有限,通过间接 JTAG 写入配置闪存可能需要很长时间。例如,通过 JTAG 加载初始设计,然后通过其他接口(PCIe、以太网、USB 等)执行实际闪存可能要快得多。如果您有一些用于在现场更新闪存的基础设施,那么在板的初始闪存期间利用它可能是有意义的 - 例如,通过 JTAG 将设计加载到 FPGA 上,然后使用其他一些接口(PCIe 、USB、以太网等)进行实际刷写。