【问题标题】:How to detect on which Altera FPGA I am from software running on NIOS2 processor如何通过在 NIOS2 处理器上运行的软件检测我在哪个 Altera FPGA 上
【发布时间】:2015-06-28 11:12:48
【问题描述】:

我认为我的标题说明了一切。 我在 Altera FPGA 上的 NIOS2 处理器上运行软件。 有什么方法可以检测软件运行在哪个 FPGA 上?

回答评论中的问题:我为什么要关心我在哪个 FPGA 上? 对于生产,我们使用带有 EPCS 控制器的设计来对所有内容进行编程。该编程流程对 Quartus 版本不敏感,与使用 Quartus 编程器的 .jic 流程不同。 不幸的是,对于新的 EPCQ 器件,您必须使用正确的等待状态和寻址模式正确地对 EPCQ 的非易失性寄存器进行编程,以便正确配置 FPGA。 NIOS shell 工具没有能力做到这一点(使用 .jic 流的 Quartus 程序员可以做到)所以我编写了一个小软件来做到这一点。 EPCQ 数据表中有一个表格,说明了根据 FPGA 系列和 EPCQ 的大小应该是什么等待状态。 EPCQ 的大小我可以问 EPCQ。 FPGA家族我不知道该问谁。因此,现在对于每个项目,我都有其个人软件,其中包含硬编码为 FPGA 类型的数据。我希望软件是通用的,而不是特定于 FPGA 的,因此我需要知道我在哪个 FPGA 上。

【问题讨论】:

  • 你的 porgram 有什么理由想知道它所在的设备吗?
  • 您的“小软件”在哪里运行?在FPGA本身上?如果有,FPGA设计是你自己开发的还是给的?
  • 所以您正在尝试使用 Nios II 流程确定您的目标是哪个 FPGA?您的问题是这样表述的,似乎您希望在 Nios II 处理器上运行的程序来确定它正在运行的设备类型,这对于尝试对其进行编程没有意义。
  • 您现在想了解哪些有关 FPGA 的确切信息?设备系列名称是否足够?
  • 无论如何,您都需要为每种 FPGA 类型构建不同的固件,那么为什么不能为每个设计或构建包含一个唯一的 ID?有趣的是,存在“Altera 唯一芯片 ID”IP 块,但这是按芯片而非按 FPGA 类型区分的。作为替代方案,您可以尝试访问 FPGA 自己的 JTAG 链,但这可能需要在硬件中完成,而且对我来说似乎过于复杂。 (并且请不要将您的 cmets 发布为“答案”,而是使用 cmets 或调整问题!)

标签: fpga intel-fpga nios


【解决方案1】:
  • 如果您可以访问 FPGA 的 JTAG 端口,请通过 IDCODE 寄存器提供时钟并对其进行解码。
  • 如果您可以访问 FPGA 比特流文件(您似乎必须这样做,因为您即将对其进行编程),则在稀疏文档的标头中是描述目标设备的字节。解码它们。
  • 由于比特流无论如何都是特定于设备的,因此在将设备类型报告给 NIOS 的固件中公开自定义 NIOS 指令或已知内存位置(通过 Avalon-MM 总线)。

第三个选项的详细信息

您可以在综合时使用 TCL(例如,一些 QSYS 魔术)将项目范围的 DEVICE_FAMILY 属性作为参数 (device_family) 注入 HDL 模块,然后在生成的逻辑中打开它以输出每个值家庭。

例如这是我基于adv_seu_detection_common.vadv_seu_detection_core_hw.tcl 的(在Quartus ip 目录中找到它们):

module crcblock_atom ( regout );
    parameter device_family = "Stratix III";
    output wire [7:0] regout;

    generate
        if  ( (device_family == "Stratix III") ||
              (device_family == "Arria II GZ") ||
              (device_family == "Stratix IV") ) begin: generate_crcblock_atom1

            assign regout = 1;
        end
        else if ( (device_family == "Arria V") ||
                  (device_family == "Cyclone V") ) begin: generate_crcblock_atom2
            assign regout = 2;
        end
        else begin: generate_crcblock_atom
            assign regout = 3;
        end
    endgenerate
endmodule

然后您需要适当地设置参数device_family。您可以在 ip-core 包装器中执行此操作,方法是在 xxxxx_hw.tcl 中使用以下部分未记录的代码,该代码使参数隐藏并从项目设置中自动填充它:

# | device_family
add_parameter device_family STRING
set_parameter_property device_family VISIBLE false
set_parameter_property device_family SYSTEM_INFO {DEVICE_FAMILY}
set_parameter_property device_family HDL_PARAMETER true
set_parameter_property device_family AFFECTS_GENERATION true

您仍然需要将其包装为自定义 NIOS 指令,或使其看起来像 Avalon-MM rom,但您明白了。

一旦您在 QSYS 系统中为每个项目连接并重新构建它们,它就会按照您的要求进行操作。不过还是很丑。

有关此问题的另一种处理方法,请参阅http://www.alteraforum.com/forum/archive/index.php/t-33948.html

【讨论】:

  • 我想在内部以通用方式执行此操作,而不做任何特定于项目的事情,例如查看比特流或公开必须为每个项目更改的自定义 NIOS 指令。正如你所说,数据以 IDCODE 寄存器的形式提供给 JTAG。如果有人知道如何在 HDL 或软件内部访问此 IDCODE 寄存器,那将会很有帮助。如果这在 HDL 中是可能的,那么它可以通过 Avalon MM 连接到 NIOS 软件,它将是通用的。该连接是自定义的,但它将是所有项目的相同附加组件。谢谢。
  • 软件无法对硬件 JTAG 链进行一般访问 - 它是一个有状态的机器,预计由外部引脚上的单个主机驱动,如果主机期望总线,则无法进行仲裁在不同的州。但是,如果您愿意放弃一些 I/O 引脚并且不需要总线用于其他任何事情,请务必在板上进行环回。但是硬件设计人员可能会同意这是对 JTAG 机制的荒谬浪费,因为无论如何每个项目的 HDL 合成方式都不同
  • shuckc,感谢脚本建议,但实现起来很尴尬。我一直在寻找更简单的解决方案。有一种方法可以在不使用环回引脚的情况下从 HDL 连接到 JTAG,但这只是半有用的。您可以使用 altera_soft_core_jtag_io。出于某种奇怪的原因,在 Altera 最终提供了一个内部连接到 JTAG 链的工具之后,它有自己的 IDCODE,所以这也不是解决方案。我仍在寻找正确的解决方案。顺便说一句,提供的链接似乎在寻找与我相同的解决方案,但那里也没有提供任何解决方案。
猜你喜欢
  • 2021-06-03
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
相关资源
最近更新 更多